diff --git a/.hgtags b/.hgtags index a9925795d56..f0dd95d1127 100644 --- a/.hgtags +++ b/.hgtags @@ -2,3 +2,7 @@ bf2517e15f0c0f950e5b3143c4ca11e2df73dcc1 jdk7-b25 5ae7db536e3fcf6be78e45b240a9058095e0ed38 jdk7-b26 67052ac87fc927d048e62ec54ff42adb230d3f7c jdk7-b27 +18dc4ba4739a537fd146f77da51db16efce28da2 jdk7-b28 +bfe4572fd301a6fcd120373cdb2eff5d2da0c72c jdk7-b29 +bee4731164a06ddece1297ae58db24aca6a1c626 jdk7-b30 +cd8b8f500face60d1566d850857a7fccadbd383a jdk7-b31 diff --git a/.hgtags-top-repo b/.hgtags-top-repo index 2d38b379a00..ce58a609d1b 100644 --- a/.hgtags-top-repo +++ b/.hgtags-top-repo @@ -2,3 +2,7 @@ cfeea66a3fa8ca3686a7cfa2d0ce8ab0169f168d jdk7-b24 cbc8ad9dd0e085a607427ea35411990982f19a36 jdk7-b25 9410f77cc30c604d1caf7c9fe3a57fa19e1acbe8 jdk7-b26 11b4dc9f2be3523ef989a0db8459eb56b3045c3a jdk7-b27 +56652b46f328937f6b9b5130f1e4cd80f48868ef jdk7-b28 +31e08f70e88d77c2053f91c21b49a04296bdc59a jdk7-b29 +2dab2f712e1832c92acfa63ec0337048b9422c20 jdk7-b30 +3300a35a0bd56d695b92fe0b34f03ebbfc939064 jdk7-b31 diff --git a/Makefile b/Makefile index d5b3ebac73a..24cd12282e2 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ # -# Copyright 1995-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/README-builds.html b/README-builds.html index a2cf768e122..37998f9c1f6 100644 --- a/README-builds.html +++ b/README-builds.html @@ -5,15 +5,12 @@ - + +
@@ -54,6 +51,7 @@
  • Bootstrap JDK
  • Binary Plugs
  • Optional Import JDK
  • +
  • Ant
  • Certificate Authority File (cacert)
  • Compilers

    @@ -507,6 +518,11 @@ Install or upgrade the FreeType development package.

  • +
  • + Install + Ant, set + ANT_HOME. +
  • @@ -567,6 +583,11 @@ CUPS Include files, set ALT_CUPS_HEADERS_PATH. +
  • + Install + Ant, set + ANT_HOME. +
  • @@ -654,6 +675,11 @@ Install Microsoft DirectX SDK. +
  • + Install + Ant, set + ANT_HOME. +
  • @@ -736,6 +762,22 @@ and the build will copy the needed files from this import area. +

    Ant

    +
    + All OpenJDK builds require access to least Ant 1.6.5. + The Ant tool is available from the + + Ant download site. + You should always set + ANT_HOME + to point to the location of + the Ant installation, this is the directory pathname + that contains a bin and lib. + It's also a good idea to also place its bin directory + in the PATH environment variable, although it's + not absolutely required. +
    +

    Certificate Authority File (cacert)

    See @@ -915,6 +957,21 @@ and ALT_FREETYPE_HEADERS_PATH to refer to place where library and header files are installed. +

    + Building the freetype 2 libraries from scratch is also possible, + however on Windows refer to the + + Windows FreeType DLL build instructions. +

    + Note that by default FreeType is built with byte code hinting + support disabled due to licensing restrictions. + In this case, text appearance and metrics are expected to + differ from Sun's official JDK build. + See + + the SourceForge FreeType2 Home Page + + for more information.

    Advanced Linux Sound Architecture (ALSA) (Linux only)

    @@ -1036,7 +1093,8 @@ - + @@ -1050,7 +1108,7 @@ - + @@ -1061,17 +1119,17 @@ - + - + - + @@ -1224,46 +1282,6 @@ document) that can impact the build are:
    -
    PATH
    -
    Typically you want to set the PATH to include: -
      -
    • The location of the GNU make binary
    • -
    • The location of the Bootstrap JDK java - (see Bootstrap JDK)
    • -
    • The location of the C/C++ compilers - (see compilers)
    • -
    • The location or locations for the Unix command utilities - (e.g. /usr/bin)
    • -
    -
    -
    MILESTONE
    -
    - The milestone name for the build (e.g."beta"). - The default value is "internal". -
    -
    BUILD_NUMBER
    -
    - The build number for the build (e.g. "b27"). - The default value is "b00". -
    -
    ARCH_DATA_MODEL
    -
    The ARCH_DATA_MODEL variable - is used to specify whether the build is to generate 32-bit or 64-bit - binaries. - The Solaris build supports either 32-bit or 64-bit builds, but - Windows and Linux will support only one, depending on the specific - OS being used. - Normally, setting this variable is only necessary on Solaris. - Set ARCH_DATA_MODEL to 32 for generating 32-bit binaries, - or to 64 for generating 64-bit binaries. -
    -
    ALT_BOOTDIR
    -
    - The location of the bootstrap JDK installation. - See Bootstrap JDK for more information. - You should always install your own local Bootstrap JDK and - always set ALT_BOOTDIR explicitly. -
    ALT_BINARY_PLUGS_PATH
    The location of the binary plugs installation. @@ -1272,118 +1290,12 @@ recent Binary Plugs install image and set this variable to that location.
    -
    ALT_JDK_IMPORT_PATH
    +
    ALT_BOOTDIR
    - The location of a previously built JDK installation. - See Optional Import JDK for more information. -
    -
    ALT_OUTPUTDIR
    -
    - An override for specifying the (absolute) path of where the - build output is to go. - The default output directory will be build/platform. -
    -
    ALT_COMPILER_PATH
    -
    - The location of the C/C++ compiler. - The default varies depending on the platform. -
    -
    ALT_CACERTS_FILE
    -
    - The location of the cacerts file. - The default will refer to - jdk/src/share/lib/security/cacerts. -
    -
    ALT_CUPS_HEADERS_PATH
    -
    - The location of the CUPS header files. - See CUPS information for more information. - If this path does not exist the fallback path is - /usr/include. -
    -
    ALT_FREETYPE_LIB_PATH
    -
    - The location of the FreeType shared library. - See FreeType information for details. -
    -
    ALT_FREETYPE_HEADERS_PATH
    -
    - The location of the FreeType header files. - See FreeType information for details. -
    -
    ALT_JDK_DEVTOOLS_PATH
    -
    - The default root location of the devtools. - The default value is - $(ALT_SLASH_JAVA)/devtools. -
    -
    ALT_DEVTOOLS_PATH
    -
    - The location of tools like the - zip and unzip - binaries, but might also contain the GNU make utility - (gmake). - So this area is a bit of a grab bag, especially on Windows. - The default value depends on the platform and - Unix Commands being used. - On Linux the default will be - $(ALT_JDK_DEVTOOLS_PATH)/linux/bin, - on Solaris - $(ALT_JDK_DEVTOOLS_PATH)/{sparc,i386}/bin, - on Windows with MKS - %SYSTEMDRIVE%/UTILS, - and on Windows with CYGWIN - /usr/bin. -
    -
    ALT_UNIXCOMMAND_PATH
    -
    - An override for specifying where the - Unix command set are located. - The default location varies depending on the platform, - "%SYSTEMDRIVE%/MKSNT" or - $(ROOTDIR) on Windows with MKS, otherwise it's - "/bin" or /usr/bin. -
    -
    ALT_UNIXCCS_PATH
    -
    - Solaris only: - An override for specifying where the Unix CCS - command set are located. - The default location is /usr/ccs/bin -
    -
    ALT_USRBIN_PATH
    -
    - An override for specifying where the - Unix /usr/bin commands are located. You usually do not need - to set this variable: the default location is /usr/bin) -
    -
    ALT_SLASHJAVA
    -
    - The default root location for many of the ALT path locations - of the following ALT variables. - The default value is - "/java" on Solaris and Linux, - "J:" on Windows. -
    -
    ALT_BUILD_JDK_IMPORT_PATH
    -
    - These are useful in managing builds on multiple platforms. - The default network location for all of the import JDK images - for all platforms. - If ALT_JDK_IMPORT_PATH - is not set, this directory will be used and should contain - the following directories: - solaris-sparc, - solaris-i586, - solaris-sparcv9, - solaris-amd64, - linux-i586, - linux-amd64, - windows-i586, - and - windows-amd64. - Where each of these directories contain the import JDK image - for that platform. + The location of the bootstrap JDK installation. + See Bootstrap JDK for more information. + You should always install your own local Bootstrap JDK and + always set ALT_BOOTDIR explicitly.
    ALT_BUILD_BINARY_PLUGS_PATH
    @@ -1405,36 +1317,186 @@ Where each of these directories contain the binary plugs image for that platform.
    -
    Windows specific:
    +
    ALT_BUILD_JDK_IMPORT_PATH
    -
    -
    ALT_MSDEVTOOLS_PATH
    -
    - The location of the Microsoft Visual Studio .NET 2003 - tools 'bin' directory. - The default is usually derived from - ALT_COMPILER_PATH. -
    -
    ALT_DXSDK_PATH
    -
    - The location of the - Microsoft DirectX 9 SDK. - The default will be to try and use the DirectX environment - variable DXSDK_DIR, - failing that, look in C:/DXSDK. -
    -
    ALT_MSVCRT_DLL_PATH
    -
    - The location of the - MSVCRT.DLL. -
    -
    ALT_MSVCR71_DLL_PATH
    -
    - i586 only: - The location of the - MSVCR71.DLL. -
    -
    + These are useful in managing builds on multiple platforms. + The default network location for all of the import JDK images + for all platforms. + If ALT_JDK_IMPORT_PATH + is not set, this directory will be used and should contain + the following directories: + solaris-sparc, + solaris-i586, + solaris-sparcv9, + solaris-amd64, + linux-i586, + linux-amd64, + windows-i586, + and + windows-amd64. + Where each of these directories contain the import JDK image + for that platform. +
    +
    ALT_CACERTS_FILE
    +
    + The location of the cacerts file. + The default will refer to + jdk/src/share/lib/security/cacerts. +
    +
    ALT_COMPILER_PATH
    +
    + The location of the C/C++ compiler. + The default varies depending on the platform. +
    +
    ALT_CUPS_HEADERS_PATH
    +
    + The location of the CUPS header files. + See CUPS information for more information. + If this path does not exist the fallback path is + /usr/include. +
    +
    ALT_DEVTOOLS_PATH
    +
    + The location of tools like the + zip and unzip + binaries, but might also contain the GNU make utility + (gmake). + So this area is a bit of a grab bag, especially on Windows. + The default value depends on the platform and + Unix Commands being used. + On Linux the default will be + $(ALT_JDK_DEVTOOLS_PATH)/linux/bin, + on Solaris + $(ALT_JDK_DEVTOOLS_PATH)/{sparc,i386}/bin, + on Windows with MKS + %SYSTEMDRIVE%/UTILS, + and on Windows with CYGWIN + /usr/bin. +
    +
    ALT_DXSDK_PATH
    +
    + Windows Only: + The location of the + Microsoft DirectX 9 SDK. + The default will be to try and use the DirectX environment + variable DXSDK_DIR, + failing that, look in C:/DXSDK. +
    +
    ALT_FREETYPE_HEADERS_PATH
    +
    + The location of the FreeType header files. + See FreeType information for details. +
    +
    ALT_FREETYPE_LIB_PATH
    +
    + The location of the FreeType shared library. + See FreeType information for details. +
    +
    ALT_JDK_DEVTOOLS_PATH
    +
    + The default root location of the devtools. + The default value is + $(ALT_SLASH_JAVA)/devtools. +
    +
    ALT_JDK_IMPORT_PATH
    +
    + The location of a previously built JDK installation. + See Optional Import JDK for more information. +
    +
    ALT_MSDEVTOOLS_PATH
    +
    + Windows Only: + The location of the Microsoft Visual Studio .NET 2003 + tools 'bin' directory. + The default is usually derived from + ALT_COMPILER_PATH. +
    +
    ALT_MSVCR71_DLL_PATH
    +
    + Windows i586 only: + The location of the + MSVCR71.DLL. +
    +
    ALT_MSVCRT_DLL_PATH
    +
    + Windows Only: + The location of the + MSVCRT.DLL. +
    +
    ALT_OUTPUTDIR
    +
    + An override for specifying the (absolute) path of where the + build output is to go. + The default output directory will be build/platform. +
    +
    ALT_SLASHJAVA
    +
    + The default root location for many of the ALT path locations + of the following ALT variables. + The default value is + "/java" on Solaris and Linux, + "J:" on Windows. +
    +
    ALT_UNIXCCS_PATH
    +
    + Solaris only: + An override for specifying where the Unix CCS + command set are located. + The default location is /usr/ccs/bin +
    +
    ALT_UNIXCOMMAND_PATH
    +
    + An override for specifying where the + Unix command set are located. + The default location varies depending on the platform, + "%SYSTEMDRIVE%/MKSNT" or + $(ROOTDIR) on Windows with MKS, otherwise it's + "/bin" or /usr/bin. +
    +
    ALT_USRBIN_PATH
    +
    + An override for specifying where the + Unix /usr/bin commands are located. You usually do not need + to set this variable: the default location is /usr/bin) +
    +
    ANT_HOME
    +
    + The location of the Ant installation. + See Ant for more information. + You should always set ANT_HOME explicitly. +
    +
    ARCH_DATA_MODEL
    +
    The ARCH_DATA_MODEL variable + is used to specify whether the build is to generate 32-bit or 64-bit + binaries. + The Solaris build supports either 32-bit or 64-bit builds, but + Windows and Linux will support only one, depending on the specific + OS being used. + Normally, setting this variable is only necessary on Solaris. + Set ARCH_DATA_MODEL to 32 for generating 32-bit binaries, + or to 64 for generating 64-bit binaries. +
    +
    BUILD_NUMBER
    +
    + The build number for the build (e.g. "b27"). + The default value is "b00". +
    +
    MILESTONE
    +
    + The milestone name for the build (e.g."beta"). + The default value is "internal". +
    +
    PATH
    +
    Typically you want to set the PATH to include: +
      +
    • The location of the GNU make binary
    • +
    • The location of the Bootstrap JDK java + (see Bootstrap JDK)
    • +
    • The location of the C/C++ compilers + (see compilers)
    • +
    • The location or locations for the Unix command utilities + (e.g. /usr/bin)
    • +
    diff --git a/corba/.hgtags b/corba/.hgtags index 1c9eb9a6072..6792e20a86a 100644 --- a/corba/.hgtags +++ b/corba/.hgtags @@ -2,3 +2,7 @@ 5e61d5df62586474414d1058e9186441aa908f51 jdk7-b25 0043eb3d4e628f049ff80a8c223b5657136085e7 jdk7-b26 e84e9018bebbf3e5bafc5706e7882a15cb1c7d99 jdk7-b27 +27509b7d21ed783b3f6eb7b7612781c675a30c2f jdk7-b28 +8b71960f79ce0a6fb8ddfeec03f03d400a361747 jdk7-b29 +c0252adbb2abbfdd6c35595429ac6fbdd98e20ac jdk7-b30 +ef6af34d75a7b44e77083f1d4ee47631fa09d3b4 jdk7-b31 diff --git a/corba/make/common/shared/Compiler-sun.gmk b/corba/make/common/shared/Compiler-sun.gmk index 8ce54825b7c..730310201c6 100644 --- a/corba/make/common/shared/Compiler-sun.gmk +++ b/corba/make/common/shared/Compiler-sun.gmk @@ -1,5 +1,5 @@ # -# Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -31,6 +31,9 @@ COMPILER_NAME=Sun Studio # Sun Studio Compiler settings specific to Solaris ifeq ($(PLATFORM), solaris) + # FIXUP: Change to SS12 when validated + #COMPILER_VERSION=SS12 + #REQUIRED_CC_VER=5.9 COMPILER_VERSION=SS11 REQUIRED_CC_VER=5.8 CC = $(COMPILER_PATH)cc @@ -51,8 +54,8 @@ endif # Sun Studio Compiler settings specific to Linux ifeq ($(PLATFORM), linux) # This has not been tested - COMPILER_VERSION=SS11 - REQUIRED_CC_VER=5.8 + COMPILER_VERSION=SS12 + REQUIRED_CC_VER=5.9 CC = $(COMPILER_PATH)cc CPP = $(COMPILER_PATH)cc -E CXX = $(COMPILER_PATH)CC diff --git a/corba/make/common/shared/Defs.gmk b/corba/make/common/shared/Defs.gmk index c7832863e34..5af64523ff7 100644 --- a/corba/make/common/shared/Defs.gmk +++ b/corba/make/common/shared/Defs.gmk @@ -1,5 +1,5 @@ # -# Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/corba/make/jprt.config b/corba/make/jprt.config index e511068ef88..86e6499a156 100644 --- a/corba/make/jprt.config +++ b/corba/make/jprt.config @@ -1,7 +1,7 @@ #!echo "This is not a shell script" ############################################################################# # -# Copyright 2006-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -123,9 +123,15 @@ if [ "${osname}" = SunOS ] ; then solaris_arch=i386 fi - # Get the SS11 compilers into path (make sure it matches ALT setting) - compiler_path=${jdk_devtools}/${solaris_arch}/SUNWspro/SS11/bin - compiler_name=SS11 + # Get the compilers into path (make sure it matches ALT setting) + if [ "${JPRT_SOLARIS_COMPILER_NAME}" != "" ] ; then + compiler_name=${JPRT_SOLARIS_COMPILER_NAME} + else + # FIXUP: Change to SS12 when validated + #compiler_name=SS12 + compiler_name=SS11 + fi + compiler_path=${jdk_devtools}/${solaris_arch}/SUNWspro/${compiler_name}/bin ALT_COMPILER_PATH="${compiler_path}" export ALT_COMPILER_PATH dirMustExist "${compiler_path}" ALT_COMPILER_PATH diff --git a/corba/src/share/classes/org/omg/CORBA/ir.idl b/corba/src/share/classes/org/omg/CORBA/ir.idl index 5ea8a1979dd..d7312f993a1 100644 --- a/corba/src/share/classes/org/omg/CORBA/ir.idl +++ b/corba/src/share/classes/org/omg/CORBA/ir.idl @@ -1,5 +1,5 @@ /* - * Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/corba/src/share/classes/org/omg/DynamicAny/DynamicAny.idl b/corba/src/share/classes/org/omg/DynamicAny/DynamicAny.idl index b0149c3e256..2d21393963e 100644 --- a/corba/src/share/classes/org/omg/DynamicAny/DynamicAny.idl +++ b/corba/src/share/classes/org/omg/DynamicAny/DynamicAny.idl @@ -1,5 +1,5 @@ /* - * Copyright 2000-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/.hgignore b/hotspot/.hgignore index 24a19191195..2c5fe5bc135 100644 --- a/hotspot/.hgignore +++ b/hotspot/.hgignore @@ -2,3 +2,6 @@ ^dist/ ^nbproject/private/ ^src/share/tools/hsdis/bin/ +^src/share/tools/IdealGraphVisualizer/[a-zA-Z0-9]*/build/ +^src/share/tools/IdealGraphVisualizer/build/ +^src/share/tools/IdealGraphVisualizer/dist/ diff --git a/hotspot/.hgtags b/hotspot/.hgtags index 5d8c9da580d..b23c6ac9012 100644 --- a/hotspot/.hgtags +++ b/hotspot/.hgtags @@ -2,3 +2,7 @@ a61af66fc99eb5ec9d50c05b0c599757b1289ceb jdk7-b24 7836be3e92d0a4f9ee7566f602c91f5609534e66 jdk7-b25 ad0b851458ff9d1d490ed2d79bb84f75a9fdb753 jdk7-b26 e3d2692f8442e2d951166dc9bd9a330684754438 jdk7-b27 +c14dab40ed9bf45ad21150bd70c9c80cdf655415 jdk7-b28 +4f91c08b3e4498213a9c5a24898f7d9c38cf86fb jdk7-b29 +d1605aabd0a15ecf93787c47de63073c33fba52d jdk7-b30 +9c2ecc2ffb125f14fab3857fe7689598956348a0 jdk7-b31 diff --git a/hotspot/agent/make/Makefile b/hotspot/agent/make/Makefile index 0cde8d5754b..ae10cb3cb97 100644 --- a/hotspot/agent/make/Makefile +++ b/hotspot/agent/make/Makefile @@ -1,5 +1,5 @@ # -# Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -246,16 +246,16 @@ SA_PROPERTIES = $(OUTPUT_DIR)/sa.properties all: filelist @mkdir -p $(OUTPUT_DIR) @echo "$(SA_BUILD_VERSION_PROP)" > $(SA_PROPERTIES) - @javac -source 1.4 -classpath $(CLASSPATH) -deprecation -sourcepath $(SRC_DIR) -g -d $(OUTPUT_DIR) @filelist - @rmic -classpath $(OUTPUT_DIR) -d $(OUTPUT_DIR) sun.jvm.hotspot.debugger.remote.RemoteDebuggerServer + @${JDK_HOME}/bin/javac -source 1.4 -classpath $(CLASSPATH) -deprecation -sourcepath $(SRC_DIR) -g -d $(OUTPUT_DIR) @filelist + @${JDK_HOME}/bin/rmic -classpath $(OUTPUT_DIR) -d $(OUTPUT_DIR) sun.jvm.hotspot.debugger.remote.RemoteDebuggerServer rm -f $(OUTPUT_DIR)/sun/jvm/hotspot/utilities/soql/sa.js cp $(SRC_DIR)/sun/jvm/hotspot/utilities/soql/sa.js $(OUTPUT_DIR)/sun/jvm/hotspot/utilities/soql allprof: filelist @mkdir -p $(OUTPUT_DIR) @echo "$(SA_BUILD_VERSION_PROP)" > $(SA_PROPERTIES) - @javac -source 1.4 -J-Xprof -classpath $(CLASSPATH) -deprecation -sourcepath $(SRC_DIR) -g -d $(OUTPUT_DIR) @filelist - @rmic -classpath $(OUTPUT_DIR) -d $(OUTPUT_DIR) sun.jvm.hotspot.debugger.remote.RemoteDebuggerServer + @${JDK_HOME}/bin/javac -source 1.4 -J-Xprof -classpath $(CLASSPATH) -deprecation -sourcepath $(SRC_DIR) -g -d $(OUTPUT_DIR) @filelist + @${JDK_HOME}/bin/rmic -classpath $(OUTPUT_DIR) -d $(OUTPUT_DIR) sun.jvm.hotspot.debugger.remote.RemoteDebuggerServer rm -f $(OUTPUT_DIR)/sun/jvm/hotspot/utilities/soql/sa.js cp $(SRC_DIR)/sun/jvm/hotspot/utilities/soql/sa.js $(OUTPUT_DIR)/sun/jvm/hotspot/utilities/soql diff --git a/hotspot/agent/src/os/linux/ps_core.c b/hotspot/agent/src/os/linux/ps_core.c index 0693ffce4bb..3562f2d31f6 100644 --- a/hotspot/agent/src/os/linux/ps_core.c +++ b/hotspot/agent/src/os/linux/ps_core.c @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/os/linux/ps_proc.c b/hotspot/agent/src/os/linux/ps_proc.c index 9b226eaf00b..d9c297e5fa3 100644 --- a/hotspot/agent/src/os/linux/ps_proc.c +++ b/hotspot/agent/src/os/linux/ps_proc.c @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/CommandProcessor.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/CommandProcessor.java index 50e81f34789..bb3dba9ea33 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/CommandProcessor.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/CommandProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/HSDB.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/HSDB.java index fb583936574..8a2ef3c84c2 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/HSDB.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/HSDB.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -398,7 +398,7 @@ public class HSDB implements ObjectHistogramPanel.Listener, SAListener { frame.getContentPane().add(desktop); GraphicsUtilities.reshapeToAspectRatio(frame, 4.0f/3.0f, 0.75f, Toolkit.getDefaultToolkit().getScreenSize()); GraphicsUtilities.centerInContainer(frame, Toolkit.getDefaultToolkit().getScreenSize()); - frame.show(); + frame.setVisible(true); Runtime.getRuntime().addShutdownHook(new java.lang.Thread() { public void run() { diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/HotSpotTypeDataBase.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/HotSpotTypeDataBase.java index 21bc43d77bf..5e56a0e3f36 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/HotSpotTypeDataBase.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/HotSpotTypeDataBase.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/SALauncherLoader.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/SALauncherLoader.java index 9c8dce59600..9f462c67455 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/SALauncherLoader.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/SALauncherLoader.java @@ -1,5 +1,5 @@ /* - * Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -148,7 +148,7 @@ public class SALauncherLoader extends URLClassLoader { } try { - return file.toURL(); + return file.toURI().toURL(); } catch (MalformedURLException mue) { throw new InternalError(mue.getMessage()); } diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/Main.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/Main.java index f86c8225f55..e34c975f775 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/Main.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/Main.java @@ -1,5 +1,5 @@ /* - * Copyright 2001-2002 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -47,6 +47,6 @@ public class Main { 4.0f/3.0f, 0.85f, Toolkit.getDefaultToolkit().getScreenSize()); GraphicsUtilities.centerInContainer(frame, Toolkit.getDefaultToolkit().getScreenSize()); - frame.show(); + frame.setVisible(true); } } diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/compiler/OopMapSet.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/compiler/OopMapSet.java index 3d9c6bbe5d8..aa99e9a444e 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/compiler/OopMapSet.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/compiler/OopMapSet.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/compiler/OopMapValue.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/compiler/OopMapValue.java index 3b7e66b1777..ee382979626 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/compiler/OopMapValue.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/compiler/OopMapValue.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/compiler/OopMapVisitor.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/compiler/OopMapVisitor.java index 612223667e4..98227008c58 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/compiler/OopMapVisitor.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/compiler/OopMapVisitor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/Address.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/Address.java index 66996c4f9a7..1800dafc25c 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/Address.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/Address.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2002 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/Debugger.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/Debugger.java index 3e85bb7635d..acbb90d4b66 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/Debugger.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/Debugger.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2002 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/DebuggerBase.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/DebuggerBase.java index 4bef7b0daae..7b4ca75f431 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/DebuggerBase.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/DebuggerBase.java @@ -1,5 +1,5 @@ /* - * Copyright 2001-2002 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/JVMDebugger.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/JVMDebugger.java index c478d33d088..679036cdac0 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/JVMDebugger.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/JVMDebugger.java @@ -1,5 +1,5 @@ /* - * Copyright 2000 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescription.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescription.java index 9498c2e25fb..87641775ac5 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescription.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescription.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2001 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionAMD64.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionAMD64.java index 3dd6e513ead..3f16b1bb5d8 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionAMD64.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionAMD64.java @@ -1,5 +1,5 @@ /* - * Copyright 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionIA64.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionIA64.java index 4099844799b..4f4322a1c6c 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionIA64.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionIA64.java @@ -1,5 +1,5 @@ /* - * Copyright 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionIntelX86.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionIntelX86.java index e333b139fcd..25d786ab8f9 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionIntelX86.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionIntelX86.java @@ -1,5 +1,5 @@ /* - * Copyright 2000 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionSPARC32Bit.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionSPARC32Bit.java index 5e70d16d975..ab615fe7c7c 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionSPARC32Bit.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionSPARC32Bit.java @@ -1,5 +1,5 @@ /* - * Copyright 2000 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionSPARC64Bit.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionSPARC64Bit.java index 289f9ca8f2b..2eae1e0e77a 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionSPARC64Bit.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionSPARC64Bit.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2001 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/DbxAddress.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/DbxAddress.java index d0c039e41ba..e91e9240a96 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/DbxAddress.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/DbxAddress.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2002 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/DbxDebugger.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/DbxDebugger.java index f73700c8e16..e34c1c12aa0 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/DbxDebugger.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/DbxDebugger.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2002 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/DbxDebuggerLocal.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/DbxDebuggerLocal.java index 1501f2b07c5..13cda991a73 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/DbxDebuggerLocal.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/DbxDebuggerLocal.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/dummy/DummyAddress.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/dummy/DummyAddress.java index 5a3b4170859..0004b99d5d2 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/dummy/DummyAddress.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/dummy/DummyAddress.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2002 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/LinuxAddress.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/LinuxAddress.java index 64577da7acd..34da90a4df2 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/LinuxAddress.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/LinuxAddress.java @@ -1,5 +1,5 @@ /* - * Copyright 2002 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/LinuxDebugger.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/LinuxDebugger.java index b3a062e82a8..f69c582db19 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/LinuxDebugger.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/LinuxDebugger.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/LinuxDebuggerLocal.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/LinuxDebuggerLocal.java index 7f4159f4a47..fadd9ef1de4 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/LinuxDebuggerLocal.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/LinuxDebuggerLocal.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcAddress.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcAddress.java index 17c75774dfe..843693a4822 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcAddress.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcAddress.java @@ -1,5 +1,5 @@ /* - * Copyright 2002 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcDebugger.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcDebugger.java index e17d2b422be..a792e9c6bc5 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcDebugger.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcDebugger.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcDebuggerLocal.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcDebuggerLocal.java index 5b89e610595..662bbe35b41 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcDebuggerLocal.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcDebuggerLocal.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteAddress.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteAddress.java index 287f7cbbc2a..6575c2faf6d 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteAddress.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteAddress.java @@ -1,5 +1,5 @@ /* - * Copyright 2002 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebugger.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebugger.java index 6850195d4eb..179fc1e9d64 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebugger.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebugger.java @@ -1,5 +1,5 @@ /* - * Copyright 2002 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebuggerClient.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebuggerClient.java index 4be718ef6e2..c1464f3d98c 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebuggerClient.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebuggerClient.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebuggerServer.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebuggerServer.java index 922890fb9ea..cdc5c713619 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebuggerServer.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebuggerServer.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32Address.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32Address.java index 0afbcacfd63..d6400ebae7a 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32Address.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32Address.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2002 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32Debugger.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32Debugger.java index 3c2558200bc..0b5d72c0709 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32Debugger.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32Debugger.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2002 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32DebuggerLocal.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32DebuggerLocal.java index 0380eb3b529..757ad00b350 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32DebuggerLocal.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32DebuggerLocal.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgAddress.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgAddress.java index 4a0d7f21cdb..89be5232e2f 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgAddress.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgAddress.java @@ -1,5 +1,5 @@ /* - * Copyright 2002 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebugger.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebugger.java index 03654377c6a..1ed40d26982 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebugger.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebugger.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebuggerLocal.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebuggerLocal.java index 687f45a4ebd..09a3685b382 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebuggerLocal.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebuggerLocal.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/jdi/SAJDIClassLoader.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/jdi/SAJDIClassLoader.java index 4483cf1b38b..02c1cff9a0e 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/jdi/SAJDIClassLoader.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/jdi/SAJDIClassLoader.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -78,7 +78,7 @@ class SAJDIClassLoader extends URLClassLoader { this(parent); this.classPathSet = true; try { - addURL(new File(classPath).toURL()); + addURL(new File(classPath).toURI().toURL()); } catch(MalformedURLException mue) { throw new RuntimeException(mue); } diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/memory/BinaryTreeDictionary.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/memory/BinaryTreeDictionary.java new file mode 100644 index 00000000000..72f3006ea67 --- /dev/null +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/memory/BinaryTreeDictionary.java @@ -0,0 +1,59 @@ +/* + * @(#)BinaryTreeDictionary.java + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ + +package sun.jvm.hotspot.memory; + +import java.util.*; +import sun.jvm.hotspot.debugger.*; +import sun.jvm.hotspot.types.*; +import sun.jvm.hotspot.runtime.*; + +public class BinaryTreeDictionary extends VMObject { + static { + VM.registerVMInitializedObserver(new Observer() { + public void update(Observable o, Object data) { + initialize(VM.getVM().getTypeDataBase()); + } + }); + } + + private static synchronized void initialize(TypeDataBase db) { + Type type = db.lookupType("BinaryTreeDictionary"); + totalSizeField = type.getCIntegerField("_totalSize"); + } + + // Fields + private static CIntegerField totalSizeField; + + // Accessors + public long size() { + return totalSizeField.getValue(addr); + } + + // Constructor + public BinaryTreeDictionary(Address addr) { + super(addr); + } +} diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/memory/CompactibleFreeListSpace.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/memory/CompactibleFreeListSpace.java index c1c701f223f..97ec593e187 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/memory/CompactibleFreeListSpace.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/memory/CompactibleFreeListSpace.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,6 +35,20 @@ import sun.jvm.hotspot.utilities.*; public class CompactibleFreeListSpace extends CompactibleSpace { private static AddressField collectorField; + // for free size, three fields + // FreeBlockDictionary* _dictionary; // ptr to dictionary for large size blocks + // FreeList _indexedFreeList[IndexSetSize]; // indexed array for small size blocks + // LinearAllocBlock _smallLinearAllocBlock; // small linear alloc in TLAB + private static AddressField indexedFreeListField; + private static AddressField dictionaryField; + private static long smallLinearAllocBlockFieldOffset; + private static long indexedFreeListSizeOf; + + private int heapWordSize; // 4 for 32bit, 8 for 64 bits + private int IndexSetStart; // for small indexed list + private int IndexSetSize; + private int IndexSetStride; + static { VM.registerVMInitializedObserver(new Observer() { public void update(Observable o, Object data) { @@ -51,10 +65,26 @@ public class CompactibleFreeListSpace extends CompactibleSpace { Type type = db.lookupType("CompactibleFreeListSpace"); collectorField = type.getAddressField("_collector"); + collectorField = type.getAddressField("_collector"); + dictionaryField = type.getAddressField("_dictionary"); + indexedFreeListField = type.getAddressField("_indexedFreeList[0]"); + smallLinearAllocBlockFieldOffset = type.getField("_smallLinearAllocBlock").getOffset(); } public CompactibleFreeListSpace(Address addr) { super(addr); + if ( VM.getVM().isLP64() ) { + heapWordSize = 8; + IndexSetStart = 1; + IndexSetStride = 1; + } + else { + heapWordSize = 4; + IndexSetStart = 2; + IndexSetStride = 2; + } + + IndexSetSize = 257; } // Accessing block offset table @@ -62,9 +92,17 @@ public class CompactibleFreeListSpace extends CompactibleSpace { return (CMSCollector) VMObjectFactory.newObject( CMSCollector.class, collectorField.getValue(addr)); - } + } + + public long free0() { + return capacity() - used0(); + } public long used() { + return capacity() - free(); + } + + public long used0() { List regions = getLiveRegions(); long usedSize = 0L; for (Iterator itr = regions.iterator(); itr.hasNext();) { @@ -75,11 +113,41 @@ public class CompactibleFreeListSpace extends CompactibleSpace { } public long free() { - return capacity() - used(); - } + // small chunks + long size = 0; + Address cur = addr.addOffsetTo( indexedFreeListField.getOffset() ); + cur = cur.addOffsetTo(IndexSetStart*FreeList.sizeOf()); + for (int i=IndexSetStart; i> cmsShift, cmsMask) & 0x1L) == 0x1L; + } + public long getSize() { return (long)(value() >> sizeShift); } } diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjArray.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjArray.java index 7ef6d8d820c..027c57ea5fe 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjArray.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjArray.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java index 0aae96fcf42..23e533348c3 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -316,6 +316,14 @@ public class ObjectHeap { iterateLiveRegions(liveRegions, visitor, null); } + public boolean isValidMethod(OopHandle handle) { + OopHandle klass = Oop.getKlassForOopHandle(handle); + if (klass != null && klass.equals(methodKlassHandle)) { + return true; + } + return false; + } + // Creates an instance from the Oop hierarchy based based on the handle public Oop newOop(OopHandle handle) { // The only known way to detect the right type of an oop is @@ -375,8 +383,10 @@ public class ObjectHeap { } } - System.err.println("Unknown oop at " + handle); - System.err.println("Oop's klass is " + klass); + if (DEBUG) { + System.err.println("Unknown oop at " + handle); + System.err.println("Oop's klass is " + klass); + } throw new UnknownOopException(); } diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHistogram.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHistogram.java index f263d49ffc3..58312c9c58e 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHistogram.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHistogram.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHistogramElement.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHistogramElement.java index 65117314f7e..d9518a3e788 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHistogramElement.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHistogramElement.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/Oop.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/Oop.java index 2bdf7eab706..cfaed93567e 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/Oop.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/Oop.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/OopPrinter.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/OopPrinter.java index 0574343d207..d46c4dfe75e 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/OopPrinter.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/OopPrinter.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/OopUtilities.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/OopUtilities.java index 1613da85bb8..276753f7067 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/OopUtilities.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/OopUtilities.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -274,10 +274,10 @@ public class OopUtilities implements /* imports */ JVMTIThreadState { // hc_klass is a HotSpot magic field and hence we can't // find it from InstanceKlass for java.lang.Class. TypeDataBase db = VM.getVM().getTypeDataBase(); - int hcKlassOffset = (int) Oop.getHeaderSize(); + int hcKlassOffset = (int) Instance.getHeaderSize(); try { hcKlassOffset += (db.lookupIntConstant("java_lang_Class::hc_klass_offset").intValue() * - db.getAddressSize()); + VM.getVM().getHeapOopSize()); } catch (RuntimeException re) { // ignore, currently java_lang_Class::hc_klass_offset is zero } diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/OopVisitor.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/OopVisitor.java index 9bb12a45701..7dc622b2d2b 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/OopVisitor.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/OopVisitor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2001 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/AddressVisitor.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/AddressVisitor.java index f9c55318fb9..b8076837473 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/AddressVisitor.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/AddressVisitor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/Frame.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/Frame.java index ad07426313b..ec3077ae02d 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/Frame.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/Frame.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java index 43ad81d44e5..204156c3ff8 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java @@ -215,11 +215,11 @@ public class JavaThread extends Thread { if (f == null) return null; boolean imprecise = true; if (f.isInterpretedFrame() && !f.isInterpretedFrameValid()) { - if (DEBUG) { - System.out.println("Correcting for invalid interpreter frame"); - } - f = f.sender(regMap); - imprecise = false; + if (DEBUG) { + System.out.println("Correcting for invalid interpreter frame"); + } + f = f.sender(regMap); + imprecise = false; } VFrame vf = VFrame.newVFrame(f, regMap, this, true, imprecise); if (vf == null) { @@ -228,10 +228,7 @@ public class JavaThread extends Thread { } return null; } - if (vf.isJavaFrame()) { - return (JavaVFrame) vf; - } - return (JavaVFrame) vf.javaSender(); + return vf.isJavaFrame() ? (JavaVFrame)vf : vf.javaSender(); } /** In this system, a JavaThread is the top-level factory for a diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/VM.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/VM.java index c6ab99073e7..e1ed4b97f2b 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/VM.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/VM.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/solaris_sparc/SolarisSPARCJavaThreadPDAccess.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/solaris_sparc/SolarisSPARCJavaThreadPDAccess.java index 7d42c211d15..93b5acf067d 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/solaris_sparc/SolarisSPARCJavaThreadPDAccess.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/solaris_sparc/SolarisSPARCJavaThreadPDAccess.java @@ -121,6 +121,13 @@ public class SolarisSPARCJavaThreadPDAccess implements JavaThreadPDAccess { } public Frame getCurrentFrameGuess(JavaThread thread, Address addr) { + + // If java stack is walkable then both last_Java_sp and last_Java_pc are + // non null and we can start stack walk from this frame. + if (thread.getLastJavaSP() != null && thread.getLastJavaPC() != null) { + return new SPARCFrame(SPARCFrame.biasSP(thread.getLastJavaSP()), thread.getLastJavaPC()); + } + ThreadProxy t = getThreadProxy(addr); SPARCThreadContext context = (SPARCThreadContext) t.getContext(); // For now, let's see what happens if we do a similar thing to diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/sparc/SPARCFrame.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/sparc/SPARCFrame.java index 015329117dc..b9c07b6bc4e 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/sparc/SPARCFrame.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/sparc/SPARCFrame.java @@ -422,6 +422,13 @@ public class SPARCFrame extends Frame { if (getFP().addOffsetTo(INTERPRETER_FRAME_VM_LOCAL_WORDS * VM.getVM().getAddressSize()).lessThan(getSP())) { return false; } + + OopHandle methodHandle = addressOfInterpreterFrameMethod().getOopHandleAt(0); + + if (VM.getVM().getObjectHeap().isValidMethod(methodHandle) == false) { + return false; + } + // These are hacks to keep us out of trouble. // The problem with these is that they mask other problems if (getFP().lessThanOrEqual(getSP())) { // this attempts to deal with unsigned comparison above @@ -433,9 +440,18 @@ public class SPARCFrame extends Frame { // FIXME: this is not atomic with respect to GC and is unsuitable // for use in a non-debugging, or reflective, system. Need to // figure out how to express this. - if (addressOfInterpreterFrameBCX().getAddressAt(0) == null) { - return false; // BCP not yet set up + Address bcx = addressOfInterpreterFrameBCX().getAddressAt(0); + + Method method; + try { + method = (Method) VM.getVM().getObjectHeap().newOop(methodHandle); + } catch (UnknownOopException ex) { + return false; } + int bci = bcpToBci(bcx, method); + //validate bci + if (bci < 0) return false; + return true; } @@ -471,7 +487,7 @@ public class SPARCFrame extends Frame { // will update it accordingly map.setIncludeArgumentOops(false); - if (cb == null && isEntryFrame()) { + if (isEntryFrame()) { return senderForEntryFrame(map); } @@ -539,7 +555,6 @@ public class SPARCFrame extends Frame { int SP_OFFSET_IN_GREGSET = 17; raw_sp = fp.getAddressAt(VM.getVM().getAddressSize() * SP_OFFSET_IN_GREGSET); Address pc = fp.getAddressAt(VM.getVM().getAddressSize() * PC_OFFSET_IN_GREGSET); - // System.out.println(" next frame's SP: " + sp + " PC: " + pc); return new SPARCFrame(raw_sp, pc); } } @@ -562,10 +577,8 @@ public class SPARCFrame extends Frame { // sender's _interpreter_sp_adjustment field. if (VM.getVM().getInterpreter().contains(pc)) { isInterpreted = true; - if (VM.getVM().isClientCompiler()) { - map.makeIntegerRegsUnsaved(); - map.shiftWindow(sp, youngerSP); - } + map.makeIntegerRegsUnsaved(); + map.shiftWindow(sp, youngerSP); } else { // Find a CodeBlob containing this frame's pc or elide the lookup and use the // supplied blob which is already known to be associated with this frame. diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java index 9bab664f274..a928d56905a 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java @@ -87,12 +87,13 @@ public class PStack extends Tool { while (f != null) { ClosestSymbol sym = f.closestSymbolToPC(); Address pc = f.pc(); + out.print(pc + "\t"); if (sym != null) { String name = sym.getName(); if (cdbgCanDemangle) { name = cdbg.demangle(name); } - out.print(pc + "\t" + name); + out.print(name); long diff = sym.getOffset(); if (diff != 0L) { out.print(" + 0x" + Long.toHexString(diff)); @@ -120,7 +121,6 @@ public class PStack extends Tool { // look for known code blobs CodeCache c = VM.getVM().getCodeCache(); if (c.contains(pc)) { - out.print(pc + "\t"); CodeBlob cb = c.findBlobUnsafe(pc); if (cb.isNMethod()) { names = getJavaNames(th, f.localVariableBase()); @@ -144,18 +144,18 @@ public class PStack extends Tool { out.println(""); } } else { - printUnknown(out,pc); + printUnknown(out); } } // print java frames, if any if (names != null && names.length != 0) { // print java frame(s) for (int i = 0; i < names.length; i++) { - out.println(pc + "\t" + names[i]); + out.println(names[i]); } } } else { - printUnknown(out,pc); + printUnknown(out); } } f = f.sender(); @@ -220,8 +220,8 @@ public class PStack extends Tool { } } - private void printUnknown(PrintStream out, Address pc) { - out.println(pc + "\t????????"); + private void printUnknown(PrintStream out) { + out.println("\t????????"); } private String[] getJavaNames(ThreadProxy th, Address fp) { diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/Field.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/Field.java index bfda1f18640..a4b98adaae2 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/Field.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/Field.java @@ -1,5 +1,5 @@ /* - * Copyright 2000 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/Type.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/Type.java index b565d326d94..1e463987672 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/Type.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/Type.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicField.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicField.java index 10e2b7aa0aa..ecc46f1d3ff 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicField.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicField.java @@ -1,5 +1,5 @@ /* - * Copyright 2000 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicFieldWrapper.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicFieldWrapper.java index 77717bedcda..c4388c94297 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicFieldWrapper.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicFieldWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright 2000 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicOopField.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicOopField.java index 1886a4c5324..3b85996b472 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicOopField.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicOopField.java @@ -1,5 +1,5 @@ /* - * Copyright 2000 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicType.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicType.java index 112ff722cb2..f72bb7ba635 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicType.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicType.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicTypeDataBase.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicTypeDataBase.java index 5db97d60177..f50fb03c16f 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicTypeDataBase.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicTypeDataBase.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/AnnotatedMemoryPanel.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/AnnotatedMemoryPanel.java index 02bb9543842..c76fa142e93 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/AnnotatedMemoryPanel.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/AnnotatedMemoryPanel.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -648,6 +648,6 @@ public class AnnotatedMemoryPanel extends JPanel { System.exit(0); } }); - frame.show(); + frame.setVisible(true); } } diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/CommandProcessorPanel.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/CommandProcessorPanel.java index e340a78a94f..26167e67f9d 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/CommandProcessorPanel.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/CommandProcessorPanel.java @@ -1,5 +1,5 @@ /* - * Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -220,7 +220,7 @@ public class CommandProcessorPanel extends JPanel { } }); frame.setSize(500, 500); - frame.show(); + frame.setVisible(true); panel.requestFocus(); } } diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/DebuggerConsolePanel.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/DebuggerConsolePanel.java index 7317fa0955c..c037fc1bf38 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/DebuggerConsolePanel.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/DebuggerConsolePanel.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2001 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -226,7 +226,7 @@ public class DebuggerConsolePanel extends JPanel { } }); frame.setSize(500, 500); - frame.show(); + frame.setVisible(true); panel.requestFocus(); } } diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/FindInHeapPanel.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/FindInHeapPanel.java index a3eae3bca8d..5dec6019ab0 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/FindInHeapPanel.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/FindInHeapPanel.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/HighPrecisionJScrollBar.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/HighPrecisionJScrollBar.java index 073afd6e6a7..7a8cfb6876b 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/HighPrecisionJScrollBar.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/HighPrecisionJScrollBar.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2002 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -424,7 +424,7 @@ public class HighPrecisionJScrollBar extends JScrollBar { } }); frame.getContentPane().add(hpsb); - frame.show(); + frame.setVisible(true); } } diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/JFrameWrapper.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/JFrameWrapper.java index 70cece15b4f..81d02573149 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/JFrameWrapper.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/JFrameWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright 2001 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -43,7 +43,7 @@ public class JFrameWrapper implements FrameWrapper { public void setVisible(boolean visible) { frame.setVisible(visible); } public void setSize(int x, int y) { frame.setSize(x, y); } public void pack() { frame.pack(); } - public void show() { frame.show(); } + public void show() { frame.setVisible(true); } public void dispose() { frame.dispose(); } public void setBackground(Color color) { frame.setBackground(color); } public void setResizable(boolean resizable) { frame.setResizable(resizable); } diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/classbrowser/HTMLGenerator.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/classbrowser/HTMLGenerator.java index 6d66bb77d84..d9b8f5bbced 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/classbrowser/HTMLGenerator.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/classbrowser/HTMLGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/treetable/JTreeTable.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/treetable/JTreeTable.java index 42b0c94da9e..1d3fff4abb2 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/treetable/JTreeTable.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/ui/treetable/JTreeTable.java @@ -1,5 +1,5 @@ /* - * Copyright 2001 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -477,9 +477,9 @@ public class JTreeTable extends JTable { static class TreeTableTextField extends JTextField { public int offset; - public void reshape(int x, int y, int w, int h) { + public void setBounds(int x, int y, int w, int h) { int newX = Math.max(x, offset); - super.reshape(newX, y, w - (newX - x), h); + super.setBounds(newX, y, w - (newX - x), h); } } diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/AbstractHeapGraphWriter.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/AbstractHeapGraphWriter.java index 0da5005f604..31880e8eab7 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/AbstractHeapGraphWriter.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/AbstractHeapGraphWriter.java @@ -1,5 +1,5 @@ /* - * Copyright 2004-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2004-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java index 16226721865..bcd4f42ff94 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java @@ -1,5 +1,5 @@ /* - * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2004-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/ReversePtrsAnalysis.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/ReversePtrsAnalysis.java index f5ca60a8e5c..3fde2fd3560 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/ReversePtrsAnalysis.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/ReversePtrsAnalysis.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/RobustOopDeterminator.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/RobustOopDeterminator.java index 2d6957f5812..255a98f6f08 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/RobustOopDeterminator.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/RobustOopDeterminator.java @@ -1,5 +1,5 @@ /* - * Copyright 2000 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/Makefile b/hotspot/make/Makefile index 2fc73534b4e..bd2744180ce 100644 --- a/hotspot/make/Makefile +++ b/hotspot/make/Makefile @@ -1,5 +1,5 @@ # -# Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/defs.make b/hotspot/make/defs.make index 056d90c4846..5e94726b3f3 100644 --- a/hotspot/make/defs.make +++ b/hotspot/make/defs.make @@ -1,5 +1,5 @@ # -# Copyright 2006-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -228,6 +228,7 @@ endif # Required make macro settings for all platforms MAKE_ARGS += JAVA_HOME=$(ABS_BOOTDIR) +MAKE_ARGS += OUTPUTDIR=$(ABS_OUTPUTDIR) MAKE_ARGS += GAMMADIR=$(ABS_GAMMADIR) MAKE_ARGS += MAKE_VERBOSE=$(MAKE_VERBOSE) MAKE_ARGS += HOTSPOT_RELEASE_VERSION=$(HOTSPOT_RELEASE_VERSION) diff --git a/hotspot/make/hotspot_distro b/hotspot/make/hotspot_distro index 9b111a2b3ec..bae47300e58 100644 --- a/hotspot/make/hotspot_distro +++ b/hotspot/make/hotspot_distro @@ -1,5 +1,5 @@ # -# Copyright 2006-2007 Sun Microsystems, Inc. All rights reserved. +# Copyright 2006-2008 Sun Microsystems, Inc. All rights reserved. # SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. # diff --git a/hotspot/make/hotspot_version b/hotspot/make/hotspot_version index c4478727175..b30abbb8928 100644 --- a/hotspot/make/hotspot_version +++ b/hotspot/make/hotspot_version @@ -1,5 +1,5 @@ # -# Copyright 2006-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -33,7 +33,7 @@ # Don't put quotes (fail windows build). HOTSPOT_VM_COPYRIGHT=Copyright 2008 -HS_MAJOR_VER=13 +HS_MAJOR_VER=14 HS_MINOR_VER=0 HS_BUILD_NUMBER=01 diff --git a/hotspot/make/jprt.config b/hotspot/make/jprt.config index 2c1f0dce2f4..dd9940763c2 100644 --- a/hotspot/make/jprt.config +++ b/hotspot/make/jprt.config @@ -1,6 +1,6 @@ #!echo "This is not a shell script" # -# Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -68,8 +68,23 @@ if [ "${osname}" = SunOS ] ; then solaris_arch=i386 fi - # Get the SS11 compilers into path (make sure it matches ALT setting) - compiler_path=${slashjava}/devtools/${solaris_arch}/SUNWspro/SS11/bin + if [ "${JPRT_SOLARIS_COMPILER_NAME}" != "" ] ; then + compiler_name=${JPRT_SOLARIS_COMPILER_NAME} + else + if [ "${JPRT_JOB_PRODUCT_RELEASE}" = "jdk6" -o \ + "${JPRT_JOB_PRODUCT_RELEASE}" = "jdk6u10" -o \ + "${JPRT_JOB_PRODUCT_RELEASE}" = "jdk6perf" ] ; then + # All jdk6 builds use SS11 + compiler_name=SS11 + else + # FIXUP: Change to SS12 once it has been validated. + #compiler_name=SS12 + compiler_name=SS11 + fi + fi + + # Get into path (make sure it matches ALT setting) + compiler_path=${slashjava}/devtools/${solaris_arch}/SUNWspro/${compiler_name}/bin dirMustExist "${compiler_path}" COMPILER_PATH path4sdk=${compiler_path} diff --git a/hotspot/make/jprt.properties b/hotspot/make/jprt.properties index fd5a75de042..459867eae08 100644 --- a/hotspot/make/jprt.properties +++ b/hotspot/make/jprt.properties @@ -1,5 +1,5 @@ # -# Copyright 2006-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -24,209 +24,274 @@ # Properties for jprt -JPRT.tools.default.release=jdk1.7.0 +# All build result bundles are full jdks, so the 64bit testing does not +# need the 32bit sibling bundle installed. +# Note: If the hotspot/make/Makefile changed to only bundle the 64bit files +# when bundling 64bit, and stripped out the 64bit files from any 32bit +# bundles, then this setting would be need to be "true". -# Build result bundles are not partial builds| but include everything -JPRT.need.sibling.build=false +jprt.need.sibling.build=false -# Directories needed to build -JPRT.bundle.src.dirs=make src agent -JPRT.bundle.exclude.src.dirs=build +# At submit time, the release supplied will be in jprt.submit.release +# and will be one of the official release names defined in jprt. +# jprt supports property value expansion using ${property.name} syntax. +# This tells jprt what default release we want to build -# Standard list of JPRT build targets for this workspace -JPRT.build.targets= \ - solaris_sparc_5.10-{product|fastdebug|debug}, \ - solaris_sparcv9_5.10-{product|fastdebug|debug}, \ - solaris_i586_5.10-{product|fastdebug|debug}, \ - solaris_x64_5.10-{product|fastdebug|debug}, \ - linux_i586-{product|fastdebug|debug}, \ - linux_x64-{product|fastdebug}, \ - windows_i586-{product|fastdebug|debug}, \ - windows_x64-{product|fastdebug|debug} +jprt.tools.default.release=${jprt.submit.release} -# Standard list of JPRT test targets for this workspace -JPRT.test.targets = \ - solaris_sparc_5.10-{product|fastdebug}-{c1|c2}-jvm98, \ - solaris_sparc_5.10-{product|fastdebug}-{c1|c2}-scimark, \ - solaris_sparcv9_5.10-{product|fastdebug}-c2-jvm98, \ - solaris_sparcv9_5.10-{product|fastdebug}-c2-scimark, \ - solaris_i586_5.10-{product|fastdebug}-{c1|c2}-jvm98, \ - solaris_i586_5.10-{product|fastdebug}-{c1|c2}-scimark, \ - solaris_x64_5.10-{product|fastdebug}-c2-jvm98, \ - solaris_x64_5.10-{product|fastdebug}-c2-scimark, \ - linux_i586-{product|fastdebug}-{c1|c2}-jvm98, \ - linux_i586-{product|fastdebug}-{c1|c2}-scimark, \ - linux_x64-{product|fastdebug}-c2-jvm98, \ - linux_x64-{product|fastdebug}-c2-scimark, \ - windows_i586-{product|fastdebug}-{c1|c2}-jvm98, \ - windows_i586-{product|fastdebug}-{c1|c2}-scimark, \ - windows_x64-{product|fastdebug}-c2-jvm98, \ - windows_x64-{product|fastdebug}-c2-scimark, \ - solaris_sparc_5.10-product-{c1|c2}-runThese, \ - solaris_sparc_5.10-product-{c1|c2}-runThese_Xcomp, \ - solaris_sparc_5.10-product-{c1|c2}-runThese_Xcomp_2, \ - solaris_sparc_5.10-product-{c1|c2}-runThese_Xcomp_3, \ - solaris_sparc_5.10-fastdebug-c1-runThese_Xshare, \ - solaris_sparc_5.10-{product|fastdebug}-{c1|c2}-GCBasher_default, \ - solaris_sparc_5.10-{product|fastdebug}-{c1|c2}-GCBasher_SerialGC, \ - solaris_sparc_5.10-{product|fastdebug}-{c1|c2}-GCBasher_ParallelGC, \ - solaris_sparc_5.10-{product|fastdebug}-{c1|c2}-GCBasher_ParNewGC, \ - solaris_sparc_5.10-{product|fastdebug}-{c1|c2}-GCBasher_CMS, \ - solaris_sparc_5.10-{product|fastdebug}-{c1|c2}-GCBasher_default_2, \ - solaris_sparc_5.10-{product|fastdebug}-{c1|c2}-GCBasher_SerialGC_2, \ - solaris_sparc_5.10-{product|fastdebug}-{c1|c2}-GCBasher_ParallelGC_2, \ - solaris_sparc_5.10-{product|fastdebug}-{c1|c2}-GCBasher_ParNewGC_2, \ - solaris_sparc_5.10-{product|fastdebug}-{c1|c2}-GCBasher_CMS_2, \ - solaris_sparc_5.10-{product|fastdebug}-{c1|c2}-GCOld_default, \ - solaris_sparc_5.10-{product|fastdebug}-{c1|c2}-GCOld_SerialGC, \ - solaris_sparc_5.10-{product|fastdebug}-{c1|c2}-GCOld_ParallelGC, \ - solaris_sparc_5.10-{product|fastdebug}-{c1|c2}-GCOld_ParNewGC, \ - solaris_sparc_5.10-{product|fastdebug}-{c1|c2}-GCOld_CMS, \ - solaris_sparc_5.10-{product|fastdebug}-{c1|c2}-jbb_default, \ - solaris_sparc_5.10-{product|fastdebug}-{c1|c2}-jbb_SerialGC, \ - solaris_sparc_5.10-{product|fastdebug}-{c1|c2}-jbb_ParallelGC, \ - solaris_sparc_5.10-{product|fastdebug}-{c1|c2}-jbb_CMS, \ - solaris_sparc_5.10-{product|fastdebug}-{c1|c2}-scimark_2, \ - solaris_sparc_5.10-{product|fastdebug}-{c1|c2}-scimark_3, \ - solaris_sparcv9_5.10-product-c2-runThese, \ - solaris_sparcv9_5.10-product-c2-runThese_Xcomp, \ - solaris_sparcv9_5.10-product-c2-runThese_Xcomp_2, \ - solaris_sparcv9_5.10-product-c2-runThese_Xcomp_3, \ - solaris_sparcv9_5.10-{product|fastdebug}-c2-GCBasher_default, \ - solaris_sparcv9_5.10-{product|fastdebug}-c2-GCBasher_SerialGC, \ - solaris_sparcv9_5.10-{product|fastdebug}-c2-GCBasher_ParallelGC, \ - solaris_sparcv9_5.10-{product|fastdebug}-c2-GCBasher_ParNewGC, \ - solaris_sparcv9_5.10-{product|fastdebug}-c2-GCBasher_CMS, \ - solaris_sparcv9_5.10-{product|fastdebug}-c2-GCBasher_default_2, \ - solaris_sparcv9_5.10-{product|fastdebug}-c2-GCBasher_SerialGC_2, \ - solaris_sparcv9_5.10-{product|fastdebug}-c2-GCBasher_ParallelGC_2, \ - solaris_sparcv9_5.10-{product|fastdebug}-c2-GCBasher_ParNewGC_2, \ - solaris_sparcv9_5.10-{product|fastdebug}-c2-GCBasher_CMS_2, \ - solaris_sparcv9_5.10-{product|fastdebug}-c2-GCOld_default, \ - solaris_sparcv9_5.10-{product|fastdebug}-c2-GCOld_SerialGC, \ - solaris_sparcv9_5.10-{product|fastdebug}-c2-GCOld_ParallelGC, \ - solaris_sparcv9_5.10-{product|fastdebug}-c2-GCOld_ParNewGC, \ - solaris_sparcv9_5.10-{product|fastdebug}-c2-GCOld_CMS, \ - solaris_sparcv9_5.10-{product|fastdebug}-c2-jbb_default, \ - solaris_sparcv9_5.10-{product|fastdebug}-c2-jbb_SerialGC, \ - solaris_sparcv9_5.10-{product|fastdebug}-c2-jbb_ParallelGC, \ - solaris_sparcv9_5.10-{product|fastdebug}-c2-jbb_CMS, \ - solaris_sparcv9_5.10-{product|fastdebug}-c2-scimark_2, \ - solaris_sparcv9_5.10-{product|fastdebug}-c2-scimark_3, \ - solaris_x64-product-c2-runThese, \ - solaris_x64-product-c2-runThese_Xcomp, \ - solaris_x64-{product|fastdebug}-c2-GCBasher_default, \ - solaris_x64-{product|fastdebug}-c2-GCBasher_SerialGC, \ - solaris_x64-{product|fastdebug}-c2-GCBasher_ParallelGC, \ - solaris_x64-{product|fastdebug}-c2-GCBasher_ParNewGC, \ - solaris_x64-{product|fastdebug}-c2-GCBasher_CMS, \ - solaris_x64-{product|fastdebug}-c2-GCBasher_default_2, \ - solaris_x64-{product|fastdebug}-c2-GCBasher_SerialGC_2, \ - solaris_x64-{product|fastdebug}-c2-GCBasher_ParallelGC_2, \ - solaris_x64-{product|fastdebug}-c2-GCBasher_ParNewGC_2, \ - solaris_x64-{product|fastdebug}-c2-GCBasher_CMS_2, \ - solaris_x64-{product|fastdebug}-c2-GCOld_default, \ - solaris_x64-{product|fastdebug}-c2-GCOld_SerialGC, \ - solaris_x64-{product|fastdebug}-c2-GCOld_ParallelGC, \ - solaris_x64-{product|fastdebug}-c2-GCOld_ParNewGC, \ - solaris_x64-{product|fastdebug}-c2-GCOld_CMS, \ - solaris_x64-{product|fastdebug}-c2-jbb_default, \ - solaris_x64-{product|fastdebug}-c2-jbb_SerialGC, \ - solaris_x64-{product|fastdebug}-c2-jbb_ParallelGC, \ - solaris_x64-{product|fastdebug}-c2-jbb_CMS, \ - solaris_i586_5.10-product-{c1|c2}-runThese_Xcomp, \ - solaris_i586_5.10-product-c2-runThese_Xcomp_2, \ - solaris_i586_5.10-fastdebug-c1-runThese_Xcomp_2, \ - solaris_i586_5.10-fastdebug-c1-runThese_Xshare, \ - solaris_i586_5.10-product-c1-GCBasher_default, \ - solaris_i586_5.10-product-c1-GCBasher_SerialGC, \ - solaris_i586_5.10-product-c1-GCBasher_ParallelGC, \ - solaris_i586_5.10-product-c1-GCBasher_ParNewGC, \ - solaris_i586_5.10-product-c1-GCBasher_CMS, \ - solaris_i586_5.10-fastdebug-c2-GCBasher_default, \ - solaris_i586_5.10-fastdebug-c2-GCBasher_SerialGC, \ - solaris_i586_5.10-fastdebug-c2-GCBasher_ParallelGC, \ - solaris_i586_5.10-fastdebug-c2-GCBasher_ParNewGC, \ - solaris_i586_5.10-fastdebug-c2-GCBasher_CMS, \ - solaris_i586_5.10-product-c1-GCOld_default, \ - solaris_i586_5.10-product-c1-GCOld_SerialGC, \ - solaris_i586_5.10-product-c1-GCOld_ParallelGC, \ - solaris_i586_5.10-product-c1-GCOld_ParNewGC, \ - solaris_i586_5.10-product-c1-GCOld_CMS, \ - solaris_i586_5.10-fastdebug-c2-jbb_default, \ - solaris_i586_5.10-fastdebug-c2-jbb_ParallelGC, \ - solaris_i586_5.10-fastdebug-c2-jbb_CMS, \ - solaris_i586_5.10-{product|fastdebug}-{c1|c2}-scimark_2, \ - solaris_i586_5.10-{product|fastdebug}-{c1|c2}-scimark_3, \ - linux_i586-product-c1-runThese_Xcomp, \ - linux_i586-product-c1-runThese_Xcomp_2, \ - linux_i586-product-c1-runThese_Xcomp_3, \ - linux_i586-fastdebug-c1-runThese_Xshare, \ - linux_i586-fastdebug-c2-runThese_Xcomp, \ - linux_i586-fastdebug-c2-runThese_Xcomp_2, \ - linux_i586-{product|fastdebug}-{c1|c2}-GCBasher_default, \ - linux_i586-{product|fastdebug}-{c1|c2}-GCBasher_SerialGC, \ - linux_i586-{product|fastdebug}-{c1|c2}-GCBasher_ParallelGC, \ - linux_i586-{product|fastdebug}-{c1|c2}-GCBasher_ParNewGC, \ - linux_i586-{product|fastdebug}-{c1|c2}-GCBasher_CMS, \ - linux_i586-product-{c1|c2}-GCOld_default, \ - linux_i586-product-{c1|c2}-GCOld_SerialGC, \ - linux_i586-product-{c1|c2}-GCOld_ParallelGC, \ - linux_i586-product-{c1|c2}-GCOld_ParNewGC, \ - linux_i586-product-{c1|c2}-GCOld_CMS, \ - linux_i586-{product|fastdebug}-c1-jbb_default, \ - linux_i586-{product|fastdebug}-c1-jbb_ParallelGC, \ - linux_i586-{product|fastdebug}-c1-jbb_CMS, \ - linux_i586-{product|fastdebug}-c2-scimark_2, \ - linux_i586-{product|fastdebug}-c2-scimark_3, \ - linux_x64-{product|fastdebug}-c2-GCBasher_default, \ - linux_x64-{product|fastdebug}-c2-GCBasher_SerialGC, \ - linux_x64-{product|fastdebug}-c2-GCBasher_ParallelGC, \ - linux_x64-{product|fastdebug}-c2-GCBasher_ParNewGC, \ - linux_x64-{product|fastdebug}-c2-GCBasher_CMS, \ - linux_x64-{product|fastdebug}-c2-GCOld_default, \ - linux_x64-{product|fastdebug}-c2-GCOld_SerialGC, \ - linux_x64-{product|fastdebug}-c2-GCOld_ParallelGC, \ - linux_x64-{product|fastdebug}-c2-GCOld_ParNewGC, \ - linux_x64-{product|fastdebug}-c2-GCOld_CMS, \ - linux_x64-{product|fastdebug}-c2-jbb_default, \ - linux_x64-{product|fastdebug}-c2-jbb_ParallelGC, \ - linux_x64-{product|fastdebug}-c2-scimark_2, \ - linux_x64-{product|fastdebug}-c2-scimark_3, \ - windows_i586-product-{c1|c2}-runThese, \ - windows_i586-product-{c1|c2}-runThese_Xcomp, \ - windows_i586-fastdebug-c1-runThese_Xshare, \ - windows_i586-{product|fastdebug}-{c1|c2}-GCBasher_default, \ - windows_i586-{product|fastdebug}-{c1|c2}-GCBasher_SerialGC, \ - windows_i586-{product|fastdebug}-{c1|c2}-GCBasher_ParallelGC, \ - windows_i586-{product|fastdebug}-{c1|c2}-GCBasher_ParNewGC, \ - windows_i586-{product|fastdebug}-{c1|c2}-GCBasher_CMS, \ - windows_i586-product-{c1|c2}-GCOld_default, \ - windows_i586-product-{c1|c2}-GCOld_SerialGC, \ - windows_i586-product-{c1|c2}-GCOld_ParallelGC, \ - windows_i586-product-{c1|c2}-GCOld_ParNewGC, \ - windows_i586-product-{c1|c2}-GCOld_CMS, \ - windows_i586-{product|fastdebug}-{c1|c2}-jbb_default, \ - windows_i586-product-{c1|c2}-jbb_ParallelGC, \ - windows_i586-product-{c1|c2}-jbb_CMS, \ - windows_i586-product-{c1|c2}-scimark_2, \ - windows_i586-product-{c1|c2}-scimark_3, \ - windows_x64-product-c2-runThese, \ - windows_x64-product-c2-runThese_Xcomp, \ - windows_x64-{product|fastdebug}-c2-GCBasher_default, \ - windows_x64-{product|fastdebug}-c2-GCBasher_SerialGC, \ - windows_x64-{product|fastdebug}-c2-GCBasher_ParallelGC, \ - windows_x64-{product|fastdebug}-c2-GCBasher_ParNewGC, \ - windows_x64-{product|fastdebug}-c2-GCBasher_CMS, \ - windows_x64-{product|fastdebug}-c2-GCOld_default, \ - windows_x64-{product|fastdebug}-c2-GCOld_SerialGC, \ - windows_x64-{product|fastdebug}-c2-GCOld_ParallelGC, \ - windows_x64-{product|fastdebug}-c2-GCOld_ParNewGC, \ - windows_x64-{product|fastdebug}-c2-GCOld_CMS, \ - windows_x64-{product|fastdebug}-c2-jbb_default, \ - windows_x64-product-c2-jbb_CMS, \ - windows_x64-product-c2-jbb_ParallelGC, \ - windows_x64-{product|fastdebug}-c2-scimark_2, \ - windows_x64-{product|fastdebug}-c2-scimark_3 +# Define the Solaris platforms we want for the various releases + +jprt.my.solaris.sparc.jdk7=solaris_sparc_5.10 +jprt.my.solaris.sparc.jdk6=solaris_sparc_5.8 +jprt.my.solaris.sparc.jdk6perf=solaris_sparc_5.8 +jprt.my.solaris.sparc.jdk6u10=solaris_sparc_5.8 +jprt.my.solaris.sparc=${jprt.my.solaris.sparc.${jprt.tools.default.release}} + +jprt.my.solaris.sparcv9.jdk7=solaris_sparcv9_5.10 +jprt.my.solaris.sparcv9.jdk6=solaris_sparcv9_5.8 +jprt.my.solaris.sparcv9.jdk6perf=solaris_sparcv9_5.8 +jprt.my.solaris.sparcv9.jdk6u10=solaris_sparcv9_5.8 +jprt.my.solaris.sparcv9=${jprt.my.solaris.sparcv9.${jprt.tools.default.release}} + +jprt.my.solaris.i586.jdk7=solaris_i586_5.10 +jprt.my.solaris.i586.jdk6=solaris_i586_5.8 +jprt.my.solaris.i586.jdk6perf=solaris_i586_5.8 +jprt.my.solaris.i586.jdk6u10=solaris_i586_5.8 +jprt.my.solaris.i586=${jprt.my.solaris.i586.${jprt.tools.default.release}} + +jprt.my.solaris.x64.jdk7=solaris_x64_5.10 +jprt.my.solaris.x64.jdk6=solaris_x64_5.10 +jprt.my.solaris.x64.jdk6perf=solaris_x64_5.10 +jprt.my.solaris.x64.jdk6u10=solaris_x64_5.10 +jprt.my.solaris.x64=${jprt.my.solaris.x64.${jprt.tools.default.release}} + +jprt.my.linux.i586=linux_i586 +jprt.my.linux.x64=linux_x64 +jprt.my.windows.i586=windows_i586 +jprt.my.windows.x64=windows_x64 + +# Standard list of jprt build targets for this source tree + +jprt.build.targets= \ + ${jprt.my.solaris.sparc}-{product|fastdebug|debug}, \ + ${jprt.my.solaris.sparcv9}-{product|fastdebug|debug}, \ + ${jprt.my.solaris.i586}-{product|fastdebug|debug}, \ + ${jprt.my.solaris.x64}-{product|fastdebug|debug}, \ + ${jprt.my.linux.i586}-{product|fastdebug|debug}, \ + ${jprt.my.linux.x64}-{product|fastdebug}, \ + ${jprt.my.windows.i586}-{product|fastdebug|debug}, \ + ${jprt.my.windows.x64}-{product|fastdebug|debug} + +# Subset lists of test targets for this source tree + +jprt.my.solaris.sparc.test.targets= \ + ${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-jvm98, \ + ${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-scimark, \ + ${jprt.my.solaris.sparc}-product-{c1|c2}-runThese, \ + ${jprt.my.solaris.sparc}-product-{c1|c2}-runThese_Xcomp, \ + ${jprt.my.solaris.sparc}-product-{c1|c2}-runThese_Xcomp_2, \ + ${jprt.my.solaris.sparc}-product-{c1|c2}-runThese_Xcomp_3, \ + ${jprt.my.solaris.sparc}-fastdebug-c1-runThese_Xshare, \ + ${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCBasher_default, \ + ${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCBasher_SerialGC, \ + ${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCBasher_ParallelGC, \ + ${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCBasher_ParNewGC, \ + ${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCBasher_CMS, \ + ${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCBasher_default_2, \ + ${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCBasher_SerialGC_2, \ + ${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCBasher_ParallelGC_2, \ + ${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCBasher_ParNewGC_2, \ + ${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCBasher_CMS_2, \ + ${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCOld_default, \ + ${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCOld_SerialGC, \ + ${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCOld_ParallelGC, \ + ${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCOld_ParNewGC, \ + ${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCOld_CMS, \ + ${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-jbb_default, \ + ${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-jbb_SerialGC, \ + ${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-jbb_ParallelGC, \ + ${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-jbb_CMS, \ + ${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-scimark_2, \ + ${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-scimark_3 + +jprt.my.solaris.sparcv9.test.targets= \ + ${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-jvm98, \ + ${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-scimark, \ + ${jprt.my.solaris.sparcv9}-product-c2-runThese, \ + ${jprt.my.solaris.sparcv9}-product-c2-runThese_Xcomp, \ + ${jprt.my.solaris.sparcv9}-product-c2-runThese_Xcomp_2, \ + ${jprt.my.solaris.sparcv9}-product-c2-runThese_Xcomp_3, \ + ${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCBasher_default, \ + ${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCBasher_SerialGC, \ + ${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCBasher_ParallelGC, \ + ${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCBasher_ParNewGC, \ + ${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCBasher_CMS, \ + ${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCBasher_default_2, \ + ${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCBasher_SerialGC_2, \ + ${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCBasher_ParallelGC_2, \ + ${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCBasher_ParNewGC_2, \ + ${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCBasher_CMS_2, \ + ${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCOld_default, \ + ${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCOld_SerialGC, \ + ${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCOld_ParallelGC, \ + ${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCOld_ParNewGC, \ + ${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCOld_CMS, \ + ${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-jbb_default, \ + ${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-jbb_SerialGC, \ + ${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-jbb_ParallelGC, \ + ${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-jbb_CMS, \ + ${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-scimark_2, \ + ${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-scimark_3 + +jprt.my.solaris.x64.test.targets= \ + ${jprt.my.solaris.x64}-{product|fastdebug}-c2-jvm98, \ + ${jprt.my.solaris.x64}-{product|fastdebug}-c2-scimark, \ + ${jprt.my.solaris.x64}-product-c2-runThese, \ + ${jprt.my.solaris.x64}-product-c2-runThese_Xcomp, \ + ${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCBasher_default, \ + ${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCBasher_SerialGC, \ + ${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCBasher_ParallelGC, \ + ${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCBasher_ParNewGC, \ + ${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCBasher_CMS, \ + ${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCBasher_default_2, \ + ${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCBasher_SerialGC_2, \ + ${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCBasher_ParallelGC_2, \ + ${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCBasher_ParNewGC_2, \ + ${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCBasher_CMS_2, \ + ${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCOld_default, \ + ${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCOld_SerialGC, \ + ${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCOld_ParallelGC, \ + ${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCOld_ParNewGC, \ + ${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCOld_CMS, \ + ${jprt.my.solaris.x64}-{product|fastdebug}-c2-jbb_default, \ + ${jprt.my.solaris.x64}-{product|fastdebug}-c2-jbb_SerialGC, \ + ${jprt.my.solaris.x64}-{product|fastdebug}-c2-jbb_ParallelGC, \ + ${jprt.my.solaris.x64}-{product|fastdebug}-c2-jbb_CMS + +jprt.my.solaris.i586.test.targets= \ + ${jprt.my.solaris.i586}-{product|fastdebug}-{c1|c2}-jvm98, \ + ${jprt.my.solaris.i586}-{product|fastdebug}-{c1|c2}-scimark, \ + ${jprt.my.solaris.i586}-product-{c1|c2}-runThese_Xcomp, \ + ${jprt.my.solaris.i586}-product-c2-runThese_Xcomp_2, \ + ${jprt.my.solaris.i586}-fastdebug-c1-runThese_Xcomp_2, \ + ${jprt.my.solaris.i586}-fastdebug-c1-runThese_Xshare, \ + ${jprt.my.solaris.i586}-product-c1-GCBasher_default, \ + ${jprt.my.solaris.i586}-product-c1-GCBasher_SerialGC, \ + ${jprt.my.solaris.i586}-product-c1-GCBasher_ParallelGC, \ + ${jprt.my.solaris.i586}-product-c1-GCBasher_ParNewGC, \ + ${jprt.my.solaris.i586}-product-c1-GCBasher_CMS, \ + ${jprt.my.solaris.i586}-fastdebug-c2-GCBasher_default, \ + ${jprt.my.solaris.i586}-fastdebug-c2-GCBasher_SerialGC, \ + ${jprt.my.solaris.i586}-fastdebug-c2-GCBasher_ParallelGC, \ + ${jprt.my.solaris.i586}-fastdebug-c2-GCBasher_ParNewGC, \ + ${jprt.my.solaris.i586}-fastdebug-c2-GCBasher_CMS, \ + ${jprt.my.solaris.i586}-product-c1-GCOld_default, \ + ${jprt.my.solaris.i586}-product-c1-GCOld_SerialGC, \ + ${jprt.my.solaris.i586}-product-c1-GCOld_ParallelGC, \ + ${jprt.my.solaris.i586}-product-c1-GCOld_ParNewGC, \ + ${jprt.my.solaris.i586}-product-c1-GCOld_CMS, \ + ${jprt.my.solaris.i586}-fastdebug-c2-jbb_default, \ + ${jprt.my.solaris.i586}-fastdebug-c2-jbb_ParallelGC, \ + ${jprt.my.solaris.i586}-fastdebug-c2-jbb_CMS, \ + ${jprt.my.solaris.i586}-{product|fastdebug}-{c1|c2}-scimark_2, \ + ${jprt.my.solaris.i586}-{product|fastdebug}-{c1|c2}-scimark_3 + +jprt.my.linux.i586.test.targets = \ + ${jprt.my.linux.i586}-{product|fastdebug}-{c1|c2}-jvm98, \ + ${jprt.my.linux.i586}-{product|fastdebug}-{c1|c2}-scimark, \ + ${jprt.my.linux.i586}-product-c1-runThese_Xcomp, \ + ${jprt.my.linux.i586}-product-c1-runThese_Xcomp_2, \ + ${jprt.my.linux.i586}-product-c1-runThese_Xcomp_3, \ + ${jprt.my.linux.i586}-fastdebug-c1-runThese_Xshare, \ + ${jprt.my.linux.i586}-fastdebug-c2-runThese_Xcomp, \ + ${jprt.my.linux.i586}-fastdebug-c2-runThese_Xcomp_2, \ + ${jprt.my.linux.i586}-{product|fastdebug}-{c1|c2}-GCBasher_default, \ + ${jprt.my.linux.i586}-{product|fastdebug}-{c1|c2}-GCBasher_SerialGC, \ + ${jprt.my.linux.i586}-{product|fastdebug}-{c1|c2}-GCBasher_ParallelGC, \ + ${jprt.my.linux.i586}-{product|fastdebug}-{c1|c2}-GCBasher_ParNewGC, \ + ${jprt.my.linux.i586}-{product|fastdebug}-{c1|c2}-GCBasher_CMS, \ + ${jprt.my.linux.i586}-product-{c1|c2}-GCOld_default, \ + ${jprt.my.linux.i586}-product-{c1|c2}-GCOld_SerialGC, \ + ${jprt.my.linux.i586}-product-{c1|c2}-GCOld_ParallelGC, \ + ${jprt.my.linux.i586}-product-{c1|c2}-GCOld_ParNewGC, \ + ${jprt.my.linux.i586}-product-{c1|c2}-GCOld_CMS, \ + ${jprt.my.linux.i586}-{product|fastdebug}-c1-jbb_default, \ + ${jprt.my.linux.i586}-{product|fastdebug}-c1-jbb_ParallelGC, \ + ${jprt.my.linux.i586}-{product|fastdebug}-c1-jbb_CMS, \ + ${jprt.my.linux.i586}-{product|fastdebug}-c2-scimark_2, \ + ${jprt.my.linux.i586}-{product|fastdebug}-c2-scimark_3 + +jprt.my.linux.x64.test.targets = \ + ${jprt.my.linux.x64}-{product|fastdebug}-c2-jvm98, \ + ${jprt.my.linux.x64}-{product|fastdebug}-c2-scimark, \ + ${jprt.my.linux.x64}-{product|fastdebug}-c2-GCBasher_default, \ + ${jprt.my.linux.x64}-{product|fastdebug}-c2-GCBasher_SerialGC, \ + ${jprt.my.linux.x64}-{product|fastdebug}-c2-GCBasher_ParallelGC, \ + ${jprt.my.linux.x64}-{product|fastdebug}-c2-GCBasher_ParNewGC, \ + ${jprt.my.linux.x64}-{product|fastdebug}-c2-GCBasher_CMS, \ + ${jprt.my.linux.x64}-{product|fastdebug}-c2-GCOld_default, \ + ${jprt.my.linux.x64}-{product|fastdebug}-c2-GCOld_SerialGC, \ + ${jprt.my.linux.x64}-{product|fastdebug}-c2-GCOld_ParallelGC, \ + ${jprt.my.linux.x64}-{product|fastdebug}-c2-GCOld_ParNewGC, \ + ${jprt.my.linux.x64}-{product|fastdebug}-c2-GCOld_CMS, \ + ${jprt.my.linux.x64}-{product|fastdebug}-c2-jbb_default, \ + ${jprt.my.linux.x64}-{product|fastdebug}-c2-jbb_ParallelGC, \ + ${jprt.my.linux.x64}-{product|fastdebug}-c2-scimark_2, \ + ${jprt.my.linux.x64}-{product|fastdebug}-c2-scimark_3 + +jprt.my.windows.i586.test.targets = \ + ${jprt.my.windows.i586}-{product|fastdebug}-{c1|c2}-jvm98, \ + ${jprt.my.windows.i586}-{product|fastdebug}-{c1|c2}-scimark, \ + ${jprt.my.windows.i586}-product-{c1|c2}-runThese, \ + ${jprt.my.windows.i586}-product-{c1|c2}-runThese_Xcomp, \ + ${jprt.my.windows.i586}-fastdebug-c1-runThese_Xshare, \ + ${jprt.my.windows.i586}-{product|fastdebug}-{c1|c2}-GCBasher_default, \ + ${jprt.my.windows.i586}-{product|fastdebug}-{c1|c2}-GCBasher_SerialGC, \ + ${jprt.my.windows.i586}-{product|fastdebug}-{c1|c2}-GCBasher_ParallelGC, \ + ${jprt.my.windows.i586}-{product|fastdebug}-{c1|c2}-GCBasher_ParNewGC, \ + ${jprt.my.windows.i586}-{product|fastdebug}-{c1|c2}-GCBasher_CMS, \ + ${jprt.my.windows.i586}-product-{c1|c2}-GCOld_default, \ + ${jprt.my.windows.i586}-product-{c1|c2}-GCOld_SerialGC, \ + ${jprt.my.windows.i586}-product-{c1|c2}-GCOld_ParallelGC, \ + ${jprt.my.windows.i586}-product-{c1|c2}-GCOld_ParNewGC, \ + ${jprt.my.windows.i586}-product-{c1|c2}-GCOld_CMS, \ + ${jprt.my.windows.i586}-{product|fastdebug}-{c1|c2}-jbb_default, \ + ${jprt.my.windows.i586}-product-{c1|c2}-jbb_ParallelGC, \ + ${jprt.my.windows.i586}-product-{c1|c2}-jbb_CMS, \ + ${jprt.my.windows.i586}-product-{c1|c2}-scimark_2, \ + ${jprt.my.windows.i586}-product-{c1|c2}-scimark_3 + +jprt.my.windows.x64.test.targets = \ + ${jprt.my.windows.x64}-{product|fastdebug}-c2-jvm98, \ + ${jprt.my.windows.x64}-{product|fastdebug}-c2-scimark, \ + ${jprt.my.windows.x64}-product-c2-runThese, \ + ${jprt.my.windows.x64}-product-c2-runThese_Xcomp, \ + ${jprt.my.windows.x64}-{product|fastdebug}-c2-GCBasher_default, \ + ${jprt.my.windows.x64}-{product|fastdebug}-c2-GCBasher_SerialGC, \ + ${jprt.my.windows.x64}-{product|fastdebug}-c2-GCBasher_ParallelGC, \ + ${jprt.my.windows.x64}-{product|fastdebug}-c2-GCBasher_ParNewGC, \ + ${jprt.my.windows.x64}-{product|fastdebug}-c2-GCBasher_CMS, \ + ${jprt.my.windows.x64}-{product|fastdebug}-c2-GCOld_default, \ + ${jprt.my.windows.x64}-{product|fastdebug}-c2-GCOld_SerialGC, \ + ${jprt.my.windows.x64}-{product|fastdebug}-c2-GCOld_ParallelGC, \ + ${jprt.my.windows.x64}-{product|fastdebug}-c2-GCOld_ParNewGC, \ + ${jprt.my.windows.x64}-{product|fastdebug}-c2-GCOld_CMS, \ + ${jprt.my.windows.x64}-{product|fastdebug}-c2-jbb_default, \ + ${jprt.my.windows.x64}-product-c2-jbb_CMS, \ + ${jprt.my.windows.x64}-product-c2-jbb_ParallelGC, \ + ${jprt.my.windows.x64}-{product|fastdebug}-c2-scimark_2, \ + ${jprt.my.windows.x64}-{product|fastdebug}-c2-scimark_3 + +# The complete list of test targets for jprt + +jprt.test.targets = \ + ${jprt.my.solaris.sparc.test.targets}, \ + ${jprt.my.solaris.sparcv9.test.targets}, \ + ${jprt.my.solaris.i586.test.targets}, \ + ${jprt.my.solaris.x64.test.targets}, \ + ${jprt.my.linux.i586.test.targets}, \ + ${jprt.my.linux.x64.test.targets}, \ + ${jprt.my.windows.i586.test.targets}, \ + ${jprt.my.windows.x64.test.targets} diff --git a/hotspot/make/linux/Makefile b/hotspot/make/linux/Makefile index 0e1ee65277a..21f2b3d7f5a 100644 --- a/hotspot/make/linux/Makefile +++ b/hotspot/make/linux/Makefile @@ -1,5 +1,5 @@ # -# Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/Queens.class b/hotspot/make/linux/Queens.class deleted file mode 100644 index d4582a04411..00000000000 Binary files a/hotspot/make/linux/Queens.class and /dev/null differ diff --git a/hotspot/make/linux/build.sh b/hotspot/make/linux/build.sh index 4239c6dcbe9..e317fddd4ae 100644 --- a/hotspot/make/linux/build.sh +++ b/hotspot/make/linux/build.sh @@ -1,6 +1,6 @@ #! /bin/sh # -# Copyright 1999-2001 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/adjust-mflags.sh b/hotspot/make/linux/makefiles/adjust-mflags.sh index 325e02d4fb1..169f86b6695 100644 --- a/hotspot/make/linux/makefiles/adjust-mflags.sh +++ b/hotspot/make/linux/makefiles/adjust-mflags.sh @@ -1,6 +1,6 @@ #! /bin/sh # -# Copyright 1999 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/adlc.make b/hotspot/make/linux/makefiles/adlc.make index 16e48c84ed5..5349f5bd323 100644 --- a/hotspot/make/linux/makefiles/adlc.make +++ b/hotspot/make/linux/makefiles/adlc.make @@ -1,5 +1,5 @@ # -# Copyright 1999-2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/amd64.make b/hotspot/make/linux/makefiles/amd64.make index d69cce70b9a..fec7787ec64 100644 --- a/hotspot/make/linux/makefiles/amd64.make +++ b/hotspot/make/linux/makefiles/amd64.make @@ -1,5 +1,5 @@ # -# Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/buildtree.make b/hotspot/make/linux/makefiles/buildtree.make index 54a30d2ad0a..005ef37cd42 100644 --- a/hotspot/make/linux/makefiles/buildtree.make +++ b/hotspot/make/linux/makefiles/buildtree.make @@ -1,5 +1,5 @@ # -# Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -328,18 +328,19 @@ JAVA_FLAG/64 = -d64 WRONG_DATA_MODE_MSG = \ echo "JAVA_HOME must point to $(DATA_MODE)bit JDK." -test_gamma: $(BUILDTREE_MAKE) +test_gamma: $(BUILDTREE_MAKE) $(GAMMADIR)/make/test/Queens.java @echo Creating $@ ... $(QUIETLY) ( \ echo '#!/bin/sh'; \ $(BUILDTREE_COMMENT); \ echo '. ./env.sh'; \ echo "if [ -z \$$JAVA_HOME ]; then { $(NO_JAVA_HOME_MSG); exit 0; }; fi"; \ - echo "if ! \$${JAVA_HOME}/bin/java $(JAVA_FLAG) -fullversion 2>1 > /dev/null"; \ + echo "if ! \$${JAVA_HOME}/bin/java $(JAVA_FLAG) -fullversion 2>&1 > /dev/null"; \ echo "then"; \ echo " $(WRONG_DATA_MODE_MSG); exit 0;"; \ echo "fi"; \ - echo 'CLASSPATH="$(GAMMADIR)/make/$(OS_FAMILY):$$CLASSPATH"'; \ + echo "rm -f Queens.class"; \ + echo "\$${JAVA_HOME}/bin/javac -d . $(GAMMADIR)/make/test/Queens.java"; \ echo '[ -f gamma_g ] && { gamma=gamma_g; }'; \ echo './$${gamma:-gamma} $(TESTFLAGS) Queens < /dev/null'; \ ) > $@ diff --git a/hotspot/make/linux/makefiles/compiler1.make b/hotspot/make/linux/makefiles/compiler1.make index 3573eccfac4..2fc8eb8a8e1 100644 --- a/hotspot/make/linux/makefiles/compiler1.make +++ b/hotspot/make/linux/makefiles/compiler1.make @@ -1,5 +1,5 @@ # -# Copyright 1999-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/compiler2.make b/hotspot/make/linux/makefiles/compiler2.make index 5ef2129ae5a..af1ec8476ca 100644 --- a/hotspot/make/linux/makefiles/compiler2.make +++ b/hotspot/make/linux/makefiles/compiler2.make @@ -1,5 +1,5 @@ # -# Copyright 1999-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/core.make b/hotspot/make/linux/makefiles/core.make index dbe2ee3a8e3..27b1aa7c36f 100644 --- a/hotspot/make/linux/makefiles/core.make +++ b/hotspot/make/linux/makefiles/core.make @@ -1,5 +1,5 @@ # -# Copyright 1999-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/cscope.make b/hotspot/make/linux/makefiles/cscope.make index 13ee5b65d0e..113d4f831af 100644 --- a/hotspot/make/linux/makefiles/cscope.make +++ b/hotspot/make/linux/makefiles/cscope.make @@ -1,5 +1,5 @@ # -# Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/debug.make b/hotspot/make/linux/makefiles/debug.make index 75bb950891d..4743745228d 100644 --- a/hotspot/make/linux/makefiles/debug.make +++ b/hotspot/make/linux/makefiles/debug.make @@ -1,5 +1,5 @@ # -# Copyright 1999-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/defs.make b/hotspot/make/linux/makefiles/defs.make index 7a06eb51276..2925654e677 100644 --- a/hotspot/make/linux/makefiles/defs.make +++ b/hotspot/make/linux/makefiles/defs.make @@ -1,5 +1,5 @@ # -# Copyright 2006-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/dtrace.make b/hotspot/make/linux/makefiles/dtrace.make index ee02f7a7d7c..a46a6758598 100644 --- a/hotspot/make/linux/makefiles/dtrace.make +++ b/hotspot/make/linux/makefiles/dtrace.make @@ -1,5 +1,5 @@ # -# Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/fastdebug.make b/hotspot/make/linux/makefiles/fastdebug.make index c7ae47ac966..740b7584364 100644 --- a/hotspot/make/linux/makefiles/fastdebug.make +++ b/hotspot/make/linux/makefiles/fastdebug.make @@ -1,5 +1,5 @@ # -# Copyright 1999-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/gcc.make b/hotspot/make/linux/makefiles/gcc.make index 66173061293..4a01c29c50e 100644 --- a/hotspot/make/linux/makefiles/gcc.make +++ b/hotspot/make/linux/makefiles/gcc.make @@ -1,5 +1,5 @@ # -# Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -50,14 +50,7 @@ PICFLAG = -fPIC VM_PICFLAG/LIBJVM = $(PICFLAG) VM_PICFLAG/AOUT = - -ifneq ($(BUILDARCH), i486) VM_PICFLAG = $(VM_PICFLAG/$(LINK_INTO)) -else -# PIC has significant overhead on x86, build nonpic VM for now. -# Link JVM at a "good" base location to avoid unnecessary .text patching. -JVM_BASE_ADDR = 0x06000000 -endif CFLAGS += $(VM_PICFLAG) CFLAGS += -fno-rtti @@ -91,8 +84,17 @@ endif # Compiler warnings are treated as errors WARNINGS_ARE_ERRORS = -Werror + # Except for a few acceptable ones +# Since GCC 4.3, -Wconversion has changed its meanings to warn these implicit +# conversions which might affect the values. To avoid that, we need to turn +# it off explicitly. +ifneq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 3 \) \))" "0" +ACCEPTABLE_WARNINGS = -Wpointer-arith -Wsign-compare +else ACCEPTABLE_WARNINGS = -Wpointer-arith -Wconversion -Wsign-compare +endif + CFLAGS_WARN/DEFAULT = $(WARNINGS_ARE_ERRORS) $(ACCEPTABLE_WARNINGS) # Special cases CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@)) diff --git a/hotspot/make/linux/makefiles/hp.make b/hotspot/make/linux/makefiles/hp.make index 5ead8272c16..c616d1a8dc8 100644 --- a/hotspot/make/linux/makefiles/hp.make +++ b/hotspot/make/linux/makefiles/hp.make @@ -1,5 +1,5 @@ # -# Copyright 1999 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/hp1.make b/hotspot/make/linux/makefiles/hp1.make index 7d62469a7f9..36e0d322f0d 100644 --- a/hotspot/make/linux/makefiles/hp1.make +++ b/hotspot/make/linux/makefiles/hp1.make @@ -1,5 +1,5 @@ # -# Copyright 1999 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/i486.make b/hotspot/make/linux/makefiles/i486.make index 63b67762f34..9dd0b4443fa 100644 --- a/hotspot/make/linux/makefiles/i486.make +++ b/hotspot/make/linux/makefiles/i486.make @@ -1,5 +1,5 @@ # -# Copyright 1999-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/ia64.make b/hotspot/make/linux/makefiles/ia64.make index b7c3aa27777..a647bc27e3a 100644 --- a/hotspot/make/linux/makefiles/ia64.make +++ b/hotspot/make/linux/makefiles/ia64.make @@ -1,5 +1,5 @@ # -# Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/jsig.make b/hotspot/make/linux/makefiles/jsig.make index 32d3c2a18d6..0d254bfe8f3 100644 --- a/hotspot/make/linux/makefiles/jsig.make +++ b/hotspot/make/linux/makefiles/jsig.make @@ -1,5 +1,5 @@ # -# Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/jvmg.make b/hotspot/make/linux/makefiles/jvmg.make index 9bf70b45e1b..4b09db64d21 100644 --- a/hotspot/make/linux/makefiles/jvmg.make +++ b/hotspot/make/linux/makefiles/jvmg.make @@ -1,5 +1,5 @@ # -# Copyright 1999-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/jvmti.make b/hotspot/make/linux/makefiles/jvmti.make index a73624857f8..70b33efef11 100644 --- a/hotspot/make/linux/makefiles/jvmti.make +++ b/hotspot/make/linux/makefiles/jvmti.make @@ -1,5 +1,5 @@ # -# Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/launcher.make b/hotspot/make/linux/makefiles/launcher.make index 7284ce3a09e..e367409f00e 100644 --- a/hotspot/make/linux/makefiles/launcher.make +++ b/hotspot/make/linux/makefiles/launcher.make @@ -1,5 +1,5 @@ # -# Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/makedeps.make b/hotspot/make/linux/makefiles/makedeps.make index 7bb452ace33..ae1fa179078 100644 --- a/hotspot/make/linux/makefiles/makedeps.make +++ b/hotspot/make/linux/makefiles/makedeps.make @@ -1,5 +1,5 @@ # -# Copyright 2000-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/mapfile-vers-debug b/hotspot/make/linux/makefiles/mapfile-vers-debug index da8e6798f28..63cce8b1535 100644 --- a/hotspot/make/linux/makefiles/mapfile-vers-debug +++ b/hotspot/make/linux/makefiles/mapfile-vers-debug @@ -3,7 +3,7 @@ # # -# Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -89,6 +89,7 @@ SUNWprivate_1.1 { JVM_FillInStackTrace; JVM_FindClassFromClass; JVM_FindClassFromClassLoader; + JVM_FindClassFromBootLoader; JVM_FindLibraryEntry; JVM_FindLoadedClass; JVM_FindPrimitiveClass; diff --git a/hotspot/make/linux/makefiles/mapfile-vers-jsig b/hotspot/make/linux/makefiles/mapfile-vers-jsig index f7ae7fb22b9..1880c82273d 100644 --- a/hotspot/make/linux/makefiles/mapfile-vers-jsig +++ b/hotspot/make/linux/makefiles/mapfile-vers-jsig @@ -1,7 +1,7 @@ # # -# Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/mapfile-vers-product b/hotspot/make/linux/makefiles/mapfile-vers-product index 7f5407c1309..6a76dd9e97b 100644 --- a/hotspot/make/linux/makefiles/mapfile-vers-product +++ b/hotspot/make/linux/makefiles/mapfile-vers-product @@ -3,7 +3,7 @@ # # -# Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -89,6 +89,7 @@ SUNWprivate_1.1 { JVM_FillInStackTrace; JVM_FindClassFromClass; JVM_FindClassFromClassLoader; + JVM_FindClassFromBootLoader; JVM_FindLibraryEntry; JVM_FindLoadedClass; JVM_FindPrimitiveClass; diff --git a/hotspot/make/linux/makefiles/optimized.make b/hotspot/make/linux/makefiles/optimized.make index 0d6aff8e91d..c391e29ef59 100644 --- a/hotspot/make/linux/makefiles/optimized.make +++ b/hotspot/make/linux/makefiles/optimized.make @@ -1,5 +1,5 @@ # -# Copyright 1999-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/product.make b/hotspot/make/linux/makefiles/product.make index a128c1101fa..43281abea99 100644 --- a/hotspot/make/linux/makefiles/product.make +++ b/hotspot/make/linux/makefiles/product.make @@ -1,5 +1,5 @@ # -# Copyright 1999-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/profiled.make b/hotspot/make/linux/makefiles/profiled.make index c73acc848f8..c5acf86329c 100644 --- a/hotspot/make/linux/makefiles/profiled.make +++ b/hotspot/make/linux/makefiles/profiled.make @@ -1,5 +1,5 @@ # -# Copyright 1999-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/rules.make b/hotspot/make/linux/makefiles/rules.make index a81633de34a..6559388141c 100644 --- a/hotspot/make/linux/makefiles/rules.make +++ b/hotspot/make/linux/makefiles/rules.make @@ -1,5 +1,5 @@ # -# Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -133,10 +133,25 @@ ifeq ($(findstring j,$(MFLAGS)),j) COMPILE_DONE = && { echo Done with $<; } endif +# Include $(NONPIC_OBJ_FILES) definition +ifndef LP64 +include $(GAMMADIR)/make/pic.make +endif + +# The non-PIC object files are only generated for 32 bit platforms. +ifdef LP64 %.o: %.cpp @echo Compiling $< $(QUIETLY) $(REMOVE_TARGET) $(QUIETLY) $(COMPILE.CC) -o $@ $< $(COMPILE_DONE) +else +%.o: %.cpp + @echo Compiling $< + $(QUIETLY) $(REMOVE_TARGET) + $(QUIETLY) $(if $(findstring $@, $(NONPIC_OBJ_FILES)), \ + $(subst $(VM_PICFLAG), ,$(COMPILE.CC)) -o $@ $< $(COMPILE_DONE), \ + $(COMPILE.CC) -o $@ $< $(COMPILE_DONE)) +endif %.o: %.s @echo Assembling $< diff --git a/hotspot/make/linux/makefiles/sa.make b/hotspot/make/linux/makefiles/sa.make index 41843c5887d..94463d6a049 100644 --- a/hotspot/make/linux/makefiles/sa.make +++ b/hotspot/make/linux/makefiles/sa.make @@ -1,5 +1,5 @@ # -# Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/saproc.make b/hotspot/make/linux/makefiles/saproc.make index f0e5d90f382..052adb13413 100644 --- a/hotspot/make/linux/makefiles/saproc.make +++ b/hotspot/make/linux/makefiles/saproc.make @@ -1,5 +1,5 @@ # -# Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/sparc.make b/hotspot/make/linux/makefiles/sparc.make index a86f9f7b6f5..6601c373347 100644 --- a/hotspot/make/linux/makefiles/sparc.make +++ b/hotspot/make/linux/makefiles/sparc.make @@ -1,5 +1,5 @@ # -# Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/sparcWorks.make b/hotspot/make/linux/makefiles/sparcWorks.make index 53819743beb..0a9f75b349a 100644 --- a/hotspot/make/linux/makefiles/sparcWorks.make +++ b/hotspot/make/linux/makefiles/sparcWorks.make @@ -1,5 +1,5 @@ # -# Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/sparcv9.make b/hotspot/make/linux/makefiles/sparcv9.make index 7aad864e51c..d18e73bd2da 100644 --- a/hotspot/make/linux/makefiles/sparcv9.make +++ b/hotspot/make/linux/makefiles/sparcv9.make @@ -1,5 +1,5 @@ # -# Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/tiered.make b/hotspot/make/linux/makefiles/tiered.make index 220124e50e1..5ad7f223c1a 100644 --- a/hotspot/make/linux/makefiles/tiered.make +++ b/hotspot/make/linux/makefiles/tiered.make @@ -1,5 +1,5 @@ # -# Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/top.make b/hotspot/make/linux/makefiles/top.make index f0aa13576d0..2a7579febd7 100644 --- a/hotspot/make/linux/makefiles/top.make +++ b/hotspot/make/linux/makefiles/top.make @@ -1,5 +1,5 @@ # -# Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/linux/makefiles/vm.make b/hotspot/make/linux/makefiles/vm.make index 65b18ef9e87..73caaf9a534 100644 --- a/hotspot/make/linux/makefiles/vm.make +++ b/hotspot/make/linux/makefiles/vm.make @@ -1,5 +1,5 @@ # -# Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/openjdk_distro b/hotspot/make/openjdk_distro index 5eb900d9fcb..b0301aab466 100644 --- a/hotspot/make/openjdk_distro +++ b/hotspot/make/openjdk_distro @@ -1,5 +1,5 @@ # -# Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/pic.make b/hotspot/make/pic.make new file mode 100644 index 00000000000..b20f77c130b --- /dev/null +++ b/hotspot/make/pic.make @@ -0,0 +1,41 @@ +# +# Copyright 2006-2007 Sun Microsystems, Inc. All Rights Reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, +# CA 95054 USA or visit www.sun.com if you need additional information or +# have any questions. +# +# + +# A list of object files built without the platform specific PIC flags, e.g. +# -fPIC on linux. Performance measurements show that by compiling GC related +# code, we could significantly reduce the GC pause time on 32 bit Linux/Unix +# platforms. See 6454213 for more details. +include $(GAMMADIR)/make/scm.make + +ifneq ($(OSNAME), windows) + ifndef LP64 + NONPIC_DIRS = memory oops gc_implementation gc_interface + NONPIC_DIRS := $(foreach dir,$(NONPIC_DIRS), $(GAMMADIR)/src/share/vm/$(dir)) + # Look for source files under NONPIC_DIRS + NONPIC_FILES := $(foreach dir,$(NONPIC_DIRS),\ + $(shell find $(dir) \( $(SCM_DIRS) \) -prune -o \ + -name '*.cpp' -print)) + NONPIC_OBJ_FILES := $(notdir $(subst .cpp,.o,$(NONPIC_FILES))) + endif +endif diff --git a/hotspot/make/sa.files b/hotspot/make/sa.files index 9b524940f3b..6f76f9d8faa 100644 --- a/hotspot/make/sa.files +++ b/hotspot/make/sa.files @@ -1,5 +1,5 @@ # -# Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/Makefile b/hotspot/make/solaris/Makefile index 0751fe9eb53..2e0882303bf 100644 --- a/hotspot/make/solaris/Makefile +++ b/hotspot/make/solaris/Makefile @@ -1,5 +1,5 @@ # -# Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/Queens.class b/hotspot/make/solaris/Queens.class deleted file mode 100644 index d4582a04411..00000000000 Binary files a/hotspot/make/solaris/Queens.class and /dev/null differ diff --git a/hotspot/make/solaris/build.sh b/hotspot/make/solaris/build.sh index bb8d175758c..29bff2d4b8f 100644 --- a/hotspot/make/solaris/build.sh +++ b/hotspot/make/solaris/build.sh @@ -1,6 +1,6 @@ #! /bin/sh # -# Copyright 1998-2000 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/adjust-mflags.sh b/hotspot/make/solaris/makefiles/adjust-mflags.sh index 325e02d4fb1..169f86b6695 100644 --- a/hotspot/make/solaris/makefiles/adjust-mflags.sh +++ b/hotspot/make/solaris/makefiles/adjust-mflags.sh @@ -1,6 +1,6 @@ #! /bin/sh # -# Copyright 1999 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/adlc.make b/hotspot/make/solaris/makefiles/adlc.make index b67ae554da0..f746d77494d 100644 --- a/hotspot/make/solaris/makefiles/adlc.make +++ b/hotspot/make/solaris/makefiles/adlc.make @@ -1,5 +1,5 @@ # -# Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/amd64.make b/hotspot/make/solaris/makefiles/amd64.make index 9b229e83b79..7ce14eae1db 100644 --- a/hotspot/make/solaris/makefiles/amd64.make +++ b/hotspot/make/solaris/makefiles/amd64.make @@ -1,5 +1,5 @@ # -# Copyright 2004-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2004-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -45,10 +45,6 @@ OPT_CFLAGS/os_solaris_x86_64.o = -xO1 OPT_CFLAGS/generateOptoStub.o = -xO2 OPT_CFLAGS/thread.o = -xO2 -# Work around for 6624782 -OPT_CFLAGS/instanceKlass.o = -Qoption ube -no_a2lf -OPT_CFLAGS/objArrayKlass.o = -Qoption ube -no_a2lf - else ifeq ("${Platform_compiler}", "gcc") diff --git a/hotspot/make/solaris/makefiles/buildtree.make b/hotspot/make/solaris/makefiles/buildtree.make index 1fb22360dca..47aced3fc59 100644 --- a/hotspot/make/solaris/makefiles/buildtree.make +++ b/hotspot/make/solaris/makefiles/buildtree.make @@ -1,5 +1,5 @@ # -# Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -340,7 +340,7 @@ JAVA_FLAG/64 = -d64 WRONG_DATA_MODE_MSG = \ echo "JAVA_HOME must point to $(DATA_MODE)bit JDK." -test_gamma: $(BUILDTREE_MAKE) +test_gamma: $(BUILDTREE_MAKE) $(GAMMADIR)/make/test/Queens.java @echo Creating $@ ... $(QUIETLY) ( \ echo '#!/bin/ksh'; \ @@ -351,7 +351,8 @@ test_gamma: $(BUILDTREE_MAKE) echo "then"; \ echo " $(WRONG_DATA_MODE_MSG); exit 0;"; \ echo "fi"; \ - echo 'CLASSPATH="$(GAMMADIR)/make/$(OS_FAMILY):$$CLASSPATH"'; \ + echo "rm -f Queens.class"; \ + echo "\$${JAVA_HOME}/bin/javac -d . $(GAMMADIR)/make/test/Queens.java"; \ echo '[ -f gamma_g ] && { gamma=gamma_g; }'; \ echo './$${gamma:-gamma} $(TESTFLAGS) Queens < /dev/null'; \ ) > $@ diff --git a/hotspot/make/solaris/makefiles/compiler1.make b/hotspot/make/solaris/makefiles/compiler1.make index 3573eccfac4..2fc8eb8a8e1 100644 --- a/hotspot/make/solaris/makefiles/compiler1.make +++ b/hotspot/make/solaris/makefiles/compiler1.make @@ -1,5 +1,5 @@ # -# Copyright 1999-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/compiler2.make b/hotspot/make/solaris/makefiles/compiler2.make index 5ef2129ae5a..af1ec8476ca 100644 --- a/hotspot/make/solaris/makefiles/compiler2.make +++ b/hotspot/make/solaris/makefiles/compiler2.make @@ -1,5 +1,5 @@ # -# Copyright 1999-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/core.make b/hotspot/make/solaris/makefiles/core.make index e52d5b1ecca..e803bdb4ed0 100644 --- a/hotspot/make/solaris/makefiles/core.make +++ b/hotspot/make/solaris/makefiles/core.make @@ -1,5 +1,5 @@ # -# Copyright 1998-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/cscope.make b/hotspot/make/solaris/makefiles/cscope.make index 6fa197a56af..b5518555a50 100644 --- a/hotspot/make/solaris/makefiles/cscope.make +++ b/hotspot/make/solaris/makefiles/cscope.make @@ -1,5 +1,5 @@ # -# Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/debug.make b/hotspot/make/solaris/makefiles/debug.make index d759910be9e..69eb236ada1 100644 --- a/hotspot/make/solaris/makefiles/debug.make +++ b/hotspot/make/solaris/makefiles/debug.make @@ -1,5 +1,5 @@ # -# Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -29,7 +29,8 @@ DEBUG_CFLAGS/DEFAULT= $(DEBUG_CFLAGS) DEBUG_CFLAGS/BYFILE = $(DEBUG_CFLAGS/$@)$(DEBUG_CFLAGS/DEFAULT$(DEBUG_CFLAGS/$@)) ifeq ("${Platform_compiler}", "sparcWorks") -ifeq ($(shell expr $(COMPILER_REV) \>= 5.8), 1) + +ifeq ($(COMPILER_REV),5.8) # SS11 SEGV when compiling with -g and -xarch=v8, using different backend DEBUG_CFLAGS/compileBroker.o = $(DEBUG_CFLAGS) -xO0 DEBUG_CFLAGS/jvmtiTagMap.o = $(DEBUG_CFLAGS) -xO0 diff --git a/hotspot/make/solaris/makefiles/defs.make b/hotspot/make/solaris/makefiles/defs.make index a56e01b65d4..625399a72b3 100644 --- a/hotspot/make/solaris/makefiles/defs.make +++ b/hotspot/make/solaris/makefiles/defs.make @@ -1,5 +1,5 @@ # -# Copyright 2006-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/dtrace.make b/hotspot/make/solaris/makefiles/dtrace.make index f4f7edf934d..bcc7819aa43 100644 --- a/hotspot/make/solaris/makefiles/dtrace.make +++ b/hotspot/make/solaris/makefiles/dtrace.make @@ -1,5 +1,5 @@ # -# Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -92,12 +92,12 @@ XARCH = $(subst sparcv9,v9,$(shell echo $(ISA))) $(XLIBJVM_DB): $(DTRACE_SRCDIR)/$(JVM_DB).c $(JVMOFFS).h $(LIBJVM_DB_MAPFILE) @echo Making $@ $(QUIETLY) mkdir -p 64/ ; \ - $(CC) $(SYMFLAG) -xarch=$(XARCH) -D$(TYPE) -I. -I$(GENERATED) \ + $(CC) $(SYMFLAG) $(ARCHFLAG/$(XARCH)) -D$(TYPE) -I. -I$(GENERATED) \ $(SHARED_FLAG) $(LFLAGS_JVM_DB) -o $@ $(DTRACE_SRCDIR)/$(JVM_DB).c -lc $(XLIBJVM_DTRACE): $(DTRACE_SRCDIR)/$(JVM_DTRACE).c $(DTRACE_SRCDIR)/$(JVM_DTRACE).h $(LIBJVM_DTRACE_MAPFILE) @echo Making $@ $(QUIETLY) mkdir -p 64/ ; \ - $(CC) $(SYMFLAG) -xarch=$(XARCH) -D$(TYPE) -I. \ + $(CC) $(SYMFLAG) $(ARCHFLAG/$(XARCH)) -D$(TYPE) -I. \ $(SHARED_FLAG) $(LFLAGS_JVM_DTRACE) -o $@ $(DTRACE_SRCDIR)/$(JVM_DTRACE).c -lc -lthread -ldoor endif # ifneq ("${ISA}","${BUILDARCH}") diff --git a/hotspot/make/solaris/makefiles/fastdebug.make b/hotspot/make/solaris/makefiles/fastdebug.make index 0329b4c3678..62eaeb8f968 100644 --- a/hotspot/make/solaris/makefiles/fastdebug.make +++ b/hotspot/make/solaris/makefiles/fastdebug.make @@ -1,5 +1,5 @@ # -# Copyright 1998-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,7 @@ # Sets make macros for making debug version of VM # Compiler specific DEBUG_CFLAGS are passed in from gcc.make, sparcWorks.make -# They may also specify FASTDEBUG_CFLAGS, but it defaults to DEBUG_FLAGS. +# They may also specify FASTDEBUG_CFLAGS, but it defaults to DEBUG_CFLAGS. FASTDEBUG_CFLAGS$(FASTDEBUG_CFLAGS) = $(DEBUG_CFLAGS) @@ -35,15 +35,26 @@ OPT_CFLAGS/BYFILE = $(OPT_CFLAGS/$@)$(OPT_CFLAGS/DEFAULT$(OPT_CFLAGS/$@)) ifeq ("${Platform_compiler}", "sparcWorks") OPT_CFLAGS/SLOWER = -xO2 -ifeq ($(shell expr $(COMPILER_REV) \>= 5.5), 1) -# CC 5.5 has bug 4908364 with -xO4 + +# Problem with SS12 compiler, dtrace doesn't like the .o files (bug 6693876) +ifeq ($(COMPILER_REV), 5.9) + # Not clear this workaround could be skipped in some cases. + OPT_CFLAGS/vmGCOperations.o = $(OPT_CFLAGS/SLOWER) + OPT_CFLAGS/java.o = $(OPT_CFLAGS/SLOWER) + OPT_CFLAGS/jni.o = $(OPT_CFLAGS/SLOWER) +endif + +ifeq ($(COMPILER_REV), 5.5) +# CC 5.5 has bug 4908364 with -xO4 (Fixed in 5.6) OPT_CFLAGS/library_call.o = $(OPT_CFLAGS/SLOWER) -else # COMPILER_REV >= 5.5 +endif # COMPILER_REV == 5.5 + +ifeq ($(shell expr $(COMPILER_REV) \<= 5.4), 1) # Compilation of *_.cpp can take an hour or more at O3. Use O2 # See comments at top of sparc.make. OPT_CFLAGS/ad_$(Platform_arch).o = $(OPT_CFLAGS/SLOWER) OPT_CFLAGS/dfa_$(Platform_arch).o = $(OPT_CFLAGS/SLOWER) -endif # COMPILER_REV >= 5.5 +endif # COMPILER_REV <= 5.4 ifeq (${COMPILER_REV}, 5.0) # Avoid a compiler bug caused by using -xO -g diff --git a/hotspot/make/solaris/makefiles/gcc.make b/hotspot/make/solaris/makefiles/gcc.make index d7314b97a85..8a88995f6de 100644 --- a/hotspot/make/solaris/makefiles/gcc.make +++ b/hotspot/make/solaris/makefiles/gcc.make @@ -1,5 +1,5 @@ # -# Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/hp.make b/hotspot/make/solaris/makefiles/hp.make index ddf659bfe19..e2fc3a88b52 100644 --- a/hotspot/make/solaris/makefiles/hp.make +++ b/hotspot/make/solaris/makefiles/hp.make @@ -1,5 +1,5 @@ # -# Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/hp1.make b/hotspot/make/solaris/makefiles/hp1.make index 7d62469a7f9..36e0d322f0d 100644 --- a/hotspot/make/solaris/makefiles/hp1.make +++ b/hotspot/make/solaris/makefiles/hp1.make @@ -1,5 +1,5 @@ # -# Copyright 1999 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/i486.make b/hotspot/make/solaris/makefiles/i486.make index 10b5949bacd..a8f92a361bb 100644 --- a/hotspot/make/solaris/makefiles/i486.make +++ b/hotspot/make/solaris/makefiles/i486.make @@ -1,5 +1,5 @@ # -# Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/jsig.make b/hotspot/make/solaris/makefiles/jsig.make index 29e4c238a9a..e4a4aef771a 100644 --- a/hotspot/make/solaris/makefiles/jsig.make +++ b/hotspot/make/solaris/makefiles/jsig.make @@ -1,5 +1,5 @@ # -# Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/jvmg.make b/hotspot/make/solaris/makefiles/jvmg.make index 24a3510d4a5..ada307af855 100644 --- a/hotspot/make/solaris/makefiles/jvmg.make +++ b/hotspot/make/solaris/makefiles/jvmg.make @@ -1,5 +1,5 @@ # -# Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -29,7 +29,8 @@ DEBUG_CFLAGS/DEFAULT= $(DEBUG_CFLAGS) DEBUG_CFLAGS/BYFILE = $(DEBUG_CFLAGS/$@)$(DEBUG_CFLAGS/DEFAULT$(DEBUG_CFLAGS/$@)) ifeq ("${Platform_compiler}", "sparcWorks") -ifeq ($(shell expr $(COMPILER_REV) \>= 5.8), 1) + +ifeq ($(COMPILER_REV),5.8) # SS11 SEGV when compiling with -g and -xarch=v8, using different backend DEBUG_CFLAGS/compileBroker.o = $(DEBUG_CFLAGS) -xO0 DEBUG_CFLAGS/jvmtiTagMap.o = $(DEBUG_CFLAGS) -xO0 diff --git a/hotspot/make/solaris/makefiles/jvmti.make b/hotspot/make/solaris/makefiles/jvmti.make index 876714eb55d..dc4efa1e9fc 100644 --- a/hotspot/make/solaris/makefiles/jvmti.make +++ b/hotspot/make/solaris/makefiles/jvmti.make @@ -1,5 +1,5 @@ # -# Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/launcher.make b/hotspot/make/solaris/makefiles/launcher.make index 67693bb90b3..2224d58017d 100644 --- a/hotspot/make/solaris/makefiles/launcher.make +++ b/hotspot/make/solaris/makefiles/launcher.make @@ -1,5 +1,5 @@ # -# Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/makedeps.make b/hotspot/make/solaris/makefiles/makedeps.make index 12b01a7da96..751d6ff3417 100644 --- a/hotspot/make/solaris/makefiles/makedeps.make +++ b/hotspot/make/solaris/makefiles/makedeps.make @@ -1,5 +1,5 @@ # -# Copyright 1999-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/mapfile-vers b/hotspot/make/solaris/makefiles/mapfile-vers index f7ed56e5f10..8c9d6883067 100644 --- a/hotspot/make/solaris/makefiles/mapfile-vers +++ b/hotspot/make/solaris/makefiles/mapfile-vers @@ -3,7 +3,7 @@ # # -# Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -89,6 +89,7 @@ SUNWprivate_1.1 { JVM_FillInStackTrace; JVM_FindClassFromClass; JVM_FindClassFromClassLoader; + JVM_FindClassFromBootLoader; JVM_FindLibraryEntry; JVM_FindLoadedClass; JVM_FindPrimitiveClass; diff --git a/hotspot/make/solaris/makefiles/mapfile-vers-COMPILER1 b/hotspot/make/solaris/makefiles/mapfile-vers-COMPILER1 index b4b420867be..c77bda4d223 100644 --- a/hotspot/make/solaris/makefiles/mapfile-vers-COMPILER1 +++ b/hotspot/make/solaris/makefiles/mapfile-vers-COMPILER1 @@ -1,7 +1,7 @@ # # -# Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/mapfile-vers-COMPILER2 b/hotspot/make/solaris/makefiles/mapfile-vers-COMPILER2 index 9e2e5356f55..ee44bf266a9 100644 --- a/hotspot/make/solaris/makefiles/mapfile-vers-COMPILER2 +++ b/hotspot/make/solaris/makefiles/mapfile-vers-COMPILER2 @@ -1,7 +1,7 @@ # # -# Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/mapfile-vers-CORE b/hotspot/make/solaris/makefiles/mapfile-vers-CORE index 25069d55c96..b62ad89fcb1 100644 --- a/hotspot/make/solaris/makefiles/mapfile-vers-CORE +++ b/hotspot/make/solaris/makefiles/mapfile-vers-CORE @@ -1,7 +1,7 @@ # # -# Copyright 2003 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/mapfile-vers-TIERED b/hotspot/make/solaris/makefiles/mapfile-vers-TIERED index 5149a01b598..ee62be5cd96 100644 --- a/hotspot/make/solaris/makefiles/mapfile-vers-TIERED +++ b/hotspot/make/solaris/makefiles/mapfile-vers-TIERED @@ -1,7 +1,7 @@ # # -# Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/mapfile-vers-debug b/hotspot/make/solaris/makefiles/mapfile-vers-debug index 98ce4887aa0..0a7c28078c2 100644 --- a/hotspot/make/solaris/makefiles/mapfile-vers-debug +++ b/hotspot/make/solaris/makefiles/mapfile-vers-debug @@ -1,7 +1,7 @@ # # -# Copyright 2000-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/mapfile-vers-jsig b/hotspot/make/solaris/makefiles/mapfile-vers-jsig index f7ae7fb22b9..1880c82273d 100644 --- a/hotspot/make/solaris/makefiles/mapfile-vers-jsig +++ b/hotspot/make/solaris/makefiles/mapfile-vers-jsig @@ -1,7 +1,7 @@ # # -# Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/mapfile-vers-jvm_db b/hotspot/make/solaris/makefiles/mapfile-vers-jvm_db index 11ac2157b93..95ac685a4b6 100644 --- a/hotspot/make/solaris/makefiles/mapfile-vers-jvm_db +++ b/hotspot/make/solaris/makefiles/mapfile-vers-jvm_db @@ -1,7 +1,7 @@ # # -# Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/mapfile-vers-jvm_dtrace b/hotspot/make/solaris/makefiles/mapfile-vers-jvm_dtrace index e10f098330a..2bde56933c2 100644 --- a/hotspot/make/solaris/makefiles/mapfile-vers-jvm_dtrace +++ b/hotspot/make/solaris/makefiles/mapfile-vers-jvm_dtrace @@ -1,7 +1,7 @@ # # -# Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/mapfile-vers-nonproduct b/hotspot/make/solaris/makefiles/mapfile-vers-nonproduct index b1544b8b6e1..911a3b7fc55 100644 --- a/hotspot/make/solaris/makefiles/mapfile-vers-nonproduct +++ b/hotspot/make/solaris/makefiles/mapfile-vers-nonproduct @@ -1,7 +1,7 @@ # # -# Copyright 2001 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/optimized.make b/hotspot/make/solaris/makefiles/optimized.make index 4e8f6484790..1f91c3124f2 100644 --- a/hotspot/make/solaris/makefiles/optimized.make +++ b/hotspot/make/solaris/makefiles/optimized.make @@ -1,5 +1,5 @@ # -# Copyright 1998-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -30,12 +30,21 @@ OPT_CFLAGS/DEFAULT= $(OPT_CFLAGS) OPT_CFLAGS/BYFILE = $(OPT_CFLAGS/$@)$(OPT_CFLAGS/DEFAULT$(OPT_CFLAGS/$@)) # (OPT_CFLAGS/SLOWER is also available, to alter compilation of buggy files) - -# Workaround SS11 bug 6345274 (all platforms) ifeq ("${Platform_compiler}", "sparcWorks") -ifeq ($(shell expr $(COMPILER_REV) \>= 5.8), 1) + +# Problem with SS12 compiler, dtrace doesn't like the .o files (bug 6693876) +ifeq ($(COMPILER_REV),5.9) + # Not clear this workaround could be skipped in some cases. + OPT_CFLAGS/vmGCOperations.o = $(OPT_CFLAGS/SLOWER) -g + OPT_CFLAGS/java.o = $(OPT_CFLAGS/SLOWER) -g + OPT_CFLAGS/jni.o = $(OPT_CFLAGS/SLOWER) -g +endif + +# Workaround SS11 bug 6345274 (all platforms) (Fixed in SS11 patch and SS12) +ifeq ($(COMPILER_REV),5.8)) OPT_CFLAGS/ciTypeFlow.o = $(OPT_CFLAGS/O2) -endif # COMPILER_REV >= 5.8 +endif # COMPILER_REV == 5.8 + endif # Platform_compiler == sparcWorks # If you set HOTSPARC_GENERIC=yes, you disable all OPT_CFLAGS settings diff --git a/hotspot/make/solaris/makefiles/product.make b/hotspot/make/solaris/makefiles/product.make index d2e78c6646a..66e53536723 100644 --- a/hotspot/make/solaris/makefiles/product.make +++ b/hotspot/make/solaris/makefiles/product.make @@ -1,5 +1,5 @@ # -# Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -38,12 +38,21 @@ OPT_CFLAGS/ciEnv.o = $(OPT_CFLAGS) -xinline=no%__1cFciEnvbFpost_compiled_method_ endif # (OPT_CFLAGS/SLOWER is also available, to alter compilation of buggy files) - -# Workaround SS11 bug 6345274 (all platforms) ifeq ("${Platform_compiler}", "sparcWorks") -ifeq ($(shell expr $(COMPILER_REV) \>= 5.8), 1) + +# Problem with SS12 compiler, dtrace doesn't like the .o files (bug 6693876) +ifeq ($(COMPILER_REV),5.9) + # Not clear this workaround could be skipped in some cases. + OPT_CFLAGS/vmGCOperations.o = $(OPT_CFLAGS/SLOWER) -g + OPT_CFLAGS/java.o = $(OPT_CFLAGS/SLOWER) -g + OPT_CFLAGS/jni.o = $(OPT_CFLAGS/SLOWER) -g +endif + +# Workaround SS11 bug 6345274 (all platforms) (Fixed in SS11 patch and SS12) +ifeq ($(COMPILER_REV),5.8) OPT_CFLAGS/ciTypeFlow.o = $(OPT_CFLAGS/O2) -endif # COMPILER_REV >= 5.8 +endif # COMPILER_REV == 5.8 + endif # Platform_compiler == sparcWorks # If you set HOTSPARC_GENERIC=yes, you disable all OPT_CFLAGS settings diff --git a/hotspot/make/solaris/makefiles/profiled.make b/hotspot/make/solaris/makefiles/profiled.make index 297e6285183..5213aaad43b 100644 --- a/hotspot/make/solaris/makefiles/profiled.make +++ b/hotspot/make/solaris/makefiles/profiled.make @@ -1,5 +1,5 @@ # -# Copyright 1998-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/reorder_COMPILER1_i486 b/hotspot/make/solaris/makefiles/reorder_COMPILER1_i486 index cee930fd1ec..bab5b288d70 100644 --- a/hotspot/make/solaris/makefiles/reorder_COMPILER1_i486 +++ b/hotspot/make/solaris/makefiles/reorder_COMPILER1_i486 @@ -2175,6 +2175,7 @@ text: .text%__1cQjava_lang_StringGlength6FpnHoopDesc__i_; text: .text%jni_GetStringUTFRegion: jni.o; text: .text%__1cQjava_lang_StringOas_utf8_string6FpnHoopDesc_ii_pc_; text: .text%JVM_FindClassFromClassLoader; +text: .text%JVM_FindClassFromBootLoader; text: .text%JVM_IsInterface; text: .text%JVM_GetClassDeclaredConstructors; text: .text%__1cNmethodOopDescOis_initializer6kM_i_; diff --git a/hotspot/make/solaris/makefiles/reorder_COMPILER1_sparc b/hotspot/make/solaris/makefiles/reorder_COMPILER1_sparc index d135e73cfac..0dc59edddac 100644 --- a/hotspot/make/solaris/makefiles/reorder_COMPILER1_sparc +++ b/hotspot/make/solaris/makefiles/reorder_COMPILER1_sparc @@ -1500,6 +1500,7 @@ text: .text%__1cQjava_lang_StringGlength6FpnHoopDesc__i_; text: .text%jni_GetStringUTFRegion: jni.o; text: .text%__1cQjava_lang_StringOas_utf8_string6FpnHoopDesc_ii_pc_; text: .text%JVM_FindClassFromClassLoader; +text: .text%JVM_FindClassFromBootLoader; text: .text%JVM_IsInterface; text: .text%JVM_GetClassDeclaredConstructors; text: .text%__1cNmethodOopDescOis_initializer6kM_i_; diff --git a/hotspot/make/solaris/makefiles/reorder_COMPILER2_amd64 b/hotspot/make/solaris/makefiles/reorder_COMPILER2_amd64 index b4bc7db5b72..4531671c613 100644 --- a/hotspot/make/solaris/makefiles/reorder_COMPILER2_amd64 +++ b/hotspot/make/solaris/makefiles/reorder_COMPILER2_amd64 @@ -4339,6 +4339,7 @@ text: .text%__1cSComputeAdapterInfoIdo_float6M_v_; text: .text%__1cFParseLarray_store6MnJBasicType__v_; text: .text%__1cOmangle_name_on6FpnMoutputStream_pnNsymbolOopDesc_ii_v_: nativeLookup.o; text: .text%JVM_FindClassFromClassLoader; +text: .text%JVM_FindClassFromBootLoader; text: .text%__1cZCallInterpreterDirectNodeSalignment_required6kM_i_; text: .text%__1cZCallInterpreterDirectNodePoper_input_base6kM_I_; text: .text%__1cZCallInterpreterDirectNodeEemit6kMrnKCodeBuffer_pnNPhaseRegAlloc__v_; diff --git a/hotspot/make/solaris/makefiles/reorder_COMPILER2_i486 b/hotspot/make/solaris/makefiles/reorder_COMPILER2_i486 index 4113159bf8d..14a1fc2e3fc 100644 --- a/hotspot/make/solaris/makefiles/reorder_COMPILER2_i486 +++ b/hotspot/make/solaris/makefiles/reorder_COMPILER2_i486 @@ -4755,6 +4755,7 @@ text: .text%__1cbCAbstractInterpreterGeneratorVgenerate_and_dispatch6MpnITemplat text: .text%__1cITemplateKinitialize6MinITosState_1pFi_vi_v_; text: .text%__1cNTemplateTableDdef6FnJBytecodesECode_inITosState_3pFi_vi_v_; text: .text%JVM_FindClassFromClassLoader; +text: .text%JVM_FindClassFromBootLoader; text: .text%__1cPshrI_eReg_1NodeEsize6kMpnNPhaseRegAlloc__I_; text: .text%__1cHi2bNodeMideal_Opcode6kM_i_: ad_i486_misc.o; text: .text%__1cMmatch_option6FpknMJavaVMOption_pkcp4_i_: arguments.o; diff --git a/hotspot/make/solaris/makefiles/reorder_COMPILER2_sparc b/hotspot/make/solaris/makefiles/reorder_COMPILER2_sparc index 4eadf379ca5..26ef9b2cd0b 100644 --- a/hotspot/make/solaris/makefiles/reorder_COMPILER2_sparc +++ b/hotspot/make/solaris/makefiles/reorder_COMPILER2_sparc @@ -3713,6 +3713,7 @@ text: .text%__1cITemplateKinitialize6MinITosState_1pFi_vi_v_; text: .text%__1cITemplateIgenerate6MpnZInterpreterMacroAssembler__v_; text: .text%__1cQregI_to_stkINodeHis_Copy6kM_I_: ad_sparc_misc.o; text: .text%JVM_FindClassFromClassLoader; +text: .text%JVM_FindClassFromBootLoader; text: .text%signalHandler; text: .text%__1cTtypeArrayKlassKlassIoop_size6kMpnHoopDesc__i_: typeArrayKlassKlass.o; text: .text%JVM_handle_solaris_signal; diff --git a/hotspot/make/solaris/makefiles/reorder_COMPILER2_sparcv9 b/hotspot/make/solaris/makefiles/reorder_COMPILER2_sparcv9 index 3cc6b8b510a..5f4949f02be 100644 --- a/hotspot/make/solaris/makefiles/reorder_COMPILER2_sparcv9 +++ b/hotspot/make/solaris/makefiles/reorder_COMPILER2_sparcv9 @@ -3735,6 +3735,7 @@ text: .text%__1cITemplateKinitialize6MinITosState_1pFi_vi_v_; text: .text%__1cQjava_lang_ThreadRget_thread_status6FpnHoopDesc__n0AMThreadStatus__; text: .text%__1cIMulINodeGadd_id6kM_pknEType__: classes.o; text: .text%JVM_FindClassFromClassLoader; +text: .text%JVM_FindClassFromBootLoader; text: .text%__1cHTypePtrFempty6kM_i_; text: .text%__1cQaddP_reg_regNodeEsize6kMpnNPhaseRegAlloc__I_; text: .text%__1cbFunnecessary_membar_volatileNodePoper_input_base6kM_I_: ad_sparc_misc.o; diff --git a/hotspot/make/solaris/makefiles/reorder_TIERED_amd64 b/hotspot/make/solaris/makefiles/reorder_TIERED_amd64 index b4bc7db5b72..4531671c613 100644 --- a/hotspot/make/solaris/makefiles/reorder_TIERED_amd64 +++ b/hotspot/make/solaris/makefiles/reorder_TIERED_amd64 @@ -4339,6 +4339,7 @@ text: .text%__1cSComputeAdapterInfoIdo_float6M_v_; text: .text%__1cFParseLarray_store6MnJBasicType__v_; text: .text%__1cOmangle_name_on6FpnMoutputStream_pnNsymbolOopDesc_ii_v_: nativeLookup.o; text: .text%JVM_FindClassFromClassLoader; +text: .text%JVM_FindClassFromBootLoader; text: .text%__1cZCallInterpreterDirectNodeSalignment_required6kM_i_; text: .text%__1cZCallInterpreterDirectNodePoper_input_base6kM_I_; text: .text%__1cZCallInterpreterDirectNodeEemit6kMrnKCodeBuffer_pnNPhaseRegAlloc__v_; diff --git a/hotspot/make/solaris/makefiles/reorder_TIERED_i486 b/hotspot/make/solaris/makefiles/reorder_TIERED_i486 index 4113159bf8d..14a1fc2e3fc 100644 --- a/hotspot/make/solaris/makefiles/reorder_TIERED_i486 +++ b/hotspot/make/solaris/makefiles/reorder_TIERED_i486 @@ -4755,6 +4755,7 @@ text: .text%__1cbCAbstractInterpreterGeneratorVgenerate_and_dispatch6MpnITemplat text: .text%__1cITemplateKinitialize6MinITosState_1pFi_vi_v_; text: .text%__1cNTemplateTableDdef6FnJBytecodesECode_inITosState_3pFi_vi_v_; text: .text%JVM_FindClassFromClassLoader; +text: .text%JVM_FindClassFromBootLoader; text: .text%__1cPshrI_eReg_1NodeEsize6kMpnNPhaseRegAlloc__I_; text: .text%__1cHi2bNodeMideal_Opcode6kM_i_: ad_i486_misc.o; text: .text%__1cMmatch_option6FpknMJavaVMOption_pkcp4_i_: arguments.o; diff --git a/hotspot/make/solaris/makefiles/reorder_TIERED_sparc b/hotspot/make/solaris/makefiles/reorder_TIERED_sparc index 4eadf379ca5..26ef9b2cd0b 100644 --- a/hotspot/make/solaris/makefiles/reorder_TIERED_sparc +++ b/hotspot/make/solaris/makefiles/reorder_TIERED_sparc @@ -3713,6 +3713,7 @@ text: .text%__1cITemplateKinitialize6MinITosState_1pFi_vi_v_; text: .text%__1cITemplateIgenerate6MpnZInterpreterMacroAssembler__v_; text: .text%__1cQregI_to_stkINodeHis_Copy6kM_I_: ad_sparc_misc.o; text: .text%JVM_FindClassFromClassLoader; +text: .text%JVM_FindClassFromBootLoader; text: .text%signalHandler; text: .text%__1cTtypeArrayKlassKlassIoop_size6kMpnHoopDesc__i_: typeArrayKlassKlass.o; text: .text%JVM_handle_solaris_signal; diff --git a/hotspot/make/solaris/makefiles/rules.make b/hotspot/make/solaris/makefiles/rules.make index 1329d2b1c42..56ff0e7d6b7 100644 --- a/hotspot/make/solaris/makefiles/rules.make +++ b/hotspot/make/solaris/makefiles/rules.make @@ -1,5 +1,5 @@ # -# Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -133,19 +133,10 @@ ifeq ($(findstring j,$(MFLAGS)),j) COMPILE_DONE = && { echo Done with $<; } endif -# A list of directories under which all source code are built without -KPIC/-Kpic -# flag. Performance measurements show that compiling GC related code will -# dramatically reduce the gc pause time. See bug 6454213 for more details. - -include $(GAMMADIR)/make/scm.make - -NONPIC_DIRS = memory oops gc_implementation gc_interface -NONPIC_DIRS := $(foreach dir,$(NONPIC_DIRS), $(GAMMADIR)/src/share/vm/$(dir)) -# Look for source code under NONPIC_DIRS -NONPIC_FILES := $(foreach dir,$(NONPIC_DIRS),\ - $(shell find $(dir) \( $(SCM_DIRS) \) -prune -o \ - -name '*.cpp' -print)) -NONPIC_OBJ_FILES := $(notdir $(subst .cpp,.o,$(NONPIC_FILES))) +# Include NONPIC_OBJ_FILES definition +ifndef LP64 +include $(GAMMADIR)/make/pic.make +endif # Sun compiler for 64 bit Solaris does not support building non-PIC object files. ifdef LP64 diff --git a/hotspot/make/solaris/makefiles/sa.make b/hotspot/make/solaris/makefiles/sa.make index 1143688394e..6d700b23437 100644 --- a/hotspot/make/solaris/makefiles/sa.make +++ b/hotspot/make/solaris/makefiles/sa.make @@ -1,5 +1,5 @@ # -# Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/saproc.make b/hotspot/make/solaris/makefiles/saproc.make index 83d9fce0e73..906cd9d998e 100644 --- a/hotspot/make/solaris/makefiles/saproc.make +++ b/hotspot/make/solaris/makefiles/saproc.make @@ -1,5 +1,5 @@ # -# Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/sparc.make b/hotspot/make/solaris/makefiles/sparc.make index b3a0e2682bb..6f332cf63bd 100644 --- a/hotspot/make/solaris/makefiles/sparc.make +++ b/hotspot/make/solaris/makefiles/sparc.make @@ -1,5 +1,5 @@ # -# Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ # Obj_Files += solaris_sparc.o -ASFLAGS += $(ARCHFLAG) +ASFLAGS += $(AS_ARCHFLAG) ifeq ("${Platform_compiler}", "sparcWorks") ifeq ($(shell expr $(COMPILER_REV) \< 5.5), 1) diff --git a/hotspot/make/solaris/makefiles/sparcWorks.make b/hotspot/make/solaris/makefiles/sparcWorks.make index a20546e6528..83ef29612ee 100644 --- a/hotspot/make/solaris/makefiles/sparcWorks.make +++ b/hotspot/make/solaris/makefiles/sparcWorks.make @@ -1,5 +1,5 @@ # -# Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -28,6 +28,8 @@ CC = cc CPP = CC +# Note that this 'as' is an older version of the Sun Studio 'fbe', and will +# use the older style options. The 'fbe' options will match 'cc' and 'CC'. AS = /usr/ccs/bin/as NM = /usr/ccs/bin/nm @@ -43,25 +45,33 @@ $(shell $(CPP) -V 2>&1 | sed -e 's/^.*\([1-9]\.[0-9][0-9]*\).*/\1/') C_COMPILER_REV := \ $(shell $(CC) -V 2>&1 | grep -i "cc:" | sed -e 's/^.*\([1-9]\.[0-9][0-9]*\).*/\1/') -VALIDATED_COMPILER_REV := 5.8 -VALIDATED_C_COMPILER_REV := 5.8 +# Pick which compiler is validated +ifeq ($(JDK_MINOR_VERSION),6) + # Validated compiler for JDK6 is SS11 (5.8) + VALIDATED_COMPILER_REV := 5.8 + VALIDATED_C_COMPILER_REV := 5.8 +else + # FIXUP: Change to SS12 (5.9) once it has been validated. + # Validated compiler for JDK7 is SS12 (5.9) + #VALIDATED_COMPILER_REV := 5.9 + #VALIDATED_C_COMPILER_REV := 5.9 + VALIDATED_COMPILER_REV := 5.8 + VALIDATED_C_COMPILER_REV := 5.8 +endif +# Warning messages about not using the above validated version ENFORCE_COMPILER_REV${ENFORCE_COMPILER_REV} := ${VALIDATED_COMPILER_REV} ifneq (${COMPILER_REV},${ENFORCE_COMPILER_REV}) -dummy_target_to_enforce_compiler_rev: - @echo "Wrong ${CPP} version: ${COMPILER_REV}. " \ - "Use version ${ENFORCE_COMPILER_REV}, or set" \ - "ENFORCE_COMPILER_REV=${COMPILER_REV}." - @exit 1 +dummy_target_to_enforce_compiler_rev:=\ +$(info WARNING: You are using CC version ${COMPILER_REV} \ +and should be using version ${ENFORCE_COMPILER_REV}) endif ENFORCE_C_COMPILER_REV${ENFORCE_C_COMPILER_REV} := ${VALIDATED_C_COMPILER_REV} ifneq (${C_COMPILER_REV},${ENFORCE_C_COMPILER_REV}) -dummy_target_to_enforce_c_compiler_rev: - @echo "Wrong ${CC} version: ${C_COMPILER_REV}. " \ - "Use version ${ENFORCE_C_COMPILER_REV}, or set" \ - "ENFORCE_C_COMPILER_REV=${C_COMPILER_REV}." - @exit 1 +dummy_target_to_enforce_c_compiler_rev:=\ +$(info WARNING: You are using cc version ${C_COMPILER_REV} \ +and should be using version ${ENFORCE_C_COMPILER_REV}) endif # Fail the build if __fabsf is used. __fabsf exists only in Solaris 8 2/04 @@ -90,20 +100,44 @@ SOLARIS_7_OR_LATER := \ $(shell uname -r | awk -F. '{ if ($$2 >= 7) print "-DSOLARIS_7_OR_LATER"; }') CFLAGS += ${SOLARIS_7_OR_LATER} -ARCHFLAG = $(ARCHFLAG/$(BUILDARCH)) -# set ARCHFLAG/BUILDARCH which will ultimately be ARCHFLAG +# New architecture options started in SS12 (5.9), we need both styles to build. +# The older arch options for SS11 (5.8) or older and also for /usr/ccs/bin/as. +# Note: SS12 default for 32bit sparc is now the same as v8plus, so the +# settings below have changed all SS12 32bit sparc builds to be v8plus. +# The older SS11 (5.8) settings have remained as they always have been. ifeq ($(TYPE),COMPILER2) -ARCHFLAG/sparc = -xarch=v8plus + ARCHFLAG_OLD/sparc = -xarch=v8plus else -ifeq ($(TYPE),TIERED) -ARCHFLAG/sparc = -xarch=v8plus + ifeq ($(TYPE),TIERED) + ARCHFLAG_OLD/sparc = -xarch=v8plus + else + ARCHFLAG_OLD/sparc = -xarch=v8 + endif +endif +ARCHFLAG_NEW/sparc = -m32 -xarch=sparc +ARCHFLAG_OLD/sparcv9 = -xarch=v9 +ARCHFLAG_NEW/sparcv9 = -m64 -xarch=sparc +ARCHFLAG_OLD/i486 = +ARCHFLAG_NEW/i486 = -m32 +ARCHFLAG_OLD/amd64 = -xarch=amd64 +ARCHFLAG_NEW/amd64 = -m64 + +# Select the ARCHFLAGs and other SS12 (5.9) options +ifeq ($(shell expr $(COMPILER_REV) \>= 5.9), 1) + ARCHFLAG/sparc = $(ARCHFLAG_NEW/sparc) + ARCHFLAG/sparcv9 = $(ARCHFLAG_NEW/sparcv9) + ARCHFLAG/i486 = $(ARCHFLAG_NEW/i486) + ARCHFLAG/amd64 = $(ARCHFLAG_NEW/amd64) else -ARCHFLAG/sparc = -xarch=v8 + ARCHFLAG/sparc = $(ARCHFLAG_OLD/sparc) + ARCHFLAG/sparcv9 = $(ARCHFLAG_OLD/sparcv9) + ARCHFLAG/i486 = $(ARCHFLAG_OLD/i486) + ARCHFLAG/amd64 = $(ARCHFLAG_OLD/amd64) endif -endif -ARCHFLAG/sparcv9 = -xarch=v9 -ARCHFLAG/i486 = -ARCHFLAG/amd64 = -xarch=amd64 + +# ARCHFLAGS for the current build arch +ARCHFLAG = $(ARCHFLAG/$(BUILDARCH)) +AS_ARCHFLAG = $(ARCHFLAG_OLD/$(BUILDARCH)) # Optional sub-directory in /usr/lib where BUILDARCH libraries are kept. ISA_DIR=$(ISA_DIR/$(BUILDARCH)) @@ -166,13 +200,13 @@ endif # 32bit x86 ifeq ("${Platform_arch_model}", "x86_64") -ASFLAGS += -xarch=amd64 -CFLAGS += -xarch=amd64 +ASFLAGS += $(AS_ARCHFLAG) +CFLAGS += $(ARCHFLAG/amd64) # this one seemed useless -LFLAGS_VM += -xarch=amd64 +LFLAGS_VM += $(ARCHFLAG/amd64) # this one worked -LFLAGS += -xarch=amd64 -AOUT_FLAGS += -xarch=amd64 +LFLAGS += $(ARCHFLAG/amd64) +AOUT_FLAGS += $(ARCHFLAG/amd64) # -xO3 is faster than -xO4 on specjbb with SS10 compiler OPT_CFLAGS=-xO4 $(EXTRA_OPT_CFLAGS) @@ -224,7 +258,7 @@ LFLAGS += -library=%none LFLAGS += -mt -endif # COMPILER_REV >= VALIDATED_COMPILER_REV +endif # COMPILER_REV >= 5.5 ###################################### # End 5.5 Forte compiler options # @@ -293,7 +327,7 @@ PICFLAG/BYFILE = $(PICFLAG/$@)$(PICFLAG/DEFAULT$(PICFLAG/$@)) LFLAGS += -library=Crun LIBS += -library=Crun -lCrun -endif # COMPILER_REV >= VALIDATED_COMPILER_REV +endif # COMPILER_REV == 5.2 ################################## # End 5.2 Forte compiler options # @@ -320,6 +354,7 @@ ifeq (${COMPILER_REV}, 5.0) # Had to hoist this higher apparently because of other changes. Must # come before -xarch specification. +# NOTE: native says optimize for the machine doing the compile, bad news. CFLAGS += -xtarget=native CFLAGS += $(ARCHFLAG) @@ -359,7 +394,7 @@ CFLAGS += $(GAMMADIR)/src/os_cpu/solaris_x86/vm/solaris_x86_32.il endif # 32bit x86 # The following options run into misaligned ldd problem (raj) -#OPT_CFLAGS = -fast -O4 -xarch=v8 -xchip=ultra +#OPT_CFLAGS = -fast -O4 $(ARCHFLAG/sparc) -xchip=ultra # no more exceptions CFLAGS/NOEX=-noex @@ -427,6 +462,15 @@ DEBUG_CFLAGS = -g FASTDEBUG_CFLAGS = -g0 # The -g0 setting allows the C++ frontend to inline, which is a big win. +# Special global options for SS12 +ifeq ($(COMPILER_REV),5.9) + # There appears to be multiple issues with the new Dwarf2 debug format, so + # we tell the compiler to use the older 'stabs' debug format all the time. + # Note that this needs to be used in optimized compiles too to be 100%. + # This is a workaround for SS12 (5.9) bug 6694600 + CFLAGS += -xdebugformat=stabs +endif + # Enable the following CFLAGS additions if you need to compare the # built ELF objects. # diff --git a/hotspot/make/solaris/makefiles/sparcv9.make b/hotspot/make/solaris/makefiles/sparcv9.make index 985b7b47135..c05d04bc18c 100644 --- a/hotspot/make/solaris/makefiles/sparcv9.make +++ b/hotspot/make/solaris/makefiles/sparcv9.make @@ -1,5 +1,5 @@ # -# Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ # Obj_Files += solaris_sparc.o -ASFLAGS += $(ARCHFLAG) +ASFLAGS += $(AS_ARCHFLAG) ifeq ("${Platform_compiler}", "sparcWorks") ifeq ($(shell expr $(COMPILER_REV) \< 5.5), 1) diff --git a/hotspot/make/solaris/makefiles/tiered.make b/hotspot/make/solaris/makefiles/tiered.make index 220124e50e1..5ad7f223c1a 100644 --- a/hotspot/make/solaris/makefiles/tiered.make +++ b/hotspot/make/solaris/makefiles/tiered.make @@ -1,5 +1,5 @@ # -# Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/top.make b/hotspot/make/solaris/makefiles/top.make index 5a883565ada..bd8a42238d1 100644 --- a/hotspot/make/solaris/makefiles/top.make +++ b/hotspot/make/solaris/makefiles/top.make @@ -1,5 +1,5 @@ # -# Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/makefiles/vm.make b/hotspot/make/solaris/makefiles/vm.make index 43d31878e54..70a11975fbc 100644 --- a/hotspot/make/solaris/makefiles/vm.make +++ b/hotspot/make/solaris/makefiles/vm.make @@ -1,5 +1,5 @@ # -# Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/solaris/reorder.sh b/hotspot/make/solaris/reorder.sh index 925b0a2407c..851140fed20 100644 --- a/hotspot/make/solaris/reorder.sh +++ b/hotspot/make/solaris/reorder.sh @@ -1,6 +1,6 @@ #!/bin/sh -x # -# Copyright 2000-2004 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/test/Queens.java b/hotspot/make/test/Queens.java index 075ca9b93ad..06064f7cc35 100644 --- a/hotspot/make/test/Queens.java +++ b/hotspot/make/test/Queens.java @@ -1,5 +1,5 @@ /* - * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/windows/build.bat b/hotspot/make/windows/build.bat index 36d4ec6b480..444f88a26d4 100644 --- a/hotspot/make/windows/build.bat +++ b/hotspot/make/windows/build.bat @@ -1,6 +1,6 @@ @echo off REM -REM Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. +REM Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. REM DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. REM REM This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/windows/build.make b/hotspot/make/windows/build.make index a871a849eb1..66ad19289e2 100644 --- a/hotspot/make/windows/build.make +++ b/hotspot/make/windows/build.make @@ -1,5 +1,5 @@ # -# Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/windows/build_vm_def.sh b/hotspot/make/windows/build_vm_def.sh index 98e65150a65..6cc931963b2 100644 --- a/hotspot/make/windows/build_vm_def.sh +++ b/hotspot/make/windows/build_vm_def.sh @@ -1,5 +1,5 @@ # -# Copyright 2000-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/windows/create.bat b/hotspot/make/windows/create.bat index a5a481ff7bd..21f97033669 100644 --- a/hotspot/make/windows/create.bat +++ b/hotspot/make/windows/create.bat @@ -1,6 +1,6 @@ @echo off REM -REM Copyright 1999-2006 Sun Microsystems, Inc. All Rights Reserved. +REM Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. REM DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. REM REM This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/windows/cross_build.bat b/hotspot/make/windows/cross_build.bat index 42e0fb147d7..7359061c54e 100644 --- a/hotspot/make/windows/cross_build.bat +++ b/hotspot/make/windows/cross_build.bat @@ -1,6 +1,6 @@ @echo off REM -REM Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved. +REM Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. REM DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. REM REM This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/windows/get_msc_ver.sh b/hotspot/make/windows/get_msc_ver.sh index 1e4f6a02489..6bbbbef7859 100644 --- a/hotspot/make/windows/get_msc_ver.sh +++ b/hotspot/make/windows/get_msc_ver.sh @@ -1,5 +1,5 @@ # -# Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/windows/makefiles/adlc.make b/hotspot/make/windows/makefiles/adlc.make index f7665667fb1..b2f8132c64d 100644 --- a/hotspot/make/windows/makefiles/adlc.make +++ b/hotspot/make/windows/makefiles/adlc.make @@ -1,5 +1,5 @@ # -# Copyright 1999-2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/windows/makefiles/compile.make b/hotspot/make/windows/makefiles/compile.make index 7292774e1b5..bf6f3be9b2e 100644 --- a/hotspot/make/windows/makefiles/compile.make +++ b/hotspot/make/windows/makefiles/compile.make @@ -1,5 +1,5 @@ # -# Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/windows/makefiles/debug.make b/hotspot/make/windows/makefiles/debug.make index 7ea4aae9486..afd987d9cd0 100644 --- a/hotspot/make/windows/makefiles/debug.make +++ b/hotspot/make/windows/makefiles/debug.make @@ -1,5 +1,5 @@ # -# Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/windows/makefiles/defs.make b/hotspot/make/windows/makefiles/defs.make index 19d49f17af6..bfabddff58e 100644 --- a/hotspot/make/windows/makefiles/defs.make +++ b/hotspot/make/windows/makefiles/defs.make @@ -1,5 +1,5 @@ # -# Copyright 2006-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/windows/makefiles/fastdebug.make b/hotspot/make/windows/makefiles/fastdebug.make index cb6901bce2f..064592bffe4 100644 --- a/hotspot/make/windows/makefiles/fastdebug.make +++ b/hotspot/make/windows/makefiles/fastdebug.make @@ -1,5 +1,5 @@ # -# Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/windows/makefiles/generated.make b/hotspot/make/windows/makefiles/generated.make index 7eff90d1681..3d2a0001d00 100644 --- a/hotspot/make/windows/makefiles/generated.make +++ b/hotspot/make/windows/makefiles/generated.make @@ -1,5 +1,5 @@ # -# Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/windows/makefiles/jvmti.make b/hotspot/make/windows/makefiles/jvmti.make index 74600a11f77..e0b22c04d3a 100644 --- a/hotspot/make/windows/makefiles/jvmti.make +++ b/hotspot/make/windows/makefiles/jvmti.make @@ -1,5 +1,5 @@ # -# Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/windows/makefiles/makedeps.make b/hotspot/make/windows/makefiles/makedeps.make index e3164313d7e..a64407bfa5f 100644 --- a/hotspot/make/windows/makefiles/makedeps.make +++ b/hotspot/make/windows/makefiles/makedeps.make @@ -1,5 +1,5 @@ # -# Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/windows/makefiles/product.make b/hotspot/make/windows/makefiles/product.make index a2887cfcef3..a143d6c99b5 100644 --- a/hotspot/make/windows/makefiles/product.make +++ b/hotspot/make/windows/makefiles/product.make @@ -1,5 +1,5 @@ # -# Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/windows/makefiles/rules.make b/hotspot/make/windows/makefiles/rules.make index 04ee8e399c5..f07f84aee1d 100644 --- a/hotspot/make/windows/makefiles/rules.make +++ b/hotspot/make/windows/makefiles/rules.make @@ -1,5 +1,5 @@ # -# Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/windows/makefiles/sa.make b/hotspot/make/windows/makefiles/sa.make index 216c44fc870..481b5149d03 100644 --- a/hotspot/make/windows/makefiles/sa.make +++ b/hotspot/make/windows/makefiles/sa.make @@ -1,5 +1,5 @@ # -# Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/windows/makefiles/sanity.make b/hotspot/make/windows/makefiles/sanity.make index 9b7aa13ab69..5b4293d27f8 100644 --- a/hotspot/make/windows/makefiles/sanity.make +++ b/hotspot/make/windows/makefiles/sanity.make @@ -1,5 +1,5 @@ # -# Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/windows/makefiles/shared.make b/hotspot/make/windows/makefiles/shared.make index a5055045e82..173450c83b9 100644 --- a/hotspot/make/windows/makefiles/shared.make +++ b/hotspot/make/windows/makefiles/shared.make @@ -1,5 +1,5 @@ # -# Copyright 1997-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/windows/makefiles/top.make b/hotspot/make/windows/makefiles/top.make index 679e5692efc..0caabcdfd3f 100644 --- a/hotspot/make/windows/makefiles/top.make +++ b/hotspot/make/windows/makefiles/top.make @@ -1,5 +1,5 @@ # -# Copyright 1997-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/windows/makefiles/vm.make b/hotspot/make/windows/makefiles/vm.make index c911ab261f0..e7321de1332 100644 --- a/hotspot/make/windows/makefiles/vm.make +++ b/hotspot/make/windows/makefiles/vm.make @@ -1,5 +1,5 @@ # -# Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -88,13 +88,20 @@ AGCT_EXPORT=/export:AsyncGetCallTrace !endif !endif -LINK_FLAGS=$(LINK_FLAGS) $(STACK_SIZE) /subsystem:windows /dll /base:0x8000000 \ - /export:JNI_GetDefaultJavaVMInitArgs /export:JNI_CreateJavaVM \ - /export:JNI_GetCreatedJavaVMs /export:jio_snprintf \ - /export:jio_printf /export:jio_fprintf \ - /export:jio_vfprintf /export:jio_vsnprintf $(AGCT_EXPORT) \ - /export:JVM_GetVersionInfo \ - /export:JVM_GetThreadStateNames /export:JVM_GetThreadStateValues \ +LINK_FLAGS=$(LINK_FLAGS) $(STACK_SIZE) /subsystem:windows /dll /base:0x8000000 \ + /export:JNI_GetDefaultJavaVMInitArgs \ + /export:JNI_CreateJavaVM \ + /export:JVM_FindClassFromBootLoader \ + /export:JNI_GetCreatedJavaVMs \ + /export:jio_snprintf \ + /export:jio_printf \ + /export:jio_fprintf \ + /export:jio_vfprintf \ + /export:jio_vsnprintf \ + $(AGCT_EXPORT) \ + /export:JVM_GetVersionInfo \ + /export:JVM_GetThreadStateNames \ + /export:JVM_GetThreadStateValues \ /export:JVM_InitAgentProperties CPP_INCLUDE_DIRS=\ diff --git a/hotspot/make/windows/projectfiles/common/Makefile b/hotspot/make/windows/projectfiles/common/Makefile index 1b4a5bf7343..c6793f96b31 100644 --- a/hotspot/make/windows/projectfiles/common/Makefile +++ b/hotspot/make/windows/projectfiles/common/Makefile @@ -1,5 +1,5 @@ # -# Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/windows/projectfiles/compiler1/Makefile b/hotspot/make/windows/projectfiles/compiler1/Makefile index e189845fd58..f96091f39ec 100644 --- a/hotspot/make/windows/projectfiles/compiler1/Makefile +++ b/hotspot/make/windows/projectfiles/compiler1/Makefile @@ -1,5 +1,5 @@ # -# Copyright 1999-2002 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/windows/projectfiles/compiler2/Makefile b/hotspot/make/windows/projectfiles/compiler2/Makefile index 567f02030ee..7c26e15d1cc 100644 --- a/hotspot/make/windows/projectfiles/compiler2/Makefile +++ b/hotspot/make/windows/projectfiles/compiler2/Makefile @@ -1,5 +1,5 @@ # -# Copyright 1998-2002 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/windows/projectfiles/core/Makefile b/hotspot/make/windows/projectfiles/core/Makefile index e42986de410..fa8c3a12d20 100644 --- a/hotspot/make/windows/projectfiles/core/Makefile +++ b/hotspot/make/windows/projectfiles/core/Makefile @@ -1,5 +1,5 @@ # -# Copyright 1998-2002 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/make/windows/projectfiles/tiered/Makefile b/hotspot/make/windows/projectfiles/tiered/Makefile index 1aaae59680d..2c24068c2b9 100644 --- a/hotspot/make/windows/projectfiles/tiered/Makefile +++ b/hotspot/make/windows/projectfiles/tiered/Makefile @@ -1,5 +1,5 @@ # -# Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/sparc/vm/assembler_sparc.cpp b/hotspot/src/cpu/sparc/vm/assembler_sparc.cpp index a4963c65078..c7dce335619 100644 --- a/hotspot/src/cpu/sparc/vm/assembler_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/assembler_sparc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1523,6 +1523,21 @@ Address MacroAssembler::constant_oop_address(jobject obj, Register d) { return Address(d, address(obj), oop_Relocation::spec(oop_index)); } +void MacroAssembler::set_narrow_oop(jobject obj, Register d) { + assert(oop_recorder() != NULL, "this assembler needs an OopRecorder"); + int oop_index = oop_recorder()->find_index(obj); + RelocationHolder rspec = oop_Relocation::spec(oop_index); + + assert_not_delayed(); + // Relocation with special format (see relocInfo_sparc.hpp). + relocate(rspec, 1); + // Assembler::sethi(0x3fffff, d); + emit_long( op(branch_op) | rd(d) | op2(sethi_op2) | hi22(0x3fffff) ); + // Don't add relocation for 'add'. Do patching during 'sethi' processing. + add(d, 0x3ff, d); + +} + void MacroAssembler::align(int modulus) { while (offset() % modulus != 0) nop(); @@ -3406,13 +3421,15 @@ void MacroAssembler::tlab_refill(Label& retry, Label& try_eden, Label& slow_case set((intptr_t)markOopDesc::prototype()->copy_set_hash(0x2), t2); st_ptr(t2, top, oopDesc::mark_offset_in_bytes()); // set up the mark word // set klass to intArrayKlass - set((intptr_t)Universe::intArrayKlassObj_addr(), t2); - ld_ptr(t2, 0, t2); - store_klass(t2, top); sub(t1, typeArrayOopDesc::header_size(T_INT), t1); add(t1, ThreadLocalAllocBuffer::alignment_reserve(), t1); sll_ptr(t1, log2_intptr(HeapWordSize/sizeof(jint)), t1); st(t1, top, arrayOopDesc::length_offset_in_bytes()); + set((intptr_t)Universe::intArrayKlassObj_addr(), t2); + ld_ptr(t2, 0, t2); + // store klass last. concurrent gcs assumes klass length is valid if + // klass field is not null. + store_klass(t2, top); verify_oop(top); // refill the tlab with an eden allocation @@ -3537,28 +3554,32 @@ void MacroAssembler::bang_stack_size(Register Rsize, Register Rtsp, } } -void MacroAssembler::load_klass(Register s, Register d) { +void MacroAssembler::load_klass(Register src_oop, Register klass) { // The number of bytes in this code is used by // MachCallDynamicJavaNode::ret_addr_offset() // if this changes, change that. if (UseCompressedOops) { - lduw(s, oopDesc::klass_offset_in_bytes(), d); - decode_heap_oop_not_null(d); + lduw(src_oop, oopDesc::klass_offset_in_bytes(), klass); + decode_heap_oop_not_null(klass); } else { - ld_ptr(s, oopDesc::klass_offset_in_bytes(), d); + ld_ptr(src_oop, oopDesc::klass_offset_in_bytes(), klass); } } -// ??? figure out src vs. dst! -void MacroAssembler::store_klass(Register d, Register s1) { +void MacroAssembler::store_klass(Register klass, Register dst_oop) { if (UseCompressedOops) { - assert(s1 != d, "not enough registers"); - encode_heap_oop_not_null(d); - // Zero out entire klass field first. - st_ptr(G0, s1, oopDesc::klass_offset_in_bytes()); - st(d, s1, oopDesc::klass_offset_in_bytes()); + assert(dst_oop != klass, "not enough registers"); + encode_heap_oop_not_null(klass); + st(klass, dst_oop, oopDesc::klass_offset_in_bytes()); } else { - st_ptr(d, s1, oopDesc::klass_offset_in_bytes()); + st_ptr(klass, dst_oop, oopDesc::klass_offset_in_bytes()); + } +} + +void MacroAssembler::store_klass_gap(Register s, Register d) { + if (UseCompressedOops) { + assert(s != d, "not enough registers"); + st(s, d, oopDesc::klass_gap_offset_in_bytes()); } } @@ -3622,6 +3643,7 @@ void MacroAssembler::store_heap_oop(Register d, const Address& a, int offset) { void MacroAssembler::encode_heap_oop(Register src, Register dst) { assert (UseCompressedOops, "must be compressed"); + verify_oop(src); Label done; if (src == dst) { // optimize for frequent case src == dst @@ -3643,12 +3665,14 @@ void MacroAssembler::encode_heap_oop(Register src, Register dst) { void MacroAssembler::encode_heap_oop_not_null(Register r) { assert (UseCompressedOops, "must be compressed"); + verify_oop(r); sub(r, G6_heapbase, r); srlx(r, LogMinObjAlignmentInBytes, r); } void MacroAssembler::encode_heap_oop_not_null(Register src, Register dst) { assert (UseCompressedOops, "must be compressed"); + verify_oop(src); sub(src, G6_heapbase, dst); srlx(dst, LogMinObjAlignmentInBytes, dst); } @@ -3661,11 +3685,13 @@ void MacroAssembler::decode_heap_oop(Register src, Register dst) { bpr(rc_nz, true, Assembler::pt, dst, done); delayed() -> add(dst, G6_heapbase, dst); // annuled if not taken bind(done); + verify_oop(dst); } void MacroAssembler::decode_heap_oop_not_null(Register r) { // Do not add assert code to this unless you change vtableStubs_sparc.cpp // pd_code_size_limit. + // Also do not verify_oop as this is called by verify_oop. assert (UseCompressedOops, "must be compressed"); sllx(r, LogMinObjAlignmentInBytes, r); add(r, G6_heapbase, r); @@ -3674,6 +3700,7 @@ void MacroAssembler::decode_heap_oop_not_null(Register r) { void MacroAssembler::decode_heap_oop_not_null(Register src, Register dst) { // Do not add assert code to this unless you change vtableStubs_sparc.cpp // pd_code_size_limit. + // Also do not verify_oop as this is called by verify_oop. assert (UseCompressedOops, "must be compressed"); sllx(src, LogMinObjAlignmentInBytes, dst); add(dst, G6_heapbase, dst); diff --git a/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp b/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp index c1aae2e6620..e1f7e0636b8 100644 --- a/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp +++ b/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1977,8 +1977,9 @@ class MacroAssembler: public Assembler { inline void movbool( bool boolconst, Register d) { mov( (int) boolconst, d); } // klass oop manipulations if compressed - void load_klass(Register src_oop, Register dst); - void store_klass(Register dst_oop, Register s1); + void load_klass(Register src_oop, Register klass); + void store_klass(Register klass, Register dst_oop); + void store_klass_gap(Register s, Register dst_oop); // oop manipulations void load_heap_oop(const Address& s, Register d, int offset = 0); @@ -2103,6 +2104,8 @@ class MacroAssembler: public Assembler { inline void set_oop_constant( jobject obj, Register d ); // uses constant_oop_address inline void set_oop ( Address obj_addr ); // same as load_address + void set_narrow_oop( jobject obj, Register d ); + // nop padding void align(int modulus); diff --git a/hotspot/src/cpu/sparc/vm/bytecodeInterpreter_sparc.hpp b/hotspot/src/cpu/sparc/vm/bytecodeInterpreter_sparc.hpp index dafab4bdcfd..28321303b08 100644 --- a/hotspot/src/cpu/sparc/vm/bytecodeInterpreter_sparc.hpp +++ b/hotspot/src/cpu/sparc/vm/bytecodeInterpreter_sparc.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2002 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp b/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp index 8436fb8561b..f1dc75f1ef4 100644 --- a/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp b/hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp index 74bc5ecf3b4..d5696d442f4 100644 --- a/hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/sparc/vm/c1_MacroAssembler_sparc.cpp b/hotspot/src/cpu/sparc/vm/c1_MacroAssembler_sparc.cpp index 523b0042a21..a002e2474aa 100644 --- a/hotspot/src/cpu/sparc/vm/c1_MacroAssembler_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/c1_MacroAssembler_sparc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/sparc/vm/copy_sparc.hpp b/hotspot/src/cpu/sparc/vm/copy_sparc.hpp index fc180cb43d3..9ddae97ef12 100644 --- a/hotspot/src/cpu/sparc/vm/copy_sparc.hpp +++ b/hotspot/src/cpu/sparc/vm/copy_sparc.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/sparc/vm/cppInterpreter_sparc.cpp b/hotspot/src/cpu/sparc/vm/cppInterpreter_sparc.cpp index 8bd53e47a51..f2d6486f856 100644 --- a/hotspot/src/cpu/sparc/vm/cppInterpreter_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/cppInterpreter_sparc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/sparc/vm/frame_sparc.cpp b/hotspot/src/cpu/sparc/vm/frame_sparc.cpp index 1e8077d55d9..13626f0700e 100644 --- a/hotspot/src/cpu/sparc/vm/frame_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/frame_sparc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp b/hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp index aff31ce6c2f..5881dd69be4 100644 --- a/hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/sparc/vm/nativeInst_sparc.cpp b/hotspot/src/cpu/sparc/vm/nativeInst_sparc.cpp index 3deee97da75..16e3c6746fb 100644 --- a/hotspot/src/cpu/sparc/vm/nativeInst_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/nativeInst_sparc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/sparc/vm/nativeInst_sparc.hpp b/hotspot/src/cpu/sparc/vm/nativeInst_sparc.hpp index 1e7263b41ef..2527e35b3e9 100644 --- a/hotspot/src/cpu/sparc/vm/nativeInst_sparc.hpp +++ b/hotspot/src/cpu/sparc/vm/nativeInst_sparc.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/sparc/vm/register_definitions_sparc.cpp b/hotspot/src/cpu/sparc/vm/register_definitions_sparc.cpp index 4001805226b..d3e80557098 100644 --- a/hotspot/src/cpu/sparc/vm/register_definitions_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/register_definitions_sparc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/sparc/vm/relocInfo_sparc.cpp b/hotspot/src/cpu/sparc/vm/relocInfo_sparc.cpp index af1450c7440..795e1831e52 100644 --- a/hotspot/src/cpu/sparc/vm/relocInfo_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/relocInfo_sparc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -87,6 +87,17 @@ void Relocation::pd_set_data_value(address x, intptr_t o) { #ifdef _LP64 jint inst2; guarantee(Assembler::inv_op2(inst)==Assembler::sethi_op2, "must be sethi"); + if (format() != 0) { + assert(type() == relocInfo::oop_type, "only narrow oops case"); + jint np = oopDesc::encode_heap_oop((oop)x); + inst &= ~Assembler::hi22(-1); + inst |= Assembler::hi22((intptr_t)np); + ip->set_long_at(0, inst); + inst2 = ip->long_at( NativeInstruction::nop_instruction_size ); + guarantee(Assembler::inv_op(inst2)==Assembler::arith_op, "arith op"); + ip->set_long_at(NativeInstruction::nop_instruction_size, ip->set_data32_simm13( inst2, (intptr_t)np)); + break; + } ip->set_data64_sethi( ip->addr_at(0), (intptr_t)x ); #ifdef COMPILER2 // [RGV] Someone must have missed putting in a reloc entry for the diff --git a/hotspot/src/cpu/sparc/vm/relocInfo_sparc.hpp b/hotspot/src/cpu/sparc/vm/relocInfo_sparc.hpp index ed38e6e50cb..69c6c889b7b 100644 --- a/hotspot/src/cpu/sparc/vm/relocInfo_sparc.hpp +++ b/hotspot/src/cpu/sparc/vm/relocInfo_sparc.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2001 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,7 +31,12 @@ // There is no need for format bits; the instructions are // sufficiently self-identifying. +#ifndef _LP64 format_width = 0 +#else + // Except narrow oops in 64-bits VM. + format_width = 1 +#endif }; diff --git a/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp b/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp index 7f5c4f81407..3812e2eaed9 100644 --- a/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -2556,7 +2556,6 @@ nmethod *SharedRuntime::generate_dtrace_nmethod( int total_strings = 0; int first_arg_to_pass = 0; int total_c_args = 0; - int box_offset = java_lang_boxing_object::value_offset_in_bytes(); // Skip the receiver as dtrace doesn't want to see it if( !method->is_static() ) { @@ -2721,7 +2720,8 @@ nmethod *SharedRuntime::generate_dtrace_nmethod( #endif /* ASSERT */ VMRegPair zero; - zero.set2(G0->as_VMReg()); + const Register g0 = G0; // without this we get a compiler warning (why??) + zero.set2(g0->as_VMReg()); int c_arg, j_arg; @@ -2778,7 +2778,9 @@ nmethod *SharedRuntime::generate_dtrace_nmethod( __ br_null(in_reg, true, Assembler::pn, skipUnbox); __ delayed()->mov(G0, tmp); - switch (out_sig_bt[c_arg]) { + BasicType bt = out_sig_bt[c_arg]; + int box_offset = java_lang_boxing_object::value_offset_in_bytes(bt); + switch (bt) { case T_BYTE: __ ldub(in_reg, box_offset, tmp); break; case T_SHORT: diff --git a/hotspot/src/cpu/sparc/vm/sparc.ad b/hotspot/src/cpu/sparc/vm/sparc.ad index 73458015efe..c02673b3efc 100644 --- a/hotspot/src/cpu/sparc/vm/sparc.ad +++ b/hotspot/src/cpu/sparc/vm/sparc.ad @@ -1,5 +1,5 @@ // -// Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. // // This code is free software; you can redistribute it and/or modify it @@ -5471,7 +5471,6 @@ instruct loadN(iRegN dst, memory mem) %{ // Load Klass Pointer instruct loadKlass(iRegP dst, memory mem) %{ match(Set dst (LoadKlass mem)); - predicate(!n->in(MemNode::Address)->bottom_type()->is_narrow()); ins_cost(MEMORY_REF_COST); size(4); @@ -5486,11 +5485,11 @@ instruct loadKlass(iRegP dst, memory mem) %{ ins_pipe(iload_mem); %} -// Load Klass Pointer -instruct loadKlassComp(iRegP dst, memory mem) %{ - match(Set dst (LoadKlass mem)); - predicate(n->in(MemNode::Address)->bottom_type()->is_narrow()); +// Load narrow Klass Pointer +instruct loadNKlass(iRegN dst, memory mem) %{ + match(Set dst (LoadNKlass mem)); ins_cost(MEMORY_REF_COST); + size(4); format %{ "LDUW $mem,$dst\t! compressed klass ptr" %} @@ -5503,9 +5502,6 @@ instruct loadKlassComp(iRegP dst, memory mem) %{ } else { __ lduw(base, $mem$$disp, dst); } - // klass oop never null but this is generated for nonheader klass loads - // too which can be null. - __ decode_heap_oop(dst); %} ins_pipe(iload_mem); %} @@ -5609,22 +5605,24 @@ instruct loadConP_poll(iRegP dst, immP_poll src) %{ ins_pipe(loadConP_poll); %} +instruct loadConN0(iRegN dst, immN0 src) %{ + match(Set dst src); + + size(4); + format %{ "CLR $dst\t! compressed NULL ptr" %} + ins_encode( SetNull( dst ) ); + ins_pipe(ialu_imm); +%} + instruct loadConN(iRegN dst, immN src) %{ match(Set dst src); - ins_cost(DEFAULT_COST * 2); - format %{ "SET $src,$dst\t!ptr" %} + ins_cost(DEFAULT_COST * 3/2); + format %{ "SET $src,$dst\t! compressed ptr" %} ins_encode %{ - address con = (address)$src$$constant; Register dst = $dst$$Register; - if (con == NULL) { - __ mov(G0, dst); - } else { - __ set_oop((jobject)$src$$constant, dst); - __ encode_heap_oop(dst); - } + __ set_narrow_oop((jobject)$src$$constant, dst); %} - ins_pipe(loadConP); - + ins_pipe(ialu_hi_lo_reg); %} instruct loadConL(iRegL dst, immL src, o7RegL tmp) %{ @@ -5957,7 +5955,7 @@ instruct storeA8B(memory mem, regD src) %{ // Convert oop pointer into compressed form instruct encodeHeapOop(iRegN dst, iRegP src) %{ - predicate(n->bottom_type()->is_narrowoop()->make_oopptr()->ptr() != TypePtr::NotNull); + predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull); match(Set dst (EncodeP src)); format %{ "encode_heap_oop $src, $dst" %} ins_encode %{ @@ -5967,7 +5965,7 @@ instruct encodeHeapOop(iRegN dst, iRegP src) %{ %} instruct encodeHeapOop_not_null(iRegN dst, iRegP src) %{ - predicate(n->bottom_type()->is_narrowoop()->make_oopptr()->ptr() == TypePtr::NotNull); + predicate(n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull); match(Set dst (EncodeP src)); format %{ "encode_heap_oop_not_null $src, $dst" %} ins_encode %{ @@ -5977,7 +5975,8 @@ instruct encodeHeapOop_not_null(iRegN dst, iRegP src) %{ %} instruct decodeHeapOop(iRegP dst, iRegN src) %{ - predicate(n->bottom_type()->is_oopptr()->ptr() != TypePtr::NotNull); + predicate(n->bottom_type()->is_oopptr()->ptr() != TypePtr::NotNull && + n->bottom_type()->is_oopptr()->ptr() != TypePtr::Constant); match(Set dst (DecodeN src)); format %{ "decode_heap_oop $src, $dst" %} ins_encode %{ @@ -5987,7 +5986,8 @@ instruct decodeHeapOop(iRegP dst, iRegN src) %{ %} instruct decodeHeapOop_not_null(iRegP dst, iRegN src) %{ - predicate(n->bottom_type()->is_oopptr()->ptr() == TypePtr::NotNull); + predicate(n->bottom_type()->is_oopptr()->ptr() == TypePtr::NotNull || + n->bottom_type()->is_oopptr()->ptr() == TypePtr::Constant); match(Set dst (DecodeN src)); format %{ "decode_heap_oop_not_null $src, $dst" %} ins_encode %{ @@ -6258,6 +6258,34 @@ instruct cmovIF_imm(cmpOpF cmp, flagsRegF fcc, iRegI dst, immI11 src) %{ ins_pipe(ialu_imm); %} +// Conditional move for RegN. Only cmov(reg,reg). +instruct cmovNP_reg(cmpOpP cmp, flagsRegP pcc, iRegN dst, iRegN src) %{ + match(Set dst (CMoveN (Binary cmp pcc) (Binary dst src))); + ins_cost(150); + format %{ "MOV$cmp $pcc,$src,$dst" %} + ins_encode( enc_cmov_reg(cmp,dst,src, (Assembler::ptr_cc)) ); + ins_pipe(ialu_reg); +%} + +// This instruction also works with CmpN so we don't need cmovNN_reg. +instruct cmovNI_reg(cmpOp cmp, flagsReg icc, iRegN dst, iRegN src) %{ + match(Set dst (CMoveN (Binary cmp icc) (Binary dst src))); + ins_cost(150); + size(4); + format %{ "MOV$cmp $icc,$src,$dst" %} + ins_encode( enc_cmov_reg(cmp,dst,src, (Assembler::icc)) ); + ins_pipe(ialu_reg); +%} + +instruct cmovNF_reg(cmpOpF cmp, flagsRegF fcc, iRegN dst, iRegN src) %{ + match(Set dst (CMoveN (Binary cmp fcc) (Binary dst src))); + ins_cost(150); + size(4); + format %{ "MOV$cmp $fcc,$src,$dst" %} + ins_encode( enc_cmov_reg_f(cmp,dst,src, fcc) ); + ins_pipe(ialu_reg); +%} + // Conditional move instruct cmovPP_reg(cmpOpP cmp, flagsRegP pcc, iRegP dst, iRegP src) %{ match(Set dst (CMoveP (Binary cmp pcc) (Binary dst src))); @@ -6275,6 +6303,7 @@ instruct cmovPP_imm(cmpOpP cmp, flagsRegP pcc, iRegP dst, immP0 src) %{ ins_pipe(ialu_imm); %} +// This instruction also works with CmpN so we don't need cmovPN_reg. instruct cmovPI_reg(cmpOp cmp, flagsReg icc, iRegP dst, iRegP src) %{ match(Set dst (CMoveP (Binary cmp icc) (Binary dst src))); ins_cost(150); @@ -6650,10 +6679,9 @@ instruct compareAndSwapP_bool(iRegP mem_ptr, iRegP oldval, iRegP newval, iRegI r ins_pipe( long_memory_op ); %} -instruct compareAndSwapN_bool_comp(iRegP mem_ptr, iRegN oldval, iRegN newval, iRegI res, o7RegI tmp, flagsReg ccr ) %{ +instruct compareAndSwapN_bool(iRegP mem_ptr, iRegN oldval, iRegN newval, iRegI res, o7RegI tmp1, flagsReg ccr ) %{ match(Set res (CompareAndSwapN mem_ptr (Binary oldval newval))); - effect( USE mem_ptr, KILL ccr, KILL tmp); - + effect( USE mem_ptr, KILL ccr, KILL tmp1); format %{ "MOV $newval,O7\n\t" "CASA [$mem_ptr],$oldval,O7\t! If $oldval==[$mem_ptr] Then store O7 into [$mem_ptr], set O7=[$mem_ptr] in any case\n\t" @@ -6661,18 +6689,8 @@ instruct compareAndSwapN_bool_comp(iRegP mem_ptr, iRegN oldval, iRegN newval, iR "MOV 1,$res\n\t" "MOVne icc,R_G0,$res" %} - ins_encode %{ - Register Rmem = reg_to_register_object($mem_ptr$$reg); - Register Rold = reg_to_register_object($oldval$$reg); - Register Rnew = reg_to_register_object($newval$$reg); - Register Rres = reg_to_register_object($res$$reg); - - __ cas(Rmem, Rold, Rnew); - __ cmp( Rold, Rnew ); - __ mov(1, Rres); - __ movcc( Assembler::notEqual, false, Assembler::icc, G0, Rres ); - %} - + ins_encode( enc_casi(mem_ptr, oldval, newval), + enc_iflags_ne_to_boolean(res) ); ins_pipe( long_memory_op ); %} @@ -8265,6 +8283,27 @@ instruct compP_iRegP_imm13(flagsRegP pcc, iRegP op1, immP13 op2 ) %{ ins_pipe(ialu_cconly_reg_imm); %} +// Compare Narrow oops +instruct compN_iRegN(flagsReg icc, iRegN op1, iRegN op2 ) %{ + match(Set icc (CmpN op1 op2)); + + size(4); + format %{ "CMP $op1,$op2\t! compressed ptr" %} + opcode(Assembler::subcc_op3, Assembler::arith_op); + ins_encode( form3_rs1_rs2_rd( op1, op2, R_G0 ) ); + ins_pipe(ialu_cconly_reg_reg); +%} + +instruct compN_iRegN_immN0(flagsReg icc, iRegN op1, immN0 op2 ) %{ + match(Set icc (CmpN op1 op2)); + + size(4); + format %{ "CMP $op1,$op2\t! compressed ptr" %} + opcode(Assembler::subcc_op3, Assembler::arith_op); + ins_encode( form3_rs1_simm13_rd( op1, op2, R_G0 ) ); + ins_pipe(ialu_cconly_reg_imm); +%} + //----------Max and Min-------------------------------------------------------- // Min Instructions // Conditional move for min @@ -8595,6 +8634,14 @@ instruct cmovIL_imm(cmpOp cmp, flagsRegL xcc, iRegI dst, immI11 src) %{ ins_pipe(ialu_imm); %} +instruct cmovNL_reg(cmpOp cmp, flagsRegL xcc, iRegN dst, iRegN src) %{ + match(Set dst (CMoveN (Binary cmp xcc) (Binary dst src))); + ins_cost(150); + format %{ "MOV$cmp $xcc,$src,$dst" %} + ins_encode( enc_cmov_reg(cmp,dst,src, (Assembler::xcc)) ); + ins_pipe(ialu_reg); +%} + instruct cmovPL_reg(cmpOp cmp, flagsRegL xcc, iRegP dst, iRegP src) %{ match(Set dst (CMoveP (Binary cmp xcc) (Binary dst src))); ins_cost(150); @@ -8826,16 +8873,6 @@ instruct partialSubtypeCheck_vs_zero( flagsRegP pcc, o1RegP sub, o2RegP super, i %} -instruct compP_iRegN_immN0(flagsRegP pcc, iRegN op1, immN0 op2 ) %{ - match(Set pcc (CmpN op1 op2)); - - size(4); - format %{ "CMP $op1,$op2\t! ptr" %} - opcode(Assembler::subcc_op3, Assembler::arith_op); - ins_encode( form3_rs1_simm13_rd( op1, op2, R_G0 ) ); - ins_pipe(ialu_cconly_reg_imm); -%} - // ============================================================================ // inlined locking and unlocking diff --git a/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp b/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp index 73e092d620c..f21ed2f80ba 100644 --- a/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp b/hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp index 63e2bdc3e59..090242c17e6 100644 --- a/hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp b/hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp index a9bc2b9eff3..bd852da5636 100644 --- a/hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -3222,7 +3222,8 @@ void TemplateTable::_new() { __ set((intptr_t)markOopDesc::prototype(), G4_scratch); } __ st_ptr(G4_scratch, RallocatedObject, oopDesc::mark_offset_in_bytes()); // mark - __ store_klass(RinstanceKlass, RallocatedObject); // klass + __ store_klass_gap(G0, RallocatedObject); // klass gap if compressed + __ store_klass(RinstanceKlass, RallocatedObject); // klass (last for cms) { SkipIfEqual skip_if( diff --git a/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp b/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp index 46b9e34e6a6..a870c7dc15b 100644 --- a/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/sparc/vm/vm_version_sparc.hpp b/hotspot/src/cpu/sparc/vm/vm_version_sparc.hpp index d10845d0659..050e7e68fcc 100644 --- a/hotspot/src/cpu/sparc/vm/vm_version_sparc.hpp +++ b/hotspot/src/cpu/sparc/vm/vm_version_sparc.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp b/hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp index 299ce53e31e..af2536b7c48 100644 --- a/hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/x86/vm/assembler_x86_32.cpp b/hotspot/src/cpu/x86/vm/assembler_x86_32.cpp index e68bf489309..91c2e9ab193 100644 --- a/hotspot/src/cpu/x86/vm/assembler_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/assembler_x86_32.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/x86/vm/assembler_x86_32.hpp b/hotspot/src/cpu/x86/vm/assembler_x86_32.hpp index 02fb38d4056..9588449955c 100644 --- a/hotspot/src/cpu/x86/vm/assembler_x86_32.hpp +++ b/hotspot/src/cpu/x86/vm/assembler_x86_32.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1054,7 +1054,7 @@ class MacroAssembler: public Assembler { // range (0 <= offset <= page_size). void null_check(Register reg, int offset = -1); - static bool needs_explicit_null_check(int offset); + static bool needs_explicit_null_check(intptr_t offset); // Required platform-specific helpers for Label::patch_instructions. // They _shadow_ the declarations in AbstractAssembler, which are undefined. diff --git a/hotspot/src/cpu/x86/vm/assembler_x86_64.cpp b/hotspot/src/cpu/x86/vm/assembler_x86_64.cpp index f700fd71b5e..431c233df73 100644 --- a/hotspot/src/cpu/x86/vm/assembler_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/assembler_x86_64.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -683,7 +683,8 @@ address Assembler::locate_operand(address inst, WhichOperand which) { case REP8(0xB8): // movl/q r, #32/#64(oop?) if (which == end_pc_operand) return ip + (is_64bit ? 8 : 4); - assert((which == call32_operand || which == imm64_operand) && is_64bit, ""); + assert((which == call32_operand || which == imm64_operand) && is_64bit || + which == narrow_oop_operand && !is_64bit, ""); return ip; case 0x69: // imul r, a, #32 @@ -909,7 +910,8 @@ void Assembler::check_relocation(RelocationHolder const& rspec, int format) { } else if (r->is_call() || format == call32_operand) { opnd = locate_operand(inst, call32_operand); } else if (r->is_data()) { - assert(format == imm64_operand || format == disp32_operand, "format ok"); + assert(format == imm64_operand || format == disp32_operand || + format == narrow_oop_operand, "format ok"); opnd = locate_operand(inst, (WhichOperand) format); } else { assert(format == 0, "cannot specify a format"); @@ -4933,6 +4935,8 @@ void MacroAssembler::tlab_refill(Label& retry, movq(Address(top, arrayOopDesc::length_offset_in_bytes()), t1); // set klass to intArrayKlass movptr(t1, ExternalAddress((address) Universe::intArrayKlassObj_addr())); + // store klass last. concurrent gcs assumes klass length is valid if + // klass field is not null. store_klass(top, t1); // refill the tlab with an eden allocation @@ -5003,8 +5007,7 @@ int MacroAssembler::biased_locking_enter(Register lock_reg, Register obj_reg, Re jcc(Assembler::notEqual, cas_label); // The bias pattern is present in the object's header. Need to check // whether the bias owner and the epoch are both still current. - load_klass(tmp_reg, obj_reg); - movq(tmp_reg, Address(tmp_reg, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes())); + load_prototype_header(tmp_reg, obj_reg); orq(tmp_reg, r15_thread); xorq(tmp_reg, swap_reg); andq(tmp_reg, ~((int) markOopDesc::age_mask_in_place)); @@ -5078,8 +5081,7 @@ int MacroAssembler::biased_locking_enter(Register lock_reg, Register obj_reg, Re // // FIXME: due to a lack of registers we currently blow away the age // bits in this situation. Should attempt to preserve them. - load_klass(tmp_reg, obj_reg); - movq(tmp_reg, Address(tmp_reg, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes())); + load_prototype_header(tmp_reg, obj_reg); orq(tmp_reg, r15_thread); if (os::is_MP()) { lock(); @@ -5109,8 +5111,7 @@ int MacroAssembler::biased_locking_enter(Register lock_reg, Register obj_reg, Re // // FIXME: due to a lack of registers we currently blow away the age // bits in this situation. Should attempt to preserve them. - load_klass(tmp_reg, obj_reg); - movq(tmp_reg, Address(tmp_reg, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes())); + load_prototype_header(tmp_reg, obj_reg); if (os::is_MP()) { lock(); } @@ -5154,17 +5155,32 @@ void MacroAssembler::load_klass(Register dst, Register src) { } } +void MacroAssembler::load_prototype_header(Register dst, Register src) { + if (UseCompressedOops) { + movl(dst, Address(src, oopDesc::klass_offset_in_bytes())); + movq(dst, Address(r12_heapbase, dst, Address::times_8, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes())); + } else { + movq(dst, Address(src, oopDesc::klass_offset_in_bytes())); + movq(dst, Address(dst, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes())); + } +} + void MacroAssembler::store_klass(Register dst, Register src) { if (UseCompressedOops) { encode_heap_oop_not_null(src); - // zero the entire klass field first as the gap needs to be zeroed too. - movptr(Address(dst, oopDesc::klass_offset_in_bytes()), NULL_WORD); movl(Address(dst, oopDesc::klass_offset_in_bytes()), src); } else { movq(Address(dst, oopDesc::klass_offset_in_bytes()), src); } } +void MacroAssembler::store_klass_gap(Register dst, Register src) { + if (UseCompressedOops) { + // Store to klass gap in destination + movl(Address(dst, oopDesc::klass_gap_offset_in_bytes()), src); + } +} + void MacroAssembler::load_heap_oop(Register dst, Address src) { if (UseCompressedOops) { movl(dst, src); @@ -5188,13 +5204,15 @@ void MacroAssembler::store_heap_oop(Address dst, Register src) { void MacroAssembler::encode_heap_oop(Register r) { assert (UseCompressedOops, "should be compressed"); #ifdef ASSERT - Label ok; - pushq(rscratch1); // cmpptr trashes rscratch1 - cmpptr(r12_heapbase, ExternalAddress((address)Universe::heap_base_addr())); - jcc(Assembler::equal, ok); - stop("MacroAssembler::encode_heap_oop: heap base corrupted?"); - bind(ok); - popq(rscratch1); + if (CheckCompressedOops) { + Label ok; + pushq(rscratch1); // cmpptr trashes rscratch1 + cmpptr(r12_heapbase, ExternalAddress((address)Universe::heap_base_addr())); + jcc(Assembler::equal, ok); + stop("MacroAssembler::encode_heap_oop: heap base corrupted?"); + bind(ok); + popq(rscratch1); + } #endif verify_oop(r, "broken oop in encode_heap_oop"); testq(r, r); @@ -5206,11 +5224,13 @@ void MacroAssembler::encode_heap_oop(Register r) { void MacroAssembler::encode_heap_oop_not_null(Register r) { assert (UseCompressedOops, "should be compressed"); #ifdef ASSERT - Label ok; - testq(r, r); - jcc(Assembler::notEqual, ok); - stop("null oop passed to encode_heap_oop_not_null"); - bind(ok); + if (CheckCompressedOops) { + Label ok; + testq(r, r); + jcc(Assembler::notEqual, ok); + stop("null oop passed to encode_heap_oop_not_null"); + bind(ok); + } #endif verify_oop(r, "broken oop in encode_heap_oop_not_null"); subq(r, r12_heapbase); @@ -5220,11 +5240,13 @@ void MacroAssembler::encode_heap_oop_not_null(Register r) { void MacroAssembler::encode_heap_oop_not_null(Register dst, Register src) { assert (UseCompressedOops, "should be compressed"); #ifdef ASSERT - Label ok; - testq(src, src); - jcc(Assembler::notEqual, ok); - stop("null oop passed to encode_heap_oop_not_null2"); - bind(ok); + if (CheckCompressedOops) { + Label ok; + testq(src, src); + jcc(Assembler::notEqual, ok); + stop("null oop passed to encode_heap_oop_not_null2"); + bind(ok); + } #endif verify_oop(src, "broken oop in encode_heap_oop_not_null2"); if (dst != src) { @@ -5237,14 +5259,16 @@ void MacroAssembler::encode_heap_oop_not_null(Register dst, Register src) { void MacroAssembler::decode_heap_oop(Register r) { assert (UseCompressedOops, "should be compressed"); #ifdef ASSERT - Label ok; - pushq(rscratch1); - cmpptr(r12_heapbase, - ExternalAddress((address)Universe::heap_base_addr())); - jcc(Assembler::equal, ok); - stop("MacroAssembler::decode_heap_oop: heap base corrupted?"); - bind(ok); - popq(rscratch1); + if (CheckCompressedOops) { + Label ok; + pushq(rscratch1); + cmpptr(r12_heapbase, + ExternalAddress((address)Universe::heap_base_addr())); + jcc(Assembler::equal, ok); + stop("MacroAssembler::decode_heap_oop: heap base corrupted?"); + bind(ok); + popq(rscratch1); + } #endif Label done; @@ -5265,6 +5289,7 @@ void MacroAssembler::decode_heap_oop_not_null(Register r) { assert (UseCompressedOops, "should only be used for compressed headers"); // Cannot assert, unverified entry point counts instructions (see .ad file) // vtableStubs also counts instructions in pd_code_size_limit. + // Also do not verify_oop as this is called by verify_oop. assert(Address::times_8 == LogMinObjAlignmentInBytes, "decode alg wrong"); leaq(r, Address(r12_heapbase, r, Address::times_8, 0)); } @@ -5273,10 +5298,24 @@ void MacroAssembler::decode_heap_oop_not_null(Register dst, Register src) { assert (UseCompressedOops, "should only be used for compressed headers"); // Cannot assert, unverified entry point counts instructions (see .ad file) // vtableStubs also counts instructions in pd_code_size_limit. + // Also do not verify_oop as this is called by verify_oop. assert(Address::times_8 == LogMinObjAlignmentInBytes, "decode alg wrong"); leaq(dst, Address(r12_heapbase, src, Address::times_8, 0)); } +void MacroAssembler::set_narrow_oop(Register dst, jobject obj) { + assert(oop_recorder() != NULL, "this assembler needs an OopRecorder"); + int oop_index = oop_recorder()->find_index(obj); + RelocationHolder rspec = oop_Relocation::spec(oop_index); + + // movl dst,obj + InstructionMark im(this); + int encode = prefix_and_encode(dst->encoding()); + emit_byte(0xB8 | encode); + emit_data(oop_index, rspec, narrow_oop_operand); +} + + Assembler::Condition MacroAssembler::negate_condition(Assembler::Condition cond) { switch (cond) { // Note some conditions are synonyms for others diff --git a/hotspot/src/cpu/x86/vm/assembler_x86_64.hpp b/hotspot/src/cpu/x86/vm/assembler_x86_64.hpp index 9e1ccbfe59d..bf509e02b22 100644 --- a/hotspot/src/cpu/x86/vm/assembler_x86_64.hpp +++ b/hotspot/src/cpu/x86/vm/assembler_x86_64.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -490,7 +490,12 @@ class Assembler : public AbstractAssembler { imm64_operand = 0, // embedded 64-bit immediate operand disp32_operand = 1, // embedded 32-bit displacement call32_operand = 2, // embedded 32-bit self-relative displacement +#ifndef AMD64 _WhichOperand_limit = 3 +#else + narrow_oop_operand = 3, // embedded 32-bit immediate narrow oop + _WhichOperand_limit = 4 +#endif }; public: @@ -1023,7 +1028,7 @@ class MacroAssembler : public Assembler { // is needed if the offset is within a certain range (0 <= offset <= // page_size). void null_check(Register reg, int offset = -1); - static bool needs_explicit_null_check(int offset); + static bool needs_explicit_null_check(intptr_t offset); // Required platform-specific helpers for Label::patch_instructions. // They _shadow_ the declarations in AbstractAssembler, which are undefined. @@ -1104,6 +1109,9 @@ class MacroAssembler : public Assembler { // oop manipulations void load_klass(Register dst, Register src); void store_klass(Register dst, Register src); + void store_klass_gap(Register dst, Register src); + + void load_prototype_header(Register dst, Register src); void load_heap_oop(Register dst, Address src); void store_heap_oop(Address dst, Register src); @@ -1114,6 +1122,8 @@ class MacroAssembler : public Assembler { void encode_heap_oop_not_null(Register dst, Register src); void decode_heap_oop_not_null(Register dst, Register src); + void set_narrow_oop(Register dst, jobject obj); + // Stack frame creation/removal void enter(); void leave(); diff --git a/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp b/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp index 7c632cbabcd..081f38c3bac 100644 --- a/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp +++ b/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp b/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp index 7c4861d614e..d2f9e2d35b7 100644 --- a/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp +++ b/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/x86/vm/c1_MacroAssembler_x86.cpp b/hotspot/src/cpu/x86/vm/c1_MacroAssembler_x86.cpp index b80a66ed87c..27024aa8a4b 100644 --- a/hotspot/src/cpu/x86/vm/c1_MacroAssembler_x86.cpp +++ b/hotspot/src/cpu/x86/vm/c1_MacroAssembler_x86.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/x86/vm/frame_x86.cpp b/hotspot/src/cpu/x86/vm/frame_x86.cpp index 5019d16c367..9fe370e85de 100644 --- a/hotspot/src/cpu/x86/vm/frame_x86.cpp +++ b/hotspot/src/cpu/x86/vm/frame_x86.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/x86/vm/frame_x86.inline.hpp b/hotspot/src/cpu/x86/vm/frame_x86.inline.hpp index 153b1002bff..85a1944bd44 100644 --- a/hotspot/src/cpu/x86/vm/frame_x86.inline.hpp +++ b/hotspot/src/cpu/x86/vm/frame_x86.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp b/hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp index 25611881bbc..4756a2587be 100644 --- a/hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -233,7 +233,7 @@ void InterpreterMacroAssembler::gen_subtype_check(Register Rsub_klass, assert(Rsub_klass != rcx, "rcx holds 2ndary super array length"); assert(Rsub_klass != rdi, "rdi holds 2ndary super array scan ptr"); - Label not_subtype, loop; + Label not_subtype, not_subtype_pop, loop; // Profile the not-null value's klass. profile_typecheck(rcx, Rsub_klass, rdi); // blows rcx, rdi @@ -272,12 +272,13 @@ void InterpreterMacroAssembler::gen_subtype_check(Register Rsub_klass, // and we store values in objArrays always encoded, thus we need to encode value // before repne if (UseCompressedOops) { + pushq(rax); encode_heap_oop(rax); repne_scanl(); // Not equal? - jcc(Assembler::notEqual, not_subtype); - // decode heap oop here for movq - decode_heap_oop(rax); + jcc(Assembler::notEqual, not_subtype_pop); + // restore heap oop here for movq + popq(rax); } else { repne_scanq(); jcc(Assembler::notEqual, not_subtype); @@ -287,9 +288,10 @@ void InterpreterMacroAssembler::gen_subtype_check(Register Rsub_klass, Klass::secondary_super_cache_offset_in_bytes()), rax); jmp(ok_is_subtype); + bind(not_subtype_pop); + // restore heap oop here for miss + if (UseCompressedOops) popq(rax); bind(not_subtype); - // decode heap oop here for miss - if (UseCompressedOops) decode_heap_oop(rax); profile_typecheck_failed(rcx); // blows rcx } diff --git a/hotspot/src/cpu/x86/vm/interpreter_x86_64.cpp b/hotspot/src/cpu/x86/vm/interpreter_x86_64.cpp index 251c32065a0..9636c5739e5 100644 --- a/hotspot/src/cpu/x86/vm/interpreter_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/interpreter_x86_64.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/x86/vm/nativeInst_x86.cpp b/hotspot/src/cpu/x86/vm/nativeInst_x86.cpp index 9133af54123..f8147a4cc64 100644 --- a/hotspot/src/cpu/x86/vm/nativeInst_x86.cpp +++ b/hotspot/src/cpu/x86/vm/nativeInst_x86.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/x86/vm/nativeInst_x86.hpp b/hotspot/src/cpu/x86/vm/nativeInst_x86.hpp index f4115bcf985..255e8210f99 100644 --- a/hotspot/src/cpu/x86/vm/nativeInst_x86.hpp +++ b/hotspot/src/cpu/x86/vm/nativeInst_x86.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/x86/vm/register_definitions_x86.cpp b/hotspot/src/cpu/x86/vm/register_definitions_x86.cpp index c5fee6815da..1be2c138211 100644 --- a/hotspot/src/cpu/x86/vm/register_definitions_x86.cpp +++ b/hotspot/src/cpu/x86/vm/register_definitions_x86.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/x86/vm/relocInfo_x86.cpp b/hotspot/src/cpu/x86/vm/relocInfo_x86.cpp index 2c547c64518..055c237149b 100644 --- a/hotspot/src/cpu/x86/vm/relocInfo_x86.cpp +++ b/hotspot/src/cpu/x86/vm/relocInfo_x86.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,11 +30,15 @@ void Relocation::pd_set_data_value(address x, intptr_t o) { #ifdef AMD64 x += o; typedef Assembler::WhichOperand WhichOperand; - WhichOperand which = (WhichOperand) format(); // that is, disp32 or imm64, call32 + WhichOperand which = (WhichOperand) format(); // that is, disp32 or imm64, call32, narrow oop assert(which == Assembler::disp32_operand || + which == Assembler::narrow_oop_operand || which == Assembler::imm64_operand, "format unpacks ok"); if (which == Assembler::imm64_operand) { *pd_address_in_code() = x; + } else if (which == Assembler::narrow_oop_operand) { + address disp = Assembler::locate_operand(addr(), which); + *(int32_t*) disp = oopDesc::encode_heap_oop((oop)x); } else { // Note: Use runtime_call_type relocations for call32_operand. address ip = addr(); diff --git a/hotspot/src/cpu/x86/vm/relocInfo_x86.hpp b/hotspot/src/cpu/x86/vm/relocInfo_x86.hpp index 964cd1ff307..da2fe93dacc 100644 --- a/hotspot/src/cpu/x86/vm/relocInfo_x86.hpp +++ b/hotspot/src/cpu/x86/vm/relocInfo_x86.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-1999 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,5 +29,10 @@ offset_unit = 1, // Encodes Assembler::disp32_operand vs. Assembler::imm32_operand. +#ifndef AMD64 format_width = 1 +#else + // vs Assembler::narrow_oop_operand. + format_width = 2 +#endif }; diff --git a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp index 7dc635d0c34..85befcf4e78 100644 --- a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1920,7 +1920,6 @@ nmethod *SharedRuntime::generate_dtrace_nmethod( int total_strings = 0; int first_arg_to_pass = 0; int total_c_args = 0; - int box_offset = java_lang_boxing_object::value_offset_in_bytes(); if( !method->is_static() ) { // Pass in receiver first in_sig_bt[i++] = T_OBJECT; @@ -2131,7 +2130,10 @@ nmethod *SharedRuntime::generate_dtrace_nmethod( assert(dst.first()->is_stack() && (!dst.second()->is_valid() || dst.second()->is_stack()), "value(s) must go into stack slots"); - if ( out_sig_bt[c_arg] == T_LONG ) { + + BasicType bt = out_sig_bt[c_arg]; + int box_offset = java_lang_boxing_object::value_offset_in_bytes(bt); + if ( bt == T_LONG ) { __ movl(rbx, Address(in_reg, box_offset + VMRegImpl::stack_slot_size)); __ movl(Address(rsp, reg2offset_out(dst.second())), rbx); diff --git a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp index 8fa458680d3..b2d4a6513ac 100644 --- a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1950,7 +1950,6 @@ nmethod *SharedRuntime::generate_dtrace_nmethod(MacroAssembler *masm, int total_strings = 0; int first_arg_to_pass = 0; int total_c_args = 0; - int box_offset = java_lang_boxing_object::value_offset_in_bytes(); // Skip the receiver as dtrace doesn't want to see it if( !method->is_static() ) { @@ -2197,8 +2196,10 @@ nmethod *SharedRuntime::generate_dtrace_nmethod(MacroAssembler *masm, __ testq(in_reg, in_reg); __ jcc(Assembler::zero, skipUnbox); + BasicType bt = out_sig_bt[c_arg]; + int box_offset = java_lang_boxing_object::value_offset_in_bytes(bt); Address src1(in_reg, box_offset); - if ( out_sig_bt[c_arg] == T_LONG ) { + if ( bt == T_LONG ) { __ movq(in_reg, src1); __ movq(stack_dst, in_reg); assert(out_sig_bt[c_arg+1] == T_VOID, "must be"); @@ -2460,8 +2461,10 @@ nmethod *SharedRuntime::generate_dtrace_nmethod(MacroAssembler *masm, Label skip; __ testq(r, r); __ jcc(Assembler::equal, skip); + BasicType bt = out_sig_bt[c_arg]; + int box_offset = java_lang_boxing_object::value_offset_in_bytes(bt); Address src1(r, box_offset); - if ( out_sig_bt[c_arg] == T_LONG ) { + if ( bt == T_LONG ) { __ movq(r, src1); } else { __ movl(r, src1); diff --git a/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp b/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp index 5cfbc09fe74..68188361b50 100644 --- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp b/hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp index 6134af3071a..3f7d4719b5f 100644 --- a/hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp b/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp index 79bcd92f2e4..24e7e12fc85 100644 --- a/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp b/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp index f84c8f8cc05..c831b0cdc38 100644 --- a/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -3163,7 +3163,9 @@ void TemplateTable::_new() { __ movptr(Address(rax, oopDesc::mark_offset_in_bytes()), (intptr_t) markOopDesc::prototype()); // header (address 0x1) } - __ store_klass(rax, rsi); // klass + __ xorl(rcx, rcx); // use zero reg to clear memory (shorter code) + __ store_klass_gap(rax, rcx); // zero klass gap for compressed oops + __ store_klass(rax, rsi); // store klass last __ jmp(done); } diff --git a/hotspot/src/cpu/x86/vm/vm_version_x86_32.cpp b/hotspot/src/cpu/x86/vm/vm_version_x86_32.cpp index ba4e3481cb7..d65cc0cc3e6 100644 --- a/hotspot/src/cpu/x86/vm/vm_version_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/vm_version_x86_32.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -307,6 +307,10 @@ void VM_Version::get_processor_features() { // Use it on new AMD cpus starting from Opteron. UseAddressNop = true; } + if( supports_sse2() && FLAG_IS_DEFAULT(UseNewLongLShift) ) { + // Use it on new AMD cpus starting from Opteron. + UseNewLongLShift = true; + } if( FLAG_IS_DEFAULT(UseXmmLoadAndClearUpper) ) { if( supports_sse4a() ) { UseXmmLoadAndClearUpper = true; // use movsd only on '10h' Opteron diff --git a/hotspot/src/cpu/x86/vm/vm_version_x86_64.cpp b/hotspot/src/cpu/x86/vm/vm_version_x86_64.cpp index ee8e2c69018..71be1f8a20e 100644 --- a/hotspot/src/cpu/x86/vm/vm_version_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/vm_version_x86_64.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/x86/vm/vtableStubs_x86_64.cpp b/hotspot/src/cpu/x86/vm/vtableStubs_x86_64.cpp index 3a934d8d7f1..931b3aa900a 100644 --- a/hotspot/src/cpu/x86/vm/vtableStubs_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/vtableStubs_x86_64.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/cpu/x86/vm/x86_32.ad b/hotspot/src/cpu/x86/vm/x86_32.ad index 90607dc2508..35db833e9ef 100644 --- a/hotspot/src/cpu/x86/vm/x86_32.ad +++ b/hotspot/src/cpu/x86/vm/x86_32.ad @@ -1,5 +1,5 @@ // -// Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. // // This code is free software; you can redistribute it and/or modify it @@ -3806,6 +3806,78 @@ encode %{ masm.bind(DONE_LABEL); %} + enc_class enc_Array_Equals(eDIRegP ary1, eSIRegP ary2, eAXRegI tmp1, eBXRegI tmp2, eCXRegI result) %{ + Label TRUE_LABEL, FALSE_LABEL, DONE_LABEL, COMPARE_LOOP_HDR, COMPARE_LOOP; + MacroAssembler masm(&cbuf); + + Register ary1Reg = as_Register($ary1$$reg); + Register ary2Reg = as_Register($ary2$$reg); + Register tmp1Reg = as_Register($tmp1$$reg); + Register tmp2Reg = as_Register($tmp2$$reg); + Register resultReg = as_Register($result$$reg); + + int length_offset = arrayOopDesc::length_offset_in_bytes(); + int base_offset = arrayOopDesc::base_offset_in_bytes(T_CHAR); + + // Check the input args + masm.cmpl(ary1Reg, ary2Reg); + masm.jcc(Assembler::equal, TRUE_LABEL); + masm.testl(ary1Reg, ary1Reg); + masm.jcc(Assembler::zero, FALSE_LABEL); + masm.testl(ary2Reg, ary2Reg); + masm.jcc(Assembler::zero, FALSE_LABEL); + + // Check the lengths + masm.movl(tmp2Reg, Address(ary1Reg, length_offset)); + masm.movl(resultReg, Address(ary2Reg, length_offset)); + masm.cmpl(tmp2Reg, resultReg); + masm.jcc(Assembler::notEqual, FALSE_LABEL); + masm.testl(resultReg, resultReg); + masm.jcc(Assembler::zero, TRUE_LABEL); + + // Get the number of 4 byte vectors to compare + masm.shrl(resultReg, 1); + + // Check for odd-length arrays + masm.andl(tmp2Reg, 1); + masm.testl(tmp2Reg, tmp2Reg); + masm.jcc(Assembler::zero, COMPARE_LOOP_HDR); + + // Compare 2-byte "tail" at end of arrays + masm.load_unsigned_word(tmp1Reg, Address(ary1Reg, resultReg, Address::times_4, base_offset)); + masm.load_unsigned_word(tmp2Reg, Address(ary2Reg, resultReg, Address::times_4, base_offset)); + masm.cmpl(tmp1Reg, tmp2Reg); + masm.jcc(Assembler::notEqual, FALSE_LABEL); + masm.testl(resultReg, resultReg); + masm.jcc(Assembler::zero, TRUE_LABEL); + + // Setup compare loop + masm.bind(COMPARE_LOOP_HDR); + // Shift tmp1Reg and tmp2Reg to the last 4-byte boundary of the arrays + masm.leal(tmp1Reg, Address(ary1Reg, resultReg, Address::times_4, base_offset)); + masm.leal(tmp2Reg, Address(ary2Reg, resultReg, Address::times_4, base_offset)); + masm.negl(resultReg); + + // 4-byte-wide compare loop + masm.bind(COMPARE_LOOP); + masm.movl(ary1Reg, Address(tmp1Reg, resultReg, Address::times_4, 0)); + masm.movl(ary2Reg, Address(tmp2Reg, resultReg, Address::times_4, 0)); + masm.cmpl(ary1Reg, ary2Reg); + masm.jcc(Assembler::notEqual, FALSE_LABEL); + masm.increment(resultReg); + masm.jcc(Assembler::notZero, COMPARE_LOOP); + + masm.bind(TRUE_LABEL); + masm.movl(resultReg, 1); // return true + masm.jmp(DONE_LABEL); + + masm.bind(FALSE_LABEL); + masm.xorl(resultReg, resultReg); // return false + + // That's it + masm.bind(DONE_LABEL); + %} + enc_class enc_pop_rdx() %{ emit_opcode(cbuf,0x5A); %} @@ -4682,6 +4754,33 @@ operand immI_32_63() %{ interface(CONST_INTER); %} +operand immI_1() %{ + predicate( n->get_int() == 1 ); + match(ConI); + + op_cost(0); + format %{ %} + interface(CONST_INTER); +%} + +operand immI_2() %{ + predicate( n->get_int() == 2 ); + match(ConI); + + op_cost(0); + format %{ %} + interface(CONST_INTER); +%} + +operand immI_3() %{ + predicate( n->get_int() == 3 ); + match(ConI); + + op_cost(0); + format %{ %} + interface(CONST_INTER); +%} + // Pointer Immediate operand immP() %{ match(ConP); @@ -8871,6 +8970,63 @@ instruct xorl_eReg_mem(eRegL dst, load_long_memory mem, eFlagsReg cr) %{ ins_pipe( ialu_reg_long_mem ); %} +// Shift Left Long by 1 +instruct shlL_eReg_1(eRegL dst, immI_1 cnt, eFlagsReg cr) %{ + predicate(UseNewLongLShift); + match(Set dst (LShiftL dst cnt)); + effect(KILL cr); + ins_cost(100); + format %{ "ADD $dst.lo,$dst.lo\n\t" + "ADC $dst.hi,$dst.hi" %} + ins_encode %{ + __ addl($dst$$Register,$dst$$Register); + __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register)); + %} + ins_pipe( ialu_reg_long ); +%} + +// Shift Left Long by 2 +instruct shlL_eReg_2(eRegL dst, immI_2 cnt, eFlagsReg cr) %{ + predicate(UseNewLongLShift); + match(Set dst (LShiftL dst cnt)); + effect(KILL cr); + ins_cost(100); + format %{ "ADD $dst.lo,$dst.lo\n\t" + "ADC $dst.hi,$dst.hi\n\t" + "ADD $dst.lo,$dst.lo\n\t" + "ADC $dst.hi,$dst.hi" %} + ins_encode %{ + __ addl($dst$$Register,$dst$$Register); + __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register)); + __ addl($dst$$Register,$dst$$Register); + __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register)); + %} + ins_pipe( ialu_reg_long ); +%} + +// Shift Left Long by 3 +instruct shlL_eReg_3(eRegL dst, immI_3 cnt, eFlagsReg cr) %{ + predicate(UseNewLongLShift); + match(Set dst (LShiftL dst cnt)); + effect(KILL cr); + ins_cost(100); + format %{ "ADD $dst.lo,$dst.lo\n\t" + "ADC $dst.hi,$dst.hi\n\t" + "ADD $dst.lo,$dst.lo\n\t" + "ADC $dst.hi,$dst.hi\n\t" + "ADD $dst.lo,$dst.lo\n\t" + "ADC $dst.hi,$dst.hi" %} + ins_encode %{ + __ addl($dst$$Register,$dst$$Register); + __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register)); + __ addl($dst$$Register,$dst$$Register); + __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register)); + __ addl($dst$$Register,$dst$$Register); + __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register)); + %} + ins_pipe( ialu_reg_long ); +%} + // Shift Left Long by 1-31 instruct shlL_eReg_1_31(eRegL dst, immI_1_31 cnt, eFlagsReg cr) %{ match(Set dst (LShiftL dst cnt)); @@ -11565,6 +11721,17 @@ instruct string_compare(eDIRegP str1, eSIRegP str2, eAXRegI tmp1, eBXRegI tmp2, ins_pipe( pipe_slow ); %} +// fast array equals +instruct array_equals(eDIRegP ary1, eSIRegP ary2, eAXRegI tmp1, eBXRegI tmp2, eCXRegI result, eFlagsReg cr) %{ + match(Set result (AryEq ary1 ary2)); + effect(USE_KILL ary1, USE_KILL ary2, KILL tmp1, KILL tmp2, KILL cr); + //ins_cost(300); + + format %{ "Array Equals $ary1,$ary2 -> $result // KILL EAX, EBX" %} + ins_encode( enc_Array_Equals(ary1, ary2, tmp1, tmp2, result) ); + ins_pipe( pipe_slow ); +%} + //----------Control Flow Instructions------------------------------------------ // Signed compare Instructions instruct compI_eReg(eFlagsReg cr, eRegI op1, eRegI op2) %{ diff --git a/hotspot/src/cpu/x86/vm/x86_64.ad b/hotspot/src/cpu/x86/vm/x86_64.ad index 2c79821c238..302994148c0 100644 --- a/hotspot/src/cpu/x86/vm/x86_64.ad +++ b/hotspot/src/cpu/x86/vm/x86_64.ad @@ -1,5 +1,5 @@ // -// Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. // // This code is free software; you can redistribute it and/or modify it @@ -3808,6 +3808,78 @@ encode %{ masm.bind(DONE_LABEL); %} + enc_class enc_Array_Equals(rdi_RegP ary1, rsi_RegP ary2, rax_RegI tmp1, rbx_RegI tmp2, rcx_RegI result) %{ + Label TRUE_LABEL, FALSE_LABEL, DONE_LABEL, COMPARE_LOOP_HDR, COMPARE_LOOP; + MacroAssembler masm(&cbuf); + + Register ary1Reg = as_Register($ary1$$reg); + Register ary2Reg = as_Register($ary2$$reg); + Register tmp1Reg = as_Register($tmp1$$reg); + Register tmp2Reg = as_Register($tmp2$$reg); + Register resultReg = as_Register($result$$reg); + + int length_offset = arrayOopDesc::length_offset_in_bytes(); + int base_offset = arrayOopDesc::base_offset_in_bytes(T_CHAR); + + // Check the input args + masm.cmpq(ary1Reg, ary2Reg); + masm.jcc(Assembler::equal, TRUE_LABEL); + masm.testq(ary1Reg, ary1Reg); + masm.jcc(Assembler::zero, FALSE_LABEL); + masm.testq(ary2Reg, ary2Reg); + masm.jcc(Assembler::zero, FALSE_LABEL); + + // Check the lengths + masm.movl(tmp2Reg, Address(ary1Reg, length_offset)); + masm.movl(resultReg, Address(ary2Reg, length_offset)); + masm.cmpl(tmp2Reg, resultReg); + masm.jcc(Assembler::notEqual, FALSE_LABEL); + masm.testl(resultReg, resultReg); + masm.jcc(Assembler::zero, TRUE_LABEL); + + // Get the number of 4 byte vectors to compare + masm.shrl(resultReg, 1); + + // Check for odd-length arrays + masm.andl(tmp2Reg, 1); + masm.testl(tmp2Reg, tmp2Reg); + masm.jcc(Assembler::zero, COMPARE_LOOP_HDR); + + // Compare 2-byte "tail" at end of arrays + masm.load_unsigned_word(tmp1Reg, Address(ary1Reg, resultReg, Address::times_4, base_offset)); + masm.load_unsigned_word(tmp2Reg, Address(ary2Reg, resultReg, Address::times_4, base_offset)); + masm.cmpl(tmp1Reg, tmp2Reg); + masm.jcc(Assembler::notEqual, FALSE_LABEL); + masm.testl(resultReg, resultReg); + masm.jcc(Assembler::zero, TRUE_LABEL); + + // Setup compare loop + masm.bind(COMPARE_LOOP_HDR); + // Shift tmp1Reg and tmp2Reg to the last 4-byte boundary of the arrays + masm.leaq(tmp1Reg, Address(ary1Reg, resultReg, Address::times_4, base_offset)); + masm.leaq(tmp2Reg, Address(ary2Reg, resultReg, Address::times_4, base_offset)); + masm.negq(resultReg); + + // 4-byte-wide compare loop + masm.bind(COMPARE_LOOP); + masm.movl(ary1Reg, Address(tmp1Reg, resultReg, Address::times_4, 0)); + masm.movl(ary2Reg, Address(tmp2Reg, resultReg, Address::times_4, 0)); + masm.cmpl(ary1Reg, ary2Reg); + masm.jcc(Assembler::notEqual, FALSE_LABEL); + masm.incrementq(resultReg); + masm.jcc(Assembler::notZero, COMPARE_LOOP); + + masm.bind(TRUE_LABEL); + masm.movl(resultReg, 1); // return true + masm.jmp(DONE_LABEL); + + masm.bind(FALSE_LABEL); + masm.xorl(resultReg, resultReg); // return false + + // That's it + masm.bind(DONE_LABEL); + %} + enc_class enc_rethrow() %{ cbuf.set_inst_mark(); @@ -5202,15 +5274,15 @@ operand indIndexScaleOffset(any_RegP reg, immL32 off, rRegL lreg, immI2 scale) %} %} -// Indirect Memory Times Scale Plus Index Register Plus Offset Operand -operand indIndexScaleOffsetComp(rRegN src, immL32 off, r12RegL base) %{ +// Indirect Narrow Oop Plus Offset Operand +operand indNarrowOopOffset(rRegN src, immL32 off) %{ constraint(ALLOC_IN_RC(ptr_reg)); - match(AddP (DecodeN src base) off); + match(AddP (DecodeN src) off); op_cost(10); - format %{"[$base + $src << 3 + $off] (compressed)" %} + format %{"[R12 + $src << 3 + $off] (compressed oop addressing)" %} interface(MEMORY_INTER) %{ - base($base); + base(0xc); // R12 index($src); scale(0x3); disp($off); @@ -5365,7 +5437,7 @@ operand cmpOpU() opclass memory(indirect, indOffset8, indOffset32, indIndexOffset, indIndex, indIndexScale, indIndexScaleOffset, indPosIndexScaleOffset, - indIndexScaleOffsetComp); + indNarrowOopOffset); //----------PIPELINE----------------------------------------------------------- // Rules which define the behavior of the target architectures pipeline. @@ -6044,10 +6116,9 @@ instruct loadP(rRegP dst, memory mem) %} // Load Compressed Pointer -instruct loadN(rRegN dst, memory mem, rFlagsReg cr) +instruct loadN(rRegN dst, memory mem) %{ match(Set dst (LoadN mem)); - effect(KILL cr); ins_cost(125); // XXX format %{ "movl $dst, $mem\t# compressed ptr" %} @@ -6064,7 +6135,6 @@ instruct loadN(rRegN dst, memory mem, rFlagsReg cr) instruct loadKlass(rRegP dst, memory mem) %{ match(Set dst (LoadKlass mem)); - predicate(!n->in(MemNode::Address)->bottom_type()->is_narrow()); ins_cost(125); // XXX format %{ "movq $dst, $mem\t# class" %} @@ -6073,22 +6143,17 @@ instruct loadKlass(rRegP dst, memory mem) ins_pipe(ialu_reg_mem); // XXX %} -// Load Klass Pointer -instruct loadKlassComp(rRegP dst, memory mem) +// Load narrow Klass Pointer +instruct loadNKlass(rRegN dst, memory mem) %{ - match(Set dst (LoadKlass mem)); - predicate(n->in(MemNode::Address)->bottom_type()->is_narrow()); + match(Set dst (LoadNKlass mem)); ins_cost(125); // XXX - format %{ "movl $dst, $mem\t# compressed class\n\t" - "decode_heap_oop $dst,$dst" %} + format %{ "movl $dst, $mem\t# compressed klass ptr" %} ins_encode %{ Address addr = build_address($mem$$base, $mem$$index, $mem$$scale, $mem$$disp); Register dst = as_Register($dst$$reg); __ movl(dst, addr); - // klass is never null in the header but this is generated for all - // klass loads not just the _klass field in the header. - __ decode_heap_oop(dst); %} ins_pipe(ialu_reg_mem); // XXX %} @@ -6362,16 +6427,14 @@ instruct loadConN(rRegN dst, immN src) %{ match(Set dst src); ins_cost(125); - format %{ "movq $dst, $src\t# compressed ptr\n\t" - "encode_heap_oop_not_null $dst,$dst" %} + format %{ "movl $dst, $src\t# compressed ptr" %} ins_encode %{ address con = (address)$src$$constant; Register dst = $dst$$Register; if (con == NULL) { ShouldNotReachHere(); } else { - __ movoop(dst, (jobject)$src$$constant); - __ encode_heap_oop_not_null(dst); + __ set_narrow_oop(dst, (jobject)$src$$constant); } %} ins_pipe(ialu_reg_fat); // XXX @@ -6633,13 +6696,12 @@ instruct storeImmP(memory mem, immP31 src) %} // Store Compressed Pointer -instruct storeN(memory mem, rRegN src, rFlagsReg cr) +instruct storeN(memory mem, rRegN src) %{ match(Set mem (StoreN mem src)); - effect(KILL cr); ins_cost(125); // XXX - format %{ "movl $mem, $src\t# ptr" %} + format %{ "movl $mem, $src\t# compressed ptr" %} ins_encode %{ Address addr = build_address($mem$$base, $mem$$index, $mem$$scale, $mem$$disp); Register src = as_Register($src$$reg); @@ -6998,7 +7060,7 @@ instruct castP2X(rRegL dst, rRegP src) // Convert oop pointer into compressed form instruct encodeHeapOop(rRegN dst, rRegP src, rFlagsReg cr) %{ - predicate(n->bottom_type()->is_narrowoop()->make_oopptr()->ptr() != TypePtr::NotNull); + predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull); match(Set dst (EncodeP src)); effect(KILL cr); format %{ "encode_heap_oop $dst,$src" %} @@ -7014,7 +7076,7 @@ instruct encodeHeapOop(rRegN dst, rRegP src, rFlagsReg cr) %{ %} instruct encodeHeapOop_not_null(rRegN dst, rRegP src, rFlagsReg cr) %{ - predicate(n->bottom_type()->is_narrowoop()->make_oopptr()->ptr() == TypePtr::NotNull); + predicate(n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull); match(Set dst (EncodeP src)); effect(KILL cr); format %{ "encode_heap_oop_not_null $dst,$src" %} @@ -7027,7 +7089,8 @@ instruct encodeHeapOop_not_null(rRegN dst, rRegP src, rFlagsReg cr) %{ %} instruct decodeHeapOop(rRegP dst, rRegN src, rFlagsReg cr) %{ - predicate(n->bottom_type()->is_oopptr()->ptr() != TypePtr::NotNull); + predicate(n->bottom_type()->is_oopptr()->ptr() != TypePtr::NotNull && + n->bottom_type()->is_oopptr()->ptr() != TypePtr::Constant); match(Set dst (DecodeN src)); effect(KILL cr); format %{ "decode_heap_oop $dst,$src" %} @@ -7043,7 +7106,8 @@ instruct decodeHeapOop(rRegP dst, rRegN src, rFlagsReg cr) %{ %} instruct decodeHeapOop_not_null(rRegP dst, rRegN src) %{ - predicate(n->bottom_type()->is_oopptr()->ptr() == TypePtr::NotNull); + predicate(n->bottom_type()->is_oopptr()->ptr() == TypePtr::NotNull || + n->bottom_type()->is_oopptr()->ptr() == TypePtr::Constant); match(Set dst (DecodeN src)); format %{ "decode_heap_oop_not_null $dst,$src" %} ins_encode %{ @@ -7142,6 +7206,30 @@ instruct cmovI_memU(cmpOpU cop, rFlagsRegU cr, rRegI dst, memory src) ins_pipe(pipe_cmov_mem); %} +// Conditional move +instruct cmovN_reg(rRegN dst, rRegN src, rFlagsReg cr, cmpOp cop) +%{ + match(Set dst (CMoveN (Binary cop cr) (Binary dst src))); + + ins_cost(200); // XXX + format %{ "cmovl$cop $dst, $src\t# signed, compressed ptr" %} + opcode(0x0F, 0x40); + ins_encode(REX_reg_reg(dst, src), enc_cmov(cop), reg_reg(dst, src)); + ins_pipe(pipe_cmov_reg); +%} + +// Conditional move +instruct cmovN_regU(rRegN dst, rRegN src, rFlagsRegU cr, cmpOpU cop) +%{ + match(Set dst (CMoveN (Binary cop cr) (Binary dst src))); + + ins_cost(200); // XXX + format %{ "cmovl$cop $dst, $src\t# unsigned, compressed ptr" %} + opcode(0x0F, 0x40); + ins_encode(REX_reg_reg(dst, src), enc_cmov(cop), reg_reg(dst, src)); + ins_pipe(pipe_cmov_reg); +%} + // Conditional move instruct cmovP_reg(rRegP dst, rRegP src, rFlagsReg cr, cmpOp cop) %{ @@ -10862,6 +10950,18 @@ instruct string_compare(rdi_RegP str1, rsi_RegP str2, rax_RegI tmp1, ins_pipe( pipe_slow ); %} +// fast array equals +instruct array_equals(rdi_RegP ary1, rsi_RegP ary2, rax_RegI tmp1, + rbx_RegI tmp2, rcx_RegI result, rFlagsReg cr) %{ + match(Set result (AryEq ary1 ary2)); + effect(USE_KILL ary1, USE_KILL ary2, KILL tmp1, KILL tmp2, KILL cr); + //ins_cost(300); + + format %{ "Array Equals $ary1,$ary2 -> $result // KILL RAX, RBX" %} + ins_encode( enc_Array_Equals(ary1, ary2, tmp1, tmp2, result) ); + ins_pipe( pipe_slow ); +%} + //----------Control Flow Instructions------------------------------------------ // Signed compare Instructions @@ -11055,14 +11155,50 @@ instruct testP_reg_mem(rFlagsReg cr, memory op, immP0 zero) ins_pipe(ialu_cr_reg_imm); %} + +instruct compN_rReg(rFlagsRegU cr, rRegN op1, rRegN op2) +%{ + match(Set cr (CmpN op1 op2)); + + format %{ "cmpl $op1, $op2\t# compressed ptr" %} + ins_encode %{ __ cmpl(as_Register($op1$$reg), as_Register($op2$$reg)); %} + ins_pipe(ialu_cr_reg_reg); +%} + +instruct compN_rReg_mem(rFlagsRegU cr, rRegN src, memory mem) +%{ + match(Set cr (CmpN src (LoadN mem))); + + ins_cost(500); // XXX + format %{ "cmpl $src, mem\t# compressed ptr" %} + ins_encode %{ + Address adr = build_address($mem$$base, $mem$$index, $mem$$scale, $mem$$disp); + __ cmpl(as_Register($src$$reg), adr); + %} + ins_pipe(ialu_cr_reg_mem); +%} + instruct testN_reg(rFlagsReg cr, rRegN src, immN0 zero) %{ match(Set cr (CmpN src zero)); - format %{ "testl $src, $src" %} + format %{ "testl $src, $src\t# compressed ptr" %} ins_encode %{ __ testl($src$$Register, $src$$Register); %} ins_pipe(ialu_cr_reg_imm); %} +instruct testN_reg_mem(rFlagsReg cr, memory mem, immN0 zero) +%{ + match(Set cr (CmpN (LoadN mem) zero)); + + ins_cost(500); // XXX + format %{ "testl $mem, 0xffffffff\t# compressed ptr" %} + ins_encode %{ + Address addr = build_address($mem$$base, $mem$$index, $mem$$scale, $mem$$disp); + __ cmpl(addr, (int)0xFFFFFFFF); + %} + ins_pipe(ialu_cr_reg_mem); +%} + // Yanked all unsigned pointer compare operations. // Pointer compares are done with CmpP which is already unsigned. diff --git a/hotspot/src/os/linux/vm/attachListener_linux.cpp b/hotspot/src/os/linux/vm/attachListener_linux.cpp index 81ce1cc976b..f40ac8e8491 100644 --- a/hotspot/src/os/linux/vm/attachListener_linux.cpp +++ b/hotspot/src/os/linux/vm/attachListener_linux.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os/linux/vm/dtraceJSDT_linux.cpp b/hotspot/src/os/linux/vm/dtraceJSDT_linux.cpp index ea0eab9b975..b7951d881b4 100644 --- a/hotspot/src/os/linux/vm/dtraceJSDT_linux.cpp +++ b/hotspot/src/os/linux/vm/dtraceJSDT_linux.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os/linux/vm/hpi_linux.hpp b/hotspot/src/os/linux/vm/hpi_linux.hpp index d14ca94347c..b671a4e7315 100644 --- a/hotspot/src/os/linux/vm/hpi_linux.hpp +++ b/hotspot/src/os/linux/vm/hpi_linux.hpp @@ -70,6 +70,10 @@ inline int hpi::send(int fd, char *buf, int nBytes, int flags) { RESTARTABLE_RETURN_INT(::send(fd, buf, nBytes, (unsigned int) flags)); } +inline int hpi::raw_send(int fd, char *buf, int nBytes, int flags) { + return send(fd, buf, nBytes, flags); +} + inline int hpi::timeout(int fd, long timeout) { julong prevtime,newtime; struct timeval t; diff --git a/hotspot/src/os/linux/vm/jvm_linux.cpp b/hotspot/src/os/linux/vm/jvm_linux.cpp index dc4d2859c6a..b38ff5c327f 100644 --- a/hotspot/src/os/linux/vm/jvm_linux.cpp +++ b/hotspot/src/os/linux/vm/jvm_linux.cpp @@ -132,7 +132,7 @@ JVM_END */ struct siglabel { - char *name; + const char *name; int number; }; diff --git a/hotspot/src/os/linux/vm/os_linux.cpp b/hotspot/src/os/linux/vm/os_linux.cpp index d28700aab88..bc5d9ebc69e 100644 --- a/hotspot/src/os/linux/vm/os_linux.cpp +++ b/hotspot/src/os/linux/vm/os_linux.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -75,8 +75,8 @@ int os::Linux::_page_size = -1; bool os::Linux::_is_floating_stack = false; bool os::Linux::_is_NPTL = false; bool os::Linux::_supports_fast_thread_cpu_time = false; -char * os::Linux::_glibc_version = NULL; -char * os::Linux::_libpthread_version = NULL; +const char * os::Linux::_glibc_version = NULL; +const char * os::Linux::_libpthread_version = NULL; static jlong initial_time_count=0; @@ -213,9 +213,9 @@ pid_t os::Linux::gettid() { // the system call returns 1. This causes the VM to act as if it is // a single processor and elide locking (see is_MP() call). static bool unsafe_chroot_detected = false; -static char *unstable_chroot_error = "/proc file system not found.\n" - "Java may be unstable running multithreaded in a chroot " - "environment on Linux when /proc filesystem is not mounted."; +static const char *unstable_chroot_error = "/proc file system not found.\n" + "Java may be unstable running multithreaded in a chroot " + "environment on Linux when /proc filesystem is not mounted."; void os::Linux::initialize_system_info() { _processor_count = sysconf(_SC_NPROCESSORS_CONF); @@ -544,26 +544,23 @@ void os::Linux::libpthread_init() { if (n > 0) { char *str = (char *)malloc(n); confstr(_CS_GNU_LIBPTHREAD_VERSION, str, n); - // Vanilla RH-9 (glibc 2.3.2) has a bug that confstr() always tells // us "NPTL-0.29" even we are running with LinuxThreads. Check if this - // is the case: + // is the case. LinuxThreads has a hard limit on max number of threads. + // So sysconf(_SC_THREAD_THREADS_MAX) will return a positive value. + // On the other hand, NPTL does not have such a limit, sysconf() + // will return -1 and errno is not changed. Check if it is really NPTL. if (strcmp(os::Linux::glibc_version(), "glibc 2.3.2") == 0 && - strstr(str, "NPTL")) { - // LinuxThreads has a hard limit on max number of threads. So - // sysconf(_SC_THREAD_THREADS_MAX) will return a positive value. - // On the other hand, NPTL does not have such a limit, sysconf() - // will return -1 and errno is not changed. Check if it is really - // NPTL: - if (sysconf(_SC_THREAD_THREADS_MAX) > 0) { - free(str); - str = "linuxthreads"; - } + strstr(str, "NPTL") && + sysconf(_SC_THREAD_THREADS_MAX) > 0) { + free(str); + os::Linux::set_libpthread_version("linuxthreads"); + } else { + os::Linux::set_libpthread_version(str); } - os::Linux::set_libpthread_version(str); } else { - // glibc before 2.3.2 only has LinuxThreads. - os::Linux::set_libpthread_version("linuxthreads"); + // glibc before 2.3.2 only has LinuxThreads. + os::Linux::set_libpthread_version("linuxthreads"); } if (strstr(libpthread_version(), "NPTL")) { @@ -2417,8 +2414,20 @@ static bool linux_mprotect(char* addr, size_t size, int prot) { return ::mprotect(bottom, size, prot) == 0; } -bool os::protect_memory(char* addr, size_t size) { - return linux_mprotect(addr, size, PROT_READ); +// Set protections specified +bool os::protect_memory(char* addr, size_t bytes, ProtType prot, + bool is_committed) { + unsigned int p = 0; + switch (prot) { + case MEM_PROT_NONE: p = PROT_NONE; break; + case MEM_PROT_READ: p = PROT_READ; break; + case MEM_PROT_RW: p = PROT_READ|PROT_WRITE; break; + case MEM_PROT_RWX: p = PROT_READ|PROT_WRITE|PROT_EXEC; break; + default: + ShouldNotReachHere(); + } + // is_committed is unused. + return linux_mprotect(addr, bytes, p); } bool os::guard_memory(char* addr, size_t size) { @@ -3707,8 +3716,9 @@ void os::make_polling_page_unreadable(void) { // Mark the polling page as readable void os::make_polling_page_readable(void) { - if( !protect_memory((char *)_polling_page, Linux::page_size()) ) + if( !linux_mprotect((char *)_polling_page, Linux::page_size(), PROT_READ)) { fatal("Could not enable polling page"); + } }; int os::active_processor_count() { @@ -4632,11 +4642,7 @@ extern char** environ; // Unlike system(), this function can be called from signal handler. It // doesn't block SIGINT et al. int os::fork_and_exec(char* cmd) { - char * argv[4]; - argv[0] = "sh"; - argv[1] = "-c"; - argv[2] = cmd; - argv[3] = NULL; + const char * argv[4] = {"sh", "-c", cmd, NULL}; // fork() in LinuxThreads/NPTL is not async-safe. It needs to run // pthread_atfork handlers and reset pthread library. All we need is a @@ -4661,7 +4667,7 @@ int os::fork_and_exec(char* cmd) { // IA64 should use normal execve() from glibc to match the glibc fork() // above. NOT_IA64(syscall(__NR_execve, "/bin/sh", argv, environ);) - IA64_ONLY(execve("/bin/sh", argv, environ);) + IA64_ONLY(execve("/bin/sh", (char* const*)argv, environ);) // execve failed _exit(-1); diff --git a/hotspot/src/os/linux/vm/os_linux.hpp b/hotspot/src/os/linux/vm/os_linux.hpp index 54fc117311f..baa412501f3 100644 --- a/hotspot/src/os/linux/vm/os_linux.hpp +++ b/hotspot/src/os/linux/vm/os_linux.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -52,8 +52,8 @@ class Linux { static address _initial_thread_stack_bottom; static uintptr_t _initial_thread_stack_size; - static char *_glibc_version; - static char *_libpthread_version; + static const char *_glibc_version; + static const char *_libpthread_version; static bool _is_floating_stack; static bool _is_NPTL; @@ -72,8 +72,8 @@ class Linux { static julong physical_memory() { return _physical_memory; } static void initialize_system_info(); - static void set_glibc_version(char *s) { _glibc_version = s; } - static void set_libpthread_version(char *s) { _libpthread_version = s; } + static void set_glibc_version(const char *s) { _glibc_version = s; } + static void set_libpthread_version(const char *s) { _libpthread_version = s; } static bool supports_variable_stack_size(); @@ -134,8 +134,8 @@ class Linux { static bool chained_handler(int sig, siginfo_t* siginfo, void* context); // GNU libc and libpthread version strings - static char *glibc_version() { return _glibc_version; } - static char *libpthread_version() { return _libpthread_version; } + static const char *glibc_version() { return _glibc_version; } + static const char *libpthread_version() { return _libpthread_version; } // NPTL or LinuxThreads? static bool is_LinuxThreads() { return !_is_NPTL; } diff --git a/hotspot/src/os/linux/vm/os_linux.inline.hpp b/hotspot/src/os/linux/vm/os_linux.inline.hpp index 399fa0c4474..6f6d608ae2d 100644 --- a/hotspot/src/os/linux/vm/os_linux.inline.hpp +++ b/hotspot/src/os/linux/vm/os_linux.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os/solaris/dtrace/generateJvmOffsets.cpp b/hotspot/src/os/solaris/dtrace/generateJvmOffsets.cpp index 8e9be682488..feedb287ada 100644 --- a/hotspot/src/os/solaris/dtrace/generateJvmOffsets.cpp +++ b/hotspot/src/os/solaris/dtrace/generateJvmOffsets.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os/solaris/dtrace/jhelper.d b/hotspot/src/os/solaris/dtrace/jhelper.d index 19b4c08c2d3..6f2f6165c35 100644 --- a/hotspot/src/os/solaris/dtrace/jhelper.d +++ b/hotspot/src/os/solaris/dtrace/jhelper.d @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os/solaris/dtrace/libjvm_db.c b/hotspot/src/os/solaris/dtrace/libjvm_db.c index 5c133663d4b..ad0031e4b92 100644 --- a/hotspot/src/os/solaris/dtrace/libjvm_db.c +++ b/hotspot/src/os/solaris/dtrace/libjvm_db.c @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os/solaris/vm/dtraceJSDT_solaris.cpp b/hotspot/src/os/solaris/vm/dtraceJSDT_solaris.cpp index 49f74216f16..5f05d7c1cd1 100644 --- a/hotspot/src/os/solaris/vm/dtraceJSDT_solaris.cpp +++ b/hotspot/src/os/solaris/vm/dtraceJSDT_solaris.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os/solaris/vm/hpi_solaris.hpp b/hotspot/src/os/solaris/vm/hpi_solaris.hpp index cd5f2eab6ac..8164a8eca9f 100644 --- a/hotspot/src/os/solaris/vm/hpi_solaris.hpp +++ b/hotspot/src/os/solaris/vm/hpi_solaris.hpp @@ -71,6 +71,10 @@ inline int hpi::send(int fd, char *buf, int nBytes, int flags) { INTERRUPTIBLE_RETURN_INT(::send(fd, buf, nBytes, flags), os::Solaris::clear_interrupted); } +inline int hpi::raw_send(int fd, char *buf, int nBytes, int flags) { + RESTARTABLE_RETURN_INT(::send(fd, buf, nBytes, flags)); +} + // As both poll and select can be interrupted by signals, we have to be // prepared to restart the system call after updating the timeout, unless // a poll() is done with timeout == -1, in which case we repeat with this diff --git a/hotspot/src/os/solaris/vm/os_solaris.cpp b/hotspot/src/os/solaris/vm/os_solaris.cpp index ce6765e8d50..b6ca2a6db90 100644 --- a/hotspot/src/os/solaris/vm/os_solaris.cpp +++ b/hotspot/src/os/solaris/vm/os_solaris.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -2965,10 +2965,21 @@ static bool solaris_mprotect(char* addr, size_t bytes, int prot) { return retVal == 0; } -// Protect memory (make it read-only. (Used to pass readonly pages through +// Protect memory (Used to pass readonly pages through // JNI GetArrayElements with empty arrays.) -bool os::protect_memory(char* addr, size_t bytes) { - return solaris_mprotect(addr, bytes, PROT_READ); +bool os::protect_memory(char* addr, size_t bytes, ProtType prot, + bool is_committed) { + unsigned int p = 0; + switch (prot) { + case MEM_PROT_NONE: p = PROT_NONE; break; + case MEM_PROT_READ: p = PROT_READ; break; + case MEM_PROT_RW: p = PROT_READ|PROT_WRITE; break; + case MEM_PROT_RWX: p = PROT_READ|PROT_WRITE|PROT_EXEC; break; + default: + ShouldNotReachHere(); + } + // is_committed is unused. + return solaris_mprotect(addr, bytes, p); } // guard_memory and unguard_memory only happens within stack guard pages. diff --git a/hotspot/src/os/solaris/vm/os_solaris.hpp b/hotspot/src/os/solaris/vm/os_solaris.hpp index 545802ae158..cffe4ee80ac 100644 --- a/hotspot/src/os/solaris/vm/os_solaris.hpp +++ b/hotspot/src/os/solaris/vm/os_solaris.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os/solaris/vm/os_solaris.inline.hpp b/hotspot/src/os/solaris/vm/os_solaris.inline.hpp index 3fe038dd6ce..0c640973e61 100644 --- a/hotspot/src/os/solaris/vm/os_solaris.inline.hpp +++ b/hotspot/src/os/solaris/vm/os_solaris.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os/windows/vm/dtraceJSDT_windows.cpp b/hotspot/src/os/windows/vm/dtraceJSDT_windows.cpp index 8f8986a98a2..9ef18dfdb59 100644 --- a/hotspot/src/os/windows/vm/dtraceJSDT_windows.cpp +++ b/hotspot/src/os/windows/vm/dtraceJSDT_windows.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os/windows/vm/hpi_windows.hpp b/hotspot/src/os/windows/vm/hpi_windows.hpp index 1398950c85b..663654f0774 100644 --- a/hotspot/src/os/windows/vm/hpi_windows.hpp +++ b/hotspot/src/os/windows/vm/hpi_windows.hpp @@ -102,6 +102,10 @@ HPIDECL(send, "send", _socket, Send, int, "%d", fd, buf, nBytes, flags), (fd, buf, nBytes, flags)); +inline int hpi::raw_send(int fd, char *buf, int nBytes, int flags) { + return send(fd, buf, nBytes, flags); +} + HPIDECL(timeout, "timeout", _socket, Timeout, int, "%d", (int fd, long timeout), ("fd = %d, timeout = %ld", fd, timeout), diff --git a/hotspot/src/os/windows/vm/os_windows.cpp b/hotspot/src/os/windows/vm/os_windows.cpp index a114b894690..14b3141d27e 100644 --- a/hotspot/src/os/windows/vm/os_windows.cpp +++ b/hotspot/src/os/windows/vm/os_windows.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -2170,6 +2170,7 @@ LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) { // Windows 98 reports faulting addresses incorrectly if (!MacroAssembler::needs_explicit_null_check((intptr_t)addr) || !os::win32::is_nt()) { + return Handle_Exception(exceptionInfo, SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL)); } @@ -2563,9 +2564,33 @@ bool os::release_memory(char* addr, size_t bytes) { return VirtualFree(addr, 0, MEM_RELEASE) != 0; } -bool os::protect_memory(char* addr, size_t bytes) { +// Set protections specified +bool os::protect_memory(char* addr, size_t bytes, ProtType prot, + bool is_committed) { + unsigned int p = 0; + switch (prot) { + case MEM_PROT_NONE: p = PAGE_NOACCESS; break; + case MEM_PROT_READ: p = PAGE_READONLY; break; + case MEM_PROT_RW: p = PAGE_READWRITE; break; + case MEM_PROT_RWX: p = PAGE_EXECUTE_READWRITE; break; + default: + ShouldNotReachHere(); + } + DWORD old_status; - return VirtualProtect(addr, bytes, PAGE_READONLY, &old_status) != 0; + + // Strange enough, but on Win32 one can change protection only for committed + // memory, not a big deal anyway, as bytes less or equal than 64K + if (!is_committed && !commit_memory(addr, bytes)) { + fatal("cannot commit protection page"); + } + // One cannot use os::guard_memory() here, as on Win32 guard page + // have different (one-shot) semantics, from MSDN on PAGE_GUARD: + // + // Pages in the region become guard pages. Any attempt to access a guard page + // causes the system to raise a STATUS_GUARD_PAGE exception and turn off + // the guard page status. Guard pages thus act as a one-time access alarm. + return VirtualProtect(addr, bytes, p, &old_status) != 0; } bool os::guard_memory(char* addr, size_t bytes) { diff --git a/hotspot/src/os/windows/vm/os_windows.inline.hpp b/hotspot/src/os/windows/vm/os_windows.inline.hpp index 26be952c03f..49dc4e75d5c 100644 --- a/hotspot/src/os/windows/vm/os_windows.inline.hpp +++ b/hotspot/src/os/windows/vm/os_windows.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os_cpu/linux_sparc/vm/assembler_linux_sparc.cpp b/hotspot/src/os_cpu/linux_sparc/vm/assembler_linux_sparc.cpp index 7ffae8d17ea..0fcd3b0d6d8 100644 --- a/hotspot/src/os_cpu/linux_sparc/vm/assembler_linux_sparc.cpp +++ b/hotspot/src/os_cpu/linux_sparc/vm/assembler_linux_sparc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,12 +27,6 @@ #include -bool MacroAssembler::needs_explicit_null_check(intptr_t offset) { - // Since the linux kernel resides at the low end of - // user address space, no null pointer check is needed. - return offset < 0 || offset >= 0x100000; -} - void MacroAssembler::read_ccr_trap(Register ccr_save) { // No implementation breakpoint_trap(); diff --git a/hotspot/src/os_cpu/linux_sparc/vm/atomic_linux_sparc.inline.hpp b/hotspot/src/os_cpu/linux_sparc/vm/atomic_linux_sparc.inline.hpp index a932a1079bc..3dc9842c623 100644 --- a/hotspot/src/os_cpu/linux_sparc/vm/atomic_linux_sparc.inline.hpp +++ b/hotspot/src/os_cpu/linux_sparc/vm/atomic_linux_sparc.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it 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 4f2693db8ed..ccc884e8329 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 @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os_cpu/linux_sparc/vm/linux_sparc.ad b/hotspot/src/os_cpu/linux_sparc/vm/linux_sparc.ad index 33288c5df2c..1f768790289 100644 --- a/hotspot/src/os_cpu/linux_sparc/vm/linux_sparc.ad +++ b/hotspot/src/os_cpu/linux_sparc/vm/linux_sparc.ad @@ -1,5 +1,5 @@ // -// Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. // // This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os_cpu/linux_sparc/vm/linux_sparc.s b/hotspot/src/os_cpu/linux_sparc/vm/linux_sparc.s index dda3d05563e..ec5e2cd7139 100644 --- a/hotspot/src/os_cpu/linux_sparc/vm/linux_sparc.s +++ b/hotspot/src/os_cpu/linux_sparc/vm/linux_sparc.s @@ -1,5 +1,5 @@ # -# Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os_cpu/linux_sparc/vm/orderAccess_linux_sparc.inline.hpp b/hotspot/src/os_cpu/linux_sparc/vm/orderAccess_linux_sparc.inline.hpp index 9b39f98fb22..44b0d2c83f2 100644 --- a/hotspot/src/os_cpu/linux_sparc/vm/orderAccess_linux_sparc.inline.hpp +++ b/hotspot/src/os_cpu/linux_sparc/vm/orderAccess_linux_sparc.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp b/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp index cc209852554..2226285c0e7 100644 --- a/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp +++ b/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.hpp b/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.hpp index 0a88fef95e2..4c74a6af6ab 100644 --- a/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.hpp +++ b/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os_cpu/linux_sparc/vm/prefetch_linux_sparc.inline.hpp b/hotspot/src/os_cpu/linux_sparc/vm/prefetch_linux_sparc.inline.hpp index 250704ff5d9..8a14e013c53 100644 --- a/hotspot/src/os_cpu/linux_sparc/vm/prefetch_linux_sparc.inline.hpp +++ b/hotspot/src/os_cpu/linux_sparc/vm/prefetch_linux_sparc.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os_cpu/linux_sparc/vm/threadLS_linux_sparc.cpp b/hotspot/src/os_cpu/linux_sparc/vm/threadLS_linux_sparc.cpp index a2c536cfc53..a3cfcb09666 100644 --- a/hotspot/src/os_cpu/linux_sparc/vm/threadLS_linux_sparc.cpp +++ b/hotspot/src/os_cpu/linux_sparc/vm/threadLS_linux_sparc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os_cpu/linux_sparc/vm/threadLS_linux_sparc.hpp b/hotspot/src/os_cpu/linux_sparc/vm/threadLS_linux_sparc.hpp index 5cfa7ee8647..a301a243106 100644 --- a/hotspot/src/os_cpu/linux_sparc/vm/threadLS_linux_sparc.hpp +++ b/hotspot/src/os_cpu/linux_sparc/vm/threadLS_linux_sparc.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os_cpu/linux_sparc/vm/thread_linux_sparc.cpp b/hotspot/src/os_cpu/linux_sparc/vm/thread_linux_sparc.cpp index 1c8a030d0d7..bcb8442b4d4 100644 --- a/hotspot/src/os_cpu/linux_sparc/vm/thread_linux_sparc.cpp +++ b/hotspot/src/os_cpu/linux_sparc/vm/thread_linux_sparc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os_cpu/linux_sparc/vm/thread_linux_sparc.hpp b/hotspot/src/os_cpu/linux_sparc/vm/thread_linux_sparc.hpp index 14ece634631..38779d09f0f 100644 --- a/hotspot/src/os_cpu/linux_sparc/vm/thread_linux_sparc.hpp +++ b/hotspot/src/os_cpu/linux_sparc/vm/thread_linux_sparc.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os_cpu/linux_sparc/vm/vmStructs_linux_sparc.hpp b/hotspot/src/os_cpu/linux_sparc/vm/vmStructs_linux_sparc.hpp index 5358d213c65..30036c490a4 100644 --- a/hotspot/src/os_cpu/linux_sparc/vm/vmStructs_linux_sparc.hpp +++ b/hotspot/src/os_cpu/linux_sparc/vm/vmStructs_linux_sparc.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os_cpu/linux_sparc/vm/vm_version_linux_sparc.cpp b/hotspot/src/os_cpu/linux_sparc/vm/vm_version_linux_sparc.cpp index 34bd7c82c99..9a15150502e 100644 --- a/hotspot/src/os_cpu/linux_sparc/vm/vm_version_linux_sparc.cpp +++ b/hotspot/src/os_cpu/linux_sparc/vm/vm_version_linux_sparc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os_cpu/linux_x86/vm/assembler_linux_x86_32.cpp b/hotspot/src/os_cpu/linux_x86/vm/assembler_linux_x86_32.cpp index e35442d61b5..1854b007516 100644 --- a/hotspot/src/os_cpu/linux_x86/vm/assembler_linux_x86_32.cpp +++ b/hotspot/src/os_cpu/linux_x86/vm/assembler_linux_x86_32.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,10 +39,3 @@ void MacroAssembler::get_thread(Register thread) { movptr(thread, tls); } - -bool MacroAssembler::needs_explicit_null_check(int offset) { - // Linux kernel guarantees that the first page is always unmapped. Don't - // assume anything more than that. - bool offset_in_first_page = 0 <= offset && offset < os::vm_page_size(); - return !offset_in_first_page; -} diff --git a/hotspot/src/os_cpu/linux_x86/vm/assembler_linux_x86_64.cpp b/hotspot/src/os_cpu/linux_x86/vm/assembler_linux_x86_64.cpp index 02ad9e4bdd8..24a4dce09e4 100644 --- a/hotspot/src/os_cpu/linux_x86/vm/assembler_linux_x86_64.cpp +++ b/hotspot/src/os_cpu/linux_x86/vm/assembler_linux_x86_64.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -65,9 +65,3 @@ void MacroAssembler::get_thread(Register thread) { popq(rax); } } - -// NOTE: since the linux kernel resides at the low end of -// user address space, no null pointer check is needed. -bool MacroAssembler::needs_explicit_null_check(int offset) { - return offset < 0 || offset >= 0x100000; -} diff --git a/hotspot/src/os_cpu/linux_x86/vm/bytes_linux_x86.inline.hpp b/hotspot/src/os_cpu/linux_x86/vm/bytes_linux_x86.inline.hpp index f0e0d5c4775..fb36b9379f1 100644 --- a/hotspot/src/os_cpu/linux_x86/vm/bytes_linux_x86.inline.hpp +++ b/hotspot/src/os_cpu/linux_x86/vm/bytes_linux_x86.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2001 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp index d598333157e..174c1df492e 100644 --- a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp +++ b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os_cpu/solaris_sparc/vm/assembler_solaris_sparc.cpp b/hotspot/src/os_cpu/solaris_sparc/vm/assembler_solaris_sparc.cpp index 8e18dde9c31..caab18f5dcd 100644 --- a/hotspot/src/os_cpu/solaris_sparc/vm/assembler_solaris_sparc.cpp +++ b/hotspot/src/os_cpu/solaris_sparc/vm/assembler_solaris_sparc.cpp @@ -28,18 +28,6 @@ #include // For trap numbers #include // For V8 compatibility -bool MacroAssembler::needs_explicit_null_check(intptr_t offset) { - // The first page of virtual addresses is unmapped on SPARC. - // Thus, any access the VM makes through a null pointer with an offset of - // less than 4K will get a recognizable SIGSEGV, which the signal handler - // will transform into a NullPointerException. - // (Actually, the first 64K or so is unmapped, but it's simpler - // to depend only on the first 4K or so.) - - bool offset_in_first_page = 0 <= offset && offset < os::vm_page_size(); - return !offset_in_first_page; -} - void MacroAssembler::read_ccr_trap(Register ccr_save) { // Execute a trap to get the PSR, mask and shift // to get the condition codes. diff --git a/hotspot/src/os_cpu/solaris_sparc/vm/solaris_sparc.s b/hotspot/src/os_cpu/solaris_sparc/vm/solaris_sparc.s index 411fdcdabf0..4762af983f4 100644 --- a/hotspot/src/os_cpu/solaris_sparc/vm/solaris_sparc.s +++ b/hotspot/src/os_cpu/solaris_sparc/vm/solaris_sparc.s @@ -1,5 +1,5 @@ !! -!! Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. +!! Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. !! DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. !! !! This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os_cpu/solaris_sparc/vm/thread_solaris_sparc.cpp b/hotspot/src/os_cpu/solaris_sparc/vm/thread_solaris_sparc.cpp index 1896130226f..2b6c743dc12 100644 --- a/hotspot/src/os_cpu/solaris_sparc/vm/thread_solaris_sparc.cpp +++ b/hotspot/src/os_cpu/solaris_sparc/vm/thread_solaris_sparc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os_cpu/solaris_x86/vm/assembler_solaris_x86_32.cpp b/hotspot/src/os_cpu/solaris_x86/vm/assembler_solaris_x86_32.cpp index 2f877bfce47..bce611c1125 100644 --- a/hotspot/src/os_cpu/solaris_x86/vm/assembler_solaris_x86_32.cpp +++ b/hotspot/src/os_cpu/solaris_x86/vm/assembler_solaris_x86_32.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -79,9 +79,3 @@ void MacroAssembler::get_thread(Register thread) { if (thread != rax) popl(rax); popl(thread); } - -bool MacroAssembler::needs_explicit_null_check(int offset) { - // Identical to Sparc/Solaris code - bool offset_in_first_page = 0 <= offset && offset < os::vm_page_size(); - return !offset_in_first_page; -} diff --git a/hotspot/src/os_cpu/solaris_x86/vm/assembler_solaris_x86_64.cpp b/hotspot/src/os_cpu/solaris_x86/vm/assembler_solaris_x86_64.cpp index b6c210f93b8..2ccae8a683d 100644 --- a/hotspot/src/os_cpu/solaris_x86/vm/assembler_solaris_x86_64.cpp +++ b/hotspot/src/os_cpu/solaris_x86/vm/assembler_solaris_x86_64.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2004-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2004-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -85,9 +85,3 @@ void MacroAssembler::get_thread(Register thread) { popq(rax); } } - -bool MacroAssembler::needs_explicit_null_check(int offset) { - // Identical to Sparc/Solaris code - bool offset_in_first_page = 0 <= offset && offset < os::vm_page_size(); - return !offset_in_first_page; -} diff --git a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp index 34365dfaee9..b21206dd227 100644 --- a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp +++ b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os_cpu/solaris_x86/vm/thread_solaris_x86.cpp b/hotspot/src/os_cpu/solaris_x86/vm/thread_solaris_x86.cpp index 06c9aed2e85..bc4b56b2d89 100644 --- a/hotspot/src/os_cpu/solaris_x86/vm/thread_solaris_x86.cpp +++ b/hotspot/src/os_cpu/solaris_x86/vm/thread_solaris_x86.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/os_cpu/windows_x86/vm/assembler_windows_x86_32.cpp b/hotspot/src/os_cpu/windows_x86/vm/assembler_windows_x86_32.cpp index dd90d704fea..5e91ce654f8 100644 --- a/hotspot/src/os_cpu/windows_x86/vm/assembler_windows_x86_32.cpp +++ b/hotspot/src/os_cpu/windows_x86/vm/assembler_windows_x86_32.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -58,7 +58,3 @@ void MacroAssembler::get_thread(Register thread) { "Thread Pointer Offset has not been initialized"); movl(thread, Address(thread, ThreadLocalStorage::get_thread_ptr_offset())); } - -bool MacroAssembler::needs_explicit_null_check(int offset) { - return offset < 0 || (int)os::vm_page_size() <= offset; -} diff --git a/hotspot/src/os_cpu/windows_x86/vm/assembler_windows_x86_64.cpp b/hotspot/src/os_cpu/windows_x86/vm/assembler_windows_x86_64.cpp index c0211d0afd8..7ff190fb21b 100644 --- a/hotspot/src/os_cpu/windows_x86/vm/assembler_windows_x86_64.cpp +++ b/hotspot/src/os_cpu/windows_x86/vm/assembler_windows_x86_64.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -65,7 +65,3 @@ void MacroAssembler::get_thread(Register thread) { popq(rax); } } - -bool MacroAssembler::needs_explicit_null_check(int offset) { - return offset < 0 || (int)os::vm_page_size() <= offset; -} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/build.xml new file mode 100644 index 00000000000..2c8642cfb1a --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/build.xml @@ -0,0 +1,8 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.svg. + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/manifest.mf new file mode 100644 index 00000000000..689e17a01e8 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/manifest.mf @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +OpenIDE-Module: com.sun.hotspot.igv.svg +OpenIDE-Module-Layer: com/sun/hotspot/igv/svg/layer.xml +OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/svg/Bundle.properties +OpenIDE-Module-Specification-Version: 1.0 + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/build-impl.xml new file mode 100644 index 00000000000..5fe569eec79 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/build-impl.xml @@ -0,0 +1,30 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/genfiles.properties new file mode 100644 index 00000000000..5018df1e656 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=ebcf0422 +build.xml.script.CRC32=d7a2678d +build.xml.stylesheet.CRC32=79c3b980 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=ebcf0422 +nbproject/build-impl.xml.script.CRC32=57997f94 +nbproject/build-impl.xml.stylesheet.CRC32=deb65f65 diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/project.properties new file mode 100644 index 00000000000..152f44eca60 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/project.properties @@ -0,0 +1,2 @@ +javac.source=1.5 +javac.compilerargs=-Xlint -Xlint:-serial diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/project.xml new file mode 100644 index 00000000000..3939a84a094 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/project.xml @@ -0,0 +1,14 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.svg + + + + com.sun.hotspot.igv.svg + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/suite.properties new file mode 100644 index 00000000000..29d7cc9bd6f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/suite.properties @@ -0,0 +1 @@ +suite.dir=${basedir}/.. diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/BatikSVG.java b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/BatikSVG.java new file mode 100644 index 00000000000..8326ff11009 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/BatikSVG.java @@ -0,0 +1,86 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.svg; + +import java.awt.Graphics2D; +import java.io.Writer; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import org.w3c.dom.DOMImplementation; + +/** + * + * @author Thomas Wuerthinger + */ +public class BatikSVG { + + private static Constructor SVGGraphics2DConstructor; + private static Method Method_stream; + private static Method Method_createDefault; + private static Method Method_getDOMImplementation; + private static Method Method_setEmbeddedFontsOn; + + public static Graphics2D createGraphicsObject() { + try { + if (SVGGraphics2DConstructor == null) { + ClassLoader cl = BatikSVG.class.getClassLoader(); + Class Class_GenericDOMImplementation = cl.loadClass("org.apache.batik.dom.GenericDOMImplementation"); + Class Class_SVGGeneratorContext = cl.loadClass("org.apache.batik.svggen.SVGGeneratorContext"); + Class Class_SVGGraphics2D = cl.loadClass("org.apache.batik.svggen.SVGGraphics2D"); + Method_getDOMImplementation = Class_GenericDOMImplementation.getDeclaredMethod("getDOMImplementation", new Class[0]); + Method_createDefault = Class_SVGGeneratorContext.getDeclaredMethod("createDefault", new Class[]{org.w3c.dom.Document.class}); + Method_setEmbeddedFontsOn = Class_SVGGeneratorContext.getDeclaredMethod("setEmbeddedFontsOn", new Class[]{boolean.class}); + Method_stream = Class_SVGGraphics2D.getDeclaredMethod("stream", Writer.class, boolean.class); + SVGGraphics2DConstructor = Class_SVGGraphics2D.getConstructor(Class_SVGGeneratorContext, boolean.class); + } + DOMImplementation dom = (DOMImplementation) Method_getDOMImplementation.invoke(null); + org.w3c.dom.Document document = dom.createDocument("http://www.w3.org/2000/svg", "svg", null); + Object ctx = Method_createDefault.invoke(null, document); + Method_setEmbeddedFontsOn.invoke(ctx, true); + Graphics2D svgGenerator = (Graphics2D) SVGGraphics2DConstructor.newInstance(ctx, true); + return svgGenerator; + } catch (ClassNotFoundException e) { + return null; + } catch (NoSuchMethodException e) { + return null; + } catch (IllegalAccessException e) { + return null; + } catch (InvocationTargetException e) { + return null; + } catch (InstantiationException e) { + return null; + } + } + + public static void printToStream(Graphics2D svgGenerator, Writer stream, boolean useCSS) { + try { + Method_stream.invoke(svgGenerator, stream, useCSS); + } catch (IllegalAccessException e) { + assert false; + } catch (InvocationTargetException e) { + assert false; + } + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/Bundle.properties new file mode 100644 index 00000000000..e579912925b --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/Bundle.properties @@ -0,0 +1 @@ +OpenIDE-Module-Name=BatikSVGProxy diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/layer.xml b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/layer.xml new file mode 100644 index 00000000000..c16a8a0fed6 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/layer.xml @@ -0,0 +1,4 @@ + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/build.xml new file mode 100644 index 00000000000..1466d8606bc --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/build.xml @@ -0,0 +1,8 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.bytecodes. + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/manifest.mf new file mode 100644 index 00000000000..a04660a02f9 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/manifest.mf @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +OpenIDE-Module: com.sun.hotspot.igv.bytecodes +OpenIDE-Module-Layer: com/sun/hotspot/igv/bytecodes/layer.xml +OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/bytecodes/Bundle.properties +OpenIDE-Module-Specification-Version: 1.0 + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/build-impl.xml new file mode 100644 index 00000000000..4991499c388 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/build-impl.xml @@ -0,0 +1,30 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/genfiles.properties new file mode 100644 index 00000000000..a60cd07cac9 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=1dee290d +build.xml.script.CRC32=d594034f +build.xml.stylesheet.CRC32=79c3b980 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=1dee290d +nbproject/build-impl.xml.script.CRC32=b4dab126 +nbproject/build-impl.xml.stylesheet.CRC32=deb65f65 diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/platform.properties new file mode 100644 index 00000000000..68ad75e5766 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/platform.properties @@ -0,0 +1,29 @@ +# Deprecated since 5.0u1; for compatibility with 5.0: +disabled.clusters=\ + apisupport1,\ + harness,\ + ide8,\ + java1,\ + nb6.0,\ + profiler2 +disabled.modules=\ + org.netbeans.core.execution,\ + org.netbeans.core.multiview,\ + org.netbeans.core.output2,\ + org.netbeans.modules.applemenu,\ + org.netbeans.modules.autoupdate.services,\ + org.netbeans.modules.autoupdate.ui,\ + org.netbeans.modules.core.kit,\ + org.netbeans.modules.favorites,\ + org.netbeans.modules.javahelp,\ + org.netbeans.modules.masterfs,\ + org.netbeans.modules.options.keymap,\ + org.netbeans.modules.sendopts,\ + org.netbeans.modules.templates,\ + org.openide.compat,\ + org.openide.execution,\ + org.openide.util.enumerations +enabled.clusters=\ + platform7 +nbjdk.active=JDK_1.6 +nbplatform.active=default diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/project.properties new file mode 100644 index 00000000000..152f44eca60 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/project.properties @@ -0,0 +1,2 @@ +javac.source=1.5 +javac.compilerargs=-Xlint -Xlint:-serial diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/project.xml new file mode 100644 index 00000000000..91bd8120565 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/project.xml @@ -0,0 +1,62 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.bytecodes + + + + com.sun.hotspot.igv.data + + + + 1.0 + + + + org.jdesktop.layout + + + + 1 + 1.4 + + + + org.openide.explorer + + + + 6.11 + + + + org.openide.nodes + + + + 7.2.0.1 + + + + org.openide.util + + + + 7.9.0.1 + + + + org.openide.windows + + + + 6.16 + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/suite.properties new file mode 100644 index 00000000000..29d7cc9bd6f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/suite.properties @@ -0,0 +1 @@ +suite.dir=${basedir}/.. diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/Bundle.properties new file mode 100644 index 00000000000..cd6852f9dd9 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/Bundle.properties @@ -0,0 +1,5 @@ +CTL_BytecodeViewAction=Open BytecodeView Window +CTL_BytecodeViewTopComponent=BytecodeView Window +CTL_SelectBytecodesAction=Select nodes +HINT_BytecodeViewTopComponent=This is a BytecodeView window +OpenIDE-Module-Name=Bytecodes diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeNode.java b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeNode.java new file mode 100644 index 00000000000..f9d1aa0ec72 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeNode.java @@ -0,0 +1,100 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.bytecodes; + +import com.sun.hotspot.igv.data.InputBytecode; +import com.sun.hotspot.igv.data.InputGraph; +import com.sun.hotspot.igv.data.InputNode; +import com.sun.hotspot.igv.data.Properties; +import com.sun.hotspot.igv.data.Properties.StringPropertyMatcher; +import java.awt.Image; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import javax.swing.Action; +import org.openide.nodes.AbstractNode; +import org.openide.nodes.Children; +import org.openide.nodes.Node; +import org.openide.util.Utilities; + +/** + * + * @author Thomas Wuerthinger + */ +public class BytecodeNode extends AbstractNode { + + private Set nodes; + + public BytecodeNode(InputBytecode bytecode, InputGraph graph, String bciValue) { + + super(Children.LEAF); + this.setDisplayName(bytecode.getBci() + " " + bytecode.getName()); + + bciValue = bytecode.getBci() + " " + bciValue; + bciValue = bciValue.trim(); + + Properties.PropertySelector selector = new Properties.PropertySelector(graph.getNodes()); + StringPropertyMatcher matcher = new StringPropertyMatcher("bci", bciValue); + List nodeList = selector.selectMultiple(matcher); + if (nodeList.size() > 0) { + nodes = new HashSet(); + for (InputNode n : nodeList) { + nodes.add(n); + } + this.setDisplayName(this.getDisplayName() + " (" + nodes.size() + " nodes)"); + } + } + + @Override + public Image getIcon(int i) { + if (nodes != null) { + return Utilities.loadImage("com/sun/hotspot/igv/bytecodes/images/link.gif"); + } else { + return Utilities.loadImage("com/sun/hotspot/igv/bytecodes/images/bytecode.gif"); + } + } + + @Override + public Image getOpenedIcon(int i) { + return getIcon(i); + } + + @Override + public Action[] getActions(boolean b) { + return new Action[]{(Action) SelectBytecodesAction.findObject(SelectBytecodesAction.class, true)}; + } + + @Override + public Action getPreferredAction() { + return (Action) SelectBytecodesAction.findObject(SelectBytecodesAction.class, true); + } + + @Override + public T getCookie(Class aClass) { + if (aClass == SelectBytecodesCookie.class && nodes != null) { + return (T) (new SelectBytecodesCookie(nodes)); + } + return super.getCookie(aClass); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewAction.java new file mode 100644 index 00000000000..df7b398e54d --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewAction.java @@ -0,0 +1,45 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.bytecodes; + +import java.awt.event.ActionEvent; +import javax.swing.AbstractAction; +import org.openide.util.NbBundle; +import org.openide.windows.TopComponent; + +/** + * @author Thomas Wuerthinger + */ +public class BytecodeViewAction extends AbstractAction { + + public BytecodeViewAction() { + super(NbBundle.getMessage(BytecodeViewAction.class, "CTL_BytecodeViewAction")); + } + + public void actionPerformed(ActionEvent evt) { + TopComponent win = BytecodeViewTopComponent.findInstance(); + win.open(); + win.requestActive(); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponent.form b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponent.form new file mode 100644 index 00000000000..c2549ecaf63 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponent.form @@ -0,0 +1,26 @@ + + +
    + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponent.java b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponent.java new file mode 100644 index 00000000000..6fbbe90e912 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponent.java @@ -0,0 +1,172 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.bytecodes; + +import com.sun.hotspot.igv.data.Group; +import com.sun.hotspot.igv.data.InputGraph; +import com.sun.hotspot.igv.data.services.InputGraphProvider; +import java.awt.BorderLayout; +import java.io.Serializable; +import org.openide.ErrorManager; +import org.openide.explorer.ExplorerManager; +import org.openide.explorer.ExplorerUtils; +import org.openide.explorer.view.BeanTreeView; +import org.openide.util.Lookup; +import org.openide.util.LookupEvent; +import org.openide.util.LookupListener; +import org.openide.util.NbBundle; +import org.openide.util.Utilities; +import org.openide.windows.TopComponent; +import org.openide.windows.WindowManager; + +/** + * @author Thomas Wuerthinger + */ +final class BytecodeViewTopComponent extends TopComponent implements ExplorerManager.Provider, LookupListener { + + private static BytecodeViewTopComponent instance; + private static final String PREFERRED_ID = "BytecodeViewTopComponent"; + private ExplorerManager manager; + private BeanTreeView treeView; + private Lookup.Result result = null; + private MethodNode rootNode; + + private BytecodeViewTopComponent() { + initComponents(); + setName(NbBundle.getMessage(BytecodeViewTopComponent.class, "CTL_BytecodeViewTopComponent")); + setToolTipText(NbBundle.getMessage(BytecodeViewTopComponent.class, "HINT_BytecodeViewTopComponent")); + + manager = new ExplorerManager(); + rootNode = new MethodNode(null, null, ""); + manager.setRootContext(rootNode); + + setLayout(new BorderLayout()); + + treeView = new BeanTreeView(); + treeView.setRootVisible(false); + this.add(BorderLayout.CENTER, treeView); + associateLookup(ExplorerUtils.createLookup(manager, getActionMap())); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(0, 400, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(0, 300, Short.MAX_VALUE) + ); + }// //GEN-END:initComponents + // Variables declaration - do not modify//GEN-BEGIN:variables + // End of variables declaration//GEN-END:variables + /** + * Gets default instance. Do not use directly: reserved for *.settings files only, + * i.e. deserialization routines; otherwise you could get a non-deserialized instance. + * To obtain the singleton instance, use {@link findInstance}. + */ + public static synchronized BytecodeViewTopComponent getDefault() { + if (instance == null) { + instance = new BytecodeViewTopComponent(); + } + return instance; + } + + /** + * Obtain the BytecodeViewTopComponent instance. Never call {@link #getDefault} directly! + */ + public static synchronized BytecodeViewTopComponent findInstance() { + TopComponent win = WindowManager.getDefault().findTopComponent(PREFERRED_ID); + if (win == null) { + ErrorManager.getDefault().log(ErrorManager.WARNING, "Cannot find BytecodeView component. It will not be located properly in the window system."); + return getDefault(); + } + if (win instanceof BytecodeViewTopComponent) { + return (BytecodeViewTopComponent) win; + } + ErrorManager.getDefault().log(ErrorManager.WARNING, "There seem to be multiple components with the '" + PREFERRED_ID + "' ID. That is a potential source of errors and unexpected behavior."); + return getDefault(); + } + + @Override + public int getPersistenceType() { + return TopComponent.PERSISTENCE_ALWAYS; + } + + @Override + public void componentOpened() { + Lookup.Template tpl = new Lookup.Template(Object.class); + result = Utilities.actionsGlobalContext().lookup(tpl); + result.addLookupListener(this); + } + + @Override + public void componentClosed() { + result.removeLookupListener(this); + result = null; + } + + @Override + public Object writeReplace() { + return new ResolvableHelper(); + } + + @Override + protected String preferredID() { + return PREFERRED_ID; + } + + public ExplorerManager getExplorerManager() { + return manager; + } + + public void resultChanged(LookupEvent lookupEvent) { + InputGraphProvider p = Lookup.getDefault().lookup(InputGraphProvider.class); + if (p != null) { + InputGraph graph = p.getGraph(); + if (graph != null) { + Group g = graph.getGroup(); + rootNode.update(graph, g.getMethod()); + } + } + } + + final static class ResolvableHelper implements Serializable { + + private static final long serialVersionUID = 1L; + + public Object readResolve() { + return BytecodeViewTopComponent.getDefault(); + } + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponentSettings.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponentSettings.xml new file mode 100644 index 00000000000..d9469aba6b1 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponentSettings.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponentWstcref.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponentWstcref.xml new file mode 100644 index 00000000000..a680c8f02fe --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponentWstcref.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/MethodNode.java b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/MethodNode.java new file mode 100644 index 00000000000..b8f777e851e --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/MethodNode.java @@ -0,0 +1,102 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.bytecodes; + +import com.sun.hotspot.igv.data.InputBytecode; +import com.sun.hotspot.igv.data.InputGraph; +import com.sun.hotspot.igv.data.InputMethod; +import java.awt.Image; +import org.openide.nodes.AbstractNode; +import org.openide.nodes.Children; +import org.openide.nodes.Node; +import org.openide.util.Utilities; + +/** + * + * @author Thomas Wuerthinger + */ +public class MethodNode extends AbstractNode { + + private static class MethodNodeChildren extends Children.Keys { + + private InputMethod method; + private InputGraph graph; + private String bciString; + + public MethodNodeChildren(InputMethod method, InputGraph graph, String bciString) { + this.method = method; + this.bciString = bciString; + this.graph = graph; + } + + protected Node[] createNodes(Object object) { + assert object instanceof InputBytecode; + InputBytecode bc = (InputBytecode) object; + if (bc.getInlined() == null) { + return new Node[]{new BytecodeNode(bc, graph, bciString)}; + } else { + return new Node[]{new BytecodeNode(bc, graph, bciString), new MethodNode(bc.getInlined(), graph, bc.getBci() + " " + bciString)}; + } + } + + @Override + public void addNotify() { + if (method != null) { + setKeys(method.getBytecodes()); + } + } + + public void setMethod(InputMethod method, InputGraph graph) { + this.method = method; + this.graph = graph; + addNotify(); + } + } + + /** Creates a new instance of MethodNode */ + public MethodNode(InputMethod method, InputGraph graph, String bciString) { + super((method != null && method.getBytecodes().size() == 0) ? Children.LEAF : new MethodNodeChildren(method, graph, bciString)); + if (method != null) { + this.setDisplayName(method.getName()); + } + } + + @Override + public Image getIcon(int i) { + return Utilities.loadImage("com/sun/hotspot/igv/bytecodes/images/method.gif"); + } + + @Override + public Image getOpenedIcon(int i) { + return getIcon(i); + } + + public void update(InputGraph graph, InputMethod method) { + ((MethodNodeChildren) this.getChildren()).setMethod(method, graph); + if (method != null) { + this.setDisplayName(method.getName()); + } + + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/SelectBytecodesAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/SelectBytecodesAction.java new file mode 100644 index 00000000000..317e3a0fbfe --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/SelectBytecodesAction.java @@ -0,0 +1,75 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.bytecodes; + +import com.sun.hotspot.igv.data.services.InputGraphProvider; +import org.openide.nodes.Node; +import org.openide.util.HelpCtx; +import org.openide.util.Lookup; +import org.openide.util.NbBundle; +import org.openide.util.actions.CookieAction; + +/** + * + * @author Thomas Wuerthinger + */ +public final class SelectBytecodesAction extends CookieAction { + + protected void performAction(Node[] activatedNodes) { + SelectBytecodesCookie c = activatedNodes[0].getCookie(SelectBytecodesCookie.class); + InputGraphProvider p = Lookup.getDefault().lookup(InputGraphProvider.class); + if (p != null) { + p.setSelectedNodes(c.getNodes()); + } + } + + protected int mode() { + return CookieAction.MODE_EXACTLY_ONE; + } + + public String getName() { + return NbBundle.getMessage(SelectBytecodesAction.class, "CTL_SelectBytecodesAction"); + } + + protected Class[] cookieClasses() { + return new Class[]{ + SelectBytecodesCookie.class + }; + } + + @Override + protected void initialize() { + super.initialize(); + putValue("noIconInMenu", Boolean.TRUE); + } + + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + protected boolean asynchronous() { + return false; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/SelectBytecodesCookie.java b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/SelectBytecodesCookie.java new file mode 100644 index 00000000000..ff48bbb49ac --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/SelectBytecodesCookie.java @@ -0,0 +1,47 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.bytecodes; + +import com.sun.hotspot.igv.data.InputNode; +import java.util.Collections; +import java.util.Set; +import org.openide.nodes.Node; + +/** + * + * @author Thomas Wuerthinger + */ +public class SelectBytecodesCookie implements Node.Cookie { + + private Set nodes; + + /** Creates a new instance of SelectBytecodesCookie */ + public SelectBytecodesCookie(Set nodes) { + this.nodes = nodes; + } + + public Set getNodes() { + return Collections.unmodifiableSet(nodes); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/bytecode.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/bytecode.gif new file mode 100644 index 00000000000..5a2a355e391 Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/bytecode.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/link.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/link.gif new file mode 100644 index 00000000000..fc6595b2c98 Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/link.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/method.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/method.gif new file mode 100644 index 00000000000..dc90fd03877 Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/method.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/layer.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/layer.xml new file mode 100644 index 00000000000..de53ae1da33 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/layer.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/build.xml new file mode 100644 index 00000000000..b90d3b8b143 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/build.xml @@ -0,0 +1,8 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.controlflow. + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/manifest.mf new file mode 100644 index 00000000000..3ed19068d76 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/manifest.mf @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +OpenIDE-Module: com.sun.hotspot.igv.controlflow +OpenIDE-Module-Layer: com/sun/hotspot/igv/controlflow/layer.xml +OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/controlflow/Bundle.properties +OpenIDE-Module-Specification-Version: 1.0 + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/build-impl.xml new file mode 100644 index 00000000000..1664c75b0dc --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/build-impl.xml @@ -0,0 +1,30 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/genfiles.properties new file mode 100644 index 00000000000..ba61dc52aba --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=b524efb3 +build.xml.script.CRC32=79a27be9 +build.xml.stylesheet.CRC32=79c3b980 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=b524efb3 +nbproject/build-impl.xml.script.CRC32=582bdab7 +nbproject/build-impl.xml.stylesheet.CRC32=deb65f65 diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/platform.properties new file mode 100644 index 00000000000..68ad75e5766 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/platform.properties @@ -0,0 +1,29 @@ +# Deprecated since 5.0u1; for compatibility with 5.0: +disabled.clusters=\ + apisupport1,\ + harness,\ + ide8,\ + java1,\ + nb6.0,\ + profiler2 +disabled.modules=\ + org.netbeans.core.execution,\ + org.netbeans.core.multiview,\ + org.netbeans.core.output2,\ + org.netbeans.modules.applemenu,\ + org.netbeans.modules.autoupdate.services,\ + org.netbeans.modules.autoupdate.ui,\ + org.netbeans.modules.core.kit,\ + org.netbeans.modules.favorites,\ + org.netbeans.modules.javahelp,\ + org.netbeans.modules.masterfs,\ + org.netbeans.modules.options.keymap,\ + org.netbeans.modules.sendopts,\ + org.netbeans.modules.templates,\ + org.openide.compat,\ + org.openide.execution,\ + org.openide.util.enumerations +enabled.clusters=\ + platform7 +nbjdk.active=JDK_1.6 +nbplatform.active=default diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/project.properties new file mode 100644 index 00000000000..152f44eca60 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/project.properties @@ -0,0 +1,2 @@ +javac.source=1.5 +javac.compilerargs=-Xlint -Xlint:-serial diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/project.xml new file mode 100644 index 00000000000..212cf234593 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/project.xml @@ -0,0 +1,70 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.controlflow + + + + com.sun.hotspot.igv.data + + + + 1.0 + + + + com.sun.hotspot.igv.hierarchicallayout + + + + 1.0 + + + + com.sun.hotspot.igv.layout + + + + 1.0 + + + + org.jdesktop.layout + + + + 1 + 1.4 + + + + org.netbeans.api.visual + + + + 2.9 + + + + org.openide.util + + + + 7.9.0.1 + + + + org.openide.windows + + + + 6.16 + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/suite.properties new file mode 100644 index 00000000000..29d7cc9bd6f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/suite.properties @@ -0,0 +1 @@ +suite.dir=${basedir}/.. diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/BlockConnectionWidget.java b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/BlockConnectionWidget.java new file mode 100644 index 00000000000..d1e9b9b9c60 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/BlockConnectionWidget.java @@ -0,0 +1,83 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.controlflow; + +import com.sun.hotspot.igv.data.InputBlockEdge; +import com.sun.hotspot.igv.layout.Link; +import com.sun.hotspot.igv.layout.Port; +import java.awt.Point; +import java.util.ArrayList; +import java.util.List; +import org.netbeans.api.visual.widget.ConnectionWidget; + +/** + * + * @author Thomas Wuerthinger + */ +public class BlockConnectionWidget extends ConnectionWidget implements Link { + + private BlockWidget from; + private BlockWidget to; + private Port inputSlot; + private Port outputSlot; + private List points; + private InputBlockEdge edge; + + public BlockConnectionWidget(ControlFlowScene scene, InputBlockEdge edge) { + super(scene); + + this.edge = edge; + this.from = (BlockWidget) scene.findWidget(edge.getFrom()); + this.to = (BlockWidget) scene.findWidget(edge.getTo()); + inputSlot = to.getInputSlot(); + outputSlot = from.getOutputSlot(); + points = new ArrayList(); + } + + public InputBlockEdge getEdge() { + return edge; + } + + public Port getTo() { + return inputSlot; + } + + public Port getFrom() { + return outputSlot; + } + + public void setControlPoints(List p) { + this.points = p; + } + + @Override + public List getControlPoints() { + return points; + } + + @Override + public String toString() { + return "Connection[ " + from.toString() + " - " + to.toString() + "]"; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/BlockWidget.java b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/BlockWidget.java new file mode 100644 index 00000000000..c56e93e7313 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/BlockWidget.java @@ -0,0 +1,160 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.controlflow; + +import com.sun.hotspot.igv.data.InputBlock; +import com.sun.hotspot.igv.layout.Cluster; +import com.sun.hotspot.igv.layout.Port; +import com.sun.hotspot.igv.layout.Vertex; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Point; +import org.netbeans.api.visual.border.BorderFactory; +import org.netbeans.api.visual.model.ObjectState; +import org.netbeans.api.visual.widget.LabelWidget; + +/** + * + * @author Thomas Wuerthinger + */ +public class BlockWidget extends LabelWidget implements Vertex { + + public static final Dimension SIZE = new Dimension(20, 20); + private InputBlock block; + private Port inputSlot; + private Port outputSlot; + private Cluster cluster; + private boolean root; + private static final Font font = new Font(Font.SERIF, Font.PLAIN, 12); + private static final Font boldFont = font.deriveFont(Font.BOLD); + public static final Color NORMAL_FOREGROUND_COLOR = Color.BLACK; + public static final Color HOVER_FOREGROUND_COLOR = Color.BLUE; + + /** Creates a new instance of BlockWidget */ + public BlockWidget(ControlFlowScene scene, InputBlock block) { + super(scene); + this.block = block; + this.setLabel(block.getName()); + this.setForeground(NORMAL_FOREGROUND_COLOR); + this.setBorder(BorderFactory.createLineBorder(1, NORMAL_FOREGROUND_COLOR)); + this.setMinimumSize(SIZE); + this.setMaximumSize(SIZE); + + this.setFont(font); + + final BlockWidget widget = this; + inputSlot = new Port() { + + public Point getRelativePosition() { + return new Point((int) (SIZE.getWidth() / 2), (int) (SIZE.getHeight() / 2)); + } + + public Vertex getVertex() { + return widget; + } + }; + + outputSlot = new Port() { + + public Point getRelativePosition() { + return new Point((int) (SIZE.getWidth() / 2), (int) (SIZE.getHeight() / 2)); + } + + public Vertex getVertex() { + return widget; + } + }; + } + + public Port getInputSlot() { + return inputSlot; + } + + public Port getOutputSlot() { + return outputSlot; + } + + public InputBlock getBlock() { + return block; + } + + public Dimension getSize() { + return SIZE; + } + + public void setPosition(Point p) { + this.setPreferredLocation(p); + } + + @Override + public String toString() { + return block.getName(); + } + + public Point getPosition() { + return this.getPreferredLocation(); + } + + public Cluster getCluster() { + return cluster; + } + + public boolean isRoot() { + return root; + } + + public void setCluster(Cluster c) { + cluster = c; + } + + public void setRoot(boolean b) { + root = b; + } + + public int compareTo(Vertex o) { + return toString().compareTo(o.toString()); + } + + @Override + protected void notifyStateChanged(ObjectState previousState, ObjectState state) { + super.notifyStateChanged(previousState, state); + + if (previousState.isHovered() != state.isHovered()) { + if (state.isHovered()) { + this.setBorder(BorderFactory.createLineBorder(1, HOVER_FOREGROUND_COLOR)); + } else { + this.setBorder(BorderFactory.createLineBorder(1, NORMAL_FOREGROUND_COLOR)); + } + } + + if (previousState.isSelected() != state.isSelected()) { + if (state.isSelected()) { + this.setFont(boldFont); + } else { + this.setFont(font); + } + } + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/Bundle.properties new file mode 100644 index 00000000000..31865f13af1 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/Bundle.properties @@ -0,0 +1,4 @@ +CTL_ControlFlowAction=Open ControlFlow Window +CTL_ControlFlowTopComponent=ControlFlow Window +HINT_ControlFlowTopComponent=This is a ControlFlow window +OpenIDE-Module-Name=ControlFlow diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowAction.java new file mode 100644 index 00000000000..bafde102313 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowAction.java @@ -0,0 +1,46 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.controlflow; + +import java.awt.event.ActionEvent; +import javax.swing.AbstractAction; +import org.openide.util.NbBundle; +import org.openide.windows.TopComponent; + +/** + * + * @author Thomas Wuerthinger + */ +public class ControlFlowAction extends AbstractAction { + + public ControlFlowAction() { + super(NbBundle.getMessage(ControlFlowAction.class, "CTL_ControlFlowAction")); + } + + public void actionPerformed(ActionEvent evt) { + TopComponent win = ControlFlowTopComponent.findInstance(); + win.open(); + win.requestActive(); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowScene.java b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowScene.java new file mode 100644 index 00000000000..8b794b11aa5 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowScene.java @@ -0,0 +1,296 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.controlflow; + +import com.sun.hotspot.igv.data.InputBlock; +import com.sun.hotspot.igv.data.InputBlockEdge; +import com.sun.hotspot.igv.data.InputGraph; +import com.sun.hotspot.igv.data.services.InputGraphProvider; +import com.sun.hotspot.igv.data.InputNode; +import java.awt.Color; +import java.awt.Point; +import java.awt.Rectangle; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.Set; +import javax.swing.BorderFactory; +import org.netbeans.api.visual.action.ActionFactory; +import org.netbeans.api.visual.action.MoveProvider; +import org.netbeans.api.visual.action.RectangularSelectDecorator; +import org.netbeans.api.visual.action.RectangularSelectProvider; +import org.netbeans.api.visual.action.SelectProvider; +import org.netbeans.api.visual.action.WidgetAction; +import org.netbeans.api.visual.anchor.AnchorFactory; +import org.netbeans.api.visual.anchor.AnchorShape; +import com.sun.hotspot.igv.controlflow.HierarchicalGraphLayout; +import org.netbeans.api.visual.layout.LayoutFactory; +import org.netbeans.api.visual.router.RouterFactory; +import org.netbeans.api.visual.widget.LayerWidget; +import org.netbeans.api.visual.widget.Widget; +import org.netbeans.api.visual.graph.GraphScene; +import org.netbeans.api.visual.graph.layout.GraphLayout; +import org.netbeans.api.visual.layout.SceneLayout; +import org.netbeans.api.visual.widget.ConnectionWidget; +import org.openide.util.Lookup; + +/** + * + * @author Thomas Wuerthinger + */ +public class ControlFlowScene extends GraphScene implements SelectProvider, MoveProvider, RectangularSelectDecorator, RectangularSelectProvider { + + private Set selection; + private Hashtable blockMap; + private InputGraph oldGraph; + private LayerWidget edgeLayer; + private LayerWidget mainLayer; + private LayerWidget selectLayer; + private WidgetAction hoverAction = this.createWidgetHoverAction(); + private WidgetAction selectAction = ActionFactory.createSelectAction(this); + private WidgetAction moveAction = ActionFactory.createMoveAction(null, this); + + public ControlFlowScene() { + selection = new HashSet(); + + this.getInputBindings().setZoomActionModifiers(0); + this.setLayout(LayoutFactory.createAbsoluteLayout()); + + mainLayer = new LayerWidget(this); + this.addChild(mainLayer); + + edgeLayer = new LayerWidget(this); + this.addChild(edgeLayer); + + selectLayer = new LayerWidget(this); + this.addChild(selectLayer); + + this.getActions().addAction(hoverAction); + this.getActions().addAction(selectAction); + this.getActions().addAction(ActionFactory.createRectangularSelectAction(this, selectLayer, this)); + this.getActions().addAction(ActionFactory.createMouseCenteredZoomAction(1.1)); + } + + public void setGraph(InputGraph g) { + if (g == oldGraph) { + return; + } + oldGraph = g; + + ArrayList blocks = new ArrayList(this.getNodes()); + for (InputBlock b : blocks) { + removeNode(b); + } + + ArrayList edges = new ArrayList(this.getEdges()); + for (InputBlockEdge e : edges) { + removeEdge(e); + } + + for (InputBlock b : g.getBlocks()) { + addNode(b); + } + + for (InputBlock b : g.getBlocks()) { + for (InputBlockEdge e : b.getOutputs()) { + addEdge(e); + assert g.getBlocks().contains(e.getFrom()); + assert g.getBlocks().contains(e.getTo()); + this.setEdgeSource(e, e.getFrom()); + this.setEdgeTarget(e, e.getTo()); + } + } + + GraphLayout layout = new HierarchicalGraphLayout();//GridGraphLayout(); + SceneLayout sceneLayout = LayoutFactory.createSceneGraphLayout(this, layout); + sceneLayout.invokeLayout(); + + this.validate(); + } + + public BlockWidget getBlockWidget(InputBlock b) { + return blockMap.get(b); + } + + public void clearSelection() { + for (BlockWidget w : selection) { + w.setState(w.getState().deriveSelected(false)); + } + selection.clear(); + selectionChanged(); + } + + public void selectionChanged() { + InputGraphProvider p = Lookup.getDefault().lookup(InputGraphProvider.class); + if (p != null) { + Set inputNodes = new HashSet(); + for (BlockWidget w : selection) { + inputNodes.addAll(w.getBlock().getNodes()); + } + p.setSelectedNodes(inputNodes); + } + } + + public void addToSelection(BlockWidget widget) { + widget.setState(widget.getState().deriveSelected(true)); + selection.add(widget); + selectionChanged(); + } + + public void removeFromSelection(BlockWidget widget) { + widget.setState(widget.getState().deriveSelected(false)); + selection.remove(widget); + selectionChanged(); + } + + public boolean isAimingAllowed(Widget widget, Point point, boolean b) { + return false; + } + + public boolean isSelectionAllowed(Widget widget, Point point, boolean b) { + return true; + } + + public void select(Widget widget, Point point, boolean change) { + if (widget == this) { + clearSelection(); + } else { + + assert widget instanceof BlockWidget; + BlockWidget bw = (BlockWidget) widget; + if (change) { + if (selection.contains(bw)) { + removeFromSelection(bw); + } else { + addToSelection(bw); + } + } else { + if (!selection.contains(bw)) { + clearSelection(); + addToSelection(bw); + } + } + } + } + + public void movementStarted(Widget widget) { + } + + public void movementFinished(Widget widget) { + } + + public Point getOriginalLocation(Widget widget) { + return widget.getPreferredLocation(); + } + + public void setNewLocation(Widget widget, Point location) { + Point originalLocation = getOriginalLocation(widget); + int xOffset = location.x - originalLocation.x; + int yOffset = location.y - originalLocation.y; + for (Widget w : this.selection) { + Point p = new Point(w.getPreferredLocation()); + p.translate(xOffset, yOffset); + w.setPreferredLocation(p); + } + + } + + public Widget createSelectionWidget() { + Widget widget = new Widget(this); + widget.setOpaque(false); + widget.setBorder(BorderFactory.createLineBorder(Color.black, 2)); + widget.setForeground(Color.red); + return widget; + } + + public void performSelection(Rectangle rectangle) { + + if (rectangle.width < 0) { + rectangle.x += rectangle.width; + rectangle.width *= -1; + } + + if (rectangle.height < 0) { + rectangle.y += rectangle.height; + rectangle.height *= -1; + } + + boolean changed = false; + for (InputBlock b : this.getNodes()) { + BlockWidget w = (BlockWidget) findWidget(b); + Rectangle r = new Rectangle(w.getBounds()); + r.setLocation(w.getLocation()); + if (r.intersects(rectangle)) { + if (!selection.contains(w)) { + changed = true; + selection.add(w); + w.setState(w.getState().deriveSelected(true)); + } + } else { + if (selection.contains(w)) { + changed = true; + selection.remove(w); + w.setState(w.getState().deriveSelected(false)); + } + } + } + + if (changed) { + selectionChanged(); + } + + } + + protected Widget attachNodeWidget(InputBlock node) { + BlockWidget w = new BlockWidget(this, node); + mainLayer.addChild(w); + w.getActions().addAction(hoverAction); + w.getActions().addAction(selectAction); + w.getActions().addAction(moveAction); + return w; + } + + protected Widget attachEdgeWidget(InputBlockEdge edge) { + ConnectionWidget w = new BlockConnectionWidget(this, edge); + w.setRouter(RouterFactory.createDirectRouter()); + w.setTargetAnchorShape(AnchorShape.TRIANGLE_FILLED); + edgeLayer.addChild(w); + return w; + } + + protected void attachEdgeSourceAnchor(InputBlockEdge edge, InputBlock oldSourceNode, InputBlock sourceNode) { + Widget w = this.findWidget(edge); + assert w instanceof ConnectionWidget; + ConnectionWidget cw = (ConnectionWidget) w; + cw.setSourceAnchor(AnchorFactory.createRectangularAnchor(findWidget(sourceNode))); + + } + + protected void attachEdgeTargetAnchor(InputBlockEdge edge, InputBlock oldTargetNode, InputBlock targetNode) { + Widget w = this.findWidget(edge); + assert w instanceof ConnectionWidget; + ConnectionWidget cw = (ConnectionWidget) w; + cw.setTargetAnchor(AnchorFactory.createRectangularAnchor(findWidget(targetNode))); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponent.form b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponent.form new file mode 100644 index 00000000000..c2549ecaf63 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponent.form @@ -0,0 +1,26 @@ + + +
    + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponent.java b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponent.java new file mode 100644 index 00000000000..968cdd531b7 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponent.java @@ -0,0 +1,179 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.controlflow; + +import com.sun.hotspot.igv.data.InputGraph; +import com.sun.hotspot.igv.data.services.InputGraphProvider; +import java.awt.BorderLayout; +import java.io.Serializable; +import javax.swing.JScrollPane; +import org.openide.ErrorManager; +import org.openide.util.Lookup; +import org.openide.util.LookupEvent; +import org.openide.util.LookupListener; +import org.openide.util.NbBundle; +import org.openide.util.Utilities; +import org.openide.windows.TopComponent; +import org.openide.windows.WindowManager; + +/** + * + * @author Thomas Wuerthinger + */ +final class ControlFlowTopComponent extends TopComponent implements LookupListener { + + private static ControlFlowTopComponent instance; + private Lookup.Result result = null; + private static final String PREFERRED_ID = "ControlFlowTopComponent"; + private ControlFlowScene scene; + + private ControlFlowTopComponent() { + initComponents(); + setName(NbBundle.getMessage(ControlFlowTopComponent.class, "CTL_ControlFlowTopComponent")); + setToolTipText(NbBundle.getMessage(ControlFlowTopComponent.class, "HINT_ControlFlowTopComponent")); + + scene = new ControlFlowScene(); + this.setLayout(new BorderLayout()); + this.associateLookup(scene.getLookup()); + + + JScrollPane panel = new JScrollPane(scene.createView()); + this.add(panel, BorderLayout.CENTER); + } + + @Override + public void requestFocus() { + super.requestFocus(); + scene.getView().requestFocus(); + } + + @Override + public boolean requestFocusInWindow() { + super.requestFocusInWindow(); + return scene.getView().requestFocusInWindow(); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(0, 400, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(0, 300, Short.MAX_VALUE) + ); + }// //GEN-END:initComponents + // Variables declaration - do not modify//GEN-BEGIN:variables + // End of variables declaration//GEN-END:variables + /** + * Gets default instance. Do not use directly: reserved for *.settings files only, + * i.e. deserialization routines; otherwise you could get a non-deserialized instance. + * To obtain the singleton instance, use {@link findInstance}. + */ + public static synchronized ControlFlowTopComponent getDefault() { + if (instance == null) { + instance = new ControlFlowTopComponent(); + } + return instance; + } + + /** + * Obtain the ControlFlowTopComponent instance. Never call {@link #getDefault} directly! + */ + public static synchronized ControlFlowTopComponent findInstance() { + TopComponent win = WindowManager.getDefault().findTopComponent(PREFERRED_ID); + if (win == null) { + ErrorManager.getDefault().log(ErrorManager.WARNING, "Cannot find ControlFlow component. It will not be located properly in the window system."); + return getDefault(); + } + if (win instanceof ControlFlowTopComponent) { + return (ControlFlowTopComponent) win; + } + ErrorManager.getDefault().log(ErrorManager.WARNING, "There seem to be multiple components with the '" + PREFERRED_ID + "' ID. That is a potential source of errors and unexpected behavior."); + return getDefault(); + } + + @Override + public int getPersistenceType() { + return TopComponent.PERSISTENCE_ALWAYS; + } + + @Override + public void componentOpened() { + Lookup.Template tpl = new Lookup.Template(Object.class); + result = Utilities.actionsGlobalContext().lookup(tpl); + result.addLookupListener(this); + } + + @Override + public void componentClosed() { + result.removeLookupListener(this); + result = null; + } + + public void resultChanged(LookupEvent lookupEvent) { + + InputGraphProvider p = Lookup.getDefault().lookup(InputGraphProvider.class); + if (p != null) { + InputGraph g = p.getGraph(); + if (g != null) { + scene.setGraph(g); + } + } + } + + @Override + public Object writeReplace() { + return new ResolvableHelper(); + } + + @Override + protected String preferredID() { + return PREFERRED_ID; + } + + @Override + public void requestActive() { + scene.getView().requestFocusInWindow(); + super.requestActive(); + } + + final static class ResolvableHelper implements Serializable { + + private static final long serialVersionUID = 1L; + + public Object readResolve() { + return ControlFlowTopComponent.getDefault(); + } + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponentSettings.xml b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponentSettings.xml new file mode 100644 index 00000000000..e226cd5ece9 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponentSettings.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponentWstcref.xml b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponentWstcref.xml new file mode 100644 index 00000000000..07bbb1f52fb --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponentWstcref.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/HierarchicalGraphLayout.java b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/HierarchicalGraphLayout.java new file mode 100644 index 00000000000..2a0c9ee4896 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/HierarchicalGraphLayout.java @@ -0,0 +1,167 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.controlflow; + +import com.sun.hotspot.igv.hierarchicallayout.HierarchicalLayoutManager; +import com.sun.hotspot.igv.layout.Cluster; +import com.sun.hotspot.igv.layout.LayoutGraph; +import com.sun.hotspot.igv.layout.Link; +import com.sun.hotspot.igv.layout.Port; +import com.sun.hotspot.igv.layout.Vertex; +import java.awt.Dimension; +import java.awt.Point; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.netbeans.api.visual.graph.layout.GraphLayout; +import org.netbeans.api.visual.graph.layout.UniversalGraph; +import org.netbeans.api.visual.widget.Widget; + +/** + * + * @author Thomas Wuerthinger + */ +public class HierarchicalGraphLayout extends GraphLayout { + + public HierarchicalGraphLayout() { + } + + private class LinkWrapper implements Link { + + private VertexWrapper from; + private VertexWrapper to; + + public LinkWrapper(VertexWrapper from, VertexWrapper to) { + this.from = from; + this.to = to; + } + + public Port getFrom() { + return from.getSlot(); + } + + public Port getTo() { + return to.getSlot(); + } + + public List getControlPoints() { + return new ArrayList(); + } + + public void setControlPoints(List list) { + // Do nothing for now + } + } + + private class VertexWrapper implements Vertex { + + private N node; + private UniversalGraph graph; + private Port slot; + private Point position; + + public VertexWrapper(N node, UniversalGraph graph) { + this.node = node; + this.graph = graph; + final VertexWrapper vertex = this; + this.slot = new Port() { + + public Vertex getVertex() { + return vertex; + } + + public Point getRelativePosition() { + return new Point((int) (vertex.getSize().getWidth() / 2), (int) (vertex.getSize().getHeight() / 2)); + } + }; + + Widget w = graph.getScene().findWidget(node); + this.position = w.getPreferredLocation(); + } + + public Cluster getCluster() { + return null; + } + + public Dimension getSize() { + Widget w = graph.getScene().findWidget(node); + return w.getBounds().getSize(); + } + + public Point getPosition() { + return position; + } + + public void setPosition(Point p) { + HierarchicalGraphLayout.this.setResolvedNodeLocation(graph, node, p); + position = p; + } + + public boolean isRoot() { + return false; + } + + public int compareTo(Vertex o) { + VertexWrapper vw = (VertexWrapper) o; + return node.toString().compareTo(vw.node.toString()); + } + + public Port getSlot() { + return slot; + } + } + + protected void performGraphLayout(UniversalGraph graph) { + + Set links = new HashSet(); + Set vertices = new HashSet(); + Map vertexMap = new HashMap(); + + for (N node : graph.getNodes()) { + VertexWrapper v = new VertexWrapper(node, graph); + vertexMap.put(node, v); + vertices.add(v); + } + + for (E edge : graph.getEdges()) { + N source = graph.getEdgeSource(edge); + N target = graph.getEdgeTarget(edge); + LinkWrapper l = new LinkWrapper(vertexMap.get(source), vertexMap.get(target)); + links.add(l); + } + + HierarchicalLayoutManager m = new HierarchicalLayoutManager(HierarchicalLayoutManager.Combine.NONE); + + LayoutGraph layoutGraph = new LayoutGraph(links, vertices); + m.doLayout(layoutGraph); + } + + protected void performNodesLayout(UniversalGraph graph, Collection nodes) { + throw new UnsupportedOperationException(); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/layer.xml b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/layer.xml new file mode 100644 index 00000000000..36b0e8ce903 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/layer.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/build.xml new file mode 100644 index 00000000000..a70f0080267 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/build.xml @@ -0,0 +1,8 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.coordinator. + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/manifest.mf new file mode 100644 index 00000000000..073c1e8040b --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/manifest.mf @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +OpenIDE-Module: com.sun.hotspot.igv.coordinator +OpenIDE-Module-Layer: com/sun/hotspot/igv/coordinator/layer.xml +OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/coordinator/Bundle.properties +OpenIDE-Module-Specification-Version: 1.0 + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/build-impl.xml new file mode 100644 index 00000000000..4deca64beea --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/build-impl.xml @@ -0,0 +1,30 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/genfiles.properties new file mode 100644 index 00000000000..71781f95c87 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=077de97c +build.xml.script.CRC32=d29d586c +build.xml.stylesheet.CRC32=79c3b980 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=077de97c +nbproject/build-impl.xml.script.CRC32=03daa42d +nbproject/build-impl.xml.stylesheet.CRC32=deb65f65 diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/platform.properties new file mode 100644 index 00000000000..68ad75e5766 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/platform.properties @@ -0,0 +1,29 @@ +# Deprecated since 5.0u1; for compatibility with 5.0: +disabled.clusters=\ + apisupport1,\ + harness,\ + ide8,\ + java1,\ + nb6.0,\ + profiler2 +disabled.modules=\ + org.netbeans.core.execution,\ + org.netbeans.core.multiview,\ + org.netbeans.core.output2,\ + org.netbeans.modules.applemenu,\ + org.netbeans.modules.autoupdate.services,\ + org.netbeans.modules.autoupdate.ui,\ + org.netbeans.modules.core.kit,\ + org.netbeans.modules.favorites,\ + org.netbeans.modules.javahelp,\ + org.netbeans.modules.masterfs,\ + org.netbeans.modules.options.keymap,\ + org.netbeans.modules.sendopts,\ + org.netbeans.modules.templates,\ + org.openide.compat,\ + org.openide.execution,\ + org.openide.util.enumerations +enabled.clusters=\ + platform7 +nbjdk.active=JDK_1.6 +nbplatform.active=default diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/project.properties new file mode 100644 index 00000000000..152f44eca60 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/project.properties @@ -0,0 +1,2 @@ +javac.source=1.5 +javac.compilerargs=-Xlint -Xlint:-serial diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/project.xml new file mode 100644 index 00000000000..ad5afed1591 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/project.xml @@ -0,0 +1,126 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.coordinator + + + + com.sun.hotspot.igv.data + + + + 1.0 + + + + com.sun.hotspot.igv.difference + + + + 1.0 + + + + com.sun.hotspot.igv.settings + + + + 1.0 + + + + com.sun.hotspot.igv.util + + + + 1.0 + + + + org.netbeans.api.progress + + + + 1 + 1.10.0.1 + + + + org.openide.actions + + + + 6.6.1.1 + + + + org.openide.awt + + + + 6.11.0.1 + + + + org.openide.dialogs + + + + 7.5.1 + + + + org.openide.explorer + + + + 6.11 + + + + org.openide.filesystems + + + + 7.3 + + + + org.openide.loaders + + + + 6.7 + + + + org.openide.nodes + + + + 7.2.0.1 + + + + org.openide.util + + + + 7.9.0.1 + + + + org.openide.windows + + + + 6.16 + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/suite.properties new file mode 100644 index 00000000000..29d7cc9bd6f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/suite.properties @@ -0,0 +1 @@ +suite.dir=${basedir}/.. diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupOrganizer b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupOrganizer new file mode 100644 index 00000000000..bf7aace9e7d --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupOrganizer @@ -0,0 +1,2 @@ +com.sun.hotspot.igv.coordinator.StandardGroupOrganizer +com.sun.hotspot.igv.coordinator.GraphCountGroupOrganizer \ No newline at end of file diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/Bundle.properties new file mode 100644 index 00000000000..455f648095d --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/Bundle.properties @@ -0,0 +1,7 @@ + +AdvancedOption_DisplayName_Coordinator=Settings +AdvancedOption_Tooltip_Coordinator=Visualization Tool Settings +CTL_OutlineTopComponent=Outline Window +CTL_SomeAction=test +HINT_OutlineTopComponent=This is a Outline window +OpenIDE-Module-Name=Coordinator diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/FolderNode.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/FolderNode.java new file mode 100644 index 00000000000..b5398edaeea --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/FolderNode.java @@ -0,0 +1,139 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.coordinator; + +import com.sun.hotspot.igv.coordinator.actions.RemoveCookie; +import com.sun.hotspot.igv.data.Group; +import com.sun.hotspot.igv.data.services.GroupOrganizer; +import com.sun.hotspot.igv.data.InputGraph; +import com.sun.hotspot.igv.data.Pair; +import java.awt.Image; +import java.util.ArrayList; +import java.util.List; +import org.openide.nodes.AbstractNode; +import org.openide.nodes.Children; +import org.openide.nodes.Node; +import org.openide.util.Utilities; +import org.openide.util.lookup.AbstractLookup; +import org.openide.util.lookup.InstanceContent; + +/** + * + * @author Thomas Wuerthinger + */ +public class FolderNode extends AbstractNode { + + private GroupOrganizer organizer; + private InstanceContent content; + private List>> structure; + private List subFolders; + private FolderChildren children; + + private static class FolderChildren extends Children.Keys { + + private FolderNode parent; + + public void setParent(FolderNode parent) { + this.parent = parent; + } + + @Override + protected Node[] createNodes(Object arg0) { + + Pair> p = (Pair>) arg0; + if (p.getLeft().length() == 0) { + + List curNodes = new ArrayList(); + for (Group g : p.getRight()) { + for (InputGraph graph : g.getGraphs()) { + curNodes.add(new GraphNode(graph)); + } + } + + Node[] result = new Node[curNodes.size()]; + for (int i = 0; i < curNodes.size(); i++) { + result[i] = curNodes.get(i); + } + return result; + + } else { + return new Node[]{new FolderNode(p.getLeft(), parent.organizer, parent.subFolders, p.getRight())}; + } + } + + @Override + public void addNotify() { + this.setKeys(parent.structure); + + } + } + + protected InstanceContent getContent() { + return content; + } + + @Override + public Image getIcon(int i) { + return Utilities.loadImage("com/sun/hotspot/igv/coordinator/images/folder.gif"); + } + + protected FolderNode(String name, GroupOrganizer organizer, List subFolders, List groups) { + this(name, organizer, subFolders, groups, new FolderChildren(), new InstanceContent()); + } + + private FolderNode(String name, GroupOrganizer organizer, List oldSubFolders, final List groups, FolderChildren children, InstanceContent content) { + super(children, new AbstractLookup(content)); + children.setParent(this); + this.content = content; + this.children = children; + content.add(new RemoveCookie() { + + public void remove() { + for (Group g : groups) { + if (g.getDocument() != null) { + g.getDocument().removeGroup(g); + } + } + } + }); + init(name, organizer, oldSubFolders, groups); + } + + public void init(String name, GroupOrganizer organizer, List oldSubFolders, List groups) { + this.setDisplayName(name); + this.organizer = organizer; + this.subFolders = new ArrayList(oldSubFolders); + if (name.length() > 0) { + this.subFolders.add(name); + } + structure = organizer.organize(subFolders, groups); + assert structure != null; + children.addNotify(); + } + + @Override + public Image getOpenedIcon(int i) { + return getIcon(i); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/GraphCountGroupOrganizer.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/GraphCountGroupOrganizer.java new file mode 100644 index 00000000000..42648d0f082 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/GraphCountGroupOrganizer.java @@ -0,0 +1,81 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.coordinator; + +import com.sun.hotspot.igv.data.Group; +import com.sun.hotspot.igv.data.Pair; +import com.sun.hotspot.igv.data.services.GroupOrganizer; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.SortedSet; +import java.util.TreeSet; + +/** + * + * @author Thomas Wuerthinger + */ +public class GraphCountGroupOrganizer implements GroupOrganizer { + + public String getName() { + return "Graph count structure"; + } + + public List>> organize(List subFolders, List groups) { + + List>> result = new ArrayList>>(); + + if (subFolders.size() == 0) { + Map> map = new HashMap>(); + for (Group g : groups) { + Integer cur = g.getGraphs().size(); + if (!map.containsKey(cur)) { + map.put(cur, new ArrayList()); + } + map.get(cur).add(g); + } + + SortedSet keys = new TreeSet(map.keySet()); + for (Integer i : keys) { + result.add(new Pair>("Graph count " + i, map.get(i))); + } + + } else if (subFolders.size() == 1) { + for (Group g : groups) { + List children = new ArrayList(); + children.add(g); + Pair> p = new Pair>(); + p.setLeft(g.getName()); + p.setRight(children); + result.add(p); + } + } else if (subFolders.size() == 2) { + result.add(new Pair>("", groups)); + } + + return result; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/GraphNode.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/GraphNode.java new file mode 100644 index 00000000000..0fd780cf679 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/GraphNode.java @@ -0,0 +1,130 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.coordinator; + +import com.sun.hotspot.igv.coordinator.actions.DiffGraphAction; +import com.sun.hotspot.igv.coordinator.actions.DiffGraphCookie; +import com.sun.hotspot.igv.coordinator.actions.RemoveCookie; +import com.sun.hotspot.igv.data.InputGraph; +import com.sun.hotspot.igv.data.services.GraphViewer; +import com.sun.hotspot.igv.data.services.InputGraphProvider; +import com.sun.hotspot.igv.util.PropertiesSheet; +import java.awt.Image; +import javax.swing.Action; +import org.openide.actions.OpenAction; +import org.openide.cookies.OpenCookie; +import org.openide.nodes.AbstractNode; +import org.openide.nodes.Children; +import org.openide.nodes.Node; +import org.openide.nodes.Sheet; +import org.openide.util.Lookup; +import org.openide.util.Utilities; +import org.openide.util.lookup.AbstractLookup; +import org.openide.util.lookup.InstanceContent; + +/** + * + * @author Thomas Wuerthinger + */ +public class GraphNode extends AbstractNode { + + private InputGraph graph; + + /** Creates a new instance of GraphNode */ + public GraphNode(InputGraph graph) { + this(graph, new InstanceContent()); + } + + private GraphNode(final InputGraph graph, InstanceContent content) { + super(Children.LEAF, new AbstractLookup(content)); + this.graph = graph; + this.setDisplayName(graph.getName()); + content.add(graph); + + final GraphViewer viewer = Lookup.getDefault().lookup(GraphViewer.class); + + if (viewer != null) { + // Action for opening the graph + content.add(new OpenCookie() { + + public void open() { + viewer.view(graph); + } + }); + } + + // Action for removing a graph + content.add(new RemoveCookie() { + + public void remove() { + graph.getGroup().removeGraph(graph); + } + }); + } + + @Override + protected Sheet createSheet() { + Sheet s = super.createSheet(); + PropertiesSheet.initializeSheet(graph.getProperties(), s); + return s; + } + + @Override + public Image getIcon(int i) { + return Utilities.loadImage("com/sun/hotspot/igv/coordinator/images/graph.gif"); + } + + @Override + public Image getOpenedIcon(int i) { + return getIcon(i); + } + + @Override + public T getCookie(Class aClass) { + if (aClass == DiffGraphCookie.class) { + InputGraphProvider graphProvider = Utilities.actionsGlobalContext().lookup(InputGraphProvider.class); + + InputGraph graphA = null; + if (graphProvider != null) { + graphA = graphProvider.getGraph(); + } + + if (graphA != null && !graphA.isDifferenceGraph()) { + return (T) new DiffGraphCookie(graphA, graph); + } + } + + return super.getCookie(aClass); + } + + @Override + public Action[] getActions(boolean b) { + return new Action[]{(Action) DiffGraphAction.findObject(DiffGraphAction.class, true), (Action) OpenAction.findObject(OpenAction.class, true)}; + } + + @Override + public Action getPreferredAction() { + return (Action) OpenAction.findObject(OpenAction.class, true); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponent.form b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponent.form new file mode 100644 index 00000000000..37e033f1989 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponent.form @@ -0,0 +1,41 @@ + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponent.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponent.java new file mode 100644 index 00000000000..9e6177b1782 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponent.java @@ -0,0 +1,271 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.coordinator; + +import com.sun.hotspot.igv.coordinator.actions.ImportAction; +import com.sun.hotspot.igv.coordinator.actions.RemoveAction; +import com.sun.hotspot.igv.coordinator.actions.RemoveAllAction; +import com.sun.hotspot.igv.coordinator.actions.SaveAllAction; +import com.sun.hotspot.igv.coordinator.actions.SaveAsAction; +import com.sun.hotspot.igv.coordinator.actions.StructuredViewAction; +import com.sun.hotspot.igv.data.GraphDocument; +import com.sun.hotspot.igv.data.ChangedListener; +import com.sun.hotspot.igv.data.Group; +import com.sun.hotspot.igv.data.services.GroupCallback; +import com.sun.hotspot.igv.data.services.GroupOrganizer; +import com.sun.hotspot.igv.data.services.GroupReceiver; +import java.awt.BorderLayout; +import java.awt.Component; +import java.io.IOException; +import java.io.ObjectInput; +import java.io.ObjectOutput; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import javax.swing.BoxLayout; +import javax.swing.JPanel; +import javax.swing.UIManager; +import javax.swing.border.Border; +import org.openide.ErrorManager; +import org.openide.awt.Toolbar; +import org.openide.awt.ToolbarPool; +import org.openide.explorer.ExplorerManager; +import org.openide.explorer.ExplorerUtils; +import org.openide.explorer.view.BeanTreeView; +import org.openide.util.Lookup; +import org.openide.util.LookupEvent; +import org.openide.util.LookupListener; +import org.openide.util.NbBundle; +import org.openide.util.actions.NodeAction; +import org.openide.windows.TopComponent; +import org.openide.windows.WindowManager; + +/** + * + * @author Thomas Wuerthinger + */ +public final class OutlineTopComponent extends TopComponent implements ExplorerManager.Provider, LookupListener { + + public static OutlineTopComponent instance; + public static final String PREFERRED_ID = "OutlineTopComponent"; + private ExplorerManager manager; + private GraphDocument document; + private FolderNode root; + private GroupOrganizer organizer; + + private OutlineTopComponent() { + initComponents(); + + setName(NbBundle.getMessage(OutlineTopComponent.class, "CTL_OutlineTopComponent")); + setToolTipText(NbBundle.getMessage(OutlineTopComponent.class, "HINT_OutlineTopComponent")); + + document = new GraphDocument(); + initListView(); + initToolbar(); + initReceivers(); + } + + private void initListView() { + manager = new ExplorerManager(); + organizer = new StandardGroupOrganizer(); + root = new FolderNode("", organizer, new ArrayList(), document.getGroups()); + manager.setRootContext(root); + ((BeanTreeView) this.jScrollPane1).setRootVisible(false); + + document.getChangedEvent().addListener(new ChangedListener() { + + public void changed(GraphDocument document) { + updateStructure(); + } + }); + + associateLookup(ExplorerUtils.createLookup(manager, getActionMap())); + } + + private void initToolbar() { + + Toolbar toolbar = new Toolbar(); + Border b = (Border) UIManager.get("Nb.Editor.Toolbar.border"); //NOI18N + toolbar.setBorder(b); + this.add(toolbar, BorderLayout.NORTH); + + toolbar.add(ImportAction.get(ImportAction.class)); + toolbar.add(((NodeAction) RemoveAction.get(RemoveAction.class)).createContextAwareInstance(this.getLookup())); + toolbar.add(RemoveAllAction.get(RemoveAllAction.class)); + + toolbar.add(((NodeAction) SaveAsAction.get(SaveAsAction.class)).createContextAwareInstance(this.getLookup())); + toolbar.add(SaveAllAction.get(SaveAllAction.class)); + + toolbar.add(StructuredViewAction.get(StructuredViewAction.class).getToolbarPresenter()); + + for (Toolbar tb : ToolbarPool.getDefault().getToolbars()) { + tb.setVisible(false); + } + + initOrganizers(); + } + + public void setOrganizer(GroupOrganizer organizer) { + this.organizer = organizer; + updateStructure(); + } + + private void initOrganizers() { + + } + + private void initReceivers() { + + final GroupCallback callback = new GroupCallback() { + + public void started(Group g) { + getDocument().addGroup(g); + } + }; + + Collection receivers = Lookup.getDefault().lookupAll(GroupReceiver.class); + if (receivers.size() > 0) { + JPanel panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); + + for (GroupReceiver r : receivers) { + Component c = r.init(callback); + panel.add(c); + } + + jPanel2.add(panel, BorderLayout.PAGE_START); + } + } + + private void updateStructure() { + root.init("", organizer, new ArrayList(), document.getGroups()); + } + + public void clear() { + document.clear(); + } + + public ExplorerManager getExplorerManager() { + return manager; + } + + public GraphDocument getDocument() { + return document; + } + + /** + * Gets default instance. Do not use directly: reserved for *.settings files only, + * i.e. deserialization routines; otherwise you could get a non-deserialized instance. + * To obtain the singleton instance, use {@link findInstance}. + */ + public static synchronized OutlineTopComponent getDefault() { + if (instance == null) { + instance = new OutlineTopComponent(); + } + return instance; + } + + /** + * Obtain the OutlineTopComponent instance. Never call {@link #getDefault} directly! + */ + public static synchronized OutlineTopComponent findInstance() { + TopComponent win = WindowManager.getDefault().findTopComponent(PREFERRED_ID); + if (win == null) { + ErrorManager.getDefault().log(ErrorManager.WARNING, "Cannot find Outline component. It will not be located properly in the window system."); + return getDefault(); + } + if (win instanceof OutlineTopComponent) { + return (OutlineTopComponent) win; + } + ErrorManager.getDefault().log(ErrorManager.WARNING, "There seem to be multiple components with the '" + PREFERRED_ID + "' ID. That is a potential source of errors and unexpected behavior."); + return getDefault(); + } + + @Override + public int getPersistenceType() { + return TopComponent.PERSISTENCE_ALWAYS; + } + + @Override + public void componentOpened() { + this.requestActive(); + } + + @Override + public void componentClosed() { + } + + @Override + protected String preferredID() { + return PREFERRED_ID; + } + + public void resultChanged(LookupEvent lookupEvent) { + } + + @Override + public void readExternal(ObjectInput objectInput) throws IOException, ClassNotFoundException { + // Not called when user starts application for the first time + super.readExternal(objectInput); + ((BeanTreeView) this.jScrollPane1).setRootVisible(false); + } + + @Override + public void writeExternal(ObjectOutput objectOutput) throws IOException { + super.writeExternal(objectOutput); + } + + static final class ResolvableHelper implements Serializable { + + private static final long serialVersionUID = 1L; + + public Object readResolve() { + return OutlineTopComponent.getDefault(); + } + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + jPanel2 = new javax.swing.JPanel(); + jScrollPane1 = new BeanTreeView(); + + setLayout(new java.awt.BorderLayout()); + + jPanel2.setLayout(new java.awt.BorderLayout()); + jPanel2.add(jScrollPane1, java.awt.BorderLayout.CENTER); + + add(jPanel2, java.awt.BorderLayout.CENTER); + }// //GEN-END:initComponents + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JPanel jPanel2; + private javax.swing.JScrollPane jScrollPane1; + // End of variables declaration//GEN-END:variables +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponentSettings.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponentSettings.xml new file mode 100644 index 00000000000..1acdbcbe986 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponentSettings.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponentWstcref.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponentWstcref.xml new file mode 100644 index 00000000000..329140ea6bd --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponentWstcref.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/StandardConfiguration.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/StandardConfiguration.xml new file mode 100644 index 00000000000..1e05bc21edb --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/StandardConfiguration.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/StandardGroupOrganizer.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/StandardGroupOrganizer.java new file mode 100644 index 00000000000..d907ba80c62 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/StandardGroupOrganizer.java @@ -0,0 +1,62 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.coordinator; + +import com.sun.hotspot.igv.data.Group; +import com.sun.hotspot.igv.data.services.GroupOrganizer; +import com.sun.hotspot.igv.data.Pair; +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public class StandardGroupOrganizer implements GroupOrganizer { + + public String getName() { + return "-- None --"; + } + + public List>> organize(List subFolders, List groups) { + + List>> result = new ArrayList>>(); + + if (groups.size() == 1 && subFolders.size() > 0) { + result.add(new Pair>("", groups)); + } else { + for (Group g : groups) { + List children = new ArrayList(); + children.add(g); + Pair> p = new Pair>(); + p.setLeft(g.getName()); + p.setRight(children); + result.add(p); + } + } + + return result; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/Bundle.properties new file mode 100644 index 00000000000..5b5b93f4773 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/Bundle.properties @@ -0,0 +1,18 @@ +CTL_EditFilterAction=Edit... +CTL_ImportAction=Open... +CTL_OpenGraphAction=View graph +CTL_DiffGraphAction=Difference to current graph +CTL_RemoveAction=Remove methods +CTL_ApplyFilterAction=Apply +CTL_FilterAction=Open Filter Window +CTL_AppliedFilterAction=Open AppliedFilter Window +CTL_OutlineAction=Open Outline Window +CTL_MoveFilterUpAction=Move upwards +CTL_MoveFilterDownAction=Move downwards +CTL_RemoveFilterAction=Remove +CTL_RemoveFilterSettingsAction=Remove filter setting +CTL_SaveAsAction=Save selected methods... +CTL_SaveAllAction=Save all... +CTL_SaveFilterSettingsAction=Save filter settings... +CTL_PropertiesAction=Open Properties Window +CTL_NewFilterAction=New filter... diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/DiffGraphAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/DiffGraphAction.java new file mode 100644 index 00000000000..3e7737e7f7f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/DiffGraphAction.java @@ -0,0 +1,70 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ + +package com.sun.hotspot.igv.coordinator.actions; + +import org.openide.nodes.Node; +import org.openide.util.HelpCtx; +import org.openide.util.NbBundle; +import org.openide.util.actions.CookieAction; + +/** + * + * @author Thomas Wuerthinger + */ +public final class DiffGraphAction extends CookieAction { + + protected void performAction(Node[] activatedNodes) { + DiffGraphCookie c = activatedNodes[0].getCookie(DiffGraphCookie.class); + c.openDiff(); + } + + protected int mode() { + return CookieAction.MODE_EXACTLY_ONE; + } + + public String getName() { + return NbBundle.getMessage(DiffGraphAction.class, "CTL_DiffGraphAction"); + } + + protected Class[] cookieClasses() { + return new Class[]{ + DiffGraphCookie.class + }; + } + + @Override + protected String iconResource() { + return "com/sun/hotspot/igv/coordinator/images/diff.gif"; + } + + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + protected boolean asynchronous() { + return false; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/DiffGraphCookie.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/DiffGraphCookie.java new file mode 100644 index 00000000000..b95ecf032eb --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/DiffGraphCookie.java @@ -0,0 +1,56 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ + +package com.sun.hotspot.igv.coordinator.actions; + +import com.sun.hotspot.igv.data.InputGraph; +import com.sun.hotspot.igv.data.services.GraphViewer; +import com.sun.hotspot.igv.difference.Difference; +import org.openide.nodes.Node; +import org.openide.util.Lookup; + +/** + * + * @author Thomas Wuerthinger + */ +public class DiffGraphCookie implements Node.Cookie { + + private InputGraph a; + private InputGraph b; + + public DiffGraphCookie(InputGraph a, InputGraph b) { + this.a = a; + this.b = b; + } + + public void openDiff() { + + final GraphViewer viewer = Lookup.getDefault().lookup(GraphViewer.class); + + if(viewer != null) { + InputGraph diffGraph = Difference.createDiffGraph(a, b); + viewer.view(diffGraph); + } + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/ImportAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/ImportAction.java new file mode 100644 index 00000000000..cc1e4b15e1d --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/ImportAction.java @@ -0,0 +1,175 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ + +package com.sun.hotspot.igv.coordinator.actions; + +import com.sun.hotspot.igv.coordinator.OutlineTopComponent; +import com.sun.hotspot.igv.data.GraphDocument; +import com.sun.hotspot.igv.data.serialization.Parser; +import com.sun.hotspot.igv.settings.Settings; +import com.sun.hotspot.igv.data.serialization.XMLParser; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import javax.swing.Action; +import javax.swing.JFileChooser; +import javax.swing.KeyStroke; +import javax.swing.filechooser.FileFilter; +import org.netbeans.api.progress.ProgressHandle; +import org.netbeans.api.progress.ProgressHandleFactory; +import org.openide.DialogDisplayer; +import org.openide.NotifyDescriptor; +import org.openide.util.HelpCtx; +import org.openide.util.NbBundle; +import org.openide.util.RequestProcessor; +import org.openide.util.actions.CallableSystemAction; +import org.openide.xml.XMLUtil; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; + +/** + * + * @author Thomas Wuerthinger + */ +public final class ImportAction extends CallableSystemAction { + + public static FileFilter getFileFilter() { + return new FileFilter() { + + public boolean accept(File f) { + return f.getName().toLowerCase().endsWith(".xml") || f.isDirectory(); + } + + public String getDescription() { + return "XML files (*.xml)"; + } + }; + } + + public void performAction() { + + JFileChooser fc = new JFileChooser(); + fc.setFileFilter(ImportAction.getFileFilter()); + fc.setCurrentDirectory(new File(Settings.get().get(Settings.DIRECTORY, Settings.DIRECTORY_DEFAULT))); + + if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { + File file = fc.getSelectedFile(); + + File dir = file; + if (!dir.isDirectory()) { + dir = dir.getParentFile(); + } + + Settings.get().put(Settings.DIRECTORY, dir.getAbsolutePath()); + + try { + final XMLReader reader = XMLUtil.createXMLReader(); + final FileInputStream inputStream = new FileInputStream(file); + final InputSource is = new InputSource(inputStream); + + final ProgressHandle handle = ProgressHandleFactory.createHandle("Opening file " + file.getName()); + final int basis = 1000; + handle.start(basis); + final int start = inputStream.available(); + + final XMLParser.ParseMonitor parseMonitor = new XMLParser.ParseMonitor() { + + public void setProgress(double d) { + try { + int curAvailable = inputStream.available(); + int prog = (int) (basis * (double) (start - curAvailable) / (double) start); + handle.progress(prog); + } catch (IOException ex) { + } + } + + public void setState(String state) { + setProgress(0.0); + handle.progress(state); + } + }; + final Parser parser = new Parser(); + final OutlineTopComponent component = OutlineTopComponent.findInstance(); + + component.requestActive(); + + RequestProcessor.getDefault().post(new Runnable() { + + public void run() { + GraphDocument document = null; + try { + document = parser.parse(reader, is, parseMonitor); + parseMonitor.setState("Finishing"); + component.getDocument().addGraphDocument(document); + } catch (SAXException ex) { + String s = "Exception during parsing the XML file, could not load document!"; + if (ex instanceof XMLParser.MissingAttributeException) { + XMLParser.MissingAttributeException e = (XMLParser.MissingAttributeException) ex; + s += "\nMissing attribute \"" + e.getAttributeName() + "\""; + } + ex.printStackTrace(); + NotifyDescriptor d = new NotifyDescriptor.Message(s, NotifyDescriptor.ERROR_MESSAGE); + DialogDisplayer.getDefault().notify(d); + } + handle.finish(); + } + }); + + } catch (SAXException ex) { + ex.printStackTrace(); + } catch (FileNotFoundException ex) { + ex.printStackTrace(); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + } + + public String getName() { + return NbBundle.getMessage(ImportAction.class, "CTL_ImportAction"); + } + + public ImportAction() { + putValue(Action.SHORT_DESCRIPTION, "Open an XML graph document"); + putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK)); + } + + @Override + protected String iconResource() { + return "com/sun/hotspot/igv/coordinator/images/import.gif"; + } + + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + protected boolean asynchronous() { + return false; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/OutlineAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/OutlineAction.java new file mode 100644 index 00000000000..580d1fa4566 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/OutlineAction.java @@ -0,0 +1,48 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ + +package com.sun.hotspot.igv.coordinator.actions; + +import com.sun.hotspot.igv.coordinator.*; +import java.awt.event.ActionEvent; +import javax.swing.AbstractAction; +import org.openide.util.NbBundle; +import org.openide.windows.TopComponent; + +/** + * + * @author Thomas Wuerthinger + */ +public class OutlineAction extends AbstractAction { + + public OutlineAction() { + super(NbBundle.getMessage(OutlineAction.class, "CTL_OutlineAction")); + } + + public void actionPerformed(ActionEvent evt) { + TopComponent win = OutlineTopComponent.findInstance(); + win.open(); + win.requestActive(); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveAction.java new file mode 100644 index 00000000000..180cb84c2ca --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveAction.java @@ -0,0 +1,73 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ + +package com.sun.hotspot.igv.coordinator.actions; + +import javax.swing.Action; +import org.openide.nodes.Node; +import org.openide.util.HelpCtx; +import org.openide.util.NbBundle; +import org.openide.util.actions.NodeAction; + +/** + * + * @author Thomas Wuerthinger + */ +public final class RemoveAction extends NodeAction { + + protected void performAction(Node[] activatedNodes) { + for (Node n : activatedNodes) { + RemoveCookie removeCookie = n.getCookie(RemoveCookie.class); + if (removeCookie != null) { + removeCookie.remove(); + } + } + } + + public RemoveAction() { + putValue(Action.SHORT_DESCRIPTION, "Remove"); + } + + public String getName() { + return NbBundle.getMessage(RemoveAction.class, "CTL_RemoveAction"); + } + + @Override + protected String iconResource() { + return "com/sun/hotspot/igv/coordinator/images/remove.gif"; + } + + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + protected boolean asynchronous() { + return false; + } + + protected boolean enable(Node[] nodes) { + return nodes.length > 0; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveAllAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveAllAction.java new file mode 100644 index 00000000000..68372525a1a --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveAllAction.java @@ -0,0 +1,70 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.coordinator.actions; + +import com.sun.hotspot.igv.coordinator.OutlineTopComponent; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; +import javax.swing.Action; +import javax.swing.KeyStroke; +import org.openide.util.HelpCtx; +import org.openide.util.NbBundle; +import org.openide.util.actions.CallableSystemAction; + +/** + * + * @author Thomas Wuerthinger + */ +public final class RemoveAllAction extends CallableSystemAction { + + + public String getName() { + return NbBundle.getMessage(RemoveAllAction.class, "CTL_ImportAction"); + } + + public RemoveAllAction() { + putValue(Action.SHORT_DESCRIPTION, "Remove all methods"); + putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_SHIFT, InputEvent.CTRL_MASK)); + } + + @Override + protected String iconResource() { + return "com/sun/hotspot/igv/coordinator/images/removeall.gif"; + } + + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + protected boolean asynchronous() { + return false; + } + + @Override + public void performAction() { + OutlineTopComponent.findInstance().clear(); + } +} diff --git a/jdk/make/tools/winver/src/StdAfx.cpp b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveCookie.java similarity index 76% rename from jdk/make/tools/winver/src/StdAfx.cpp rename to hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveCookie.java index a7169bc689b..7fc2989bc56 100644 --- a/jdk/make/tools/winver/src/StdAfx.cpp +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveCookie.java @@ -1,5 +1,5 @@ /* - * Copyright 2001 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,11 +23,14 @@ * have any questions. */ -// stdafx.cpp : source file that includes just the standard includes -// getver.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information +package com.sun.hotspot.igv.coordinator.actions; -#include "stdafx.h" +import org.openide.nodes.Node; -// TODO: reference any additional headers you need in STDAFX.H -// and not in this file +/** + * + * @author Thomas Wuerthinger + */ +public interface RemoveCookie extends Node.Cookie { + void remove(); +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/SaveAllAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/SaveAllAction.java new file mode 100644 index 00000000000..af56a00936c --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/SaveAllAction.java @@ -0,0 +1,69 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.coordinator.actions; + +import com.sun.hotspot.igv.coordinator.OutlineTopComponent; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; +import javax.swing.Action; +import javax.swing.KeyStroke; +import org.openide.util.HelpCtx; +import org.openide.util.NbBundle; +import org.openide.util.actions.CallableSystemAction; + +/** + * + * @author Thomas Wuerthinger + */ +public final class SaveAllAction extends CallableSystemAction { + + public void performAction() { + final OutlineTopComponent component = OutlineTopComponent.findInstance(); + SaveAsAction.save(component.getDocument()); + } + + public String getName() { + return NbBundle.getMessage(SaveAllAction.class, "CTL_SaveAllAction"); + } + + public SaveAllAction() { + putValue(Action.SHORT_DESCRIPTION, "Save all methods to XML file"); + putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK)); + } + + @Override + protected String iconResource() { + return "com/sun/hotspot/igv/coordinator/images/saveall.gif"; + } + + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + protected boolean asynchronous() { + return false; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/SaveAsAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/SaveAsAction.java new file mode 100644 index 00000000000..d8565b09b8c --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/SaveAsAction.java @@ -0,0 +1,122 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ + +package com.sun.hotspot.igv.coordinator.actions; + +import com.sun.hotspot.igv.data.GraphDocument; +import com.sun.hotspot.igv.data.Group; +import com.sun.hotspot.igv.data.serialization.Printer; +import com.sun.hotspot.igv.settings.Settings; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.Writer; +import javax.swing.JFileChooser; +import org.openide.nodes.Node; +import org.openide.util.HelpCtx; +import org.openide.util.NbBundle; +import org.openide.util.actions.CookieAction; +import org.openide.util.actions.NodeAction; + +/** + * + * @author Thomas Wuerthinger + */ +public final class SaveAsAction extends NodeAction { + + protected void performAction(Node[] activatedNodes) { + + GraphDocument doc = new GraphDocument(); + for (Node n : activatedNodes) { + Group group = n.getLookup().lookup(Group.class); + doc.addGroup(group); + } + + save(doc); + } + + public static void save(GraphDocument doc) { + JFileChooser fc = new JFileChooser(); + fc.setFileFilter(ImportAction.getFileFilter()); + fc.setCurrentDirectory(new File(Settings.get().get(Settings.DIRECTORY, Settings.DIRECTORY_DEFAULT))); + + if (fc.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) { + File file = fc.getSelectedFile(); + if (!file.getName().contains(".")) { + file = new File(file.getAbsolutePath() + ".xml"); + } + + File dir = file; + if (!dir.isDirectory()) { + dir = dir.getParentFile(); + } + Settings.get().put(Settings.DIRECTORY, dir.getAbsolutePath()); + try { + Writer writer = new OutputStreamWriter(new FileOutputStream(file)); + Printer p = new Printer(); + p.export(writer, doc); + writer.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + + } + } + } + + protected int mode() { + return CookieAction.MODE_SOME; + } + + public String getName() { + return NbBundle.getMessage(SaveAsAction.class, "CTL_SaveAsAction"); + } + + @Override + protected String iconResource() { + return "com/sun/hotspot/igv/coordinator/images/save.gif"; + } + + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + protected boolean asynchronous() { + return false; + } + + protected boolean enable(Node[] nodes) { + + int cnt = 0; + for (Node n : nodes) { + cnt += n.getLookup().lookupAll(Group.class).size(); + } + + return cnt > 0; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/StructuredViewAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/StructuredViewAction.java new file mode 100644 index 00000000000..1486c2e8e02 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/StructuredViewAction.java @@ -0,0 +1,180 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.coordinator.actions; + +import com.sun.hotspot.igv.coordinator.OutlineTopComponent; +import com.sun.hotspot.igv.data.services.GroupOrganizer; +import java.awt.Component; +import java.awt.Image; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.awt.image.BufferedImage; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.swing.Action; +import javax.swing.ButtonGroup; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; +import org.openide.awt.DropDownButtonFactory; +import org.openide.util.HelpCtx; +import org.openide.util.Lookup; +import org.openide.util.Utilities; +import org.openide.util.actions.CallableSystemAction; + +public class StructuredViewAction extends CallableSystemAction { + + private static JButton dropDownButton; + private static ButtonGroup buttonGroup; + private static JPopupMenu popup; + private MyMenuItemListener menuItemListener; + private Map map; + + public StructuredViewAction() { + + putValue(Action.SHORT_DESCRIPTION, "Cluster nodes into blocks"); + } + + @Override + public Component getToolbarPresenter() { + + Image iconImage = Utilities.loadImage("com/sun/hotspot/igv/coordinator/images/structure.gif"); + ImageIcon icon = new ImageIcon(iconImage); + + popup = new JPopupMenu(); + + menuItemListener = new MyMenuItemListener(); + + buttonGroup = new ButtonGroup(); + + Collection organizersCollection = Lookup.getDefault().lookupAll(GroupOrganizer.class); + + List organizers = new ArrayList(organizersCollection); + Collections.sort(organizers, new Comparator() { + public int compare(GroupOrganizer a, GroupOrganizer b) { + return a.getName().compareTo(b.getName()); + } + }); + + map = new HashMap(); + + boolean first = true; + for(GroupOrganizer organizer : organizers) { + JCheckBoxMenuItem item = new JCheckBoxMenuItem(organizer.getName()); + map.put(item, organizer); + item.addActionListener(menuItemListener); + buttonGroup.add(item); + popup.add(item); + if(first) { + item.setSelected(true); + first = false; + } + } + + dropDownButton = DropDownButtonFactory.createDropDownButton( + new ImageIcon( + new BufferedImage(32, 32, BufferedImage.TYPE_BYTE_GRAY)), + popup); + + dropDownButton.setIcon(icon); + + dropDownButton.setToolTipText("Insert Layer Registration"); + + dropDownButton.addItemListener(new ItemListener() { + + public void itemStateChanged(ItemEvent e) { + int state = e.getStateChange(); + if (state == ItemEvent.SELECTED) { + performAction(); + } + } + }); + + dropDownButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + performAction(); + } + }); + + popup.addPopupMenuListener(new PopupMenuListener() { + + public void popupMenuCanceled(PopupMenuEvent e) { + dropDownButton.setSelected(false); + } + + public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { + dropDownButton.setSelected(false); + } + + public void popupMenuWillBecomeVisible(PopupMenuEvent e) { + dropDownButton.setSelected(true); + } + }); + + return dropDownButton; + + } + + private class MyMenuItemListener implements ActionListener { + + public void actionPerformed(ActionEvent ev) { + JMenuItem item = (JMenuItem) ev.getSource(); + GroupOrganizer organizer = map.get(item); + assert organizer != null : "Organizer must exist!"; + OutlineTopComponent.findInstance().setOrganizer(organizer); + } + } + + + @Override + public void performAction() { + popup.show(dropDownButton, 0, dropDownButton.getHeight()); + } + + public String getName() { + return "Structured View"; + } + + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + protected boolean asynchronous() { + return false; + } + +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/customLeftWsmode.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/customLeftWsmode.xml new file mode 100644 index 00000000000..2655e46a14b --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/customLeftWsmode.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/diff.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/diff.gif new file mode 100644 index 00000000000..6e49c314adf Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/diff.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/folder.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/folder.gif new file mode 100644 index 00000000000..2d3ca05fb33 Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/folder.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/graph.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/graph.gif new file mode 100644 index 00000000000..7a4e5fc8cd7 Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/graph.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/import.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/import.gif new file mode 100644 index 00000000000..c0b2ca24af5 Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/import.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/remove.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/remove.gif new file mode 100644 index 00000000000..9dc08247b8f Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/remove.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/removeall.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/removeall.gif new file mode 100644 index 00000000000..9eeab3cad6d Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/removeall.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/save.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/save.gif new file mode 100644 index 00000000000..954f1accde6 Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/save.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/saveall.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/saveall.gif new file mode 100644 index 00000000000..2d31c8b2ccd Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/saveall.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/structure.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/structure.gif new file mode 100644 index 00000000000..2be84874874 Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/structure.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/structured.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/structured.gif new file mode 100644 index 00000000000..71aa946d539 Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/structured.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/layer.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/layer.xml new file mode 100644 index 00000000000..999997db9f6 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/layer.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Data/build.xml new file mode 100644 index 00000000000..dd626066c85 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/build.xml @@ -0,0 +1,8 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.data. + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/Data/manifest.mf new file mode 100644 index 00000000000..702ae8764a2 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/manifest.mf @@ -0,0 +1,5 @@ +Manifest-Version: 1.0 +OpenIDE-Module: com.sun.hotspot.igv.data +OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/data/Bundle.properties +OpenIDE-Module-Specification-Version: 1.0 + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/build-impl.xml new file mode 100644 index 00000000000..942d7a628fc --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/build-impl.xml @@ -0,0 +1,30 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/genfiles.properties new file mode 100644 index 00000000000..621e413c962 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=a403efd8 +build.xml.script.CRC32=b87f73ba +build.xml.stylesheet.CRC32=79c3b980 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=a403efd8 +nbproject/build-impl.xml.script.CRC32=cc649146 +nbproject/build-impl.xml.stylesheet.CRC32=deb65f65 diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/platform.properties new file mode 100644 index 00000000000..68ad75e5766 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/platform.properties @@ -0,0 +1,29 @@ +# Deprecated since 5.0u1; for compatibility with 5.0: +disabled.clusters=\ + apisupport1,\ + harness,\ + ide8,\ + java1,\ + nb6.0,\ + profiler2 +disabled.modules=\ + org.netbeans.core.execution,\ + org.netbeans.core.multiview,\ + org.netbeans.core.output2,\ + org.netbeans.modules.applemenu,\ + org.netbeans.modules.autoupdate.services,\ + org.netbeans.modules.autoupdate.ui,\ + org.netbeans.modules.core.kit,\ + org.netbeans.modules.favorites,\ + org.netbeans.modules.javahelp,\ + org.netbeans.modules.masterfs,\ + org.netbeans.modules.options.keymap,\ + org.netbeans.modules.sendopts,\ + org.netbeans.modules.templates,\ + org.openide.compat,\ + org.openide.execution,\ + org.openide.util.enumerations +enabled.clusters=\ + platform7 +nbjdk.active=JDK_1.6 +nbplatform.active=default diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/project.properties new file mode 100644 index 00000000000..152f44eca60 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/project.properties @@ -0,0 +1,2 @@ +javac.source=1.5 +javac.compilerargs=-Xlint -Xlint:-serial diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/project.xml new file mode 100644 index 00000000000..dce4d28a7c3 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/project.xml @@ -0,0 +1,16 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.data + + + + com.sun.hotspot.igv.data + com.sun.hotspot.igv.data.serialization + com.sun.hotspot.igv.data.services + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/suite.properties new file mode 100644 index 00000000000..29d7cc9bd6f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/suite.properties @@ -0,0 +1 @@ +suite.dir=${basedir}/.. diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Bundle.properties new file mode 100644 index 00000000000..f17788c7ff4 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Bundle.properties @@ -0,0 +1 @@ +OpenIDE-Module-Name=Data diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedEvent.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedEvent.java new file mode 100644 index 00000000000..18a8cedbabf --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedEvent.java @@ -0,0 +1,44 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.data; + +/** + * + * @author Thomas Wuerthinger + */ +public class ChangedEvent extends Event> { + + private T object; + + public ChangedEvent() { + } + + public ChangedEvent(T object) { + this.object = object; + } + + protected void fire(ChangedListener l) { + l.changed(object); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedEventProvider.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedEventProvider.java new file mode 100644 index 00000000000..5e2978e8260 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedEventProvider.java @@ -0,0 +1,34 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.data; + +/** + * + * @author Thomas Wuerthinger + */ +public interface ChangedEventProvider { + + public ChangedEvent getChangedEvent(); +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedListener.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedListener.java new file mode 100644 index 00000000000..806b339be17 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedListener.java @@ -0,0 +1,33 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.data; + +/** + * + * @author Thomas Wuerthinger + */ +public interface ChangedListener { + + public void changed(T source); +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Event.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Event.java new file mode 100644 index 00000000000..c31e5935a12 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Event.java @@ -0,0 +1,57 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.data; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public abstract class Event { + + private List listener; + + public Event() { + listener = new ArrayList(); + } + + public void addListener(L l) { + listener.add(l); + } + + public void removeListener(L l) { + listener.remove(l); + } + + public void fire() { + List tmpList = new ArrayList(listener); + for (L l : tmpList) { + fire(l); + } + } + + protected abstract void fire(L l); +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/GraphDocument.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/GraphDocument.java new file mode 100644 index 00000000000..27d09c38f71 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/GraphDocument.java @@ -0,0 +1,91 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.data; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public class GraphDocument extends Properties.Object implements ChangedEventProvider { + + private List groups; + private ChangedEvent changedEvent; + + public GraphDocument() { + groups = new ArrayList(); + changedEvent = new ChangedEvent(this); + } + + public void clear() { + groups.clear(); + getChangedEvent().fire(); + } + + public ChangedEvent getChangedEvent() { + return changedEvent; + } + + public List getGroups() { + return Collections.unmodifiableList(groups); + } + + public void addGroup(Group group) { + group.setDocument(this); + groups.add(group); + getChangedEvent().fire(); + } + + public void removeGroup(Group group) { + if (groups.contains(group)) { + group.setDocument(null); + groups.remove(group); + getChangedEvent().fire(); + } + } + + public void addGraphDocument(GraphDocument document) { + for (Group g : document.groups) { + this.addGroup(g); + } + document.clear(); + getChangedEvent().fire(); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + + sb.append("GraphDocument: " + getProperties().toString() + " \n\n"); + for (Group g : getGroups()) { + sb.append(g.toString()); + sb.append("\n\n"); + } + + return sb.toString(); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Group.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Group.java new file mode 100644 index 00000000000..8f0aa15e992 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Group.java @@ -0,0 +1,141 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.data; + +import com.sun.hotspot.igv.data.ChangedEvent; +import com.sun.hotspot.igv.data.ChangedEventProvider; +import com.sun.hotspot.igv.data.Properties; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * + * @author Thomas Wuerthinger + */ +public class Group extends Properties.Object implements ChangedEventProvider { + + private List graphs; + private transient ChangedEvent changedEvent; + private GraphDocument document; + private InputMethod method; + private String assembly; + + public Group() { + graphs = new ArrayList(); + init(); + } + + private void init() { + changedEvent = new ChangedEvent(this); + } + + public void fireChangedEvent() { + changedEvent.fire(); + } + + public void setAssembly(String s) { + this.assembly = s; + } + + public String getAssembly() { + return assembly; + } + + public void setMethod(InputMethod method) { + this.method = method; + } + + public InputMethod getMethod() { + return method; + } + + void setDocument(GraphDocument document) { + this.document = document; + } + + public GraphDocument getDocument() { + return document; + } + + public ChangedEvent getChangedEvent() { + return changedEvent; + } + + public List getGraphs() { + return Collections.unmodifiableList(graphs); + } + + public void addGraph(InputGraph g) { + assert g != null; + assert !graphs.contains(g); + graphs.add(g); + changedEvent.fire(); + } + + public void removeGraph(InputGraph g) { + int index = graphs.indexOf(g); + if (index != -1) { + graphs.remove(g); + changedEvent.fire(); + } + } + + public Set getAllNodes() { + Set result = new HashSet(); + for (InputGraph g : graphs) { + Set ids = g.getNodesAsSet(); + result.addAll(g.getNodesAsSet()); + for (Integer i : ids) { + result.add(-i); + } + } + return result; + } + + public InputGraph getLastAdded() { + if (graphs.size() == 0) { + return null; + } + return graphs.get(graphs.size() - 1); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("Group " + getProperties().toString() + "\n"); + for (InputGraph g : graphs) { + sb.append(g.toString()); + sb.append("\n"); + } + return sb.toString(); + } + + public String getName() { + return getProperties().get("name"); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBlock.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBlock.java new file mode 100644 index 00000000000..1c1367738af --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBlock.java @@ -0,0 +1,140 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.data; + +import java.awt.Rectangle; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * + * @author Thomas Wuerthinger + */ +public class InputBlock { + + private List nodes; + private List successorNames; + private String name; + private InputGraph graph; + private Rectangle bounds; + private Set successors; + private Set predecessors; + private Set inputs; + private Set outputs; + + public InputBlock(InputGraph graph, String name) { + this.graph = graph; + this.name = name; + nodes = new ArrayList(); + successorNames = new ArrayList(); + successors = new HashSet(); + predecessors = new HashSet(); + inputs = new HashSet(); + outputs = new HashSet(); + } + + public void removeSuccessor(InputBlock b) { + if (successors.contains(b)) { + successors.remove(b); + b.predecessors.remove(this); + InputBlockEdge e = new InputBlockEdge(this, b); + assert outputs.contains(e); + outputs.remove(e); + assert b.inputs.contains(e); + b.inputs.remove(e); + } + } + + public String getName() { + return name; + } + + public void setName(String s) { + name = s; + } + + public List getNodes() { + return Collections.unmodifiableList(nodes); + } + + public void addNode(int id) { + InputNode n = graph.getNode(id); + assert n != null; + graph.setBlock(n, this); + addNode(graph.getNode(id)); + } + + public void addNode(InputNode node) { + assert !nodes.contains(node); + nodes.add(node); + } + + public Set getPredecessors() { + return Collections.unmodifiableSet(predecessors); + } + + public Set getSuccessors() { + return Collections.unmodifiableSet(successors); + } + + public Set getInputs() { + return Collections.unmodifiableSet(inputs); + } + + public Set getOutputs() { + return Collections.unmodifiableSet(outputs); + } + + // resolveBlockLinks must be called afterwards + public void addSuccessor(String name) { + successorNames.add(name); + } + + public void resolveBlockLinks() { + for (String s : successorNames) { + InputBlock b = graph.getBlock(s); + addSuccessor(b); + } + + successorNames.clear(); + } + + public void addSuccessor(InputBlock b) { + if (!successors.contains(b)) { + successors.add(b); + b.predecessors.add(this); + InputBlockEdge e = new InputBlockEdge(this, b); + outputs.add(e); + b.inputs.add(e); + } + } + + @Override + public String toString() { + return this.getName(); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBlockEdge.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBlockEdge.java new file mode 100644 index 00000000000..10cac158a4a --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBlockEdge.java @@ -0,0 +1,65 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.data; + +/** + * + * @author Thomas Wuerthinger + */ +public class InputBlockEdge { + + private InputBlock from; + private InputBlock to; + + public InputBlockEdge(InputBlock from, InputBlock to) { + assert from != null; + assert to != null; + this.from = from; + this.to = to; + } + + public InputBlock getFrom() { + return from; + } + + public InputBlock getTo() { + return to; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof InputBlockEdge && obj != null) { + InputBlockEdge e = (InputBlockEdge) obj; + return e.from.equals(from) && e.to.equals(to); + } + return super.equals(obj); + } + + @Override + public int hashCode() { + int hash = from.hashCode(); + hash = 59 * hash + to.hashCode(); + return hash; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBytecode.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBytecode.java new file mode 100644 index 00000000000..14ab1f34059 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBytecode.java @@ -0,0 +1,56 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.data; + +/** + * + * @author Thomas Wuerthinger + */ +public class InputBytecode { + + private int bci; + private String name; + private InputMethod inlined; + + public InputBytecode(int bci, String name) { + this.bci = bci; + this.name = name; + } + + public InputMethod getInlined() { + return inlined; + } + + public void setInlined(InputMethod inlined) { + this.inlined = inlined; + } + + public int getBci() { + return bci; + } + + public String getName() { + return name; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputEdge.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputEdge.java new file mode 100644 index 00000000000..d1c440ec09a --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputEdge.java @@ -0,0 +1,92 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.data; + +/** + * + * @author Thomas Wuerthinger + */ +public class InputEdge { + + public enum State { + + SAME, + NEW, + DELETED + } + private char toIndex; + private int from; + private int to; + private State state; + + public InputEdge(char toIndex, int from, int to) { + this.toIndex = toIndex; + this.from = from; + this.to = to; + this.state = State.SAME; + } + + public State getState() { + return state; + } + + public void setState(State x) { + this.state = x; + } + + public char getToIndex() { + return toIndex; + } + + public String getName() { + return "in" + toIndex; + } + + public int getFrom() { + return from; + } + + public int getTo() { + return to; + } + + @Override + public boolean equals(Object o) { + if (o == null || !(o instanceof InputEdge)) { + return false; + } + InputEdge conn2 = (InputEdge) o; + return conn2.toIndex == toIndex && conn2.from == from && conn2.to == to; + } + + @Override + public String toString() { + return "Edge from " + from + " to " + to + "(" + (int) toIndex + ") "; + } + + @Override + public int hashCode() { + return (from << 20 | to << 8 | toIndex); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputGraph.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputGraph.java new file mode 100644 index 00000000000..b929fd627c6 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputGraph.java @@ -0,0 +1,249 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.data; + +import com.sun.hotspot.igv.data.Properties; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * + * @author Thomas Wuerthinger + */ +public class InputGraph extends Properties.Object { + + private Map nodes; + private Set edges; + private Group parent; + private Map blocks; + private Map nodeToBlock; + private boolean isDifferenceGraph; + + public InputGraph(Group parent) { + this(parent, null); + } + + public InputGraph(Group parent, InputGraph last) { + this(parent, last, ""); + } + + private void clearBlocks() { + blocks.clear(); + nodeToBlock.clear(); + } + + public InputGraph(Group parent, InputGraph last, String name) { + this.parent = parent; + setName(name); + nodes = new Hashtable(); + edges = new HashSet(); + blocks = new Hashtable(); + nodeToBlock = new Hashtable(); + if (last != null) { + + for (InputNode n : last.getNodes()) { + addNode(n); + } + + for (InputEdge c : last.getEdges()) { + addEdge(c); + } + } + } + + public void schedule(Collection newBlocks) { + clearBlocks(); + InputBlock noBlock = new InputBlock(this, "no block"); + Set scheduledNodes = new HashSet(); + + for (InputBlock b : newBlocks) { + for (InputNode n : b.getNodes()) { + assert !scheduledNodes.contains(n); + scheduledNodes.add(n); + } + } + + for (InputNode n : this.getNodes()) { + assert nodes.get(n.getId()) == n; + if (!scheduledNodes.contains(n)) { + noBlock.addNode(n.getId()); + } + } + + if (noBlock.getNodes().size() != 0) { + newBlocks.add(noBlock); + } + for (InputBlock b : newBlocks) { + addBlock(b); + } + + for (InputNode n : this.getNodes()) { + assert this.getBlock(n) != null; + } + } + + public void setBlock(InputNode node, InputBlock block) { + nodeToBlock.put(node.getId(), block); + } + + public InputBlock getBlock(int nodeId) { + return nodeToBlock.get(nodeId); + } + + public InputBlock getBlock(InputNode node) { + return getBlock(node.getId()); + } + + public InputGraph getNext() { + List list = parent.getGraphs(); + if (!list.contains(this)) { + return null; + } + int index = list.indexOf(this); + if (index == list.size() - 1) { + return null; + } else { + return list.get(index + 1); + } + } + + public InputGraph getPrev() { + List list = parent.getGraphs(); + if (!list.contains(this)) { + return null; + } + int index = list.indexOf(this); + if (index == 0) { + return null; + } else { + return list.get(index - 1); + } + } + + public String getName() { + return getProperties().get("name"); + } + + public String getAbsoluteName() { + String result = getName(); + if (this.parent != null) { + result = parent.getName() + ": " + result; + } + return result; + } + + public Collection getNodes() { + return Collections.unmodifiableCollection(nodes.values()); + } + + public Set getNodesAsSet() { + return Collections.unmodifiableSet(nodes.keySet()); + } + + public Collection getBlocks() { + return Collections.unmodifiableCollection(blocks.values()); + } + + public void addNode(InputNode node) { + nodes.put(node.getId(), node); + } + + public InputNode getNode(int id) { + return nodes.get(id); + } + + public InputNode removeNode(int index) { + return nodes.remove(index); + } + + public Set getEdges() { + return Collections.unmodifiableSet(edges); + } + + public void removeEdge(InputEdge c) { + assert edges.contains(c); + edges.remove(c); + assert !edges.contains(c); + } + + public void addEdge(InputEdge c) { + assert !edges.contains(c); + edges.add(c); + assert edges.contains(c); + } + + public Group getGroup() { + return parent; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("Graph " + getName() + " " + getProperties().toString() + "\n"); + for (InputNode n : nodes.values()) { + sb.append(n.toString()); + sb.append("\n"); + } + + for (InputEdge c : edges) { + sb.append(c.toString()); + sb.append("\n"); + } + return sb.toString(); + } + + public void addBlock(InputBlock b) { + blocks.put(b.getName(), b); + for (InputNode n : b.getNodes()) { + this.nodeToBlock.put(n.getId(), b); + } + } + + public void resolveBlockLinks() { + for (InputBlock b : blocks.values()) { + b.resolveBlockLinks(); + } + } + + public void setName(String s) { + getProperties().setProperty("name", s); + } + + public InputBlock getBlock(String s) { + return blocks.get(s); + } + + public boolean isDifferenceGraph() { + return this.isDifferenceGraph; + } + + public void setIsDifferenceGraph(boolean b) { + isDifferenceGraph = b; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputMethod.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputMethod.java new file mode 100644 index 00000000000..eac6b1a0308 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputMethod.java @@ -0,0 +1,127 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.data; + +import com.sun.hotspot.igv.data.Properties; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public class InputMethod extends Properties.Object { + + private String name; + private int bci; + private String shortName; + private List inlined; + private InputMethod parentMethod; + private Group group; + private List bytecodes; + + /** Creates a new instance of InputMethod */ + public InputMethod(Group parent, String name, String shortName, int bci) { + this.group = parent; + this.name = name; + this.bci = bci; + this.shortName = shortName; + inlined = new ArrayList(); + bytecodes = new ArrayList(); + } + + public List getBytecodes() { + return Collections.unmodifiableList(bytecodes); + } + + public List getInlined() { + return Collections.unmodifiableList(inlined); + } + + public void addInlined(InputMethod m) { + + // assert bci unique + for (InputMethod m2 : inlined) { + assert m2.getBci() != m.getBci(); + } + + inlined.add(m); + assert m.parentMethod == null; + m.parentMethod = this; + + for (InputBytecode bc : bytecodes) { + if (bc.getBci() == m.getBci()) { + bc.setInlined(m); + } + } + } + + public Group getGroup() { + return group; + } + + public String getShortName() { + return shortName; + } + + public void setBytecodes(String text) { + + String[] strings = text.split("\n"); + int oldNumber = -1; + for (String s : strings) { + + if (s.length() > 0 && Character.isDigit(s.charAt(0))) { + s = s.trim(); + int spaceIndex = s.indexOf(' '); + String numberString = s.substring(0, spaceIndex); + String tmpName = s.substring(spaceIndex + 1, s.length()); + + int number = -1; + number = Integer.parseInt(numberString); + + // assert correct order of bytecodes + assert number > oldNumber; + + InputBytecode bc = new InputBytecode(number, tmpName); + bytecodes.add(bc); + + for (InputMethod m : inlined) { + if (m.getBci() == number) { + bc.setInlined(m); + break; + } + } + } + } + } + + public String getName() { + return name; + } + + public int getBci() { + return bci; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputNode.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputNode.java new file mode 100644 index 00000000000..ad15d141ac9 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputNode.java @@ -0,0 +1,73 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.data; + +/** + * + * @author Thomas Wuerthinger + */ +public class InputNode extends Properties.Object { + + private int id; + + public InputNode(InputNode n) { + super(n); + setId(n.id); + } + + public InputNode(int id) { + setId(id); + } + + public void setId(int id) { + this.id = id; + getProperties().setProperty("id", "" + id); + } + + public int getId() { + return id; + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof InputNode)) { + return false; + } + InputNode n = (InputNode) o; + if (n.id != id) { + return false; + } + return getProperties().equals(n.getProperties()); + } + + @Override + public int hashCode() { + return id; + } + + @Override + public String toString() { + return "Node " + id + " " + getProperties().toString(); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Pair.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Pair.java new file mode 100644 index 00000000000..3becd18cbc5 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Pair.java @@ -0,0 +1,72 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.data; + +/** + * + * @author Thomas Wuerthinger + */ +public class Pair { + + private L l; + private R r; + + public Pair() { + } + + public Pair(L l, R r) { + this.l = l; + this.r = r; + } + + public L getLeft() { + return l; + } + + public void setLeft(L l) { + this.l = l; + } + + public R getRight() { + return r; + } + + public void setRight(R r) { + this.r = r; + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof Pair)) { + return false; + } + Pair obj = (Pair) o; + return l.equals(obj.l) && r.equals(obj.r); + } + + @Override + public int hashCode() { + return l.hashCode() * 71 + r.hashCode(); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Properties.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Properties.java new file mode 100644 index 00000000000..07a29962f9f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Properties.java @@ -0,0 +1,288 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * + * @author Thomas Wuerthinger + */ +public class Properties implements Serializable { + + public static final long serialVersionUID = 1L; + private Map map; + + public Properties() { + map = new HashMap(5); + } + + @Override + public boolean equals(java.lang.Object o) { + if (!(o instanceof Properties)) { + return false; + } + + Properties p = (Properties) o; + + if (getProperties().size() != p.getProperties().size()) { + return false; + } + for (Property prop : getProperties()) { + String value = p.get(prop.getName()); + if (value == null || !value.equals(prop.getValue())) { + return false; + } + } + return true; + } + + @Override + public int hashCode() { + int hash = 5; + hash = 83 * hash + (this.map != null ? this.map.hashCode() : 0); + return hash; + } + + public Properties(String name, String value) { + this(); + this.add(new Property(name, value)); + } + + public Properties(String name, String value, String name1, String value1) { + this(name, value); + this.add(new Property(name1, value1)); + } + + public Properties(String name, String value, String name1, String value1, String name2, String value2) { + this(name, value, name1, value1); + this.add(new Property(name2, value2)); + } + + public Properties(Properties p) { + map = new HashMap(p.map); + } + + public static class Object implements Provider { + + private Properties properties; + + public Object() { + properties = new Properties(); + } + + public Object(Properties.Object object) { + properties = new Properties(object.getProperties()); + } + + public Properties getProperties() { + return properties; + } + } + + public interface PropertyMatcher { + + String getName(); + + boolean match(String value); + } + + public static class InvertPropertyMatcher implements PropertyMatcher { + + private PropertyMatcher matcher; + + public InvertPropertyMatcher(PropertyMatcher matcher) { + this.matcher = matcher; + } + + public String getName() { + return matcher.getName(); + } + + public boolean match(String p) { + return !matcher.match(p); + } + } + + public static class StringPropertyMatcher implements PropertyMatcher { + + private String name; + private String value; + + public StringPropertyMatcher(String name, String value) { + this.name = name; + this.value = value; + } + + public String getName() { + return name; + } + + public boolean match(String p) { + return p.equals(value); + } + } + + public static class RegexpPropertyMatcher implements PropertyMatcher { + + private String name; + private Pattern valuePattern; + + public RegexpPropertyMatcher(String name, String value) { + this.name = name; + valuePattern = Pattern.compile(value); + } + + public String getName() { + return name; + } + + public boolean match(String p) { + Matcher m = valuePattern.matcher(p); + return m.matches(); + } + } + + public Property selectSingle(PropertyMatcher matcher) { + + Property p = this.map.get(matcher.getName()); + if (p == null) { + return null; + } + if (matcher.match(p.getValue())) { + return p; + } else { + return null; + } + } + + public interface Provider { + + public Properties getProperties(); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("["); + for (Property p : map.values()) { + sb.append(p.toString()); + } + return sb.append("]").toString(); + } + + public static class PropertySelector { + + private Collection objects; + + public PropertySelector(Collection objects) { + this.objects = objects; + } + + public T selectSingle(final String name, final String value) { + return selectSingle(new StringPropertyMatcher(name, value)); + } + + public T selectSingle(PropertyMatcher matcher) { + + for (T t : objects) { + Property p = t.getProperties().selectSingle(matcher); + if (p != null) { + return t; + } + } + + return null; + } + + public List selectMultiple(final String name, final String value) { + return selectMultiple(new StringPropertyMatcher(name, value)); + } + + public List selectMultiple(PropertyMatcher matcher) { + List result = new ArrayList(); + for (T t : objects) { + Property p = t.getProperties().selectSingle(matcher); + if (p != null) { + result.add(t); + } + } + return result; + } + } + + public String get(String key) { + Property p = map.get(key); + if (p == null) { + return null; + } else { + return p.getValue(); + } + } + + public String getProperty(String string) { + return get(string); + } + + public Property setProperty(String name, String value) { + + if (value == null) { + // remove this property + return map.remove(name); + } else { + Property p = map.get(name); + if (p == null) { + p = new Property(name, value); + map.put(name, p); + } else { + p.setValue(value); + } + return p; + } + } + + public Collection getProperties() { + return Collections.unmodifiableCollection(map.values()); + } + + public void add(Properties properties) { + for (Property p : properties.getProperties()) { + add(p); + } + } + + public void add(Property property) { + assert property.getName() != null; + assert property.getValue() != null; + map.put(property.getName(), property); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Property.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Property.java new file mode 100644 index 00000000000..6694153d3b7 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Property.java @@ -0,0 +1,75 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.data; + +import java.io.Serializable; + +/** + * + * @author Thomas Wuerthinger + */ +public class Property implements Serializable { + + public static final long serialVersionUID = 1L; + private String name; + private String value; + + public Property() { + this(null, null); + } + + public Property(Property p) { + this(p.getName(), p.getValue()); + } + + public Property(String name) { + this(name, null); + } + + public Property(String name, String value) { + this.name = name; + this.value = value; + } + + public String getName() { + return name; + } + + public String getValue() { + return value; + } + + public void setName(String s) { + this.name = s; + } + + public void setValue(String s) { + this.value = s; + } + + @Override + public String toString() { + return name + " = " + value + "; "; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/Parser.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/Parser.java new file mode 100644 index 00000000000..410ee7c41a8 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/Parser.java @@ -0,0 +1,422 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.data.serialization; + +import com.sun.hotspot.igv.data.GraphDocument; +import com.sun.hotspot.igv.data.Group; +import com.sun.hotspot.igv.data.InputBlock; +import com.sun.hotspot.igv.data.InputEdge; +import com.sun.hotspot.igv.data.InputGraph; +import com.sun.hotspot.igv.data.InputMethod; +import com.sun.hotspot.igv.data.InputNode; +import com.sun.hotspot.igv.data.Properties; +import com.sun.hotspot.igv.data.Property; +import com.sun.hotspot.igv.data.services.GroupCallback; +import com.sun.hotspot.igv.data.serialization.XMLParser.ElementHandler; +import com.sun.hotspot.igv.data.serialization.XMLParser.HandoverElementHandler; +import com.sun.hotspot.igv.data.serialization.XMLParser.ParseMonitor; +import com.sun.hotspot.igv.data.serialization.XMLParser.TopElementHandler; +import java.io.IOException; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; + +/** + * + * @author Thomas Wuerthinger + */ +public class Parser { + + public static final String INDENT = " "; + public static final String TOP_ELEMENT = "graphDocument"; + public static final String GROUP_ELEMENT = "group"; + public static final String GRAPH_ELEMENT = "graph"; + public static final String ROOT_ELEMENT = "graphDocument"; + public static final String PROPERTIES_ELEMENT = "properties"; + public static final String EDGES_ELEMENT = "edges"; + public static final String PROPERTY_ELEMENT = "p"; + public static final String EDGE_ELEMENT = "edge"; + public static final String NODE_ELEMENT = "node"; + public static final String NODES_ELEMENT = "nodes"; + public static final String REMOVE_EDGE_ELEMENT = "removeEdge"; + public static final String REMOVE_NODE_ELEMENT = "removeNode"; + public static final String METHOD_NAME_PROPERTY = "name"; + public static final String METHOD_IS_PUBLIC_PROPERTY = "public"; + public static final String METHOD_IS_STATIC_PROPERTY = "static"; + public static final String TRUE_VALUE = "true"; + public static final String NODE_NAME_PROPERTY = "name"; + public static final String EDGE_NAME_PROPERTY = "name"; + public static final String NODE_ID_PROPERTY = "id"; + public static final String FROM_PROPERTY = "from"; + public static final String TO_PROPERTY = "to"; + public static final String PROPERTY_NAME_PROPERTY = "name"; + public static final String GRAPH_NAME_PROPERTY = "name"; + public static final String TO_INDEX_PROPERTY = "index"; + public static final String METHOD_ELEMENT = "method"; + public static final String INLINE_ELEMENT = "inline"; + public static final String BYTECODES_ELEMENT = "bytecodes"; + public static final String METHOD_BCI_PROPERTY = "bci"; + public static final String METHOD_SHORT_NAME_PROPERTY = "shortName"; + public static final String CONTROL_FLOW_ELEMENT = "controlFlow"; + public static final String BLOCK_NAME_PROPERTY = "name"; + public static final String BLOCK_ELEMENT = "block"; + public static final String SUCCESSORS_ELEMENT = "successors"; + public static final String SUCCESSOR_ELEMENT = "successor"; + public static final String ASSEMBLY_ELEMENT = "assembly"; + public static final String DIFFERENCE_PROPERTY = "difference"; + private TopElementHandler xmlDocument = new TopElementHandler(); + private boolean difference; + private GroupCallback groupCallback; + // + private ElementHandler topHandler = new ElementHandler(TOP_ELEMENT) { + + @Override + protected GraphDocument start() throws SAXException { + return new GraphDocument(); + } + }; + // + private ElementHandler groupHandler = new XMLParser.ElementHandler(GROUP_ELEMENT) { + + @Override + protected Group start() throws SAXException { + Group group = new Group(); + Parser.this.difference = false; + String differenceProperty = this.readAttribute(DIFFERENCE_PROPERTY); + if (differenceProperty != null && (differenceProperty.equals("1") || differenceProperty.equals("true"))) { + Parser.this.difference = true; + } + + ParseMonitor monitor = getMonitor(); + if (monitor != null) { + monitor.setState(group.getName()); + } + + return group; + } + + @Override + protected void end(String text) throws SAXException { + if (groupCallback == null) { + getParentObject().addGroup(getObject()); + } + } + }; + private HandoverElementHandler assemblyHandler = new XMLParser.HandoverElementHandler(ASSEMBLY_ELEMENT, true) { + + @Override + protected void end(String text) throws SAXException { + getParentObject().setAssembly(text); + } + }; + // + private ElementHandler methodHandler = new XMLParser.ElementHandler(METHOD_ELEMENT) { + + @Override + protected InputMethod start() throws SAXException { + + InputMethod method = parseMethod(this, getParentObject()); + getParentObject().setMethod(method); + return method; + } + }; + + private InputMethod parseMethod(XMLParser.ElementHandler handler, Group group) throws SAXException { + String s = handler.readRequiredAttribute(METHOD_BCI_PROPERTY); + int bci = 0; + try { + bci = Integer.parseInt(s); + } catch (NumberFormatException e) { + throw new SAXException(e); + } + InputMethod method = new InputMethod(group, handler.readRequiredAttribute(METHOD_NAME_PROPERTY), handler.readRequiredAttribute(METHOD_SHORT_NAME_PROPERTY), bci); + return method; + } + // + private HandoverElementHandler bytecodesHandler = new XMLParser.HandoverElementHandler(BYTECODES_ELEMENT, true) { + + @Override + protected void end(String text) throws SAXException { + getParentObject().setBytecodes(text); + } + }; + // + private HandoverElementHandler inlinedHandler = new XMLParser.HandoverElementHandler(INLINE_ELEMENT); + // + private ElementHandler inlinedMethodHandler = new XMLParser.ElementHandler(METHOD_ELEMENT) { + + @Override + protected InputMethod start() throws SAXException { + InputMethod method = parseMethod(this, getParentObject().getGroup()); + getParentObject().addInlined(method); + return method; + } + }; + // + private ElementHandler graphHandler = new XMLParser.ElementHandler(GRAPH_ELEMENT) { + + private InputGraph graph; + + @Override + protected InputGraph start() throws SAXException { + + String name = readAttribute(GRAPH_NAME_PROPERTY); + InputGraph previous = getParentObject().getLastAdded(); + if (!difference) { + previous = null; + } + InputGraph curGraph = new InputGraph(getParentObject(), previous, name); + getParentObject().addGraph(curGraph); + this.graph = curGraph; + return curGraph; + } + + @Override + protected void end(String text) throws SAXException { + graph.resolveBlockLinks(); + } + }; + // + private HandoverElementHandler nodesHandler = new HandoverElementHandler(NODES_ELEMENT); + // + private HandoverElementHandler controlFlowHandler = new HandoverElementHandler(CONTROL_FLOW_ELEMENT); + // + private ElementHandler blockHandler = new ElementHandler(BLOCK_ELEMENT) { + + @Override + protected InputBlock start() throws SAXException { + InputGraph graph = getParentObject(); + String name = readRequiredAttribute(BLOCK_NAME_PROPERTY); + InputBlock b = new InputBlock(getParentObject(), name); + graph.addBlock(b); + return b; + } + }; + // + private HandoverElementHandler blockNodesHandler = new HandoverElementHandler(NODES_ELEMENT); + // + private ElementHandler blockNodeHandler = new ElementHandler(NODE_ELEMENT) { + + @Override + protected InputBlock start() throws SAXException { + String s = readRequiredAttribute(NODE_ID_PROPERTY); + + int id = 0; + try { + id = Integer.parseInt(s); + } catch (NumberFormatException e) { + throw new SAXException(e); + } + getParentObject().addNode(id); + return getParentObject(); + } + }; + // + private HandoverElementHandler successorsHandler = new HandoverElementHandler(SUCCESSORS_ELEMENT); + // + private ElementHandler successorHandler = new ElementHandler(SUCCESSOR_ELEMENT) { + + @Override + protected InputBlock start() throws SAXException { + String name = readRequiredAttribute(BLOCK_NAME_PROPERTY); + getParentObject().addSuccessor(name); + return getParentObject(); + } + }; + // + private ElementHandler nodeHandler = new ElementHandler(NODE_ELEMENT) { + + @Override + protected InputNode start() throws SAXException { + String s = readRequiredAttribute(NODE_ID_PROPERTY); + int id = 0; + try { + id = Integer.parseInt(s); + } catch (NumberFormatException e) { + throw new SAXException(e); + } + InputNode node = new InputNode(id); + getParentObject().addNode(node); + return node; + } + }; + // + private ElementHandler removeNodeHandler = new ElementHandler(REMOVE_NODE_ELEMENT) { + + @Override + protected InputNode start() throws SAXException { + String s = readRequiredAttribute(NODE_ID_PROPERTY); + int id = 0; + try { + id = Integer.parseInt(s); + } catch (NumberFormatException e) { + throw new SAXException(e); + } + return getParentObject().removeNode(id); + } + }; + // + private HandoverElementHandler edgesHandler = new HandoverElementHandler(EDGES_ELEMENT); + + // Local class for edge elements + private static class EdgeElementHandler extends ElementHandler { + + public EdgeElementHandler(String name) { + super(name); + } + + @Override + protected InputEdge start() throws SAXException { + int toIndex = 0; + int from = -1; + int to = -1; + + try { + String toIndexString = readAttribute(TO_INDEX_PROPERTY); + if (toIndexString != null) { + toIndex = Integer.parseInt(toIndexString); + } + + from = Integer.parseInt(readRequiredAttribute(FROM_PROPERTY)); + to = Integer.parseInt(readRequiredAttribute(TO_PROPERTY)); + } catch (NumberFormatException e) { + throw new SAXException(e); + } + + + InputEdge conn = new InputEdge((char) toIndex, from, to); + return start(conn); + } + + protected InputEdge start(InputEdge conn) throws SAXException { + return conn; + } + } + // + private EdgeElementHandler edgeHandler = new EdgeElementHandler(EDGE_ELEMENT) { + + @Override + protected InputEdge start(InputEdge conn) throws SAXException { + getParentObject().addEdge(conn); + return conn; + } + }; + // + private EdgeElementHandler removeEdgeHandler = new EdgeElementHandler(REMOVE_EDGE_ELEMENT) { + + @Override + protected InputEdge start(InputEdge conn) throws SAXException { + getParentObject().removeEdge(conn); + return conn; + } + }; + // + private HandoverElementHandler propertiesHandler = new HandoverElementHandler(PROPERTIES_ELEMENT); + // + private HandoverElementHandler groupPropertiesHandler = new HandoverElementHandler(PROPERTIES_ELEMENT) { + + @Override + public void end(String text) throws SAXException { + if (groupCallback != null) { + groupCallback.started(getParentObject()); + } + } + }; + // + private ElementHandler propertyHandler = new XMLParser.ElementHandler(PROPERTY_ELEMENT, true) { + + @Override + public Property start() throws SAXException { + String value = ""; + String name = readRequiredAttribute(PROPERTY_NAME_PROPERTY).intern(); + return getParentObject().getProperties().setProperty(name, value); + } + + @Override + public void end(String text) { + getObject().setValue(text.trim().intern()); + } + }; + + public Parser() { + this(null); + } + + public Parser(GroupCallback groupCallback) { + + this.groupCallback = groupCallback; + + // Initialize dependencies + xmlDocument.addChild(topHandler); + topHandler.addChild(groupHandler); + + groupHandler.addChild(methodHandler); + groupHandler.addChild(assemblyHandler); + groupHandler.addChild(graphHandler); + + methodHandler.addChild(inlinedHandler); + methodHandler.addChild(bytecodesHandler); + + inlinedHandler.addChild(inlinedMethodHandler); + inlinedMethodHandler.addChild(bytecodesHandler); + inlinedMethodHandler.addChild(inlinedHandler); + + graphHandler.addChild(nodesHandler); + graphHandler.addChild(edgesHandler); + graphHandler.addChild(controlFlowHandler); + + controlFlowHandler.addChild(blockHandler); + + blockHandler.addChild(successorsHandler); + successorsHandler.addChild(successorHandler); + blockHandler.addChild(blockNodesHandler); + blockNodesHandler.addChild(blockNodeHandler); + + nodesHandler.addChild(nodeHandler); + nodesHandler.addChild(removeNodeHandler); + edgesHandler.addChild(edgeHandler); + edgesHandler.addChild(removeEdgeHandler); + + methodHandler.addChild(propertiesHandler); + inlinedMethodHandler.addChild(propertiesHandler); + topHandler.addChild(propertiesHandler); + groupHandler.addChild(groupPropertiesHandler); + graphHandler.addChild(propertiesHandler); + nodeHandler.addChild(propertiesHandler); + propertiesHandler.addChild(propertyHandler); + groupPropertiesHandler.addChild(propertyHandler); + } + + // Returns a new GraphDocument object deserialized from an XML input source. + public GraphDocument parse(XMLReader reader, InputSource source, XMLParser.ParseMonitor monitor) throws SAXException { + reader.setContentHandler(new XMLParser(xmlDocument, monitor)); + try { + reader.parse(source); + } catch (IOException ex) { + throw new SAXException(ex); + } + + return topHandler.getObject(); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/Printer.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/Printer.java new file mode 100644 index 00000000000..c5b794fce2f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/Printer.java @@ -0,0 +1,217 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.data.serialization; + +import com.sun.hotspot.igv.data.GraphDocument; +import com.sun.hotspot.igv.data.Group; +import com.sun.hotspot.igv.data.InputBlock; +import com.sun.hotspot.igv.data.InputBytecode; +import com.sun.hotspot.igv.data.InputEdge; +import com.sun.hotspot.igv.data.InputGraph; +import com.sun.hotspot.igv.data.InputMethod; +import com.sun.hotspot.igv.data.InputNode; +import com.sun.hotspot.igv.data.Properties; +import com.sun.hotspot.igv.data.Property; +import java.io.IOException; +import java.io.Writer; +import java.util.HashSet; +import java.util.Set; + +/** + * + * @author Thomas Wuerthinger + */ +public class Printer { + + public void export(Writer writer, GraphDocument document) { + + XMLWriter xmlWriter = new XMLWriter(writer); + + try { + export(xmlWriter, document); + } catch (IOException ex) { + } + } + + private void export(XMLWriter xmlWriter, GraphDocument document) throws IOException { + xmlWriter.startTag(Parser.ROOT_ELEMENT); + xmlWriter.writeProperties(document.getProperties()); + for (Group g : document.getGroups()) { + export(xmlWriter, g); + } + + xmlWriter.endTag(); + xmlWriter.flush(); + } + + private void export(XMLWriter writer, Group g) throws IOException { + Properties attributes = new Properties(); + attributes.add(new Property("difference", Boolean.toString(true))); + writer.startTag(Parser.GROUP_ELEMENT, attributes); + writer.writeProperties(g.getProperties()); + + if (g.getMethod() != null) { + export(writer, g.getMethod()); + } + + InputGraph previous = null; + for (InputGraph graph : g.getGraphs()) { + export(writer, graph, previous, true); + previous = graph; + } + + writer.endTag(); + } + + public void export(XMLWriter writer, InputGraph graph, InputGraph previous, boolean difference) throws IOException { + + writer.startTag(Parser.GRAPH_ELEMENT); + writer.writeProperties(graph.getProperties()); + writer.startTag(Parser.NODES_ELEMENT); + + Set removed = new HashSet(); + Set equal = new HashSet(); + + if (previous != null) { + for (InputNode n : previous.getNodes()) { + int id = n.getId(); + InputNode n2 = graph.getNode(id); + if (n2 == null) { + removed.add(n); + } else if (n.equals(n2)) { + equal.add(n); + } + } + } + + if (difference) { + for (InputNode n : removed) { + writer.simpleTag(Parser.REMOVE_NODE_ELEMENT, new Properties(Parser.NODE_ID_PROPERTY, Integer.toString(n.getId()))); + } + } + + for (InputNode n : graph.getNodes()) { + if (!difference || !equal.contains(n)) { + writer.startTag(Parser.NODE_ELEMENT, new Properties(Parser.NODE_ID_PROPERTY, Integer.toString(n.getId()))); + writer.writeProperties(n.getProperties()); + writer.endTag(); + } + } + + writer.endTag(); + + writer.startTag(Parser.EDGES_ELEMENT); + Set removedEdges = new HashSet(); + Set equalEdges = new HashSet(); + + if (previous != null) { + for (InputEdge e : previous.getEdges()) { + if (graph.getEdges().contains(e)) { + equalEdges.add(e); + } else { + removedEdges.add(e); + } + } + } + + if (difference) { + for (InputEdge e : removedEdges) { + writer.simpleTag(Parser.REMOVE_EDGE_ELEMENT, createProperties(e)); + } + } + + for (InputEdge e : graph.getEdges()) { + if (!difference || !equalEdges.contains(e)) { + if (!equalEdges.contains(e)) { + writer.simpleTag(Parser.EDGE_ELEMENT, createProperties(e)); + } + } + } + + writer.endTag(); + + writer.startTag(Parser.CONTROL_FLOW_ELEMENT); + for (InputBlock b : graph.getBlocks()) { + + writer.startTag(Parser.BLOCK_ELEMENT, new Properties(Parser.BLOCK_NAME_PROPERTY, b.getName())); + + writer.startTag(Parser.SUCCESSORS_ELEMENT); + for (InputBlock s : b.getSuccessors()) { + writer.simpleTag(Parser.SUCCESSOR_ELEMENT, new Properties(Parser.BLOCK_NAME_PROPERTY, s.getName())); + } + writer.endTag(); + + writer.startTag(Parser.NODES_ELEMENT); + for (InputNode n : b.getNodes()) { + writer.simpleTag(Parser.NODE_ELEMENT, new Properties(Parser.NODE_ID_PROPERTY, n.getId() + "")); + } + writer.endTag(); + + writer.endTag(); + + } + + writer.endTag(); + writer.endTag(); + } + + private void export(XMLWriter w, InputMethod method) throws IOException { + + w.startTag(Parser.METHOD_ELEMENT, new Properties(Parser.METHOD_BCI_PROPERTY, method.getBci() + "", Parser.METHOD_NAME_PROPERTY, method.getName(), Parser.METHOD_SHORT_NAME_PROPERTY, method.getShortName())); + + w.writeProperties(method.getProperties()); + + if (method.getInlined().size() > 0) { + w.startTag(Parser.INLINE_ELEMENT); + for (InputMethod m : method.getInlined()) { + export(w, m); + } + w.endTag(); + } + + w.startTag(Parser.BYTECODES_ELEMENT); + + StringBuilder b = new StringBuilder(); + b.append(""); + w.write(b.toString()); + w.endTag(); + w.endTag(); + } + + private Properties createProperties(InputEdge edge) { + Properties p = new Properties(); + p.setProperty(Parser.TO_INDEX_PROPERTY, Integer.toString(edge.getToIndex())); + p.setProperty(Parser.TO_PROPERTY, Integer.toString(edge.getTo())); + p.setProperty(Parser.FROM_PROPERTY, Integer.toString(edge.getFrom())); + return p; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/XMLParser.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/XMLParser.java new file mode 100644 index 00000000000..1efcd06dec9 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/XMLParser.java @@ -0,0 +1,254 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.data.serialization; + +import com.sun.hotspot.igv.data.Property; +import com.sun.hotspot.igv.data.Properties; +import java.util.Hashtable; +import java.util.Stack; +import org.xml.sax.Attributes; +import org.xml.sax.ContentHandler; +import org.xml.sax.Locator; +import org.xml.sax.SAXException; + +/** + * + * @author Thomas Wuerthinger + */ +public class XMLParser implements ContentHandler { + + public static interface ParseMonitor { + + public void setProgress(double d); + + public void setState(String state); + } + + public static class MissingAttributeException extends SAXException { + + private String name; + + public MissingAttributeException(String name) { + super("Missing attribute \"" + name + "\""); + this.name = name; + } + + public String getAttributeName() { + return this.getMessage(); + } + } + + public static class HandoverElementHandler

    extends ElementHandler { + + @Override + protected P start() throws SAXException { + return getParentObject(); + } + + public HandoverElementHandler(String name) { + super(name); + } + + public HandoverElementHandler(String name, boolean needsText) { + super(name, needsText); + } + } + + public static class TopElementHandler

    extends ElementHandler { + + public TopElementHandler() { + super(null); + } + } + + public static class ElementHandler { + + private String name; + private T object; + private Attributes attr; + private StringBuilder currentText; + private ParseMonitor monitor; + private Hashtable> hashtable; + private boolean needsText; + private ElementHandler parentElement; + + public ElementHandler(String name) { + this(name, false); + } + + public ElementHandler getParentElement() { + return parentElement; + } + + public P getParentObject() { + return getParentElement().getObject(); + } + + protected boolean needsText() { + return needsText; + } + + public ElementHandler(String name, boolean needsText) { + this.hashtable = new Hashtable>(); + this.name = name; + this.needsText = needsText; + } + + public ParseMonitor getMonitor() { + return monitor; + } + + public ElementHandler getChild(String name) { + return hashtable.get(name); + } + + public void addChild(ElementHandler handler) { + assert handler != null; + hashtable.put(handler.getName(), handler); + } + + public String getName() { + return name; + } + + public T getObject() { + return object; + } + + public String readAttribute(String name) { + return attr.getValue(name); + } + + public String readRequiredAttribute(String name) throws SAXException { + String s = readAttribute(name); + if (s == null) { + throw new MissingAttributeException(name); + } + return s; + } + + public void processAttributesAsProperties(Properties p) { + int length = attr.getLength(); + for (int i = 0; i < length; i++) { + String val = attr.getValue(i).intern(); + String localName = attr.getLocalName(i).intern(); + p.add(new Property(val, localName)); + } + } + + public void startElement(ElementHandler parentElement, Attributes attr, ParseMonitor monitor) throws SAXException { + this.currentText = new StringBuilder(); + this.attr = attr; + this.monitor = monitor; + this.parentElement = parentElement; + object = start(); + } + + protected T start() throws SAXException { + return null; + } + + protected void end(String text) throws SAXException { + + } + + public void endElement() throws SAXException { + end(currentText.toString()); + } + + protected void text(char[] c, int start, int length) { + assert currentText != null; + currentText.append(c, start, length); + } + } + private Stack stack; + private ParseMonitor monitor; + + public XMLParser(TopElementHandler rootHandler, ParseMonitor monitor) { + this.stack = new Stack(); + this.monitor = monitor; + this.stack.push(rootHandler); + } + + public void setDocumentLocator(Locator locator) { + if (monitor != null) { + monitor.setState("Starting parsing"); + } + } + + public void startDocument() throws SAXException { + } + + public void endDocument() throws SAXException { + } + + public void startPrefixMapping(String prefix, String uri) throws SAXException { + } + + public void endPrefixMapping(String prefix) throws SAXException { + } + + public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { + + assert !stack.isEmpty(); + ElementHandler parent = stack.peek(); + if (parent != null) { + ElementHandler child = parent.getChild(qName); + if (child != null) { + child.startElement(parent, atts, monitor); + stack.push(child); + return; + } + } + + stack.push(null); + } + + public void endElement(String uri, String localName, String qName) throws SAXException { + ElementHandler handler = stack.pop(); + if (handler != null) { + handler.endElement(); + } + } + + public void characters(char[] ch, int start, int length) throws SAXException { + + assert !stack.isEmpty(); + + + ElementHandler top = stack.peek(); + if (top != null && top.needsText()) { + top.text(ch, start, length); + } + } + + public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { + } + + public void processingInstruction(String target, String data) throws SAXException { + } + + public void skippedEntity(String name) throws SAXException { + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/XMLWriter.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/XMLWriter.java new file mode 100644 index 00000000000..e112dbf4f07 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/XMLWriter.java @@ -0,0 +1,128 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.data.serialization; + +import com.sun.hotspot.igv.data.Properties; +import com.sun.hotspot.igv.data.Property; +import java.io.IOException; +import java.io.Writer; +import java.util.Stack; + +/** + * + * @author Thomas Wuerthinger + */ +public class XMLWriter extends Writer { + + private Writer inner; + private Stack elementStack; + + public XMLWriter(Writer inner) { + this.inner = inner; + elementStack = new Stack(); + } + + @Override + public void write(char[] arr) throws IOException { + write(arr, 0, arr.length); + } + + public void write(char[] cbuf, int off, int len) throws IOException { + for (int i = off; i < off + len; i++) { + char c = cbuf[i]; + if (c == '>') { + inner.write(">"); + } else if (c == '<') { + inner.write("<"); + } else if (c == '&') { + inner.write("&"); + } else { + inner.write(c); + } + } + } + + public void flush() throws IOException { + inner.flush(); + } + + public void close() throws IOException { + inner.close(); + } + + public void endTag() throws IOException { + inner.write("\n"); + } + + public void startTag(String name) throws IOException { + inner.write("<" + name + ">\n"); + elementStack.push(name); + } + + public void simpleTag(String name) throws IOException { + inner.write("<" + name + "/>\n"); + } + + public void startTag(String name, Properties attributes) throws IOException { + inner.write("<" + name); + elementStack.push(name); + + for (Property p : attributes.getProperties()) { + inner.write(" " + p.getName() + "=\""); + write(p.getValue().toCharArray()); + inner.write("\""); + } + + inner.write(">\n"); + } + + public void simpleTag(String name, Properties attributes) throws IOException { + inner.write("<" + name); + + for (Property p : attributes.getProperties()) { + inner.write(" " + p.getName() + "=\""); + write(p.getValue().toCharArray()); + inner.write("\""); + } + + inner.write("/>\n"); + } + + public void writeProperties(Properties props) throws IOException { + if (props.getProperties().size() == 0) { + return; + } + + startTag(Parser.PROPERTIES_ELEMENT); + + for (Property p : props.getProperties()) { + startTag(Parser.PROPERTY_ELEMENT, new Properties(Parser.PROPERTY_NAME_PROPERTY, p.getName())); + this.write(p.getValue().toCharArray()); + endTag(); + } + + endTag(); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GraphViewer.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GraphViewer.java new file mode 100644 index 00000000000..153221d55e5 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GraphViewer.java @@ -0,0 +1,35 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.data.services; + +import com.sun.hotspot.igv.data.InputGraph; + +/** + * + * @author Thomas Wuerthinger + */ +public interface GraphViewer { + + public void view(InputGraph graph); +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupCallback.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupCallback.java new file mode 100644 index 00000000000..8b0115e84b1 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupCallback.java @@ -0,0 +1,36 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.data.services; + +import com.sun.hotspot.igv.data.Group; + +/** + * + * @author Thomas Wuerthinger + */ +public interface GroupCallback { + + public void started(Group g); +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupOrganizer.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupOrganizer.java new file mode 100644 index 00000000000..90d61ebc10d --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupOrganizer.java @@ -0,0 +1,39 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.data.services; + +import com.sun.hotspot.igv.data.Group; +import com.sun.hotspot.igv.data.Pair; +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public interface GroupOrganizer { + + public String getName(); + + public List>> organize(List subFolders, List groups); +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupReceiver.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupReceiver.java new file mode 100644 index 00000000000..8b730c3e291 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupReceiver.java @@ -0,0 +1,35 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.data.services; + +import java.awt.Component; + +/** + * + * @author Thomas Wuerthinger + */ +public interface GroupReceiver { + + public Component init(GroupCallback callback); +} diff --git a/jdk/make/tools/winver/src/winver.cpp b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/InputGraphProvider.java similarity index 65% rename from jdk/make/tools/winver/src/winver.cpp rename to hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/InputGraphProvider.java index 6497b9e2ee6..0006ec55a13 100644 --- a/jdk/make/tools/winver/src/winver.cpp +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/InputGraphProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2001 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,28 +22,19 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ +package com.sun.hotspot.igv.data.services; -// getver.cpp : Defines the entry point for the console application. -// +import com.sun.hotspot.igv.data.InputGraph; +import com.sun.hotspot.igv.data.InputNode; +import java.util.Set; -#include "stdafx.h" -#include +/** + * + * @author Thomas Wuerthinger + */ +public interface InputGraphProvider { -int main(int argc, char* argv[]) -{ - OSVERSIONINFO verInfo; + InputGraph getGraph(); - memset(&verInfo,0,sizeof(verInfo)); - verInfo.dwOSVersionInfoSize = sizeof(verInfo); - - if (GetVersionEx(&verInfo)) - { - printf("%d %d %s",verInfo.dwMajorVersion,verInfo.dwMinorVersion,verInfo.szCSDVersion); - } - else - { - printf("No version info available"); - } - - return 0; + void setSelectedNodes(Set nodes); } diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/Scheduler.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/Scheduler.java new file mode 100644 index 00000000000..18207df4c1f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/Scheduler.java @@ -0,0 +1,38 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.data.services; + +import com.sun.hotspot.igv.data.InputBlock; +import com.sun.hotspot.igv.data.InputGraph; +import java.util.Collection; + +/** + * + * @author Thomas Wuerthinger + */ +public interface Scheduler { + + public Collection schedule(InputGraph graph); +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Difference/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/build.xml new file mode 100644 index 00000000000..bc11fd91f85 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/build.xml @@ -0,0 +1,8 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.difference. + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Difference/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/manifest.mf new file mode 100644 index 00000000000..febe22452a0 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/manifest.mf @@ -0,0 +1,5 @@ +Manifest-Version: 1.0 +OpenIDE-Module: com.sun.hotspot.igv.difference +OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/difference/Bundle.properties +OpenIDE-Module-Specification-Version: 1.0 + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/build-impl.xml new file mode 100644 index 00000000000..1c1b96a9dea --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/build-impl.xml @@ -0,0 +1,30 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/genfiles.properties new file mode 100644 index 00000000000..1c01a0733d1 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=1657ecfe +build.xml.script.CRC32=03909051 +build.xml.stylesheet.CRC32=79c3b980 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=1657ecfe +nbproject/build-impl.xml.script.CRC32=2208e770 +nbproject/build-impl.xml.stylesheet.CRC32=deb65f65 diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/platform.properties new file mode 100644 index 00000000000..68ad75e5766 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/platform.properties @@ -0,0 +1,29 @@ +# Deprecated since 5.0u1; for compatibility with 5.0: +disabled.clusters=\ + apisupport1,\ + harness,\ + ide8,\ + java1,\ + nb6.0,\ + profiler2 +disabled.modules=\ + org.netbeans.core.execution,\ + org.netbeans.core.multiview,\ + org.netbeans.core.output2,\ + org.netbeans.modules.applemenu,\ + org.netbeans.modules.autoupdate.services,\ + org.netbeans.modules.autoupdate.ui,\ + org.netbeans.modules.core.kit,\ + org.netbeans.modules.favorites,\ + org.netbeans.modules.javahelp,\ + org.netbeans.modules.masterfs,\ + org.netbeans.modules.options.keymap,\ + org.netbeans.modules.sendopts,\ + org.netbeans.modules.templates,\ + org.openide.compat,\ + org.openide.execution,\ + org.openide.util.enumerations +enabled.clusters=\ + platform7 +nbjdk.active=JDK_1.6 +nbplatform.active=default diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/project.properties new file mode 100644 index 00000000000..152f44eca60 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/project.properties @@ -0,0 +1,2 @@ +javac.source=1.5 +javac.compilerargs=-Xlint -Xlint:-serial diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/project.xml new file mode 100644 index 00000000000..1225db62971 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/project.xml @@ -0,0 +1,23 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.difference + + + + com.sun.hotspot.igv.data + + + + 1.0 + + + + + com.sun.hotspot.igv.difference + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/suite.properties new file mode 100644 index 00000000000..29d7cc9bd6f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/suite.properties @@ -0,0 +1 @@ +suite.dir=${basedir}/.. diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Difference/src/com/sun/hotspot/igv/difference/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/src/com/sun/hotspot/igv/difference/Bundle.properties new file mode 100644 index 00000000000..5c4d7e177fb --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/src/com/sun/hotspot/igv/difference/Bundle.properties @@ -0,0 +1 @@ +OpenIDE-Module-Name=Difference diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Difference/src/com/sun/hotspot/igv/difference/Difference.java b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/src/com/sun/hotspot/igv/difference/Difference.java new file mode 100644 index 00000000000..335344eb77b --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/src/com/sun/hotspot/igv/difference/Difference.java @@ -0,0 +1,320 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.difference; + +import com.sun.hotspot.igv.data.Group; +import com.sun.hotspot.igv.data.InputEdge; +import com.sun.hotspot.igv.data.InputGraph; +import com.sun.hotspot.igv.data.InputNode; +import com.sun.hotspot.igv.data.Property; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * + * @author Thomas Wuerthinger + */ +public class Difference { + + public static final String PROPERTY_STATE = "state"; + public static final String VALUE_NEW = "new"; + public static final String VALUE_CHANGED = "changed"; + public static final String VALUE_SAME = "same"; + public static final String VALUE_DELETED = "deleted"; + public static final String OLD_PREFIX = "OLD_"; + public static final String MAIN_PROPERTY = "name"; + public static final double LIMIT = 100.0; + public static final String[] IGNORE_PROPERTIES = new String[]{"idx", "debug_idx"}; + + public static InputGraph createDiffGraph(InputGraph a, InputGraph b) { + if (a.getGroup() == b.getGroup()) { + return createDiffSameGroup(a, b); + } else { + return createDiff(a, b); + } + } + + private static InputGraph createDiffSameGroup(InputGraph a, InputGraph b) { + Map keyMapB = new HashMap(); + for (InputNode n : b.getNodes()) { + Integer key = n.getId(); + assert !keyMapB.containsKey(key); + keyMapB.put(key, n); + } + + Set pairs = new HashSet(); + + for (InputNode n : a.getNodes()) { + Integer key = n.getId(); + + + if (keyMapB.containsKey(key)) { + InputNode nB = keyMapB.get(key); + pairs.add(new Pair(n, nB)); + } + } + + return createDiff(a, b, pairs); + } + + private static InputGraph createDiff(InputGraph a, InputGraph b, Set pairs) { + Group g = new Group(); + g.setMethod(a.getGroup().getMethod()); + g.setAssembly(a.getGroup().getAssembly()); + g.getProperties().setProperty("name", "Difference"); + InputGraph graph = new InputGraph(g, null); + graph.setName(a.getName() + ", " + b.getName()); + graph.setIsDifferenceGraph(true); + + Set nodesA = new HashSet(a.getNodes()); + Set nodesB = new HashSet(b.getNodes()); + + Map inputNodeMap = new HashMap(); + for (Pair p : pairs) { + InputNode n = p.getN1(); + assert nodesA.contains(n); + InputNode nB = p.getN2(); + assert nodesB.contains(nB); + + nodesA.remove(n); + nodesB.remove(nB); + InputNode n2 = new InputNode(n); + inputNodeMap.put(n, n2); + inputNodeMap.put(nB, n2); + graph.addNode(n2); + markAsChanged(n2, n, nB); + } + + for (InputNode n : nodesA) { + InputNode n2 = new InputNode(n); + graph.addNode(n2); + markAsNew(n2); + inputNodeMap.put(n, n2); + } + + for (InputNode n : nodesB) { + InputNode n2 = new InputNode(n); + n2.setId(-n2.getId()); + graph.addNode(n2); + markAsDeleted(n2); + inputNodeMap.put(n, n2); + } + + Set edgesA = a.getEdges(); + Set edgesB = b.getEdges(); + + Set newEdges = new HashSet(); + + for (InputEdge e : edgesA) { + int from = e.getFrom(); + int to = e.getTo(); + InputNode nodeFrom = inputNodeMap.get(a.getNode(from)); + InputNode nodeTo = inputNodeMap.get(a.getNode(to)); + char index = e.getToIndex(); + + InputEdge newEdge = new InputEdge(index, nodeFrom.getId(), nodeTo.getId()); + if (!newEdges.contains(newEdge)) { + markAsNew(newEdge); + newEdges.add(newEdge); + graph.addEdge(newEdge); + } + } + + for (InputEdge e : edgesB) { + int from = e.getFrom(); + int to = e.getTo(); + InputNode nodeFrom = inputNodeMap.get(b.getNode(from)); + InputNode nodeTo = inputNodeMap.get(b.getNode(to)); + char index = e.getToIndex(); + + InputEdge newEdge = new InputEdge(index, nodeFrom.getId(), nodeTo.getId()); + if (!newEdges.contains(newEdge)) { + markAsDeleted(newEdge); + newEdges.add(newEdge); + graph.addEdge(newEdge); + } else { + newEdges.remove(newEdge); + graph.removeEdge(newEdge); + markAsSame(newEdge); + newEdges.add(newEdge); + graph.addEdge(newEdge); + } + } + + g.addGraph(graph); + return graph; + } + + private static class Pair { + + private InputNode n1; + private InputNode n2; + + public Pair(InputNode n1, InputNode n2) { + this.n1 = n1; + this.n2 = n2; + } + + public double getValue() { + + double result = 0.0; + for (Property p : n1.getProperties().getProperties()) { + double faktor = 1.0; + for (String forbidden : IGNORE_PROPERTIES) { + if (p.getName().equals(forbidden)) { + faktor = 0.1; + break; + } + } + String p2 = n2.getProperties().get(p.getName()); + result += evaluate(p.getValue(), p2) * faktor; + } + + return result; + } + + private double evaluate(String p, String p2) { + if (p2 == null) { + return 1.0; + } + if (p.equals(p2)) { + return 0.0; + } else { + return (double) (Math.abs(p.length() - p2.length())) / p.length() + 0.5; + } + } + + public InputNode getN1() { + return n1; + } + + public InputNode getN2() { + return n2; + } + } + + private static InputGraph createDiff(InputGraph a, InputGraph b) { + + Set matched = new HashSet(); + + Set pairs = new HashSet(); + for (InputNode n : a.getNodes()) { + String s = n.getProperties().get(MAIN_PROPERTY); + if (s == null) { + s = ""; + } + for (InputNode n2 : b.getNodes()) { + String s2 = n2.getProperties().get(MAIN_PROPERTY); + if (s2 == null) { + s2 = ""; + } + + if (s.equals(s2)) { + Pair p = new Pair(n, n2); + pairs.add(p); + } + } + } + + Set selectedPairs = new HashSet(); + while (pairs.size() > 0) { + + double min = Double.MAX_VALUE; + Pair minPair = null; + for (Pair p : pairs) { + double cur = p.getValue(); + if (cur < min) { + minPair = p; + min = cur; + } + } + + if (min > LIMIT) { + break; + } else { + selectedPairs.add(minPair); + + Set toRemove = new HashSet(); + for (Pair p : pairs) { + if (p.getN1() == minPair.getN1() || p.getN2() == minPair.getN2()) { + toRemove.add(p); + } + } + pairs.removeAll(toRemove); + } + } + + return createDiff(a, b, selectedPairs); + } + + private static void markAsNew(InputEdge e) { + e.setState(InputEdge.State.NEW); + } + + private static void markAsDeleted(InputEdge e) { + e.setState(InputEdge.State.DELETED); + + } + + private static void markAsSame(InputEdge e) { + e.setState(InputEdge.State.SAME); + } + + private static void markAsChanged(InputNode n, InputNode firstNode, InputNode otherNode) { + + boolean difference = false; + for (Property p : otherNode.getProperties().getProperties()) { + String s = firstNode.getProperties().getProperty(p.getName()); + if (!p.getValue().equals(s)) { + difference = true; + n.getProperties().add(new Property(OLD_PREFIX + p.getName(), p.getValue())); + } + } + + for (Property p : firstNode.getProperties().getProperties()) { + String s = otherNode.getProperties().getProperty(p.getName()); + if (s == null && p.getValue().length() > 0) { + difference = true; + n.getProperties().add(new Property(OLD_PREFIX + p.getName(), "")); + } + } + + if (difference) { + n.getProperties().add(new Property(PROPERTY_STATE, VALUE_CHANGED)); + } else { + n.getProperties().add(new Property(PROPERTY_STATE, VALUE_SAME)); + } + } + + private static void markAsDeleted(InputNode n) { + n.getProperties().add(new Property(PROPERTY_STATE, VALUE_DELETED)); + } + + private static void markAsNew(InputNode n) { + n.getProperties().add(new Property(PROPERTY_STATE, VALUE_NEW)); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/build.xml new file mode 100644 index 00000000000..2182f70466c --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/build.xml @@ -0,0 +1,8 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.filter. + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/manifest.mf new file mode 100644 index 00000000000..185ff360536 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/manifest.mf @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +OpenIDE-Module: com.sun.hotspot.igv.filter +OpenIDE-Module-Layer: com/sun/hotspot/igv/filter/layer.xml +OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/filter/Bundle.properties +OpenIDE-Module-Specification-Version: 1.0 + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/build-impl.xml new file mode 100644 index 00000000000..363a56cc9d9 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/build-impl.xml @@ -0,0 +1,30 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/genfiles.properties new file mode 100644 index 00000000000..0b45838e076 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=7c032ebf +build.xml.script.CRC32=3b022a25 +build.xml.stylesheet.CRC32=79c3b980 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=7c032ebf +nbproject/build-impl.xml.script.CRC32=26513f91 +nbproject/build-impl.xml.stylesheet.CRC32=deb65f65 diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/platform.properties new file mode 100644 index 00000000000..68ad75e5766 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/platform.properties @@ -0,0 +1,29 @@ +# Deprecated since 5.0u1; for compatibility with 5.0: +disabled.clusters=\ + apisupport1,\ + harness,\ + ide8,\ + java1,\ + nb6.0,\ + profiler2 +disabled.modules=\ + org.netbeans.core.execution,\ + org.netbeans.core.multiview,\ + org.netbeans.core.output2,\ + org.netbeans.modules.applemenu,\ + org.netbeans.modules.autoupdate.services,\ + org.netbeans.modules.autoupdate.ui,\ + org.netbeans.modules.core.kit,\ + org.netbeans.modules.favorites,\ + org.netbeans.modules.javahelp,\ + org.netbeans.modules.masterfs,\ + org.netbeans.modules.options.keymap,\ + org.netbeans.modules.sendopts,\ + org.netbeans.modules.templates,\ + org.openide.compat,\ + org.openide.execution,\ + org.openide.util.enumerations +enabled.clusters=\ + platform7 +nbjdk.active=JDK_1.6 +nbplatform.active=default diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/project.properties new file mode 100644 index 00000000000..152f44eca60 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/project.properties @@ -0,0 +1,2 @@ +javac.source=1.5 +javac.compilerargs=-Xlint -Xlint:-serial diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/project.xml new file mode 100644 index 00000000000..31414d5503e --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/project.xml @@ -0,0 +1,80 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.filter + + + + com.sun.hotspot.igv.data + + + + 1.0 + + + + com.sun.hotspot.igv.graph + + + + 1.0 + + + + org.jdesktop.layout + + + + 1 + 1.4.1 + + + + org.openide.dialogs + + + + 7.5.1 + + + + org.openide.filesystems + + + + 7.3 + + + + org.openide.nodes + + + + 7.2.0.1 + + + + org.openide.util + + + + 7.9.0.1 + + + + org.openide.windows + + + + 6.16 + + + + + com.sun.hotspot.igv.filter + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/suite.properties new file mode 100644 index 00000000000..29d7cc9bd6f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/suite.properties @@ -0,0 +1 @@ +suite.dir=${basedir}/.. diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/META-INF/services/com.sun.hotspot.igv.filter.ScriptEngineAbstraction b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/META-INF/services/com.sun.hotspot.igv.filter.ScriptEngineAbstraction new file mode 100644 index 00000000000..4ebfb455217 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/META-INF/services/com.sun.hotspot.igv.filter.ScriptEngineAbstraction @@ -0,0 +1 @@ +com.sun.hotspot.igv.filter.JavaSE6ScriptEngine \ No newline at end of file diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/AbstractFilter.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/AbstractFilter.java new file mode 100644 index 00000000000..d015e641895 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/AbstractFilter.java @@ -0,0 +1,60 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.filter; + +import com.sun.hotspot.igv.data.ChangedEvent; +import com.sun.hotspot.igv.data.Properties; +import org.openide.cookies.OpenCookie; + +/** + * + * @author Thomas Wuerthinger + */ +public abstract class AbstractFilter implements Filter { + + private ChangedEvent changedEvent; + private Properties properties; + + public AbstractFilter() { + changedEvent = new ChangedEvent(this); + properties = new Properties(); + } + + public Properties getProperties() { + return properties; + } + + public OpenCookie getEditor() { + return null; + } + + public ChangedEvent getChangedEvent() { + return changedEvent; + } + + protected void fireChangedEvent() { + changedEvent.fire(); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/Bundle.properties new file mode 100644 index 00000000000..cd43cb80c2a --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/Bundle.properties @@ -0,0 +1,11 @@ +OpenIDE-Module-Name=Filter + +jLabel1.text=Name\: +jLabel2.text=Source\: + +nameTextField.text= + +jButton1.text=OK +jButton2.text=Cancel + +title=Edit Filter Dialog diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ColorFilter.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ColorFilter.java new file mode 100644 index 00000000000..f0dd2ca95cb --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ColorFilter.java @@ -0,0 +1,138 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.filter; + +import com.sun.hotspot.igv.graph.Connection; +import com.sun.hotspot.igv.graph.Connection.ConnectionStyle; +import com.sun.hotspot.igv.graph.Diagram; +import com.sun.hotspot.igv.graph.Figure; +import com.sun.hotspot.igv.graph.OutputSlot; +import com.sun.hotspot.igv.graph.Selector; +import com.sun.hotspot.igv.data.Properties; +import java.awt.Color; +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public class ColorFilter extends AbstractFilter { + + private List colorRules; + private String name; + + public ColorFilter(String name) { + this.name = name; + colorRules = new ArrayList(); + } + + public String getName() { + return name; + } + + public void apply(Diagram diagram) { + + Properties.PropertySelector

    selector = new Properties.PropertySelector
    (diagram.getFigures()); + for (ColorRule rule : colorRules) { + if (rule.getSelector() != null) { + List
    figures = rule.getSelector().selected(diagram); + for (Figure f : figures) { + applyRule(rule, f); + if (rule.getColor() != null) { + f.setColor(rule.getColor()); + } + } + } else { + for (Figure f : diagram.getFigures()) { + applyRule(rule, f); + } + } + } + } + + private void applyRule(ColorRule rule, Figure f) { + if (rule.getColor() != null) { + f.setColor(rule.getColor()); + } + Color color = rule.getLineColor(); + ConnectionStyle style = rule.getLineStyle(); + + for (OutputSlot s : f.getOutputSlots()) { + for (Connection c : s.getConnections()) { + if (color != null) { + c.setColor(color); + } + + if (style != null) { + c.setStyle(style); + } + } + } + } + + public void addRule(ColorRule r) { + colorRules.add(r); + } + + public static class ColorRule { + + private Color color; + private Color lineColor; + private Connection.ConnectionStyle lineStyle; + private Selector selector; + + public ColorRule(Selector selector, Color c) { + this(selector, c, null, null); + } + + public ColorRule(Selector selector, Color c, Color lineColor, Connection.ConnectionStyle lineStyle) { + this.selector = selector; + this.color = c; + this.lineColor = lineColor; + this.lineStyle = lineStyle; + + } + + public ColorRule(Color c) { + this(null, c); + } + + public Color getColor() { + return color; + } + + public Selector getSelector() { + return selector; + } + + public Color getLineColor() { + return lineColor; + } + + public Connection.ConnectionStyle getLineStyle() { + return lineStyle; + } + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/CombineFilter.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/CombineFilter.java new file mode 100644 index 00000000000..613ca154cf4 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/CombineFilter.java @@ -0,0 +1,194 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.filter; + +import com.sun.hotspot.igv.graph.Connection; +import com.sun.hotspot.igv.graph.Diagram; +import com.sun.hotspot.igv.graph.Figure; +import com.sun.hotspot.igv.graph.InputSlot; +import com.sun.hotspot.igv.graph.OutputSlot; +import com.sun.hotspot.igv.data.Properties; +import com.sun.hotspot.igv.data.Properties.PropertyMatcher; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * + * @author Thomas Wuerthinger + */ +public class CombineFilter extends AbstractFilter { + + private List rules; + private String name; + + public CombineFilter(String name) { + this.name = name; + rules = new ArrayList(); + } + + public String getName() { + return name; + } + + public void apply(Diagram diagram) { + + Properties.PropertySelector
    selector = new Properties.PropertySelector
    (diagram.getFigures()); + for (CombineRule r : rules) { + + List
    list = selector.selectMultiple(r.getFirstMatcher()); + Set
    figuresToRemove = new HashSet
    (); + for (Figure f : list) { + + List
    successors = new ArrayList
    (f.getSuccessors()); + if (r.isReversed()) { + if (successors.size() == 1) { + Figure succ = successors.get(0); + InputSlot slot = null; + + for (InputSlot s : succ.getInputSlots()) { + for (Connection c : s.getConnections()) { + if (c.getOutputSlot().getFigure() == f) { + slot = s; + } + } + } + + assert slot != null; + slot.setName(f.getProperties().get("dump_spec")); + if (f.getProperties().get("short_name") != null) { + slot.setShortName(f.getProperties().get("short_name")); + } else { + String s = f.getProperties().get("dump_spec"); + if (s != null && s.length() <= 5) { + slot.setShortName(s); + } + + } + + for (InputSlot s : f.getInputSlots()) { + for (Connection c : s.getConnections()) { + Connection newConn = diagram.createConnection(slot, c.getOutputSlot()); + newConn.setColor(c.getColor()); + newConn.setStyle(c.getStyle()); + } + } + + figuresToRemove.add(f); + } + } else { + + for (Figure succ : successors) { + if (succ.getPredecessors().size() == 1) { + if (succ.getProperties().selectSingle(r.getSecondMatcher()) != null && succ.getOutputSlots().size() == 1) { + + + OutputSlot oldSlot = null; + for (OutputSlot s : f.getOutputSlots()) { + for (Connection c : s.getConnections()) { + if (c.getInputSlot().getFigure() == succ) { + oldSlot = s; + } + } + } + + assert oldSlot != null; + + OutputSlot nextSlot = succ.getOutputSlots().get(0); + int pos = 0; + if (succ.getProperties().get("con") != null) { + pos = Integer.parseInt(succ.getProperties().get("con")); + } + OutputSlot slot = f.createOutputSlot(pos); + slot.setName(succ.getProperties().get("dump_spec")); + if (succ.getProperties().get("short_name") != null) { + slot.setShortName(succ.getProperties().get("short_name")); + } else { + String s = succ.getProperties().get("dump_spec"); + if (s != null && s.length() <= 2) { + slot.setShortName(s); + } else { + String tmpName = succ.getProperties().get("name"); + if (tmpName != null && tmpName.length() > 0) { + slot.setShortName(tmpName.substring(0, 1)); + } + } + } + for (Connection c : nextSlot.getConnections()) { + Connection newConn = diagram.createConnection(c.getInputSlot(), slot); + newConn.setColor(c.getColor()); + newConn.setStyle(c.getStyle()); + } + + + figuresToRemove.add(succ); + + if (oldSlot.getConnections().size() == 0) { + f.removeSlot(oldSlot); + } + } + } + } + } + } + + diagram.removeAllFigures(figuresToRemove); + } + } + + public void addRule(CombineRule combineRule) { + rules.add(combineRule); + } + + public static class CombineRule { + + private PropertyMatcher first; + private PropertyMatcher second; + private boolean reversed; + + public CombineRule(PropertyMatcher first, PropertyMatcher second) { + this(first, second, false); + + } + + public CombineRule(PropertyMatcher first, PropertyMatcher second, boolean reversed) { + this.first = first; + this.second = second; + this.reversed = reversed; + } + + public boolean isReversed() { + return reversed; + } + + public PropertyMatcher getFirstMatcher() { + return first; + } + + public PropertyMatcher getSecondMatcher() { + return second; + } + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ConnectionFilter.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ConnectionFilter.java new file mode 100644 index 00000000000..d4057918483 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ConnectionFilter.java @@ -0,0 +1,106 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.filter; + +import com.sun.hotspot.igv.graph.Connection; +import com.sun.hotspot.igv.graph.Diagram; +import com.sun.hotspot.igv.graph.Figure; +import com.sun.hotspot.igv.graph.OutputSlot; +import com.sun.hotspot.igv.graph.Selector; +import com.sun.hotspot.igv.data.Properties; +import java.awt.Color; +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public class ConnectionFilter extends AbstractFilter { + + private List connectionStyleRules; + private String name; + + public ConnectionFilter(String name) { + this.name = name; + connectionStyleRules = new ArrayList(); + } + + public String getName() { + return name; + } + + public void apply(Diagram diagram) { + + Properties.PropertySelector
    selector = new Properties.PropertySelector
    (diagram.getFigures()); + for (ConnectionStyleRule rule : connectionStyleRules) { + List
    figures = null; + if (rule.getSelector() != null) { + figures = rule.getSelector().selected(diagram); + } else { + figures = diagram.getFigures(); + } + + for (Figure f : figures) { + for (OutputSlot os : f.getOutputSlots()) { + for (Connection c : os.getConnections()) { + if (figures.contains(c.getInputSlot().getFigure())) { + c.setStyle(rule.getLineStyle()); + c.setColor(rule.getLineColor()); + } + } + } + } + } + } + + public void addRule(ConnectionStyleRule r) { + connectionStyleRules.add(r); + } + + public static class ConnectionStyleRule { + + private Color lineColor; + private Connection.ConnectionStyle lineStyle; + private Selector selector; + + public ConnectionStyleRule(Selector selector, Color lineColor, Connection.ConnectionStyle lineStyle) { + this.selector = selector; + this.lineColor = lineColor; + this.lineStyle = lineStyle; + } + + public Selector getSelector() { + return selector; + } + + public Color getLineColor() { + return lineColor; + } + + public Connection.ConnectionStyle getLineStyle() { + return lineStyle; + } + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/CustomFilter.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/CustomFilter.java new file mode 100644 index 00000000000..762d8d2a22e --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/CustomFilter.java @@ -0,0 +1,159 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.filter; + +import com.sun.hotspot.igv.graph.Diagram; +import com.sun.hotspot.igv.data.Property; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Collection; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.openide.DialogDisplayer; +import org.openide.NotifyDescriptor; +import org.openide.cookies.OpenCookie; +import org.openide.filesystems.Repository; +import org.openide.filesystems.FileSystem; +import org.openide.filesystems.FileObject; +import org.openide.util.Exceptions; +import org.openide.util.Lookup; + +/** + * + * @author Thomas Wuerthinger + */ +public class CustomFilter extends AbstractFilter { + + public static final String JAVASCRIPT_HELPER_ID = "JavaScriptHelper"; + private static ScriptEngineAbstraction engine; + private String code; + private String name; + + public CustomFilter(String name, String code) { + this.name = name; + this.code = code; + getProperties().add(new Property("name", name)); + } + + public String getName() { + return name; + } + + public String getCode() { + return code; + } + + public void setName(String s) { + name = s; + fireChangedEvent(); + } + + public void setCode(String s) { + code = s; + fireChangedEvent(); + } + + @Override + public OpenCookie getEditor() { + return new OpenCookie() { + + public void open() { + openInEditor(); + } + }; + } + + public boolean openInEditor() { + EditFilterDialog dialog = new EditFilterDialog(CustomFilter.this); + dialog.setVisible(true); + return dialog.wasAccepted(); + } + + @Override + public String toString() { + return getName(); + } + + public static ScriptEngineAbstraction getEngine() { + if (engine == null) { + + ScriptEngineAbstraction chosen = null; + try { + Collection list = Lookup.getDefault().lookupAll(ScriptEngineAbstraction.class); + for (ScriptEngineAbstraction s : list) { + if (s.initialize(getJsHelperText())) { + if (chosen == null || !(chosen instanceof JavaSE6ScriptEngine)) { + chosen = s; + } + } + } + } catch (NoClassDefFoundError ncdfe) { + Logger.getLogger("global").log(Level.SEVERE, null, ncdfe); + } + + if (chosen == null) { + NotifyDescriptor message = new NotifyDescriptor.Message("Could not find a scripting engine. Please make sure that the Rhino scripting engine is available. Otherwise filter cannot be used.", NotifyDescriptor.ERROR_MESSAGE); + DialogDisplayer.getDefault().notifyLater(message); + chosen = new NullScriptEngine(); + } + + engine = chosen; + } + + return engine; + } + + private static String getJsHelperText() { + InputStream is = null; + StringBuilder sb = new StringBuilder("importPackage(Packages.com.sun.hotspot.igv.filter);importPackage(Packages.com.sun.hotspot.igv.graph);importPackage(Packages.com.sun.hotspot.igv.data);importPackage(Packages.com.sun.hotspot.igv.util);importPackage(java.awt);"); + try { + FileSystem fs = Repository.getDefault().getDefaultFileSystem(); + FileObject fo = fs.getRoot().getFileObject(JAVASCRIPT_HELPER_ID); + is = fo.getInputStream(); + BufferedReader r = new BufferedReader(new InputStreamReader(is)); + String s; + while ((s = r.readLine()) != null) { + sb.append(s); + sb.append("\n"); + } + + } catch (IOException ex) { + Logger.getLogger("global").log(Level.SEVERE, null, ex); + } finally { + try { + is.close(); + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + } + return sb.toString(); + } + + public void apply(Diagram d) { + getEngine().execute(d, code); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/EditFilterDialog.form b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/EditFilterDialog.form new file mode 100644 index 00000000000..58a40cd1c8a --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/EditFilterDialog.form @@ -0,0 +1,133 @@ + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/EditFilterDialog.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/EditFilterDialog.java new file mode 100644 index 00000000000..7383e7f82e5 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/EditFilterDialog.java @@ -0,0 +1,161 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.filter; + +import org.openide.windows.WindowManager; + +/** + * + * @author Thomas Wuerthinger + */ +public class EditFilterDialog extends javax.swing.JDialog { + + private CustomFilter customFilter; + private boolean accepted; + + /** Creates new form EditFilterDialog */ + public EditFilterDialog(CustomFilter customFilter) { + super(WindowManager.getDefault().getMainWindow(), true); + this.customFilter = customFilter; + initComponents(); + + sourceTextArea.setText(customFilter.getCode()); + nameTextField.setText(customFilter.getName()); + } + + public boolean wasAccepted() { + return accepted; + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + jScrollPane1 = new javax.swing.JScrollPane(); + sourceTextArea = new javax.swing.JTextArea(); + nameTextField = new javax.swing.JTextField(); + nameLabel = new javax.swing.JLabel(); + sourceLabel = new javax.swing.JLabel(); + okButton = new javax.swing.JButton(); + cancelButton = new javax.swing.JButton(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + setTitle(org.openide.util.NbBundle.getMessage(EditFilterDialog.class, "title")); // NOI18N + setResizable(false); + + sourceTextArea.setColumns(20); + sourceTextArea.setRows(5); + jScrollPane1.setViewportView(sourceTextArea); + + nameTextField.setText("null"); + + nameLabel.setText(org.openide.util.NbBundle.getMessage(EditFilterDialog.class, "jLabel1.text")); // NOI18N + + sourceLabel.setText(org.openide.util.NbBundle.getMessage(EditFilterDialog.class, "jLabel2.text")); // NOI18N + + okButton.setText(org.openide.util.NbBundle.getMessage(EditFilterDialog.class, "jButton1.text")); // NOI18N + okButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cancelButtonClicked(evt); + okButtonClicked(evt); + } + }); + + cancelButton.setText(org.openide.util.NbBundle.getMessage(EditFilterDialog.class, "jButton2.text")); // NOI18N + cancelButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cancelButtonClicked(evt); + } + }); + + org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(layout.createSequentialGroup() + .addContainerGap() + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(sourceLabel) + .add(nameLabel)) + .add(25, 25, 25) + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 695, Short.MAX_VALUE) + .add(nameTextField, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 695, Short.MAX_VALUE))) + .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() + .add(okButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 76, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) + .add(cancelButton))) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(layout.createSequentialGroup() + .addContainerGap() + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) + .add(nameLabel) + .add(nameTextField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED) + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(sourceLabel) + .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 337, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 16, Short.MAX_VALUE) + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) + .add(cancelButton) + .add(okButton)) + .addContainerGap()) + ); + + pack(); + }// //GEN-END:initComponents + +private void okButtonClicked(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonClicked + this.customFilter.setName(this.nameTextField.getText()); + this.customFilter.setCode(this.sourceTextArea.getText()); + accepted = true; + setVisible(false); +}//GEN-LAST:event_okButtonClicked + +private void cancelButtonClicked(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonClicked + setVisible(false); +}//GEN-LAST:event_cancelButtonClicked + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton cancelButton; + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JLabel nameLabel; + private javax.swing.JTextField nameTextField; + private javax.swing.JButton okButton; + private javax.swing.JLabel sourceLabel; + private javax.swing.JTextArea sourceTextArea; + // End of variables declaration//GEN-END:variables + +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/Filter.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/Filter.java new file mode 100644 index 00000000000..2742ad28bb4 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/Filter.java @@ -0,0 +1,45 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.filter; + +import com.sun.hotspot.igv.data.ChangedEvent; +import com.sun.hotspot.igv.data.ChangedEventProvider; +import com.sun.hotspot.igv.data.Properties; +import com.sun.hotspot.igv.graph.Diagram; +import org.openide.cookies.OpenCookie; + +/** + * + * @author Thomas Wuerthinger + */ +public interface Filter extends Properties.Provider, ChangedEventProvider { + + public String getName(); + + public void apply(Diagram d); + + OpenCookie getEditor(); + + ChangedEvent getChangedEvent(); +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterChain.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterChain.java new file mode 100644 index 00000000000..340c7483c2f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterChain.java @@ -0,0 +1,155 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.filter; + +import com.sun.hotspot.igv.graph.Diagram; +import com.sun.hotspot.igv.data.ChangedEvent; +import com.sun.hotspot.igv.data.ChangedEventProvider; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public class FilterChain implements ChangedEventProvider { + + private List filters; + private transient ChangedEvent changedEvent; + private boolean fireEvents; + + public FilterChain() { + filters = new ArrayList(); + changedEvent = new ChangedEvent(this); + this.fireEvents = true; + } + + public FilterChain(FilterChain f) { + this.filters = new ArrayList(f.filters); + changedEvent = new ChangedEvent(this); + this.fireEvents = true; + } + + public ChangedEvent getChangedEvent() { + return changedEvent; + } + + public Filter getFilterAt(int index) { + assert index >= 0 && index < filters.size(); + return filters.get(index); + } + + public void apply(Diagram d) { + for (Filter f : filters) { + f.apply(d); + } + } + + public void apply(Diagram d, FilterChain sequence) { + List applied = new ArrayList(); + for (Filter f : sequence.getFilters()) { + if (filters.contains(f)) { + f.apply(d); + applied.add(f); + } + } + + + for (Filter f : filters) { + if (!applied.contains(f)) { + f.apply(d); + } + } + } + + public void beginAtomic() { + this.fireEvents = false; + } + + public void endAtomic() { + this.fireEvents = true; + changedEvent.fire(); + } + + public void addFilter(Filter filter) { + assert filter != null; + filters.add(filter); + if (fireEvents) { + changedEvent.fire(); + } + } + + public void addFilterSameSequence(Filter filter) { + assert filter != null; + filters.add(filter); + if (fireEvents) { + changedEvent.fire(); + } + } + + public boolean containsFilter(Filter filter) { + return filters.contains(filter); + } + + public void removeFilter(Filter filter) { + assert filters.contains(filter); + filters.remove(filter); + if (fireEvents) { + changedEvent.fire(); + } + } + + public void moveFilterUp(Filter filter) { + assert filters.contains(filter); + int index = filters.indexOf(filter); + if (index != 0) { + filters.remove(index); + filters.add(index - 1, filter); + } + if (fireEvents) { + changedEvent.fire(); + } + } + + public void moveFilterDown(Filter filter) { + assert filters.contains(filter); + int index = filters.indexOf(filter); + if (index != filters.size() - 1) { + filters.remove(index); + filters.add(index + 1, filter); + } + if (fireEvents) { + changedEvent.fire(); + } + } + + public List getFilters() { + return Collections.unmodifiableList(filters); + } + + public void clear() { + filters.clear(); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterChainProvider.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterChainProvider.java new file mode 100644 index 00000000000..d9ae82e0629 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterChainProvider.java @@ -0,0 +1,35 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.filter; + +/** + * + * @author Thomas Wuerthinger + */ +public interface FilterChainProvider { + + public FilterChain getFilterChain(); + + public FilterChain getSequence(); +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterSetting.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterSetting.java new file mode 100644 index 00000000000..aadd4bb32ec --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterSetting.java @@ -0,0 +1,82 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.filter; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +/** + * + * @author Thomas Wuerthinger + */ +public class FilterSetting { + + private Set filters; + private String name; + + public FilterSetting() { + this(null); + } + + public FilterSetting(String name) { + this.name = name; + filters = new HashSet(); + } + + public Set getFilters() { + return Collections.unmodifiableSet(filters); + } + + public void addFilter(Filter f) { + assert !filters.contains(f); + filters.add(f); + } + + public void removeFilter(Filter f) { + assert filters.contains(f); + filters.remove(f); + } + + public boolean containsFilter(Filter f) { + return filters.contains(f); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getFilterCount() { + return filters.size(); + } + + @Override + public String toString() { + return getName(); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/JavaSE6ScriptEngine.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/JavaSE6ScriptEngine.java new file mode 100644 index 00000000000..1ba7fbc123a --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/JavaSE6ScriptEngine.java @@ -0,0 +1,68 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.filter; + +import com.sun.hotspot.igv.graph.Diagram; +import javax.script.Bindings; +import javax.script.ScriptContext; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; +import org.openide.util.Exceptions; + +/** + * + * @author Thomas Wuerthinger + */ +public class JavaSE6ScriptEngine implements ScriptEngineAbstraction { + + private ScriptEngine engine; + private Bindings bindings; + + public boolean initialize(String jsHelperText) { + try { + ScriptEngineManager sem = new ScriptEngineManager(); + ScriptEngine e = sem.getEngineByName("ECMAScript"); + engine = e; + e.eval(jsHelperText); + Bindings b = e.getContext().getBindings(ScriptContext.ENGINE_SCOPE); + b.put("IO", System.out); + bindings = b; + return true; + } catch (Exception e) { + return false; + } + } + + public void execute(Diagram d, String code) { + try { + Bindings b = bindings; + b.put("graph", d); + engine.eval(code, b); + } catch (ScriptException ex) { + Exceptions.printStackTrace(ex); + } + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/NullScriptEngine.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/NullScriptEngine.java new file mode 100644 index 00000000000..94f3848affb --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/NullScriptEngine.java @@ -0,0 +1,40 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.filter; + +import com.sun.hotspot.igv.graph.Diagram; + +/** + * + * @author Thomas Wuerthinger + */ +public class NullScriptEngine implements ScriptEngineAbstraction { + + public boolean initialize(String jsHelperText) { + return true; + } + + public void execute(Diagram d, String code) { + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveFilter.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveFilter.java new file mode 100644 index 00000000000..f43793ccffe --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveFilter.java @@ -0,0 +1,132 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.filter; + +import com.sun.hotspot.igv.graph.Diagram; +import com.sun.hotspot.igv.graph.Figure; +import com.sun.hotspot.igv.graph.InputSlot; +import com.sun.hotspot.igv.graph.Selector; +import com.sun.hotspot.igv.data.Properties; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * + * @author Thomas Wuerthinger + */ +public class RemoveFilter extends AbstractFilter { + + private List rules; + private String name; + + public RemoveFilter(String name) { + this.name = name; + rules = new ArrayList(); + } + + public String getName() { + return name; + } + + public void apply(Diagram diagram) { + + for (RemoveRule r : rules) { + + List
    list = r.getSelector().selected(diagram); + Set
    figuresToRemove = new HashSet
    (); + + List
    protectedFigures = null; + if (r.getRemoveAllWithoutPredecessor()) { + protectedFigures = diagram.getRootFigures(); + } + + for (Figure f : list) { + if (r.getRemoveOnlyInputs()) { + List inputSlots = new ArrayList(); + for (InputSlot is : f.getInputSlots()) { + inputSlots.add(is); + } + for (InputSlot is : inputSlots) { + f.removeSlot(is); + } + + f.createInputSlot(); + } else { + figuresToRemove.add(f); + } + } + + if (r.getRemoveAllWithoutPredecessor()) { + boolean progress = true; + while (progress) { + List
    rootFigures = diagram.getRootFigures(); + progress = false; + for (Figure f : rootFigures) { + if (!protectedFigures.contains(f)) { + figuresToRemove.add(f); + progress = true; + } + } + } + } + + diagram.removeAllFigures(figuresToRemove); + } + } + + public void addRule(RemoveRule rule) { + rules.add(rule); + } + + public static class RemoveRule { + + private Selector selector; + private boolean removeAllWithoutPredecessor; + private boolean removeOnlyInputs; + + public RemoveRule(Selector selector, boolean b) { + this(selector, b, false); + } + + public RemoveRule(Selector selector, boolean removeAllWithoutPredecessor, boolean removeOnlyInputs) { + this.selector = selector; + this.removeOnlyInputs = removeOnlyInputs; + this.removeAllWithoutPredecessor = removeAllWithoutPredecessor; + } + + public Selector getSelector() { + return selector; + } + + public boolean getRemoveOnlyInputs() { + return removeOnlyInputs; + } + + public boolean getRemoveAllWithoutPredecessor() { + return removeAllWithoutPredecessor; + } + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveInputsFilter.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveInputsFilter.java new file mode 100644 index 00000000000..61b21a0652c --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveInputsFilter.java @@ -0,0 +1,143 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.filter; + +import com.sun.hotspot.igv.graph.Connection; +import com.sun.hotspot.igv.graph.Diagram; +import com.sun.hotspot.igv.graph.Figure; +import com.sun.hotspot.igv.graph.InputSlot; +import com.sun.hotspot.igv.graph.OutputSlot; +import com.sun.hotspot.igv.graph.Selector; +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public class RemoveInputsFilter extends AbstractFilter { + + private List rules; + private String name; + + public RemoveInputsFilter(String name) { + this.name = name; + rules = new ArrayList(); + } + + public String getName() { + return name; + } + + public void apply(Diagram diagram) { + + for (RemoveInputsRule r : rules) { + + List
    list = r.getSelector().selected(diagram); + for (Figure f : list) { + int z = 0; + List last = new ArrayList(); + for (InputSlot is : f.getInputSlots()) { + if (z >= r.getStartingIndex() && z <= r.getEndIndex() && is.getConnections().size() > 0) { + StringBuilder sb = new StringBuilder(); + List conns = is.getConnections(); + for (int i = 0; i < conns.size(); i++) { + Connection c = conns.get(i); + OutputSlot os = c.getOutputSlot(); + Figure pred = os.getFigure(); + if (i != 0) { + sb.append("
    "); + } + sb.append(pred.getLines()[0]); + } + is.removeAllConnections(); + is.setShortName("X"); + is.setName(sb.toString()); + last.add(is); + } else { + last.clear(); + } + z++; + } + + if (last.size() > 3) { + InputSlot first = last.get(0); + first.setShortName("XX"); + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < last.size(); i++) { + InputSlot is2 = last.get(i); + if (i != 0) { + sb.append("
    "); + } + sb.append(is2.getName()); + } + + first.setName(sb.toString()); + + for (int i = 1; i < last.size(); i++) { + f.removeSlot(last.get(i)); + } + } + } + } + } + + public void addRule(RemoveInputsRule rule) { + rules.add(rule); + } + + public static class RemoveInputsRule { + + private Selector selector; + private int startingIndex; + private int endIndex; + + public RemoveInputsRule(Selector selector) { + this(selector, 0); + } + + public RemoveInputsRule(Selector selector, int startIndex) { + this(selector, startIndex, Integer.MAX_VALUE); + } + + public RemoveInputsRule(Selector selector, int startIndex, int endIndex) { + this.startingIndex = startIndex; + this.endIndex = endIndex; + this.selector = selector; + } + + public int getStartingIndex() { + return startingIndex; + } + + public int getEndIndex() { + return endIndex; + } + + public Selector getSelector() { + return selector; + } + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveSelfLoopsFilter.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveSelfLoopsFilter.java new file mode 100644 index 00000000000..c8fd54b1156 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveSelfLoopsFilter.java @@ -0,0 +1,80 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.filter; + +import com.sun.hotspot.igv.graph.Connection; +import com.sun.hotspot.igv.graph.Diagram; +import com.sun.hotspot.igv.graph.Figure; +import com.sun.hotspot.igv.graph.InputSlot; +import com.sun.hotspot.igv.graph.OutputSlot; +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public class RemoveSelfLoopsFilter extends AbstractFilter { + + private String name; + + /** Creates a new instance of RemoveSelfLoops */ + public RemoveSelfLoopsFilter(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void apply(Diagram d) { + + for (Figure f : d.getFigures()) { + + for (InputSlot is : f.getInputSlots()) { + + List toRemove = new ArrayList(); + for (Connection c : is.getConnections()) { + + if (c.getOutputSlot().getFigure() == f) { + toRemove.add(c); + } + } + + for (Connection c : toRemove) { + + c.remove(); + + OutputSlot os = c.getOutputSlot(); + if (os.getConnections().size() == 0) { + f.removeSlot(os); + } + + c.getInputSlot().setShortName("O"); + c.getInputSlot().setName("Self Loop"); + } + } + } + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ScriptEngineAbstraction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ScriptEngineAbstraction.java new file mode 100644 index 00000000000..065725ed3da --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ScriptEngineAbstraction.java @@ -0,0 +1,38 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.filter; + +import com.sun.hotspot.igv.graph.Diagram; + +/** + * + * @author Thomas Wuerthinger + */ +public interface ScriptEngineAbstraction { + + public boolean initialize(String jsHelperText); + + public void execute(Diagram d, String code); +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/SplitFilter.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/SplitFilter.java new file mode 100644 index 00000000000..e4c2554bda5 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/SplitFilter.java @@ -0,0 +1,70 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.filter; + +import com.sun.hotspot.igv.graph.Connection; +import com.sun.hotspot.igv.graph.Diagram; +import com.sun.hotspot.igv.graph.Figure; +import com.sun.hotspot.igv.graph.InputSlot; +import com.sun.hotspot.igv.graph.OutputSlot; +import com.sun.hotspot.igv.graph.Selector; +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public class SplitFilter extends AbstractFilter { + + private String name; + private Selector selector; + + public SplitFilter(String name, Selector selector) { + this.name = name; + this.selector = selector; + } + + public String getName() { + return name; + } + + public void apply(Diagram d) { + List
    list = selector.selected(d); + + for (Figure f : list) { + for (OutputSlot os : f.getOutputSlots()) { + for (Connection c : os.getConnections()) { + InputSlot is = c.getInputSlot(); + is.setName(f.getProperties().getProperty("dump_spec")); + String s = f.getProperties().getProperty("short_name"); + if (s != null) { + is.setShortName(s); + } + } + } + + d.removeFigure(f); + } + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/helper.js b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/helper.js new file mode 100644 index 00000000000..d45f682d634 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/helper.js @@ -0,0 +1,71 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ + + /** + * + * @author Thomas Wuerthinger + */ + +function colorize(property, regexp, color) { + var f = new ColorFilter(""); + f.addRule(new ColorFilter.ColorRule(new MatcherSelector(new Properties.RegexpPropertyMatcher(property, regexp)), color)); + f.apply(graph); +} + +function remove(property, regexp) { + var f = new RemoveFilter(""); + f.addRule(new RemoveFilter.RemoveRule(new MatcherSelector(new Properties.RegexpPropertyMatcher(property, regexp)), false, false)); + f.apply(graph); +} + +function split(property, regexp) { + var f = new SplitFilter("", new MatcherSelector(new Properties.RegexpPropertyMatcher(property, regexp))); + f.apply(graph); +} + +function removeInputs(property, regexp, from, to) { + var f = new RemoveInputsFilter(""); + if(from == undefined && to == undefined) { + f.addRule(new RemoveInputsFilter.RemoveInputsRule(new MatcherSelector(new Properties.RegexpPropertyMatcher(property, regexp)))); + } else if(to == undefined) { + f.addRule(new RemoveInputsFilter.RemoveInputsRule(new MatcherSelector(new Properties.RegexpPropertyMatcher(property, regexp)), from)); + } else { + f.addRule(new RemoveInputsFilter.RemoveInputsRule(new MatcherSelector(new Properties.RegexpPropertyMatcher(property, regexp)), from, to)); + } + f.apply(graph); +} + +var black = Color.black; +var blue = Color.blue; +var cyan = Color.cyan; +var darkGray = Color.darkGray; +var gray = Color.gray; +var green = Color.green; +var lightGray = Color.lightGray; +var magenta = Color.magenta; +var orange = Color.orange; +var pink = Color.pink +var red = Color.red; +var yellow = Color.yellow; +var white = Color.white; diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/layer.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/layer.xml new file mode 100644 index 00000000000..32fe79fc1a8 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/layer.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/build.xml new file mode 100644 index 00000000000..e604ea7bcba --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/build.xml @@ -0,0 +1,8 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.filterwindow. + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/manifest.mf new file mode 100644 index 00000000000..ba1485636f6 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/manifest.mf @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +OpenIDE-Module: com.sun.hotspot.igv.filterwindow +OpenIDE-Module-Layer: com/sun/hotspot/igv/filterwindow/layer.xml +OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/filterwindow/Bundle.properties +OpenIDE-Module-Specification-Version: 1.0 + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/build-impl.xml new file mode 100644 index 00000000000..01265560daa --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/build-impl.xml @@ -0,0 +1,30 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/genfiles.properties new file mode 100644 index 00000000000..b9832d5e596 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=401b2654 +build.xml.script.CRC32=9c158403 +build.xml.stylesheet.CRC32=79c3b980 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=401b2654 +nbproject/build-impl.xml.script.CRC32=19fb08e0 +nbproject/build-impl.xml.stylesheet.CRC32=deb65f65 diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/project.properties new file mode 100644 index 00000000000..152f44eca60 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/project.properties @@ -0,0 +1,2 @@ +javac.source=1.5 +javac.compilerargs=-Xlint -Xlint:-serial diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/project.xml new file mode 100644 index 00000000000..7740f12aef9 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/project.xml @@ -0,0 +1,109 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.filterwindow + + + + com.sun.hotspot.igv.data + + + + 1.0 + + + + com.sun.hotspot.igv.filter + + + + 1.0 + + + + com.sun.hotspot.igv.graph + + + + 1.0 + + + + com.sun.hotspot.igv.util + + + + 1.0 + + + + org.openide.actions + + + + 6.6.1.1 + + + + org.openide.dialogs + + + + 7.5.1 + + + + org.openide.explorer + + + + 6.12.1 + + + + org.openide.filesystems + + + + 7.3.1 + + + + org.openide.loaders + + + + 6.7.1 + + + + org.openide.nodes + + + + 7.2.1.1 + + + + org.openide.util + + + + 7.10.1.1 + + + + org.openide.windows + + + + 6.18.1 + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/suite.properties new file mode 100644 index 00000000000..29d7cc9bd6f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/suite.properties @@ -0,0 +1 @@ +suite.dir=${basedir}/.. diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/META-INF/services/com.sun.hotspot.igv.filter.FilterChainProvider b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/META-INF/services/com.sun.hotspot.igv.filter.FilterChainProvider new file mode 100644 index 00000000000..a3cdc882cca --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/META-INF/services/com.sun.hotspot.igv.filter.FilterChainProvider @@ -0,0 +1 @@ +com.sun.hotspot.igv.filterwindow.FilterChainProviderImplementation diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/Bundle.properties new file mode 100644 index 00000000000..c7f2ba7357f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/Bundle.properties @@ -0,0 +1,3 @@ +OpenIDE-Module-Name=FilterWindow +CTL_FilterTopComponent=Filter Window +HINT_FilterTopComponent=This is a Filter window diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckListView.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckListView.java new file mode 100644 index 00000000000..911a7c7e535 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckListView.java @@ -0,0 +1,52 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.filterwindow; + +import javax.swing.JList; +import org.openide.explorer.view.ListView; +import org.openide.explorer.view.NodeListModel; + +/** + * + * @author Thomas Wuerthinger + */ +public class CheckListView extends ListView { + + @Override + public void showSelection(int[] indices) { + super.showSelection(indices); + } + + @Override + protected NodeListModel createModel() { + return new CheckNodeListModel(); + } + + @Override + protected JList createList() { + JList tmpList = super.createList(); + tmpList.setCellRenderer(new CheckRenderer(tmpList)); + return tmpList; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckNode.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckNode.java new file mode 100644 index 00000000000..d8f2e04abe0 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckNode.java @@ -0,0 +1,70 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.filterwindow; + +import com.sun.hotspot.igv.data.ChangedEvent; +import org.openide.nodes.AbstractNode; +import org.openide.nodes.Children; +import org.openide.util.Lookup; + +/** + * + * @author Thomas Wuerthinger + */ +public class CheckNode extends AbstractNode { + + private ChangedEvent selectionChangedEvent; + public boolean selected; + public boolean enabled; + + public CheckNode(Children c, Lookup lookup) { + super(c, lookup); + selectionChangedEvent = new ChangedEvent(this); + selected = false; + enabled = true; + } + + public ChangedEvent getSelectionChangedEvent() { + return selectionChangedEvent; + } + + public boolean isSelected() { + return selected; + } + + public void setSelected(boolean b) { + if (b != selected) { + selected = b; + selectionChangedEvent.fire(); + } + } + + public void setEnabled(boolean b) { + enabled = b; + } + + public boolean isEnabled() { + return enabled; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckNodeListModel.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckNodeListModel.java new file mode 100644 index 00000000000..caf75023000 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckNodeListModel.java @@ -0,0 +1,46 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.filterwindow; + +import org.openide.explorer.view.NodeListModel; +import org.openide.nodes.Node; + +/** + * + * @author Thomas Wuerthinger + */ +public class CheckNodeListModel extends NodeListModel { + + private Node rootNode; + + @Override + public void setNode(Node rootNode) { + this.rootNode = rootNode; + super.setNode(rootNode); + } + + public CheckNode getCheckNodeAt(int index) { + return (CheckNode) rootNode.getChildren().getNodes()[index]; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckRenderer.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckRenderer.java new file mode 100644 index 00000000000..f37716ff049 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckRenderer.java @@ -0,0 +1,88 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.filterwindow; + +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import javax.swing.JCheckBox; +import javax.swing.JList; +import javax.swing.ListCellRenderer; + +/** + * @author Thomas Wuerthinger + */ +public class CheckRenderer extends JCheckBox implements ListCellRenderer { + + private JList list; + private Color startBackground; + + public CheckRenderer(final JList list) { + this.list = list; + list.addMouseListener( + new MouseAdapter() { + + @Override + public void mouseClicked(MouseEvent e) { + int index = list.locationToIndex(e.getPoint()); + Point p2 = list.indexToLocation(index); + Rectangle r = new Rectangle(p2.x, p2.y, getPreferredSize().height, getPreferredSize().height); + if (r.contains(e.getPoint())) { + CheckNode node = ((CheckNodeListModel) list.getModel()).getCheckNodeAt(index); + node.setSelected(!node.isSelected()); + list.repaint(); + e.consume(); + } + } + }); + + this.setPreferredSize(new Dimension(getPreferredSize().width, getPreferredSize().height - 5)); + startBackground = this.getBackground(); + } + + public Component getListCellRendererComponent(final JList list, Object value, final int index, boolean isSelected, boolean cellHasFocus) { + setText(value.toString()); + CheckNode node = ((CheckNodeListModel) list.getModel()).getCheckNodeAt(index); + this.setSelected(node.isSelected()); + this.setEnabled(list.isEnabled()); + + if (isSelected && list.hasFocus()) { + this.setBackground(list.getSelectionBackground()); + this.setForeground(list.getSelectionForeground()); + } else if (isSelected) { + assert !list.hasFocus(); + this.setBackground(startBackground); + this.setForeground(list.getForeground()); + + } else { + this.setBackground(list.getBackground()); + this.setForeground(list.getForeground()); + } + return this; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterChainProviderImplementation.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterChainProviderImplementation.java new file mode 100644 index 00000000000..407ce3989ab --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterChainProviderImplementation.java @@ -0,0 +1,42 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.filterwindow; + +import com.sun.hotspot.igv.filter.FilterChain; +import com.sun.hotspot.igv.filter.FilterChainProvider; + +/** + * + * @author Thomas Wuerthinger + */ +public class FilterChainProviderImplementation implements FilterChainProvider { + + public FilterChain getFilterChain() { + return FilterTopComponent.findInstance().getFilterChain(); + } + + public FilterChain getSequence() { + return FilterTopComponent.findInstance().getSequence(); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterNode.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterNode.java new file mode 100644 index 00000000000..962651327b3 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterNode.java @@ -0,0 +1,112 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.filterwindow; + +import com.sun.hotspot.igv.filterwindow.actions.MoveFilterDownAction; +import com.sun.hotspot.igv.filterwindow.actions.MoveFilterUpAction; +import com.sun.hotspot.igv.filterwindow.actions.RemoveFilterAction; +import com.sun.hotspot.igv.filter.Filter; +import com.sun.hotspot.igv.filter.FilterChain; +import com.sun.hotspot.igv.data.ChangedListener; +import com.sun.hotspot.igv.util.PropertiesSheet; +import javax.swing.Action; +import org.openide.actions.OpenAction; +import org.openide.nodes.Children; +import org.openide.nodes.Sheet; +import org.openide.util.Lookup; +import org.openide.util.LookupEvent; +import org.openide.util.LookupListener; +import org.openide.util.Utilities; +import org.openide.util.lookup.AbstractLookup; +import org.openide.util.lookup.InstanceContent; + +/** + * + * @author Thomas Wuerthinger + */ +public class FilterNode extends CheckNode implements LookupListener, ChangedListener { + + private Filter filter; + private Lookup.Result result; + + public FilterNode(Filter filter) { + this(filter, new InstanceContent()); + } + + private FilterNode(Filter filter, InstanceContent content) { + super(Children.LEAF, new AbstractLookup(content)); + content.add(filter); + + content.add(filter.getEditor()); + this.filter = filter; + filter.getChangedEvent().addListener(new ChangedListener() { + + public void changed(Filter source) { + update(); + } + }); + + update(); + + Lookup.Template tpl = new Lookup.Template(FilterChain.class); + result = Utilities.actionsGlobalContext().lookup(tpl); + result.addLookupListener(this); + + FilterTopComponent.findInstance().getFilterSettingsChangedEvent().addListener(this); + resultChanged(null); + } + + private void update() { + this.setDisplayName(filter.getName()); + } + + public Filter getFilter() { + return filter; + } + + @Override + protected Sheet createSheet() { + Sheet s = super.createSheet(); + PropertiesSheet.initializeSheet(getFilter().getProperties(), s); + return s; + } + + @Override + public Action[] getActions(boolean b) { + return new Action[]{(Action) OpenAction.findObject(OpenAction.class, true), (Action) MoveFilterUpAction.findObject(MoveFilterUpAction.class, true), (Action) MoveFilterDownAction.findObject(MoveFilterDownAction.class, true), (Action) RemoveFilterAction.findObject(RemoveFilterAction.class, true)}; + } + + @Override + public Action getPreferredAction() { + return OpenAction.get(OpenAction.class).createContextAwareInstance(Utilities.actionsGlobalContext()); + } + + public void resultChanged(LookupEvent lookupEvent) { + changed(FilterTopComponent.findInstance()); + } + + public void changed(FilterTopComponent source) { + setSelected(source.getFilterChain().containsFilter(filter)); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponent.form b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponent.form new file mode 100644 index 00000000000..f3fc524ebe3 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponent.form @@ -0,0 +1,16 @@ + + +
    + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponent.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponent.java new file mode 100644 index 00000000000..7cd32e8f6ef --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponent.java @@ -0,0 +1,689 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.filterwindow; + +import com.sun.hotspot.igv.filterwindow.actions.MoveFilterDownAction; +import com.sun.hotspot.igv.filterwindow.actions.MoveFilterUpAction; +import com.sun.hotspot.igv.filterwindow.actions.NewFilterAction; +import com.sun.hotspot.igv.filterwindow.actions.RemoveFilterAction; +import com.sun.hotspot.igv.filterwindow.actions.RemoveFilterSettingsAction; +import com.sun.hotspot.igv.filterwindow.actions.SaveFilterSettingsAction; +import com.sun.hotspot.igv.filter.CustomFilter; +import com.sun.hotspot.igv.filter.Filter; +import com.sun.hotspot.igv.filter.FilterChain; +import com.sun.hotspot.igv.filter.FilterSetting; +import com.sun.hotspot.igv.data.ChangedEvent; +import com.sun.hotspot.igv.data.ChangedListener; +import java.awt.BorderLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.ObjectInput; +import java.io.ObjectOutput; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.Serializable; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import javax.swing.JComboBox; +import javax.swing.UIManager; +import javax.swing.border.Border; +import org.openide.DialogDisplayer; +import org.openide.ErrorManager; +import org.openide.NotifyDescriptor; +import org.openide.awt.ToolbarPool; +import org.openide.explorer.ExplorerManager; +import org.openide.explorer.ExplorerUtils; +import org.openide.nodes.AbstractNode; +import org.openide.nodes.Children; +import org.openide.nodes.Node; +import org.openide.util.Exceptions; +import org.openide.util.Lookup; +import org.openide.util.LookupEvent; +import org.openide.util.LookupListener; +import org.openide.util.NbBundle; +import org.openide.util.Utilities; +import org.openide.awt.Toolbar; +import org.openide.filesystems.FileLock; +import org.openide.util.actions.SystemAction; +import org.openide.windows.TopComponent; +import org.openide.windows.WindowManager; +import org.openide.filesystems.Repository; +import org.openide.filesystems.FileSystem; +import org.openide.filesystems.FileObject; + +/** + * + * @author Thomas Wuerthinger + */ +public final class FilterTopComponent extends TopComponent implements LookupListener, ExplorerManager.Provider { + + private static FilterTopComponent instance; + public static final String FOLDER_ID = "Filters"; + public static final String AFTER_ID = "after"; + public static final String ENABLED_ID = "enabled"; + public static final String PREFERRED_ID = "FilterTopComponent"; + private CheckListView view; + private ExplorerManager manager; + private FilterChain filterChain; + private FilterChain sequence; + private Lookup.Result result; + private JComboBox comboBox; + private List filterSettings; + private FilterSetting customFilterSetting = new FilterSetting("-- Custom --"); + private ChangedEvent filterSettingsChangedEvent; + private ActionListener comboBoxActionListener = new ActionListener() { + + public void actionPerformed(ActionEvent e) { + comboBoxSelectionChanged(); + } + }; + + public ChangedEvent getFilterSettingsChangedEvent() { + return filterSettingsChangedEvent; + } + + public FilterChain getSequence() { + return sequence; + } + + public void updateSelection() { + Node[] nodes = this.getExplorerManager().getSelectedNodes(); + int[] arr = new int[nodes.length]; + for (int i = 0; i < nodes.length; i++) { + int index = sequence.getFilters().indexOf(((FilterNode) nodes[i]).getFilter()); + arr[i] = index; + } + view.showSelection(arr); + } + + private void comboBoxSelectionChanged() { + + Object o = comboBox.getSelectedItem(); + if (o == null) { + return; + } + assert o instanceof FilterSetting; + FilterSetting s = (FilterSetting) o; + + if (s != customFilterSetting) { + FilterChain chain = getFilterChain(); + chain.beginAtomic(); + List toRemove = new ArrayList(); + for (Filter f : chain.getFilters()) { + if (!s.containsFilter(f)) { + toRemove.add(f); + } + } + for (Filter f : toRemove) { + chain.removeFilter(f); + } + + for (Filter f : s.getFilters()) { + if (!chain.containsFilter(f)) { + chain.addFilter(f); + } + } + + chain.endAtomic(); + filterSettingsChangedEvent.fire(); + } else { + this.updateComboBoxSelection(); + } + + SystemAction.get(RemoveFilterSettingsAction.class).setEnabled(comboBox.getSelectedItem() != this.customFilterSetting); + SystemAction.get(SaveFilterSettingsAction.class).setEnabled(comboBox.getSelectedItem() == this.customFilterSetting); + } + + private void updateComboBox() { + comboBox.removeAllItems(); + comboBox.addItem(customFilterSetting); + for (FilterSetting s : filterSettings) { + comboBox.addItem(s); + } + + this.updateComboBoxSelection(); + } + + public void addFilterSetting() { + NotifyDescriptor.InputLine l = new NotifyDescriptor.InputLine("Enter a name:", "Filter"); + if (DialogDisplayer.getDefault().notify(l) == NotifyDescriptor.OK_OPTION) { + String name = l.getInputText(); + + FilterSetting toRemove = null; + for (FilterSetting s : filterSettings) { + if (s.getName().equals(name)) { + NotifyDescriptor.Confirmation conf = new NotifyDescriptor.Confirmation("Filter \"" + name + "\" already exists, to you want to overwrite?", "Filter"); + if (DialogDisplayer.getDefault().notify(conf) == NotifyDescriptor.YES_OPTION) { + toRemove = s; + break; + } else { + return; + } + } + } + + if (toRemove != null) { + filterSettings.remove(toRemove); + } + FilterSetting setting = createFilterSetting(name); + filterSettings.add(setting); + + // Sort alphabetically + Collections.sort(filterSettings, new Comparator() { + + public int compare(FilterSetting o1, FilterSetting o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + + updateComboBox(); + } + } + + public boolean canRemoveFilterSetting() { + return comboBox.getSelectedItem() != customFilterSetting; + } + + public void removeFilterSetting() { + if (canRemoveFilterSetting()) { + Object o = comboBox.getSelectedItem(); + assert o instanceof FilterSetting; + FilterSetting f = (FilterSetting) o; + assert f != customFilterSetting; + assert filterSettings.contains(f); + NotifyDescriptor.Confirmation l = new NotifyDescriptor.Confirmation("Do you really want to remove filter \"" + f + "\"?", "Filter"); + if (DialogDisplayer.getDefault().notify(l) == NotifyDescriptor.YES_OPTION) { + filterSettings.remove(f); + updateComboBox(); + } + } + } + + private FilterSetting createFilterSetting(String name) { + FilterSetting s = new FilterSetting(name); + FilterChain chain = this.getFilterChain(); + for (Filter f : chain.getFilters()) { + s.addFilter(f); + } + return s; + } + + private void updateComboBoxSelection() { + List filters = this.getFilterChain().getFilters(); + boolean found = false; + for (FilterSetting s : filterSettings) { + if (s.getFilterCount() == filters.size()) { + boolean ok = true; + for (Filter f : filters) { + if (!s.containsFilter(f)) { + ok = false; + } + } + + if (ok) { + if (comboBox.getSelectedItem() != s) { + comboBox.setSelectedItem(s); + } + found = true; + break; + } + } + } + + if (!found && comboBox.getSelectedItem() != customFilterSetting) { + comboBox.setSelectedItem(customFilterSetting); + } + } + + private class FilterChildren extends Children.Keys implements ChangedListener { + + //private Node[] oldSelection; + //private ArrayList newSelection; + private HashMap nodeHash = new HashMap(); + + protected Node[] createNodes(Object object) { + if (nodeHash.containsKey(object)) { + return new Node[]{nodeHash.get(object)}; + } + + assert object instanceof Filter; + Filter filter = (Filter) object; + com.sun.hotspot.igv.filterwindow.FilterNode node = new com.sun.hotspot.igv.filterwindow.FilterNode(filter); + node.getSelectionChangedEvent().addListener(this); + nodeHash.put(object, node); + return new Node[]{node}; + } + + public FilterChildren() { + sequence.getChangedEvent().addListener(new ChangedListener() { + + public void changed(FilterChain source) { + addNotify(); + } + }); + + setBefore(false); + } + + protected void addNotify() { + setKeys(sequence.getFilters()); + updateSelection(); + } + + public void changed(CheckNode source) { + FilterNode node = (FilterNode) source; + Filter f = node.getFilter(); + FilterChain chain = getFilterChain(); + if (node.isSelected()) { + if (!chain.containsFilter(f)) { + chain.addFilter(f); + } + } else { + if (chain.containsFilter(f)) { + chain.removeFilter(f); + } + } + view.revalidate(); + view.repaint(); + updateComboBoxSelection(); + } + } + + public FilterChain getFilterChain() { + return filterChain;/* + EditorTopComponent tc = EditorTopComponent.getActive(); + if (tc == null) { + return filterChain; + } + return tc.getFilterChain();*/ + } + + private FilterTopComponent() { + filterSettingsChangedEvent = new ChangedEvent(this); + initComponents(); + setName(NbBundle.getMessage(FilterTopComponent.class, "CTL_FilterTopComponent")); + setToolTipText(NbBundle.getMessage(FilterTopComponent.class, "HINT_FilterTopComponent")); + // setIcon(Utilities.loadImage(ICON_PATH, true)); + + sequence = new FilterChain(); + filterChain = new FilterChain(); + initFilters(); + manager = new ExplorerManager(); + manager.setRootContext(new AbstractNode(new FilterChildren())); + associateLookup(ExplorerUtils.createLookup(manager, getActionMap())); + view = new CheckListView(); + + ToolbarPool.getDefault().setPreferredIconSize(16); + Toolbar toolBar = new Toolbar(); + Border b = (Border) UIManager.get("Nb.Editor.Toolbar.border"); //NOI18N + toolBar.setBorder(b); + comboBox = new JComboBox(); + toolBar.add(comboBox); + this.add(toolBar, BorderLayout.NORTH); + toolBar.add(SaveFilterSettingsAction.get(SaveFilterSettingsAction.class)); + toolBar.add(RemoveFilterSettingsAction.get(RemoveFilterSettingsAction.class)); + toolBar.addSeparator(); + toolBar.add(MoveFilterUpAction.get(MoveFilterUpAction.class).createContextAwareInstance(this.getLookup())); + toolBar.add(MoveFilterDownAction.get(MoveFilterDownAction.class).createContextAwareInstance(this.getLookup())); + toolBar.add(RemoveFilterAction.get(RemoveFilterAction.class).createContextAwareInstance(this.getLookup())); + toolBar.add(NewFilterAction.get(NewFilterAction.class)); + this.add(view, BorderLayout.CENTER); + + filterSettings = new ArrayList(); + updateComboBox(); + + comboBox.addActionListener(comboBoxActionListener); + setChain(filterChain); + } + + public void newFilter() { + CustomFilter cf = new CustomFilter("My custom filter", ""); + if (cf.openInEditor()) { + sequence.addFilter(cf); + FileObject fo = getFileObject(cf); + FilterChangedListener listener = new FilterChangedListener(fo, cf); + listener.changed(cf); + cf.getChangedEvent().addListener(listener); + } + } + + public void removeFilter(Filter f) { + com.sun.hotspot.igv.filter.CustomFilter cf = (com.sun.hotspot.igv.filter.CustomFilter) f; + + sequence.removeFilter(cf); + try { + getFileObject(cf).delete(); + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + + } + + private static class FilterChangedListener implements ChangedListener { + + private FileObject fileObject; + private CustomFilter filter; + + public FilterChangedListener(FileObject fo, CustomFilter cf) { + fileObject = fo; + filter = cf; + } + + public void changed(Filter source) { + try { + if (!fileObject.getName().equals(filter.getName())) { + FileLock lock = fileObject.lock(); + fileObject.move(lock, fileObject.getParent(), filter.getName(), ""); + lock.releaseLock(); + FileObject newFileObject = fileObject.getParent().getFileObject(filter.getName()); + fileObject = newFileObject; + + } + + FileLock lock = fileObject.lock(); + OutputStream os = fileObject.getOutputStream(lock); + Writer w = new OutputStreamWriter(os); + String s = filter.getCode(); + w.write(s); + w.close(); + lock.releaseLock(); + + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + } + } + + public void initFilters() { + + FileSystem fs = Repository.getDefault().getDefaultFileSystem(); + FileObject folder = fs.getRoot().getFileObject(FOLDER_ID); + FileObject[] children = folder.getChildren(); + + List customFilters = new ArrayList(); + HashMap afterMap = new HashMap(); + Set enabledSet = new HashSet(); + HashMap map = new HashMap(); + + for (final FileObject fo : children) { + InputStream is = null; + + String code = ""; + FileLock lock = null; + try { + lock = fo.lock(); + is = fo.getInputStream(); + BufferedReader r = new BufferedReader(new InputStreamReader(is)); + String s; + StringBuffer sb = new StringBuffer(); + while ((s = r.readLine()) != null) { + sb.append(s); + sb.append("\n"); + } + code = sb.toString(); + + } catch (FileNotFoundException ex) { + Exceptions.printStackTrace(ex); + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } finally { + try { + is.close(); + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + lock.releaseLock(); + } + + String displayName = fo.getName(); + + + final CustomFilter cf = new CustomFilter(displayName, code); + map.put(displayName, cf); + + String after = (String) fo.getAttribute(AFTER_ID); + afterMap.put(cf, after); + + Boolean enabled = (Boolean) fo.getAttribute(ENABLED_ID); + if (enabled != null && (boolean) enabled) { + enabledSet.add(cf); + } + + cf.getChangedEvent().addListener(new FilterChangedListener(fo, cf)); + + customFilters.add(cf); + } + + for (int j = 0; j < customFilters.size(); j++) { + for (int i = 0; i < customFilters.size(); i++) { + List copiedList = new ArrayList(customFilters); + for (CustomFilter cf : copiedList) { + + String after = afterMap.get(cf); + + if (map.containsKey(after)) { + CustomFilter afterCf = map.get(after); + int index = customFilters.indexOf(afterCf); + int currentIndex = customFilters.indexOf(cf); + + if (currentIndex < index) { + customFilters.remove(currentIndex); + customFilters.add(index, cf); + } + } + } + } + } + + for (CustomFilter cf : customFilters) { + sequence.addFilter(cf); + if (enabledSet.contains(cf)) { + filterChain.addFilter(cf); + } + } + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + setLayout(new java.awt.BorderLayout()); + + }// //GEN-END:initComponents + // Variables declaration - do not modify//GEN-BEGIN:variables + // End of variables declaration//GEN-END:variables + /** + * Gets default instance. Do not use directly: reserved for *.settings files only, + * i.e. deserialization routines; otherwise you could get a non-deserialized instance. + * To obtain the singleton instance, use {@link findInstance}. + */ + public static synchronized FilterTopComponent getDefault() { + if (instance == null) { + instance = new FilterTopComponent(); + } + return instance; + } + + /** + * Obtain the FilterTopComponent instance. Never call {@link #getDefault} directly! + */ + public static synchronized FilterTopComponent findInstance() { + TopComponent win = WindowManager.getDefault().findTopComponent(PREFERRED_ID); + if (win == null) { + ErrorManager.getDefault().log(ErrorManager.WARNING, "Cannot find Filter component. It will not be located properly in the window system."); + return getDefault(); + } + if (win instanceof FilterTopComponent) { + return (FilterTopComponent) win; + } + ErrorManager.getDefault().log(ErrorManager.WARNING, "There seem to be multiple components with the '" + PREFERRED_ID + "' ID. That is a potential source of errors and unexpected behavior."); + return getDefault(); + } + + @Override + public int getPersistenceType() { + return TopComponent.PERSISTENCE_ALWAYS; + } + + @Override + protected String preferredID() { + return PREFERRED_ID; + } + + @Override + public ExplorerManager getExplorerManager() { + return manager; + } + + @Override + public void componentOpened() { + Lookup.Template tpl = new Lookup.Template(FilterChain.class); + result = Utilities.actionsGlobalContext().lookup(tpl); + result.addLookupListener(this); + } + + @Override + public void componentClosed() { + result.removeLookupListener(this); + result = null; + } + + public void resultChanged(LookupEvent lookupEvent) { + setChain(Utilities.actionsGlobalContext().lookup(FilterChain.class)); + /* + EditorTopComponent tc = EditorTopComponent.getActive(); + if (tc != null) { + setChain(tc.getFilterChain()); + }*/ + } + + public void setChain(FilterChain chain) { + updateComboBoxSelection(); + } + + private FileObject getFileObject(CustomFilter cf) { + FileObject fo = Repository.getDefault().getDefaultFileSystem().getRoot().getFileObject(FOLDER_ID + "/" + cf.getName()); + if (fo == null) { + try { + fo = org.openide.filesystems.Repository.getDefault().getDefaultFileSystem().getRoot().getFileObject(FOLDER_ID).createData(cf.getName()); + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + } + return fo; + } + + @Override + public void writeExternal(ObjectOutput out) throws IOException { + super.writeExternal(out); + + out.writeInt(filterSettings.size()); + for (FilterSetting f : filterSettings) { + out.writeUTF(f.getName()); + + out.writeInt(f.getFilterCount()); + for (Filter filter : f.getFilters()) { + CustomFilter cf = (CustomFilter) filter; + out.writeUTF(cf.getName()); + } + } + + CustomFilter prev = null; + for (Filter f : this.sequence.getFilters()) { + CustomFilter cf = (CustomFilter) f; + FileObject fo = getFileObject(cf); + if (getFilterChain().containsFilter(cf)) { + fo.setAttribute(ENABLED_ID, true); + } else { + fo.setAttribute(ENABLED_ID, false); + } + + if (prev == null) { + fo.setAttribute(AFTER_ID, null); + } else { + fo.setAttribute(AFTER_ID, prev.getName()); + } + + prev = cf; + } + } + + public CustomFilter findFilter(String name) { + for (Filter f : sequence.getFilters()) { + + CustomFilter cf = (CustomFilter) f; + if (cf.getName().equals(name)) { + return cf; + } + } + + return null; + } + + @Override + public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { + super.readExternal(in); + + int filterSettingsCount = in.readInt(); + for (int i = 0; i < filterSettingsCount; i++) { + String name = in.readUTF(); + FilterSetting s = new FilterSetting(name); + int filterCount = in.readInt(); + for (int j = 0; j < filterCount; j++) { + String filterName = in.readUTF(); + CustomFilter filter = findFilter(filterName); + if (filter != null) { + s.addFilter(filter); + } + } + + filterSettings.add(s); + } + updateComboBox(); + } + + final static class ResolvableHelper implements Serializable { + + private static final long serialVersionUID = 1L; + + public Object readResolve() { + return FilterTopComponent.getDefault(); + } + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponentSettings.xml b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponentSettings.xml new file mode 100644 index 00000000000..6ae22f0fcd8 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponentSettings.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponentWstcref.xml b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponentWstcref.xml new file mode 100644 index 00000000000..cc493bc5d6d --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponentWstcref.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/Bundle.properties new file mode 100644 index 00000000000..8cf238dc8c3 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/Bundle.properties @@ -0,0 +1,10 @@ +# To change this template, choose Tools | Templates +# and open the template in the editor. + +CTL_FilterAction=Open Filter Window +CTL_MoveFilterDownAction=Move downwards +CTL_MoveFilterUpAction=Move upwards +CTL_NewFilterAction=New filter... +CTL_RemoveFilterAction=Remove +CTL_RemoveFilterSettingsAction=Remove filter setting +CTL_SaveFilterSettingsAction=Save filter settings... diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/FilterAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/FilterAction.java new file mode 100644 index 00000000000..ad2d1e435b1 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/FilterAction.java @@ -0,0 +1,47 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.filterwindow.actions; + +import com.sun.hotspot.igv.filterwindow.*; +import java.awt.event.ActionEvent; +import javax.swing.AbstractAction; +import org.openide.util.NbBundle; +import org.openide.windows.TopComponent; + +/** + * + * @author Thomas Wuerthinger + */ +public class FilterAction extends AbstractAction { + + public FilterAction() { + super(NbBundle.getMessage(FilterAction.class, "CTL_FilterAction")); + } + + public void actionPerformed(ActionEvent evt) { + TopComponent win = FilterTopComponent.findInstance(); + win.open(); + win.requestActive(); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/MoveFilterDownAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/MoveFilterDownAction.java new file mode 100644 index 00000000000..c2849fc1163 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/MoveFilterDownAction.java @@ -0,0 +1,85 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.filterwindow.actions; + +import com.sun.hotspot.igv.filterwindow.FilterTopComponent; +import com.sun.hotspot.igv.filter.Filter; +import javax.swing.Action; +import org.openide.nodes.Node; +import org.openide.util.HelpCtx; +import org.openide.util.NbBundle; +import org.openide.util.actions.CookieAction; + +/** + * + * @author Thomas Wuerthinger + */ +public final class MoveFilterDownAction extends CookieAction { + + protected void performAction(Node[] activatedNodes) { + for (Node n : activatedNodes) { + Filter c = n.getLookup().lookup(Filter.class); + FilterTopComponent.findInstance().getSequence().moveFilterDown(c); + } + } + + protected int mode() { + return CookieAction.MODE_EXACTLY_ONE; + } + + public MoveFilterDownAction() { + + putValue(Action.SHORT_DESCRIPTION, "Move filter downwards"); + } + + public String getName() { + return NbBundle.getMessage(MoveFilterUpAction.class, "CTL_MoveFilterDownAction"); + } + + protected Class[] cookieClasses() { + return new Class[]{ + Filter.class + }; + } + + @Override + protected String iconResource() { + return "com/sun/hotspot/igv/filterwindow/images/down.gif"; + } + + @Override + protected void initialize() { + super.initialize(); + putValue("noIconInMenu", Boolean.TRUE); + } + + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + protected boolean asynchronous() { + return false; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/MoveFilterUpAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/MoveFilterUpAction.java new file mode 100644 index 00000000000..c75238ba05c --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/MoveFilterUpAction.java @@ -0,0 +1,84 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.filterwindow.actions; + +import com.sun.hotspot.igv.filterwindow.FilterTopComponent; +import com.sun.hotspot.igv.filter.Filter; +import javax.swing.Action; +import org.openide.nodes.Node; +import org.openide.util.HelpCtx; +import org.openide.util.NbBundle; +import org.openide.util.actions.CookieAction; + +/** + * + * @author Thomas Wuerthinger + */ +public final class MoveFilterUpAction extends CookieAction { + + protected void performAction(Node[] activatedNodes) { + for (Node n : activatedNodes) { + Filter c = n.getLookup().lookup(Filter.class); + FilterTopComponent.findInstance().getSequence().moveFilterUp(c); + } + } + + protected int mode() { + return CookieAction.MODE_EXACTLY_ONE; + } + + public MoveFilterUpAction() { + putValue(Action.SHORT_DESCRIPTION, "Move filter upwards"); + } + + public String getName() { + return NbBundle.getMessage(MoveFilterUpAction.class, "CTL_MoveFilterUpAction"); + } + + protected Class[] cookieClasses() { + return new Class[]{ + Filter.class + }; + } + + @Override + protected String iconResource() { + return "com/sun/hotspot/igv/filterwindow/images/up.gif"; + } + + @Override + protected void initialize() { + super.initialize(); + putValue("noIconInMenu", Boolean.TRUE); + } + + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + protected boolean asynchronous() { + return false; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/NewFilterAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/NewFilterAction.java new file mode 100644 index 00000000000..22bb760613d --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/NewFilterAction.java @@ -0,0 +1,68 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.filterwindow.actions; + +import com.sun.hotspot.igv.filterwindow.FilterTopComponent; +import javax.swing.Action; +import org.openide.util.HelpCtx; +import org.openide.util.NbBundle; +import org.openide.util.actions.CallableSystemAction; + +/** + * + * @author Thomas Wuerthinger + */ +public final class NewFilterAction extends CallableSystemAction { + + public NewFilterAction() { + putValue(Action.SHORT_DESCRIPTION, "Create new filter"); + } + + public void performAction() { + FilterTopComponent.findInstance().newFilter(); + } + + public String getName() { + return NbBundle.getMessage(SaveFilterSettingsAction.class, "CTL_NewFilterAction"); + } + + @Override + protected void initialize() { + super.initialize(); + } + + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + protected boolean asynchronous() { + return false; + } + + @Override + protected String iconResource() { + return "com/sun/hotspot/igv/filterwindow/images/plus.gif"; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/RemoveFilterAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/RemoveFilterAction.java new file mode 100644 index 00000000000..86d8577f2c8 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/RemoveFilterAction.java @@ -0,0 +1,99 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.filterwindow.actions; + +import com.sun.hotspot.igv.filterwindow.FilterTopComponent; +import com.sun.hotspot.igv.filter.Filter; +import javax.swing.Action; +import javax.swing.JOptionPane; +import org.openide.nodes.Node; +import org.openide.util.HelpCtx; +import org.openide.util.NbBundle; +import org.openide.util.actions.CookieAction; +import org.openide.windows.WindowManager; + +/** + * + * @author Thomas Wuerthinger + */ +public final class RemoveFilterAction extends CookieAction { + + protected void performAction(Node[] activatedNodes) { + Object[] options = {"Yes", + "No", + "Cancel" + }; + int n = JOptionPane.showOptionDialog(WindowManager.getDefault().getMainWindow(), + "Do you really want to delete " + activatedNodes.length + " filter/s?", "Delete?", + JOptionPane.YES_NO_CANCEL_OPTION, + JOptionPane.QUESTION_MESSAGE, + null, + options, + options[2]); + + if (n == JOptionPane.YES_OPTION) { + for (int i = 0; i < activatedNodes.length; i++) { + FilterTopComponent.findInstance().removeFilter(activatedNodes[i].getLookup().lookup(Filter.class)); + } + } + } + + protected int mode() { + return CookieAction.MODE_ALL; + } + + public String getName() { + return NbBundle.getMessage(RemoveFilterAction.class, "CTL_RemoveFilterAction"); + } + + public RemoveFilterAction() { + putValue(Action.SHORT_DESCRIPTION, "Remove filter"); + } + + protected Class[] cookieClasses() { + return new Class[]{ + Filter.class + }; + } + + @Override + protected void initialize() { + super.initialize(); + putValue("noIconInMenu", Boolean.TRUE); + } + + @Override + protected String iconResource() { + return "com/sun/hotspot/igv/filterwindow/images/minus.gif"; + } + + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + protected boolean asynchronous() { + return false; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/RemoveFilterSettingsAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/RemoveFilterSettingsAction.java new file mode 100644 index 00000000000..ead48f27cde --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/RemoveFilterSettingsAction.java @@ -0,0 +1,68 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.filterwindow.actions; + +import com.sun.hotspot.igv.filterwindow.FilterTopComponent; +import javax.swing.Action; +import org.openide.util.HelpCtx; +import org.openide.util.NbBundle; +import org.openide.util.actions.CallableSystemAction; + +/** + * + * @author Thomas Wuerthinger + */ +public final class RemoveFilterSettingsAction extends CallableSystemAction { + + public void performAction() { + FilterTopComponent.findInstance().removeFilterSetting(); + } + + public String getName() { + return NbBundle.getMessage(RemoveFilterSettingsAction.class, "CTL_RemoveFilterSettingsAction"); + } + + public RemoveFilterSettingsAction() { + putValue(Action.SHORT_DESCRIPTION, "Remove filter profile"); + } + + @Override + protected void initialize() { + super.initialize(); + } + + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + protected boolean asynchronous() { + return false; + } + + @Override + protected String iconResource() { + return "com/sun/hotspot/igv/filterwindow/images/delete.gif"; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/SaveFilterSettingsAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/SaveFilterSettingsAction.java new file mode 100644 index 00000000000..59d5b789594 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/SaveFilterSettingsAction.java @@ -0,0 +1,68 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.filterwindow.actions; + +import com.sun.hotspot.igv.filterwindow.FilterTopComponent; +import javax.swing.Action; +import org.openide.util.HelpCtx; +import org.openide.util.NbBundle; +import org.openide.util.actions.CallableSystemAction; + +/** + * + * @author Thomas Wuerthinger + */ +public final class SaveFilterSettingsAction extends CallableSystemAction { + + public void performAction() { + FilterTopComponent.findInstance().addFilterSetting(); + } + + public String getName() { + return NbBundle.getMessage(SaveFilterSettingsAction.class, "CTL_SaveFilterSettingsAction"); + } + + @Override + protected void initialize() { + super.initialize(); + } + + public SaveFilterSettingsAction() { + putValue(Action.SHORT_DESCRIPTION, "Create new filter profile"); + } + + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + protected boolean asynchronous() { + return false; + } + + @Override + protected String iconResource() { + return "com/sun/hotspot/igv/filterwindow/images/add.gif"; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/customRightTopWsmode.xml b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/customRightTopWsmode.xml new file mode 100644 index 00000000000..ca1b2772e89 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/customRightTopWsmode.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/add.gif b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/add.gif new file mode 100644 index 00000000000..0fc47e193cf Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/add.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/delete.gif b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/delete.gif new file mode 100644 index 00000000000..3f83fce4b9a Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/delete.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/down.gif b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/down.gif new file mode 100644 index 00000000000..6123422ddde Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/down.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/minus.gif b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/minus.gif new file mode 100644 index 00000000000..ba0d281cf90 Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/minus.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/plus.gif b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/plus.gif new file mode 100644 index 00000000000..5e2274da3fc Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/plus.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/up.gif b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/up.gif new file mode 100644 index 00000000000..277f5bb492b Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/up.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/layer.xml b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/layer.xml new file mode 100644 index 00000000000..8d1367e773a --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/layer.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/build.xml new file mode 100644 index 00000000000..7843b57f1d5 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/build.xml @@ -0,0 +1,8 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.graph. + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/manifest.mf new file mode 100644 index 00000000000..aee3b0e8ec5 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/manifest.mf @@ -0,0 +1,5 @@ +Manifest-Version: 1.0 +OpenIDE-Module: com.sun.hotspot.igv.graph +OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/graph/Bundle.properties +OpenIDE-Module-Specification-Version: 1.0 + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/build-impl.xml new file mode 100644 index 00000000000..d4b873896f2 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/build-impl.xml @@ -0,0 +1,30 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/genfiles.properties new file mode 100644 index 00000000000..473f81981cd --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=b2bc2f02 +build.xml.script.CRC32=486d5dab +build.xml.stylesheet.CRC32=79c3b980 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=b2bc2f02 +nbproject/build-impl.xml.script.CRC32=17fa0f49 +nbproject/build-impl.xml.stylesheet.CRC32=deb65f65 diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/platform.properties new file mode 100644 index 00000000000..68ad75e5766 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/platform.properties @@ -0,0 +1,29 @@ +# Deprecated since 5.0u1; for compatibility with 5.0: +disabled.clusters=\ + apisupport1,\ + harness,\ + ide8,\ + java1,\ + nb6.0,\ + profiler2 +disabled.modules=\ + org.netbeans.core.execution,\ + org.netbeans.core.multiview,\ + org.netbeans.core.output2,\ + org.netbeans.modules.applemenu,\ + org.netbeans.modules.autoupdate.services,\ + org.netbeans.modules.autoupdate.ui,\ + org.netbeans.modules.core.kit,\ + org.netbeans.modules.favorites,\ + org.netbeans.modules.javahelp,\ + org.netbeans.modules.masterfs,\ + org.netbeans.modules.options.keymap,\ + org.netbeans.modules.sendopts,\ + org.netbeans.modules.templates,\ + org.openide.compat,\ + org.openide.execution,\ + org.openide.util.enumerations +enabled.clusters=\ + platform7 +nbjdk.active=JDK_1.6 +nbplatform.active=default diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/project.properties new file mode 100644 index 00000000000..152f44eca60 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/project.properties @@ -0,0 +1,2 @@ +javac.source=1.5 +javac.compilerargs=-Xlint -Xlint:-serial diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/project.xml new file mode 100644 index 00000000000..c8fbe3c294f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/project.xml @@ -0,0 +1,31 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.graph + + + + com.sun.hotspot.igv.data + + + + 1.0 + + + + com.sun.hotspot.igv.layout + + + + 1.0 + + + + + com.sun.hotspot.igv.graph + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/suite.properties new file mode 100644 index 00000000000..29d7cc9bd6f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/suite.properties @@ -0,0 +1 @@ +suite.dir=${basedir}/.. diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/AndSelector.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/AndSelector.java new file mode 100644 index 00000000000..d15ed8d152d --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/AndSelector.java @@ -0,0 +1,54 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.graph; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public class AndSelector implements Selector { + + private Selector selector1; + private Selector selector2; + + public AndSelector(Selector s1, Selector s2) { + this.selector1 = s1; + this.selector2 = s2; + } + + public List
    selected(Diagram d) { + List
    l1 = selector1.selected(d); + List
    l2 = selector2.selected(d); + List
    result = new ArrayList
    (); + for (Figure f : l2) { + if (l1.contains(f)) { + result.add(f); + } + } + return result; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Block.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Block.java new file mode 100644 index 00000000000..eaa73b70519 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Block.java @@ -0,0 +1,82 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.graph; + +import com.sun.hotspot.igv.data.InputBlock; +import com.sun.hotspot.igv.layout.Cluster; +import java.awt.Rectangle; +import java.util.HashSet; +import java.util.Set; + +/** + * + * @author Thomas Wuerthinger + */ +public class Block implements Cluster { + + private InputBlock inputBlock; + private Rectangle bounds; + private Diagram diagram; + + public Block(InputBlock inputBlock, Diagram diagram) { + this.inputBlock = inputBlock; + this.diagram = diagram; + } + + public Cluster getOuter() { + return null; + } + + public InputBlock getInputBlock() { + return inputBlock; + } + + public Set getSuccessors() { + Set succs = new HashSet(); + for (InputBlock b : inputBlock.getSuccessors()) { + succs.add(diagram.getBlock(b)); + } + return succs; + } + + public Set getPredecessors() { + Set succs = new HashSet(); + for (InputBlock b : inputBlock.getPredecessors()) { + succs.add(diagram.getBlock(b)); + } + return succs; + } + + public void setBounds(Rectangle r) { + this.bounds = r; + } + + public Rectangle getBounds() { + return bounds; + } + + public int compareTo(Cluster o) { + return toString().compareTo(o.toString()); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Bundle.properties new file mode 100644 index 00000000000..b7434e09e98 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Bundle.properties @@ -0,0 +1 @@ +OpenIDE-Module-Name=Graph diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Connection.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Connection.java new file mode 100644 index 00000000000..8c027b0b3c3 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Connection.java @@ -0,0 +1,123 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.graph; + +import com.sun.hotspot.igv.layout.Link; +import com.sun.hotspot.igv.layout.Port; +import java.awt.Color; +import java.awt.Point; +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public class Connection implements Source.Provider, Link { + + public enum ConnectionStyle { + + NORMAL, + DASHED, + BOLD + } + private InputSlot inputSlot; + private OutputSlot outputSlot; + private Source source; + private Color color; + private ConnectionStyle style; + private List controlPoints; + + protected Connection(InputSlot inputSlot, OutputSlot outputSlot) { + this.inputSlot = inputSlot; + this.outputSlot = outputSlot; + this.inputSlot.connections.add(this); + this.outputSlot.connections.add(this); + controlPoints = new ArrayList(); + Figure sourceFigure = this.outputSlot.getFigure(); + Figure destFigure = this.inputSlot.getFigure(); + sourceFigure.addSuccessor(destFigure); + destFigure.addPredecessor(sourceFigure); + source = new Source(); + + this.color = Color.BLACK; + this.style = ConnectionStyle.NORMAL; + } + + public InputSlot getInputSlot() { + return inputSlot; + } + + public OutputSlot getOutputSlot() { + return outputSlot; + } + + public Color getColor() { + return color; + } + + public ConnectionStyle getStyle() { + return style; + } + + public void setColor(Color c) { + color = c; + } + + public void setStyle(ConnectionStyle s) { + style = s; + } + + public Source getSource() { + return source; + } + + public void remove() { + inputSlot.getFigure().removePredecessor(outputSlot.getFigure()); + inputSlot.connections.remove(this); + outputSlot.getFigure().removeSuccessor(inputSlot.getFigure()); + outputSlot.connections.remove(this); + } + + @Override + public String toString() { + return "Connection(" + getFrom().getVertex() + " to " + getTo().getVertex() + ")"; + } + + public Port getFrom() { + return outputSlot; + } + + public Port getTo() { + return inputSlot; + } + + public List getControlPoints() { + return controlPoints; + } + + public void setControlPoints(List list) { + controlPoints = list; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Diagram.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Diagram.java new file mode 100644 index 00000000000..00d48f6e926 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Diagram.java @@ -0,0 +1,294 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.graph; + +import com.sun.hotspot.igv.data.InputBlock; +import com.sun.hotspot.igv.data.InputEdge; +import com.sun.hotspot.igv.data.InputGraph; +import com.sun.hotspot.igv.data.InputNode; +import com.sun.hotspot.igv.data.Properties; +import java.awt.Font; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * + * @author Thomas Wuerthinger + */ +public class Diagram { + + private List
    figures; + private Map blocks; + private InputGraph graph; + private int curId; + private String nodeText; + private Font font; + + public Font getFont() { + return font; + } + + private Diagram() { + figures = new ArrayList
    (); + blocks = new HashMap(); + this.nodeText = ""; + this.font = new Font("Serif", Font.PLAIN, 14); + } + + public Block getBlock(InputBlock b) { + return blocks.get(b); + } + + public String getNodeText() { + return nodeText; + } + + public void schedule(Collection newBlocks) { + graph.schedule(newBlocks); + updateBlocks(); + } + + private void updateBlocks() { + blocks.clear(); + for (InputBlock b : graph.getBlocks()) { + Block curBlock = new Block(b, this); + blocks.put(b, curBlock); + } + } + + public Diagram getNext() { + return Diagram.createDiagram(graph.getNext(), nodeText); + } + + public Collection getBlocks() { + return Collections.unmodifiableCollection(blocks.values()); + } + + public Diagram getPrev() { + return Diagram.createDiagram(graph.getPrev(), nodeText); + } + + public List
    getFigures() { + return Collections.unmodifiableList(figures); + } + + public Figure createFigure() { + Figure f = new Figure(this, curId); + curId++; + this.figures.add(f); + return f; + } + + public Connection createConnection(InputSlot inputSlot, OutputSlot outputSlot) { + assert inputSlot.getFigure().getDiagram() == this; + assert outputSlot.getFigure().getDiagram() == this; + return new Connection(inputSlot, outputSlot); + } + + public static Diagram createDiagram(InputGraph graph, String nodeText) { + if (graph == null) { + return null; + } + + Diagram d = new Diagram(); + d.graph = graph; + d.nodeText = nodeText; + + d.updateBlocks(); + + Collection nodes = graph.getNodes(); + Hashtable figureHash = new Hashtable(); + for (InputNode n : nodes) { + Figure f = d.createFigure(); + f.getSource().addSourceNode(n); + f.getProperties().add(n.getProperties()); + figureHash.put(n.getId(), f); + } + + for (InputEdge e : graph.getEdges()) { + + int from = e.getFrom(); + int to = e.getTo(); + Figure fromFigure = figureHash.get(from); + Figure toFigure = figureHash.get(to); + assert fromFigure != null && toFigure != null; + + int toIndex = e.getToIndex(); + + while (fromFigure.getOutputSlots().size() <= 0) { + fromFigure.createOutputSlot(); + } + + OutputSlot outputSlot = fromFigure.getOutputSlots().get(0); + + while (toFigure.getInputSlots().size() <= toIndex) { + toFigure.createInputSlot(); + } + + InputSlot inputSlot = toFigure.getInputSlots().get(toIndex); + + Connection c = d.createConnection(inputSlot, outputSlot); + + if (e.getState() == InputEdge.State.NEW) { + c.setStyle(Connection.ConnectionStyle.BOLD); + } else if (e.getState() == InputEdge.State.DELETED) { + c.setStyle(Connection.ConnectionStyle.DASHED); + } + } + + + return d; + } + + public void removeAllFigures(Set
    figuresToRemove) { + for (Figure f : figuresToRemove) { + freeFigure(f); + } + + ArrayList
    newFigures = new ArrayList
    (); + for (Figure f : this.figures) { + if (!figuresToRemove.contains(f)) { + newFigures.add(f); + } + } + figures = newFigures; + } + + private void freeFigure(Figure succ) { + + List inputSlots = new ArrayList(succ.getInputSlots()); + for (InputSlot s : inputSlots) { + succ.removeInputSlot(s); + } + + List outputSlots = new ArrayList(succ.getOutputSlots()); + for (OutputSlot s : outputSlots) { + succ.removeOutputSlot(s); + } + + assert succ.getInputSlots().size() == 0; + assert succ.getOutputSlots().size() == 0; + assert succ.getPredecessors().size() == 0; + assert succ.getSuccessors().size() == 0; + + } + + public void removeFigure(Figure succ) { + + assert this.figures.contains(succ); + freeFigure(succ); + this.figures.remove(succ); + } + + public String getName() { + return graph.getName(); + } + + public InputGraph getGraph() { + return graph; + } + + public Set getConnections() { + + Set connections = new HashSet(); + for (Figure f : figures) { + + for (InputSlot s : f.getInputSlots()) { + connections.addAll(s.getConnections()); + } + } + + return connections; + } + + public Figure getRootFigure() { + Properties.PropertySelector
    selector = new Properties.PropertySelector
    (figures); + Figure root = selector.selectSingle("name", "Root"); + if (root == null) { + root = selector.selectSingle("name", "Start"); + } + if (root == null) { + List
    rootFigures = getRootFigures(); + if (rootFigures.size() > 0) { + root = rootFigures.get(0); + } else if (figures.size() > 0) { + root = figures.get(0); + } + } + + return root; + } + + public void printStatistics() { + System.out.println("============================================================="); + System.out.println("Diagram statistics"); + + List
    tmpFigures = getFigures(); + Set connections = getConnections(); + + System.out.println("Number of figures: " + tmpFigures.size()); + System.out.println("Number of connections: " + connections.size()); + + List
    figuresSorted = new ArrayList
    (tmpFigures); + Collections.sort(figuresSorted, new Comparator
    () { + + public int compare(Figure a, Figure b) { + return b.getPredecessors().size() + b.getSuccessors().size() - a.getPredecessors().size() - a.getSuccessors().size(); + } + }); + + final int COUNT = 10; + int z = 0; + for (Figure f : figuresSorted) { + + z++; + int sum = f.getPredecessors().size() + f.getSuccessors().size(); + System.out.println("#" + z + ": " + f + ", predCount=" + f.getPredecessors().size() + " succCount=" + f.getSuccessors().size()); + if (sum < COUNT) { + break; + } + + } + + System.out.println("============================================================="); + } + + public List
    getRootFigures() { + ArrayList
    rootFigures = new ArrayList
    (); + for (Figure f : figures) { + if (f.getPredecessors().size() == 0) { + rootFigures.add(f); + } + } + return rootFigures; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Figure.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Figure.java new file mode 100644 index 00000000000..cfb913ca318 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Figure.java @@ -0,0 +1,328 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.graph; + +import com.sun.hotspot.igv.layout.Cluster; +import com.sun.hotspot.igv.layout.Vertex; +import com.sun.hotspot.igv.data.Properties; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Point; +import java.awt.image.BufferedImage; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * + * @author Thomas Wuerthinger + */ +public class Figure extends Properties.Object implements Source.Provider, Vertex { + + public static final int INSET = 6; + public static final int SLOT_WIDTH = 10; + public static final int SLOT_START = 3; + public static final boolean VERTICAL_LAYOUT = true; + protected List inputSlots; + protected List outputSlots; + private Source source; + private Diagram diagram; + private Point position; + private List
    predecessors; + private List
    successors; + private Color color; + private int id; + private String idString; + private String[] lines; + private int heightCash = -1; + private int widthCash = -1; + + public int getHeight() { + if (heightCash == -1) { + BufferedImage image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB); + Graphics g = image.getGraphics(); + g.setFont(diagram.getFont()); + FontMetrics metrics = g.getFontMetrics(); + String nodeText = diagram.getNodeText(); + heightCash = nodeText.split("\n").length * metrics.getHeight() + INSET; + } + return heightCash; + } + + public int getWidth() { + if (widthCash == -1) { + int max = 0; + BufferedImage image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB); + Graphics g = image.getGraphics(); + g.setFont(diagram.getFont()); + FontMetrics metrics = g.getFontMetrics(); + for (String s : lines) { + int cur = metrics.stringWidth(s); + if (cur > max) { + max = cur; + } + } + widthCash = max + INSET; + } + return widthCash; + } + + protected Figure(Diagram diagram, int id) { + this.diagram = diagram; + this.source = new Source(); + inputSlots = new ArrayList(5); + outputSlots = new ArrayList(1); + predecessors = new ArrayList
    (6); + successors = new ArrayList
    (6); + this.id = id; + idString = Integer.toString(id); + + this.position = new Point(0, 0); + this.color = Color.WHITE; + } + + public int getId() { + return id; + } + + public void setColor(Color color) { + this.color = color; + } + + public Color getColor() { + return color; + } + + public List
    getPredecessors() { + return Collections.unmodifiableList(predecessors); + } + + public Set
    getPredecessorSet() { + Set
    result = new HashSet
    (); + for (Figure f : getPredecessors()) { + result.add(f); + } + return Collections.unmodifiableSet(result); + } + + public Set
    getSuccessorSet() { + Set
    result = new HashSet
    (); + for (Figure f : getSuccessors()) { + result.add(f); + } + return Collections.unmodifiableSet(result); + } + + public List
    getSuccessors() { + return Collections.unmodifiableList(successors); + } + + protected void addPredecessor(Figure f) { + this.predecessors.add(f); + } + + protected void addSuccessor(Figure f) { + this.successors.add(f); + } + + protected void removePredecessor(Figure f) { + assert predecessors.contains(f); + predecessors.remove(f); + } + + protected void removeSuccessor(Figure f) { + assert successors.contains(f); + successors.remove(f); + } + + public void setPosition(Point p) { + this.position = p; + } + + public Point getPosition() { + return position; + } + + public Diagram getDiagram() { + return diagram; + } + + public Source getSource() { + return source; + } + + public InputSlot createInputSlot() { + InputSlot slot = new InputSlot(this, -1); + inputSlots.add(slot); + return slot; + } + + public InputSlot createInputSlot(int index) { + InputSlot slot = new InputSlot(this, index); + inputSlots.add(slot); + Collections.sort(inputSlots, Slot.slotIndexComparator); + return slot; + } + + public void removeSlot(Slot s) { + + assert inputSlots.contains(s) || outputSlots.contains(s); + + List connections = new ArrayList(s.getConnections()); + for (Connection c : connections) { + c.remove(); + } + + if (inputSlots.contains(s)) { + inputSlots.remove(s); + } else if (outputSlots.contains(s)) { + outputSlots.remove(s); + } + } + + public OutputSlot createOutputSlot() { + OutputSlot slot = new OutputSlot(this, -1); + outputSlots.add(slot); + return slot; + } + + public OutputSlot createOutputSlot(int index) { + OutputSlot slot = new OutputSlot(this, index); + outputSlots.add(slot); + Collections.sort(outputSlots, Slot.slotIndexComparator); + return slot; + } + + public List getInputSlots() { + return Collections.unmodifiableList(inputSlots); + } + + public List getOutputSlots() { + return Collections.unmodifiableList(outputSlots); + } + + void removeInputSlot(InputSlot s) { + s.removeAllConnections(); + inputSlots.remove(s); + } + + void removeOutputSlot(OutputSlot s) { + s.removeAllConnections(); + outputSlots.remove(s); + } + + public String[] getLines() { + if (lines == null) { + updateLines(); + } + return lines; + } + + public void updateLines() { + String[] strings = diagram.getNodeText().split("\n"); + String[] result = new String[strings.length]; + + for (int i = 0; i < strings.length; i++) { + result[i] = resolveString(strings[i]); + } + + lines = result; + } + + private String resolveString(String string) { + + StringBuilder sb = new StringBuilder(); + boolean inBrackets = false; + StringBuilder curIdent = new StringBuilder(); + + for (int i = 0; i < string.length(); i++) { + char c = string.charAt(i); + if (inBrackets) { + if (c == ']') { + String value = getProperties().get(curIdent.toString()); + if (value == null) { + value = ""; + } + sb.append(value); + inBrackets = false; + } else { + curIdent.append(c); + } + } else { + if (c == '[') { + inBrackets = true; + curIdent = new StringBuilder(); + } else { + sb.append(c); + } + } + } + + return sb.toString(); + } + + public Dimension getSize() { + if (VERTICAL_LAYOUT) { + int width = Math.max(getWidth(), Figure.SLOT_WIDTH * (Math.max(inputSlots.size(), outputSlots.size()) + 1)); + int height = getHeight() + 2 * Figure.SLOT_WIDTH; + return new Dimension(width, height); + } else { + int width = getWidth() + 2 * Figure.SLOT_WIDTH; + int height = Figure.SLOT_WIDTH * (Math.max(inputSlots.size(), outputSlots.size()) + 1); + return new Dimension(width, height); + } + } + + @Override + public String toString() { + return idString; + } + + public Cluster getCluster() { + if (getSource().getSourceNodes().size() == 0) { + assert false : "Should never reach here, every figure must have at least one source node!"; + return null; + } else { + Cluster result = diagram.getBlock(diagram.getGraph().getBlock(getSource().getSourceNodes().get(0))); + assert result != null; + return result; + } + } + + public boolean isRoot() { + if (source.getSourceNodes().size() > 0 && source.getSourceNodes().get(0).getProperties().get("name").equals("Root")) { + return true; + } else { + return false; + } + } + + public int compareTo(Vertex f) { + return toString().compareTo(f.toString()); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/InputSlot.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/InputSlot.java new file mode 100644 index 00000000000..9ffa077cddd --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/InputSlot.java @@ -0,0 +1,57 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.graph; + +import java.awt.Point; +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public class InputSlot extends Slot { + + protected InputSlot(Figure figure, int wantedIndex) { + super(figure, wantedIndex); + } + + public int getPosition() { + return getFigure().getInputSlots().indexOf(this); + } + + public void setPosition(int position) { + List inputSlots = getFigure().inputSlots; + InputSlot s = inputSlots.remove(position); + inputSlots.add(position, s); + } + + public Point getRelativePosition() { + return new Point(getFigure().getWidth() * (getPosition() + 1) / (getFigure().getInputSlots().size() + 1), Figure.SLOT_WIDTH - Figure.SLOT_START); + } + + @Override + public String toString() { + return "InputSlot[figure=" + this.getFigure().toString() + ", position=" + getPosition() + "]"; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/InvertSelector.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/InvertSelector.java new file mode 100644 index 00000000000..8cd8e467bf7 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/InvertSelector.java @@ -0,0 +1,53 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.graph; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public class InvertSelector implements Selector { + + private Selector selector; + + public InvertSelector(Selector selector) { + this.selector = selector; + } + + public List
    selected(Diagram d) { + + List
    result = new ArrayList
    (); + List
    otherResult = selector.selected(d); + for (Figure f : d.getFigures()) { + if (!otherResult.contains(f)) { + result.add(f); + } + } + + return result; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/MatcherSelector.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/MatcherSelector.java new file mode 100644 index 00000000000..7ad17dd40a1 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/MatcherSelector.java @@ -0,0 +1,47 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.graph; + +import com.sun.hotspot.igv.data.Properties; +import com.sun.hotspot.igv.data.Properties.PropertyMatcher; +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public class MatcherSelector implements Selector { + + private PropertyMatcher matcher; + + public MatcherSelector(PropertyMatcher matcher) { + this.matcher = matcher; + } + + public List
    selected(Diagram d) { + Properties.PropertySelector
    selector = new Properties.PropertySelector
    (d.getFigures()); + List
    list = selector.selectMultiple(matcher); + return list; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/OrSelector.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/OrSelector.java new file mode 100644 index 00000000000..3a7e8299cc2 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/OrSelector.java @@ -0,0 +1,56 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.graph; + +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public class OrSelector implements Selector { + + private Selector selector1; + private Selector selector2; + + /** Creates a new instance of OrSelector */ + public OrSelector(Selector s1, Selector s2) { + this.selector1 = s1; + this.selector2 = s2; + } + + public List
    selected(Diagram d) { + + List
    l1 = selector1.selected(d); + List
    l2 = selector2.selected(d); + + for (Figure f : l2) { + if (!l1.contains(f)) { + l1.add(f); + } + } + + return l1; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/OutputSlot.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/OutputSlot.java new file mode 100644 index 00000000000..b85f3d37cfd --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/OutputSlot.java @@ -0,0 +1,55 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.graph; + +import java.awt.Point; + +/** + * + * @author Thomas Wuerthinger + */ +public class OutputSlot extends Slot { + + protected OutputSlot(Figure figure, int wantedIndex) { + super(figure, wantedIndex); + } + + public int getPosition() { + return getFigure().getOutputSlots().indexOf(this); + } + + public void setPosition(int position) { + OutputSlot s = getFigure().outputSlots.remove(position); + getFigure().outputSlots.add(position, s); + } + + public Point getRelativePosition() { + return new Point(getFigure().getWidth() * (getPosition() + 1) / (getFigure().getOutputSlots().size() + 1), getFigure().getSize().height - Figure.SLOT_WIDTH + Figure.SLOT_START); + } + + @Override + public String toString() { + return "OutputSlot[figure=" + this.getFigure().toString() + ", position=" + getPosition() + "]"; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/PredecessorSelector.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/PredecessorSelector.java new file mode 100644 index 00000000000..ab069325e06 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/PredecessorSelector.java @@ -0,0 +1,59 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.graph; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public class PredecessorSelector implements Selector { + + private Selector innerSelector; + + public PredecessorSelector(Selector innerSelector) { + this.innerSelector = innerSelector; + } + + public List
    selected(Diagram d) { + List
    inner = innerSelector.selected(d); + List
    result = new ArrayList
    (); + for (Figure f : d.getFigures()) { + boolean saved = false; + for (Figure f2 : f.getSuccessors()) { + if (inner.contains(f2)) { + saved = true; + } + } + + if (saved) { + result.add(f); + } + } + + return result; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Selector.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Selector.java new file mode 100644 index 00000000000..9b47d89eb7f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Selector.java @@ -0,0 +1,35 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.graph; + +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public interface Selector { + + List
    selected(Diagram d); +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Slot.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Slot.java new file mode 100644 index 00000000000..d525dbfe857 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Slot.java @@ -0,0 +1,125 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.graph; + +import com.sun.hotspot.igv.layout.Port; +import com.sun.hotspot.igv.layout.Vertex; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Comparator; + +/** + * + * @author Thomas Wuerthinger + */ +public abstract class Slot implements Port, Source.Provider { + + private int wantedIndex; + private String name; + private String shortName; // 1 - 2 characters + private Source source; + protected List connections; + private Figure figure; + + protected Slot(Figure figure, int wantedIndex) { + this.figure = figure; + connections = new ArrayList(2); + source = new Source(); + this.wantedIndex = wantedIndex; + name = ""; + shortName = ""; + assert figure != null; + } + public static final Comparator slotIndexComparator = new Comparator() { + + public int compare(Slot o1, Slot o2) { + return o1.wantedIndex - o2.wantedIndex; + } + }; + public static final Comparator slotFigureComparator = new Comparator() { + + public int compare(Slot o1, Slot o2) { + return o1.figure.getId() - o2.figure.getId(); + } + }; + + public int getWantedIndex() { + return wantedIndex; + } + + public Source getSource() { + return source; + } + + public String getName() { + return name; + } + + public void setShortName(String s) { + assert s != null; + assert s.length() <= 2; + this.shortName = s; + + } + + public String getShortName() { + return shortName; + } + + public boolean getShowName() { + return getShortName() != null && getShortName().length() > 0; + } + + public void setName(String s) { + if (s == null) { + s = ""; + } + this.name = s; + } + + public Figure getFigure() { + assert figure != null; + return figure; + } + + public List getConnections() { + return Collections.unmodifiableList(connections); + } + + public void removeAllConnections() { + List connectionsCopy = new ArrayList(this.connections); + for (Connection c : connectionsCopy) { + c.remove(); + } + } + + public Vertex getVertex() { + return figure; + } + + public abstract int getPosition(); + + public abstract void setPosition(int position); +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Source.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Source.java new file mode 100644 index 00000000000..a43b905d242 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Source.java @@ -0,0 +1,100 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.graph; + +import com.sun.hotspot.igv.data.InputBlock; +import com.sun.hotspot.igv.data.InputGraph; +import com.sun.hotspot.igv.data.InputNode; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * + * @author Thomas Wuerthinger + */ +public class Source { + + private List sourceNodes; + private Set set; + + public Source() { + sourceNodes = new ArrayList(1); + } + + public List getSourceNodes() { + return Collections.unmodifiableList(sourceNodes); + } + + public Set getSourceNodesAsSet() { + if (set == null) { + set = new HashSet(); + for (InputNode n : sourceNodes) { + int id = n.getId(); + //if(id < 0) id = -id; + set.add(id); + } + } + return set; + } + + public void addSourceNode(InputNode n) { + sourceNodes.add(n); + set = null; + } + + public void removeSourceNode(InputNode n) { + sourceNodes.remove(n); + set = null; + } + + public interface Provider { + + public Source getSource(); + } + + public void setSourceNodes(List sourceNodes) { + this.sourceNodes = sourceNodes; + set = null; + } + + public void addSourceNodes(Source s) { + for (InputNode n : s.getSourceNodes()) { + sourceNodes.add(n); + } + set = null; + } + + public boolean isInBlock(InputGraph g, InputBlock blockNode) { + + for (InputNode n : this.getSourceNodes()) { + if (g.getBlock(n) == blockNode) { + return true; + } + } + return false; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/SuccessorSelector.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/SuccessorSelector.java new file mode 100644 index 00000000000..da95a1796d6 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/SuccessorSelector.java @@ -0,0 +1,59 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.graph; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public class SuccessorSelector implements Selector { + + private Selector innerSelector; + + public SuccessorSelector(Selector innerSelector) { + this.innerSelector = innerSelector; + } + + public List
    selected(Diagram d) { + List
    inner = innerSelector.selected(d); + List
    result = new ArrayList
    (); + for (Figure f : d.getFigures()) { + boolean saved = false; + for (Figure f2 : f.getPredecessors()) { + if (inner.contains(f2)) { + saved = true; + } + } + + if (saved) { + result.add(f); + } + } + + return result; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/build.xml new file mode 100644 index 00000000000..8376e08d8a8 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/build.xml @@ -0,0 +1,8 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.hierarchicallayout. + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/manifest.mf new file mode 100644 index 00000000000..723afd12fac --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/manifest.mf @@ -0,0 +1,5 @@ +Manifest-Version: 1.0 +OpenIDE-Module: com.sun.hotspot.igv.hierarchicallayout +OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/hierarchicallayout/Bundle.properties +OpenIDE-Module-Specification-Version: 1.0 + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/build-impl.xml new file mode 100644 index 00000000000..3257988a701 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/build-impl.xml @@ -0,0 +1,30 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/genfiles.properties new file mode 100644 index 00000000000..cb74676188a --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=de087df9 +build.xml.script.CRC32=98977c36 +build.xml.stylesheet.CRC32=79c3b980 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=de087df9 +nbproject/build-impl.xml.script.CRC32=0d734625 +nbproject/build-impl.xml.stylesheet.CRC32=deb65f65 diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/platform.properties new file mode 100644 index 00000000000..68ad75e5766 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/platform.properties @@ -0,0 +1,29 @@ +# Deprecated since 5.0u1; for compatibility with 5.0: +disabled.clusters=\ + apisupport1,\ + harness,\ + ide8,\ + java1,\ + nb6.0,\ + profiler2 +disabled.modules=\ + org.netbeans.core.execution,\ + org.netbeans.core.multiview,\ + org.netbeans.core.output2,\ + org.netbeans.modules.applemenu,\ + org.netbeans.modules.autoupdate.services,\ + org.netbeans.modules.autoupdate.ui,\ + org.netbeans.modules.core.kit,\ + org.netbeans.modules.favorites,\ + org.netbeans.modules.javahelp,\ + org.netbeans.modules.masterfs,\ + org.netbeans.modules.options.keymap,\ + org.netbeans.modules.sendopts,\ + org.netbeans.modules.templates,\ + org.openide.compat,\ + org.openide.execution,\ + org.openide.util.enumerations +enabled.clusters=\ + platform7 +nbjdk.active=JDK_1.6 +nbplatform.active=default diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/project.properties new file mode 100644 index 00000000000..152f44eca60 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/project.properties @@ -0,0 +1,2 @@ +javac.source=1.5 +javac.compilerargs=-Xlint -Xlint:-serial diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/project.xml new file mode 100644 index 00000000000..fc4c20a9dad --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/project.xml @@ -0,0 +1,23 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.hierarchicallayout + + + + com.sun.hotspot.igv.layout + + + + 1.0 + + + + + com.sun.hotspot.igv.hierarchicallayout + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/suite.properties new file mode 100644 index 00000000000..29d7cc9bd6f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/suite.properties @@ -0,0 +1 @@ +suite.dir=${basedir}/.. diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Bundle.properties new file mode 100644 index 00000000000..037223194d3 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Bundle.properties @@ -0,0 +1 @@ +OpenIDE-Module-Name=HierarchicalLayout diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterEdge.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterEdge.java new file mode 100644 index 00000000000..343cc65f5c6 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterEdge.java @@ -0,0 +1,63 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.hierarchicallayout; + +import com.sun.hotspot.igv.layout.Link; +import com.sun.hotspot.igv.layout.Port; +import java.awt.Point; +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public class ClusterEdge implements Link { + + private ClusterNode from; + private ClusterNode to; + private List points; + + public ClusterEdge(ClusterNode from, ClusterNode to) { + assert from != null; + assert to != null; + this.from = from; + this.to = to; + } + + public Port getTo() { + return to.getInputSlot(); + } + + public Port getFrom() { + return from.getInputSlot(); + } + + public void setControlPoints(List p) { + this.points = p; + } + + public List getControlPoints() { + return points; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterIngoingConnection.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterIngoingConnection.java new file mode 100644 index 00000000000..e6588771c5b --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterIngoingConnection.java @@ -0,0 +1,76 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.hierarchicallayout; + +import com.sun.hotspot.igv.layout.Link; +import com.sun.hotspot.igv.layout.Port; +import java.awt.Point; +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public class ClusterIngoingConnection implements Link { + + private List controlPoints; + private ClusterInputSlotNode inputSlotNode; + private Link connection; + private Port inputSlot; + private Port outputSlot; + + public ClusterIngoingConnection(ClusterInputSlotNode inputSlotNode, Link c) { + this.inputSlotNode = inputSlotNode; + this.connection = c; + this.controlPoints = new ArrayList(); + + inputSlot = c.getTo(); + outputSlot = inputSlotNode.getOutputSlot(); + } + + public Link getConnection() { + return connection; + } + + public ClusterInputSlotNode getInputSlotNode() { + return inputSlotNode; + } + + public Port getTo() { + return inputSlot; + } + + public Port getFrom() { + return outputSlot; + } + + public void setControlPoints(List p) { + this.controlPoints = p; + } + + public List getControlPoints() { + return controlPoints; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterInputSlotNode.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterInputSlotNode.java new file mode 100644 index 00000000000..8458ed5afab --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterInputSlotNode.java @@ -0,0 +1,145 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.hierarchicallayout; + +import com.sun.hotspot.igv.layout.Cluster; +import com.sun.hotspot.igv.layout.Port; +import com.sun.hotspot.igv.layout.Vertex; +import java.awt.Dimension; +import java.awt.Point; + +/** + * + * @author Thomas Wuerthinger + */ +public class ClusterInputSlotNode implements Vertex { + + private final int SIZE = 0; + private Point position; + private Port inputSlot; + private Port outputSlot; + private ClusterNode blockNode; + private InterClusterConnection interBlockConnection; + private Cluster cluster; + private ClusterIngoingConnection conn; + + public void setIngoingConnection(ClusterIngoingConnection c) { + conn = c; + } + + public ClusterIngoingConnection getIngoingConnection() { + return conn; + } + private String id; + + @Override + public String toString() { + return id; + } + + public ClusterInputSlotNode(ClusterNode n, String id) { + this.blockNode = n; + this.id = id; + + n.addSubNode(this); + + final Vertex thisNode = this; + final ClusterNode thisBlockNode = blockNode; + + outputSlot = new Port() { + + public Point getRelativePosition() { + return new Point(0, 0); + } + + public Vertex getVertex() { + return thisNode; + } + + @Override + public String toString() { + return "OutPort of " + thisNode.toString(); + } + }; + + inputSlot = new Port() { + + public Point getRelativePosition() { + Point p = new Point(thisNode.getPosition()); + p.x += ClusterNode.BORDER; + p.y = 0; + return p; + } + + public Vertex getVertex() { + return thisBlockNode; + } + + @Override + public String toString() { + return "InPort of " + thisNode.toString(); + } + }; + } + + public Port getInputSlot() { + return inputSlot; + } + + public InterClusterConnection getInterBlockConnection() { + return interBlockConnection; + } + + public Port getOutputSlot() { + return outputSlot; + } + + public Dimension getSize() { + return new Dimension(SIZE, SIZE); + } + + public void setPosition(Point p) { + this.position = p; + } + + public Point getPosition() { + return position; + } + + public void setInterBlockConnection(InterClusterConnection interBlockConnection) { + this.interBlockConnection = interBlockConnection; + } + + public Cluster getCluster() { + return cluster; + } + + public boolean isRoot() { + return true; + } + + public int compareTo(Vertex o) { + return toString().compareTo(o.toString()); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterNode.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterNode.java new file mode 100644 index 00000000000..315ff82ae6e --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterNode.java @@ -0,0 +1,233 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.hierarchicallayout; + +import com.sun.hotspot.igv.layout.Cluster; +import com.sun.hotspot.igv.layout.Link; +import com.sun.hotspot.igv.layout.Port; +import com.sun.hotspot.igv.layout.Vertex; +import java.awt.Dimension; +import java.awt.Point; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * + * @author Thomas Wuerthinger + */ +public class ClusterNode implements Vertex { + + private Cluster cluster; + private Port inputSlot; + private Port outputSlot; + private Set subNodes; + private Dimension size; + private Point position; + private Set subEdges; + private boolean dirty; + private boolean root; + private String name; + public static final int BORDER = 20; + + public ClusterNode(Cluster cluster, String name) { + this.subNodes = new HashSet(); + this.subEdges = new HashSet(); + this.cluster = cluster; + position = new Point(0, 0); + this.name = name; + } + + public void addSubNode(Vertex v) { + subNodes.add(v); + } + + public void addSubEdge(Link l) { + subEdges.add(l); + } + + public Set getSubEdges() { + return Collections.unmodifiableSet(subEdges); + } + + public void updateSize() { + + + calculateSize(); + + final ClusterNode widget = this; + inputSlot = new Port() { + + public Point getRelativePosition() { + return new Point(size.width / 2, 0); + } + + public Vertex getVertex() { + return widget; + } + }; + + outputSlot = new Port() { + + public Point getRelativePosition() { + return new Point(size.width / 2, size.height); + } + + public Vertex getVertex() { + return widget; + } + }; + } + + private void calculateSize() { + + if (subNodes.size() == 0) { + size = new Dimension(0, 0); + } + + int minX = Integer.MAX_VALUE; + int maxX = Integer.MIN_VALUE; + int minY = Integer.MAX_VALUE; + int maxY = Integer.MIN_VALUE; + + + for (Vertex n : subNodes) { + Point p = n.getPosition(); + minX = Math.min(minX, p.x); + minY = Math.min(minY, p.y); + maxX = Math.max(maxX, p.x + n.getSize().width); + maxY = Math.max(maxY, p.y + n.getSize().height); + } + + for (Link l : subEdges) { + List points = l.getControlPoints(); + for (Point p : points) { + if (p != null) { + minX = Math.min(minX, p.x); + maxX = Math.max(maxX, p.x); + minY = Math.min(minY, p.y); + maxY = Math.max(maxY, p.y); + } + } + } + + size = new Dimension(maxX - minX, maxY - minY); + + // Normalize coordinates + for (Vertex n : subNodes) { + n.setPosition(new Point(n.getPosition().x - minX, n.getPosition().y - minY)); + } + + for (Link l : subEdges) { + List points = new ArrayList(l.getControlPoints()); + for (Point p : points) { + p.x -= minX; + p.y -= minY; + } + l.setControlPoints(points); + + } + + size.width += 2 * BORDER; + size.height += 2 * BORDER; + } + + public Port getInputSlot() { + return inputSlot; + + } + + public Port getOutputSlot() { + return outputSlot; + } + + public Dimension getSize() { + return size; + } + + public Point getPosition() { + return position; + } + + public void setPosition(Point pos) { + + this.position = pos; + for (Vertex n : subNodes) { + Point cur = new Point(n.getPosition()); + cur.translate(pos.x + BORDER, pos.y + BORDER); + n.setPosition(cur); + } + + for (Link e : subEdges) { + List arr = e.getControlPoints(); + ArrayList newArr = new ArrayList(); + for (Point p : arr) { + if (p != null) { + Point p2 = new Point(p); + p2.translate(pos.x + BORDER, pos.y + BORDER); + newArr.add(p2); + } else { + newArr.add(null); + } + } + + e.setControlPoints(newArr); + } + } + + public Cluster getCluster() { + return cluster; + } + + public void setCluster(Cluster c) { + cluster = c; + } + + public void setDirty(boolean b) { + dirty = b; + } + + public void setRoot(boolean b) { + root = b; + } + + public boolean isRoot() { + return root; + } + + public int compareTo(Vertex o) { + return toString().compareTo(o.toString()); + } + + @Override + public String toString() { + return name; + } + + public Set getSubNodes() { + return subNodes; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterOutgoingConnection.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterOutgoingConnection.java new file mode 100644 index 00000000000..babf2f228b5 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterOutgoingConnection.java @@ -0,0 +1,68 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.hierarchicallayout; + +import com.sun.hotspot.igv.layout.Link; +import com.sun.hotspot.igv.layout.Port; +import java.awt.Point; +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public class ClusterOutgoingConnection implements Link { + + private List intermediatePoints; + private ClusterOutputSlotNode outputSlotNode; + private Link connection; + private Port inputSlot; + private Port outputSlot; + + public ClusterOutgoingConnection(ClusterOutputSlotNode outputSlotNode, Link c) { + this.outputSlotNode = outputSlotNode; + this.connection = c; + this.intermediatePoints = new ArrayList(); + + outputSlot = c.getFrom(); + inputSlot = outputSlotNode.getInputSlot(); + } + + public Port getTo() { + return inputSlot; + } + + public Port getFrom() { + return outputSlot; + } + + public void setControlPoints(List p) { + this.intermediatePoints = p; + } + + public List getControlPoints() { + return intermediatePoints; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterOutputSlotNode.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterOutputSlotNode.java new file mode 100644 index 00000000000..924c9e0845c --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterOutputSlotNode.java @@ -0,0 +1,145 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.hierarchicallayout; + +import com.sun.hotspot.igv.layout.Cluster; +import com.sun.hotspot.igv.layout.Port; +import com.sun.hotspot.igv.layout.Vertex; +import java.awt.Dimension; +import java.awt.Point; + +/** + * + * @author Thomas Wuerthinger + */ +public class ClusterOutputSlotNode implements Vertex { + + private final int SIZE = 0; + private Point position; + private Port inputSlot; + private Port outputSlot; + private ClusterNode blockNode; + private boolean root; + private Cluster cluster; + private ClusterOutgoingConnection conn; + private String id; + + public void setOutgoingConnection(ClusterOutgoingConnection c) { + this.conn = c; + } + + public ClusterOutgoingConnection getOutgoingConnection() { + return conn; + } + + @Override + public String toString() { + return id; + } + + public ClusterOutputSlotNode(ClusterNode n, String id) { + this.blockNode = n; + this.id = id; + + n.addSubNode(this); + + final Vertex thisNode = this; + final ClusterNode thisBlockNode = blockNode; + + inputSlot = new Port() { + + public Point getRelativePosition() { + return new Point(0, 0); + } + + public Vertex getVertex() { + return thisNode; + } + + @Override + public String toString() { + return "InPort of " + thisNode.toString(); + } + }; + + outputSlot = new Port() { + + public Point getRelativePosition() { + Point p = new Point(thisNode.getPosition()); + p.x += ClusterNode.BORDER; + p.y = thisBlockNode.getSize().height; + return p; + } + + public Vertex getVertex() { + return thisBlockNode; + } + + @Override + public String toString() { + return "OutPort of " + thisNode.toString(); + } + }; + } + + public Dimension getSize() { + return new Dimension(SIZE, SIZE); + } + + public void setPosition(Point p) { + this.position = p; + } + + public Point getPosition() { + return position; + } + + public Port getInputSlot() { + return inputSlot; + } + + public Port getOutputSlot() { + return outputSlot; + } + + public void setCluster(Cluster c) { + cluster = c; + } + + public void setRoot(boolean b) { + root = b; + } + + public Cluster getCluster() { + return cluster; + } + + public boolean isRoot() { + return root; + } + + public int compareTo(Vertex o) { + return toString().compareTo(o.toString()); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Edge.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Edge.java new file mode 100644 index 00000000000..2c11ce67c75 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Edge.java @@ -0,0 +1,89 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.hierarchicallayout; + +/** + * + * @author Thomas Wuerthinger + */ +public class Edge { + + private E data; + private Node source; + private Node dest; + + protected Edge(Graph graph, Node source, Node dest, E data) { + setData(data); + this.source = source; + this.dest = dest; + assert source != null; + assert dest != null; + assert source.getGraph() == dest.getGraph(); + assert source.getGraph() != null; + assert dest.getGraph() != null; + } + + public Node getSource() { + return source; + } + + public Node getDest() { + return dest; + } + + public E getData() { + return data; + } + + public void setData(E e) { + data = e; + } + + public void remove() { + source.getGraph().removeEdge(this, null); + } + + public boolean isSelfLoop() { + return source == dest; + } + + public void reverse() { + + // Remove from current source / dest + source.removeOutEdge(this); + dest.removeInEdge(this); + + Node tmp = source; + source = dest; + dest = tmp; + + // Add to new source / dest + source.addOutEdge(this); + dest.addInEdge(this); + } + + public String toString() { + return "Edge (" + source + " -- " + dest + "): " + data; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Graph.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Graph.java new file mode 100644 index 00000000000..98dbe392c21 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Graph.java @@ -0,0 +1,298 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.hierarchicallayout; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Hashtable; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + +/** + * + * @author Thomas Wuerthinger + */ +public class Graph { + + private Hashtable> nodes; + private Hashtable> edges; + private List> nodeList; + + public Graph() { + nodes = new Hashtable>(); + edges = new Hashtable>(); + nodeList = new ArrayList>(); + } + + public Node createNode(N data, Object key) { + Node n = new Node(this, data); + assert key == null || !nodes.containsKey(key); + if (key != null) { + nodes.put(key, n); + } + nodeList.add(n); + return n; + } + + public Edge createEdge(Node source, Node dest, E data, Object key) { + Edge e = new Edge(this, source, dest, data); + source.addOutEdge(e); + dest.addInEdge(e); + if (key != null) { + edges.put(key, e); + } + return e; + } + + public Node getNode(Object key) { + return nodes.get(key); + } + + public Edge getEdge(Object key) { + return edges.get(key); + } + + public Collection> getEdges() { + return Collections.unmodifiableCollection(edges.values()); + } + + public Collection> getNodes() { + return Collections.unmodifiableList(nodeList); + } + + public void removeEdge(Edge e, Object key) { + assert key == null || edges.containsKey(key); + if (key != null) { + edges.remove(key); + } + e.getSource().removeOutEdge(e); + e.getDest().removeInEdge(e); + } + + public class DFSTraversalVisitor { + + public void visitNode(Node n) { + } + + public boolean visitEdge(Edge e, boolean backEdge) { + return true; + } + } + + public class BFSTraversalVisitor { + + public void visitNode(Node n, int depth) { + } + } + + public List> getNodesWithInDegree(int x) { + return getNodesWithInDegree(x, true); + } + + public List> getNodesWithInDegree(int x, boolean countSelfLoops) { + + List> result = new ArrayList>(); + for (Node n : getNodes()) { + if (n.getInDegree(countSelfLoops) == x) { + result.add(n); + } + } + + return result; + + } + + private void markReachable(Node startingNode) { + ArrayList> arr = new ArrayList>(); + arr.add(startingNode); + for (Node n : getNodes()) { + n.setReachable(false); + } + traverseDFS(arr, new DFSTraversalVisitor() { + + @Override + public void visitNode(Node n) { + n.setReachable(true); + } + }); + } + + public void traverseBFS(Node startingNode, BFSTraversalVisitor tv, boolean longestPath) { + + if (longestPath) { + markReachable(startingNode); + } + + for (Node n : getNodes()) { + n.setVisited(false); + n.setActive(false); + } + + Queue> queue = new LinkedList>(); + queue.add(startingNode); + startingNode.setVisited(true); + int layer = 0; + Node lastOfLayer = startingNode; + Node lastAdded = null; + + while (!queue.isEmpty()) { + + Node current = queue.poll(); + tv.visitNode(current, layer); + current.setActive(false); + + + for (Edge e : current.getOutEdges()) { + if (!e.getDest().isVisited()) { + + boolean allow = true; + if (longestPath) { + for (Node pred : e.getDest().getPredecessors()) { + if ((!pred.isVisited() || pred.isActive()) && pred.isReachable()) { + allow = false; + break; + } + } + } + + if (allow) { + queue.offer(e.getDest()); + lastAdded = e.getDest(); + e.getDest().setVisited(true); + e.getDest().setActive(true); + } + } + } + + if (current == lastOfLayer && !queue.isEmpty()) { + lastOfLayer = lastAdded; + layer++; + } + } + } + + public void traverseDFS(DFSTraversalVisitor tv) { + traverseDFS(getNodes(), tv); + } + + public void traverseDFS(Collection> startingNodes, DFSTraversalVisitor tv) { + + for (Node n : getNodes()) { + n.setVisited(false); + n.setActive(false); + } + + boolean result = false; + for (Node n : startingNodes) { + traverse(tv, n); + } + } + + private void traverse(DFSTraversalVisitor tv, Node n) { + + if (!n.isVisited()) { + n.setVisited(true); + n.setActive(true); + tv.visitNode(n); + + for (Edge e : n.getOutEdges()) { + + Node next = e.getDest(); + if (next.isActive()) { + tv.visitEdge(e, true); + } else { + if (tv.visitEdge(e, false)) { + traverse(tv, next); + } + } + } + + n.setActive(false); + } + + } + + public boolean hasCycles() { + + for (Node n : getNodes()) { + n.setVisited(false); + n.setActive(false); + } + + boolean result = false; + for (Node n : getNodes()) { + result |= checkCycles(n); + if (result) { + break; + } + } + return result; + } + + private boolean checkCycles(Node n) { + + if (n.isActive()) { + return true; + } + + if (!n.isVisited()) { + + n.setVisited(true); + n.setActive(true); + + for (Node succ : n.getSuccessors()) { + if (checkCycles(succ)) { + return true; + } + } + + n.setActive(false); + + } + + return false; + } + + @Override + public String toString() { + + StringBuilder s = new StringBuilder(); + s.append("Nodes: "); + for (Node n : getNodes()) { + s.append(n.toString()); + s.append("\n"); + } + + s.append("Edges: "); + + for (Edge e : getEdges()) { + s.append(e.toString()); + s.append("\n"); + } + + return s.toString(); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/HierarchicalClusterLayoutManager.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/HierarchicalClusterLayoutManager.java new file mode 100644 index 00000000000..1dc1b3691d7 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/HierarchicalClusterLayoutManager.java @@ -0,0 +1,247 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.hierarchicallayout; + +import java.awt.Point; +import java.awt.Rectangle; +import java.util.Hashtable; +import java.util.List; +import java.util.Set; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.TreeSet; +import com.sun.hotspot.igv.layout.Cluster; +import com.sun.hotspot.igv.layout.LayoutGraph; +import com.sun.hotspot.igv.layout.LayoutManager; +import com.sun.hotspot.igv.layout.Link; +import com.sun.hotspot.igv.layout.Port; +import com.sun.hotspot.igv.layout.Vertex; + +/** + * + * @author Thomas Wuerthinger + */ +public class HierarchicalClusterLayoutManager implements LayoutManager { + + private OldHierarchicalLayoutManager.Combine combine; + private LayoutManager subManager = new OldHierarchicalLayoutManager(combine); + private LayoutManager manager = new OldHierarchicalLayoutManager(combine, 150); + private static final boolean TRACE = false; + + public HierarchicalClusterLayoutManager(OldHierarchicalLayoutManager.Combine combine) { + this.combine = combine; + } + + public void doLayout(LayoutGraph graph) { + doLayout(graph, new HashSet(), new HashSet(), new HashSet()); + } + + public void setSubManager(LayoutManager manager) { + this.subManager = manager; + } + + public void setManager(LayoutManager manager) { + this.manager = manager; + } + + public void doLayout(LayoutGraph graph, Set firstLayerHint, Set lastLayerHint, Set importantLinks) { + + assert graph.verify(); + + Hashtable> lists = new Hashtable>(); + Hashtable> listsConnection = new Hashtable>(); + Hashtable> clusterInputSlotHash = new Hashtable>(); + Hashtable> clusterOutputSlotHash = new Hashtable>(); + + Hashtable clusterNodes = new Hashtable(); + Hashtable> clusterInputSlotSet = new Hashtable>(); + Hashtable> clusterOutputSlotSet = new Hashtable>(); + Set clusterEdges = new HashSet(); + Set interClusterEdges = new HashSet(); + Hashtable linkClusterOutgoingConnection = new Hashtable(); + Hashtable linkInterClusterConnection = new Hashtable(); + Hashtable linkClusterIngoingConnection = new Hashtable(); + Set clusterNodeSet = new HashSet(); + + Set cluster = graph.getClusters(); + int z = 0; + for (Cluster c : cluster) { + lists.put(c, new ArrayList()); + listsConnection.put(c, new ArrayList()); + clusterInputSlotHash.put(c, new Hashtable()); + clusterOutputSlotHash.put(c, new Hashtable()); + clusterOutputSlotSet.put(c, new TreeSet()); + clusterInputSlotSet.put(c, new TreeSet()); + ClusterNode cn = new ClusterNode(c, "" + z); + clusterNodes.put(c, cn); + clusterNodeSet.add(cn); + z++; + } + + // Add cluster edges + for (Cluster c : cluster) { + + ClusterNode start = clusterNodes.get(c); + + for (Cluster succ : c.getSuccessors()) { + ClusterNode end = clusterNodes.get(succ); + if (end != null && start != end) { + ClusterEdge e = new ClusterEdge(start, end); + clusterEdges.add(e); + interClusterEdges.add(e); + } + } + } + + for (Vertex v : graph.getVertices()) { + Cluster c = v.getCluster(); + assert c != null; + clusterNodes.get(c).addSubNode(v); + } + + for (Link l : graph.getLinks()) { + + Port fromPort = l.getFrom(); + Port toPort = l.getTo(); + Vertex fromVertex = fromPort.getVertex(); + Vertex toVertex = toPort.getVertex(); + Cluster fromCluster = fromVertex.getCluster(); + Cluster toCluster = toVertex.getCluster(); + + Port samePort = null; + if (combine == OldHierarchicalLayoutManager.Combine.SAME_INPUTS) { + samePort = toPort; + } else if (combine == OldHierarchicalLayoutManager.Combine.SAME_OUTPUTS) { + samePort = fromPort; + } + + assert listsConnection.containsKey(fromCluster); + assert listsConnection.containsKey(toCluster); + + if (fromCluster == toCluster) { + listsConnection.get(fromCluster).add(l); + clusterNodes.get(fromCluster).addSubEdge(l); + } else { + ClusterInputSlotNode inputSlotNode = null; + ClusterOutputSlotNode outputSlotNode = null; + + if (samePort != null) { + outputSlotNode = clusterOutputSlotHash.get(fromCluster).get(samePort); + inputSlotNode = clusterInputSlotHash.get(toCluster).get(samePort); + } + + if (outputSlotNode == null) { + outputSlotNode = new ClusterOutputSlotNode(clusterNodes.get(fromCluster), "Out " + fromCluster.toString() + " " + samePort.toString()); + clusterOutputSlotSet.get(fromCluster).add(outputSlotNode); + ClusterOutgoingConnection conn = new ClusterOutgoingConnection(outputSlotNode, l); + outputSlotNode.setOutgoingConnection(conn); + clusterNodes.get(fromCluster).addSubEdge(conn); + if (samePort != null) { + clusterOutputSlotHash.get(fromCluster).put(samePort, outputSlotNode); + } + + linkClusterOutgoingConnection.put(l, conn); + } else { + linkClusterOutgoingConnection.put(l, outputSlotNode.getOutgoingConnection()); + } + + if (inputSlotNode == null) { + inputSlotNode = new ClusterInputSlotNode(clusterNodes.get(toCluster), "In " + toCluster.toString() + " " + samePort.toString()); + clusterInputSlotSet.get(toCluster).add(inputSlotNode); + } + + ClusterIngoingConnection conn = new ClusterIngoingConnection(inputSlotNode, l); + inputSlotNode.setIngoingConnection(conn); + clusterNodes.get(toCluster).addSubEdge(conn); + if (samePort != null) { + clusterInputSlotHash.get(toCluster).put(samePort, inputSlotNode); + } + + linkClusterIngoingConnection.put(l, conn); + + + InterClusterConnection interConn = new InterClusterConnection(outputSlotNode, inputSlotNode); + linkInterClusterConnection.put(l, interConn); + clusterEdges.add(interConn); + } + } + + Timing t = null; + + if (TRACE) { + new Timing("Child timing"); + t.start(); + } + + for (Cluster c : cluster) { + ClusterNode n = clusterNodes.get(c); + subManager.doLayout(new LayoutGraph(n.getSubEdges(), n.getSubNodes()), clusterInputSlotSet.get(c), clusterOutputSlotSet.get(c), new HashSet()); + n.updateSize(); + } + + Set roots = new LayoutGraph(interClusterEdges).findRootVertices(); + for (Vertex v : roots) { + assert v instanceof ClusterNode; + ((ClusterNode) v).setRoot(true); + } + + manager.doLayout(new LayoutGraph(clusterEdges, clusterNodeSet), new HashSet(), new HashSet(), interClusterEdges); + + for (Cluster c : cluster) { + ClusterNode n = clusterNodes.get(c); + c.setBounds(new Rectangle(n.getPosition(), n.getSize())); + } + + // TODO: handle case where blocks are not fully connected + + if (TRACE) { + t.stop(); + t.print(); + } + + for (Link l : graph.getLinks()) { + + if (linkInterClusterConnection.containsKey(l)) { + ClusterOutgoingConnection conn1 = linkClusterOutgoingConnection.get(l); + InterClusterConnection conn2 = linkInterClusterConnection.get(l); + ClusterIngoingConnection conn3 = linkClusterIngoingConnection.get(l); + + assert conn1 != null; + assert conn2 != null; + assert conn3 != null; + + List points = new ArrayList(); + + points.addAll(conn1.getControlPoints()); + points.addAll(conn2.getControlPoints()); + points.addAll(conn3.getControlPoints()); + + l.setControlPoints(points); + } + } + } + + public void doRouting(LayoutGraph graph) { + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/HierarchicalLayoutManager.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/HierarchicalLayoutManager.java new file mode 100644 index 00000000000..9e5656f489f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/HierarchicalLayoutManager.java @@ -0,0 +1,2110 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.hierarchicallayout; + +import com.sun.hotspot.igv.layout.LayoutGraph; +import com.sun.hotspot.igv.layout.LayoutManager; +import com.sun.hotspot.igv.layout.Link; +import com.sun.hotspot.igv.layout.Vertex; +import java.awt.Dimension; +import java.awt.Point; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashSet; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; +import java.util.Set; +import java.util.SortedSet; +import java.util.Stack; +import java.util.TreeSet; + +/** + * + * @author Thomas Wuerthinger + */ +public class HierarchicalLayoutManager implements LayoutManager { + + public static final boolean TRACE = false; + public static final boolean CHECK = false; + public static final int SWEEP_ITERATIONS = 1; + public static final int CROSSING_ITERATIONS = 2; + public static final int DUMMY_HEIGHT = 1; + public static final int DUMMY_WIDTH = 1; + public static final int X_OFFSET = 9; + public static final int LAYER_OFFSET = 30; + public static final int MAX_LAYER_LENGTH = -1; + public static final int MIN_LAYER_DIFFERENCE = 1; + + public enum Combine { + + NONE, + SAME_INPUTS, + SAME_OUTPUTS + } + // Options + private Combine combine; + private int dummyWidth; + private int dummyHeight; + private int xOffset; + private int layerOffset; + private int maxLayerLength; + private int minLayerDifference; + // Algorithm global datastructures + private Set reversedLinks; + private List nodes; + private HashMap vertexToLayoutNode; + private HashMap> reversedLinkStartPoints; + private HashMap> reversedLinkEndPoints; + private HashMap bottomEdgeHash; + private HashMap> splitStartPoints; + private HashMap> splitEndPoints; + private LayoutGraph graph; + private List[] layers; + private int layerCount; + private Set firstLayerHint; + private Set lastLayerHint; + private Set importantLinks; + private Set linksToFollow; + + private class LayoutNode { + + public int x; + public int y; + public int width; + public int height; + public int layer = -1; + public int xOffset; + public int yOffset; + public int bottomYOffset; + public Vertex vertex; // Only used for non-dummy nodes, otherwise null + public List preds = new ArrayList(); + public List succs = new ArrayList(); + public HashMap outOffsets = new HashMap(); + public HashMap inOffsets = new HashMap(); + public int pos = -1; // Position within layer + public int crossingNumber; + + @Override + public String toString() { + return "Node " + vertex; + } + } + + private class LayoutEdge { + + public LayoutNode from; + public LayoutNode to; + public int relativeFrom; + public int relativeTo; + public Link link; + } + + private abstract class AlgorithmPart { + + public void start() { + if (CHECK) { + preCheck(); + } + + long start = 0; + if (TRACE) { + System.out.println("##################################################"); + System.out.println("Starting part " + this.getClass().getName()); + start = System.currentTimeMillis(); + } + run(); + if (TRACE) { + System.out.println("Timing for " + this.getClass().getName() + " is " + (System.currentTimeMillis() - start)); + printStatistics(); + } + + if (CHECK) { + postCheck(); + } + } + + protected abstract void run(); + + protected void printStatistics() { + } + + protected void postCheck() { + } + + protected void preCheck() { + } + } + + public HierarchicalLayoutManager() { + this(Combine.NONE); + } + + public HierarchicalLayoutManager(Combine b) { + this.combine = b; + this.dummyWidth = DUMMY_WIDTH; + this.dummyHeight = DUMMY_HEIGHT; + this.xOffset = X_OFFSET; + this.layerOffset = LAYER_OFFSET; + this.maxLayerLength = MAX_LAYER_LENGTH; + this.minLayerDifference = MIN_LAYER_DIFFERENCE; + this.linksToFollow = new HashSet(); + } + + public int getMaxLayerLength() { + return maxLayerLength; + } + + public void setMaxLayerLength(int v) { + maxLayerLength = v; + } + + public void setMinLayerDifference(int v) { + minLayerDifference = v; + } + + public void doLayout(LayoutGraph graph) { + doLayout(graph, new HashSet(), new HashSet(), new HashSet()); + + } + + public void doLayout(LayoutGraph graph, Set firstLayerHint, Set lastLayerHint, Set importantLinks) { + + this.importantLinks = importantLinks; + this.graph = graph; + this.firstLayerHint = firstLayerHint; + this.lastLayerHint = lastLayerHint; + + vertexToLayoutNode = new HashMap(); + reversedLinks = new HashSet(); + reversedLinkStartPoints = new HashMap>(); + reversedLinkEndPoints = new HashMap>(); + bottomEdgeHash = new HashMap(); + nodes = new ArrayList(); + splitStartPoints = new HashMap>(); + splitEndPoints = new HashMap>(); + + // ############################################################# + // Step 1: Build up data structure + new BuildDatastructure().start(); + + // ############################################################# + // STEP 2: Reverse edges, handle backedges + new ReverseEdges().start(); + + for (LayoutNode n : nodes) { + ArrayList tmpArr = new ArrayList(); + for (LayoutEdge e : n.succs) { + if (importantLinks.contains(e.link)) { + tmpArr.add(e); + } + } + + for (LayoutEdge e : tmpArr) { + //System.out.println("Removed " + e); + e.from.succs.remove(e); + e.to.preds.remove(e); + } + } + + // ############################################################# + // STEP 3: Assign layers + new AssignLayers().start(); + + // ############################################################# + // STEP 4: Create dummy nodes + new CreateDummyNodes().start(); + + // ############################################################# + // STEP 5: Crossing Reduction + new CrossingReduction().start(); + + // ############################################################# + // STEP 7: Assign X coordinates + //new AssignXCoordinates().start(); + new AssignXCoordinates2().start(); + + // ############################################################# + // STEP 6: Assign Y coordinates + new AssignYCoordinates().start(); + + // ############################################################# + // STEP 8: Write back to interface + new WriteResult().start(); + } + + private class WriteResult extends AlgorithmPart { + + private int pointCount; + + protected void run() { + + HashMap vertexPositions = new HashMap(); + HashMap> linkPositions = new HashMap>(); + for (Vertex v : graph.getVertices()) { + LayoutNode n = vertexToLayoutNode.get(v); + assert !vertexPositions.containsKey(v); + vertexPositions.put(v, new Point(n.x + n.xOffset, n.y + n.yOffset)); + } + + for (LayoutNode n : nodes) { + + for (LayoutEdge e : n.preds) { + if (e.link != null) { + ArrayList points = new ArrayList(); + + Point p = new Point(e.to.x + e.relativeTo, e.to.y + e.to.yOffset); + points.add(p); + if (e.to.inOffsets.containsKey(e.relativeTo)) { + points.add(new Point(p.x, p.y + e.to.inOffsets.get(e.relativeTo))); + } + + LayoutNode cur = e.from; + LayoutNode other = e.to; + LayoutEdge curEdge = e; + while (cur.vertex == null && cur.preds.size() != 0) { + if (points.size() > 1 && points.get(points.size() - 1).x == cur.x + cur.width / 2 && points.get(points.size() - 2).x == cur.x + cur.width / 2) { + points.remove(points.size() - 1); + } + points.add(new Point(cur.x + cur.width / 2, cur.y + cur.height)); + if (points.size() > 1 && points.get(points.size() - 1).x == cur.x + cur.width / 2 && points.get(points.size() - 2).x == cur.x + cur.width / 2) { + points.remove(points.size() - 1); + } + points.add(new Point(cur.x + cur.width / 2, cur.y)); + assert cur.preds.size() == 1; + curEdge = cur.preds.get(0); + cur = curEdge.from; + } + + p = new Point(cur.x + curEdge.relativeFrom, cur.y + cur.height - cur.bottomYOffset); + if (curEdge.from.outOffsets.containsKey(curEdge.relativeFrom)) { + points.add(new Point(p.x, p.y + curEdge.from.outOffsets.get(curEdge.relativeFrom))); + } + points.add(p); + + Collections.reverse(points); + + + + if (cur.vertex == null && cur.preds.size() == 0) { + + if (reversedLinkEndPoints.containsKey(e.link)) { + for (Point p1 : reversedLinkEndPoints.get(e.link)) { + points.add(new Point(p1.x + e.to.x, p1.y + e.to.y)); + } + } + + if (splitStartPoints.containsKey(e.link)) { + points.add(0, null); + points.addAll(0, splitStartPoints.get(e.link)); + + //checkPoints(points); + if (reversedLinks.contains(e.link)) { + Collections.reverse(points); + } + assert !linkPositions.containsKey(e.link); + linkPositions.put(e.link, points); + } else { + splitEndPoints.put(e.link, points); + } + + } else { + if (reversedLinks.contains(e.link)) { + Collections.reverse(points); + } + if (reversedLinkStartPoints.containsKey(e.link)) { + for (Point p1 : reversedLinkStartPoints.get(e.link)) { + points.add(new Point(p1.x + cur.x, p1.y + cur.y)); + } + } + + if (reversedLinkEndPoints.containsKey(e.link)) { + for (Point p1 : reversedLinkEndPoints.get(e.link)) { + points.add(0, new Point(p1.x + other.x, p1.y + other.y)); + } + } + + assert !linkPositions.containsKey(e.link); + linkPositions.put(e.link, points); + } + pointCount += points.size(); + + // No longer needed! + e.link = null; + } + } + + for (LayoutEdge e : n.succs) { + if (e.link != null) { + ArrayList points = new ArrayList(); + Point p = new Point(e.from.x + e.relativeFrom, e.from.y + e.from.height - e.from.bottomYOffset); + points.add(p); + if (e.from.outOffsets.containsKey(e.relativeFrom)) { + points.add(new Point(p.x, p.y + e.from.outOffsets.get(e.relativeFrom))); + } + + LayoutNode cur = e.to; + LayoutNode other = e.from; + LayoutEdge curEdge = e; + while (cur.vertex == null && cur.succs.size() != 0) { + if (points.size() > 1 && points.get(points.size() - 1).x == cur.x + cur.width / 2 && points.get(points.size() - 2).x == cur.x + cur.width / 2) { + points.remove(points.size() - 1); + } + points.add(new Point(cur.x + cur.width / 2, cur.y)); + if (points.size() > 1 && points.get(points.size() - 1).x == cur.x + cur.width / 2 && points.get(points.size() - 2).x == cur.x + cur.width / 2) { + points.remove(points.size() - 1); + } + points.add(new Point(cur.x + cur.width / 2, cur.y + cur.height)); + if (cur.succs.size() == 0) { + break; + } + assert cur.succs.size() == 1; + curEdge = cur.succs.get(0); + cur = curEdge.to; + } + + + p = new Point(cur.x + curEdge.relativeTo, cur.y + cur.yOffset); + points.add(p); + if (curEdge.to.inOffsets.containsKey(curEdge.relativeTo)) { + points.add(new Point(p.x, p.y + curEdge.to.inOffsets.get(curEdge.relativeTo))); + } + + + if (cur.succs.size() == 0 && cur.vertex == null) { + if (reversedLinkStartPoints.containsKey(e.link)) { + for (Point p1 : reversedLinkStartPoints.get(e.link)) { + points.add(0, new Point(p1.x + other.x, p1.y + other.y)); + } + } + + if (splitEndPoints.containsKey(e.link)) { + points.add(null); + points.addAll(splitEndPoints.get(e.link)); + + //checkPoints(points); + if (reversedLinks.contains(e.link)) { + Collections.reverse(points); + } + assert !linkPositions.containsKey(e.link); + linkPositions.put(e.link, points); + } else { + splitStartPoints.put(e.link, points); + } + } else { + + if (reversedLinkStartPoints.containsKey(e.link)) { + for (Point p1 : reversedLinkStartPoints.get(e.link)) { + points.add(0, new Point(p1.x + other.x, p1.y + other.y)); + } + } + if (reversedLinkEndPoints.containsKey(e.link)) { + for (Point p1 : reversedLinkEndPoints.get(e.link)) { + points.add(new Point(p1.x + cur.x, p1.y + cur.y)); + } + } + if (reversedLinks.contains(e.link)) { + Collections.reverse(points); + } + //checkPoints(points); + assert !linkPositions.containsKey(e.link); + linkPositions.put(e.link, points); + } + + pointCount += points.size(); + e.link = null; + } + } + } + + int minX = Integer.MAX_VALUE; + int minY = Integer.MAX_VALUE; + for (Vertex v : vertexPositions.keySet()) { + Point p = vertexPositions.get(v); + minX = Math.min(minX, p.x); + minY = Math.min(minY, p.y); + } + + for (Link l : linkPositions.keySet()) { + List points = linkPositions.get(l); + for (Point p : points) { + if (p != null) { + minX = Math.min(minX, p.x); + minY = Math.min(minY, p.y); + } + } + + } + + for (Vertex v : vertexPositions.keySet()) { + Point p = vertexPositions.get(v); + p.x -= minX; + p.y -= minY; + v.setPosition(p); + } + + for (Link l : linkPositions.keySet()) { + List points = linkPositions.get(l); + for (Point p : points) { + if (p != null) { + p.x -= minX; + p.y -= minY; + } + } + l.setControlPoints(points); + + } + } + + @Override + protected void printStatistics() { + System.out.println("Number of nodes: " + nodes.size()); + int edgeCount = 0; + for (LayoutNode n : nodes) { + edgeCount += n.succs.size(); + } + System.out.println("Number of edges: " + edgeCount); + System.out.println("Number of points: " + pointCount); + } + } + + private static class Segment { + + public float d; + public int orderNumber = -1; + public ArrayList nodes = new ArrayList(); + public HashSet succs = new HashSet(); + public HashSet preds = new HashSet(); + public Region region; + } + private static final Comparator segmentComparator = new Comparator() { + + public int compare(Segment s1, Segment s2) { + return s1.orderNumber - s2.orderNumber; + } + }; + + private static class Region { + + public float d; + public int minOrderNumber; + public SortedSet segments = new TreeSet(segmentComparator); + public HashSet succs = new HashSet(4); + public HashSet preds = new HashSet(4); + } + private static final Comparator regionComparator = new Comparator() { + + public int compare(Region r1, Region r2) { + return r1.minOrderNumber - r2.minOrderNumber; + } + }; + private static final Comparator nodePositionComparator = new Comparator() { + + public int compare(LayoutNode n1, LayoutNode n2) { + return n1.pos - n2.pos; + } + }; + private static final Comparator nodeProcessingDownComparator = new Comparator() { + + public int compare(LayoutNode n1, LayoutNode n2) { + if (n1.vertex == null) { + return -1; + } + if (n2.vertex == null) { + return 1; + } + return n1.preds.size() - n2.preds.size(); + } + }; + private static final Comparator nodeProcessingUpComparator = new Comparator() { + + public int compare(LayoutNode n1, LayoutNode n2) { + if (n1.vertex == null) { + return -1; + } + if (n2.vertex == null) { + return 1; + } + return n1.succs.size() - n2.succs.size(); + } + }; + + private class AssignXCoordinates2 extends AlgorithmPart { + + private ArrayList[] space; + private ArrayList[] downProcessingOrder; + private ArrayList[] upProcessingOrder; + + private void initialPositions() { + for (LayoutNode n : nodes) { + n.x = space[n.layer].get(n.pos); + } + } + + protected void run() { + + space = new ArrayList[layers.length]; + downProcessingOrder = new ArrayList[layers.length]; + upProcessingOrder = new ArrayList[layers.length]; + + for (int i = 0; i < layers.length; i++) { + space[i] = new ArrayList(); + downProcessingOrder[i] = new ArrayList(); + upProcessingOrder[i] = new ArrayList(); + + int curX = 0; + for (LayoutNode n : layers[i]) { + space[i].add(curX); + curX += n.width + xOffset; + downProcessingOrder[i].add(n); + upProcessingOrder[i].add(n); + } + + Collections.sort(downProcessingOrder[i], nodeProcessingDownComparator); + Collections.sort(upProcessingOrder[i], nodeProcessingUpComparator); + } + + initialPositions(); + for (int i = 0; i < SWEEP_ITERATIONS; i++) { + sweepDown(); + sweepUp(); + } + + for (int i = 0; i < SWEEP_ITERATIONS; i++) { + doubleSweep(); + } + } + + private int calculateOptimalDown(LayoutNode n) { + + List values = new ArrayList(); + if (n.preds.size() == 0) { + return n.x; + } + for (LayoutEdge e : n.preds) { + int cur = e.from.x + e.relativeFrom - e.relativeTo; + values.add(cur); + } + return median(values); + } + + private int calculateOptimalBoth(LayoutNode n) { + + List values = new ArrayList(); + if (n.preds.size() == 0 + n.succs.size()) { + return n.x; + } + for (LayoutEdge e : n.preds) { + int cur = e.from.x + e.relativeFrom - e.relativeTo; + values.add(cur); + } + + for (LayoutEdge e : n.succs) { + int cur = e.to.x + e.relativeTo - e.relativeFrom; + values.add(cur); + } + + return median(values); + } + + private int calculateOptimalUp(LayoutNode n) { + + //List values = new ArrayList(); + int size = n.succs.size(); + if (size == 0) { + return n.x; + } else { + int result = 0; + for (LayoutEdge e : n.succs) { + int cur = e.to.x + e.relativeTo - e.relativeFrom; + result += cur; + } + return result / size; //median(values); + } + } + + private int median(List values) { + Collections.sort(values); + if (values.size() % 2 == 0) { + return (values.get(values.size() / 2 - 1) + values.get(values.size() / 2)) / 2; + } else { + return values.get(values.size() / 2); + } + } + + private void sweepUp() { + for (int i = layers.length - 1; i >= 0; i--) { + NodeRow r = new NodeRow(space[i]); + for (LayoutNode n : upProcessingOrder[i]) { + int optimal = calculateOptimalUp(n); + r.insert(n, optimal); + } + } + /* + for(int i=0; i= 0; i--) { + NodeRow r = new NodeRow(space[i]); + for (LayoutNode n : upProcessingOrder[i]) { + int optimal = calculateOptimalBoth(n); + r.insert(n, optimal); + } + } + } + + private void sweepDown() { + for (int i = 1; i < layers.length; i++) { + NodeRow r = new NodeRow(space[i]); + for (LayoutNode n : downProcessingOrder[i]) { + int optimal = calculateOptimalDown(n); + r.insert(n, optimal); + } + } + } + } + + private static class NodeRow { + + private TreeSet treeSet; + private ArrayList space; + + public NodeRow(ArrayList space) { + treeSet = new TreeSet(nodePositionComparator); + this.space = space; + } + + public int offset(LayoutNode n1, LayoutNode n2) { + int v1 = space.get(n1.pos) + n1.width; + int v2 = space.get(n2.pos); + return v2 - v1; + } + + public void insert(LayoutNode n, int pos) { + + SortedSet headSet = treeSet.headSet(n); + + LayoutNode leftNeighbor = null; + int minX = Integer.MIN_VALUE; + if (!headSet.isEmpty()) { + leftNeighbor = headSet.last(); + minX = leftNeighbor.x + leftNeighbor.width + offset(leftNeighbor, n); + } + + if (pos < minX) { + n.x = minX; + } else { + + LayoutNode rightNeighbor = null; + SortedSet tailSet = treeSet.tailSet(n); + int maxX = Integer.MAX_VALUE; + if (!tailSet.isEmpty()) { + rightNeighbor = tailSet.first(); + maxX = rightNeighbor.x - offset(n, rightNeighbor) - n.width; + } + + if (pos > maxX) { + n.x = maxX; + } else { + n.x = pos; + } + + assert minX <= maxX; + } + + treeSet.add(n); + } + } + + private class AssignXCoordinates extends AlgorithmPart { + + HashMap hashMap = new HashMap(); + ArrayList segments = new ArrayList(); + + private void generateSegments() { + + for (int i = 0; i < layerCount; i++) { + for (LayoutNode n : layers[i]) { + if (!hashMap.containsKey(n)) { + Segment s = new Segment(); + segments.add(s); + LayoutNode curNode = n; + + int maxLength = 0; + while (curNode.succs.size() == 1 && curNode.preds.size() == 1) { + s.nodes.add(curNode); + assert !hashMap.containsKey(curNode); + hashMap.put(curNode, s); + curNode = curNode.succs.get(0).to; + maxLength++; + //if(maxLength > 10) break; + } + + if (s.nodes.size() > 0 && curNode.preds.size() == 1 && curNode.vertex == null) { + s.nodes.add(curNode); + assert !hashMap.containsKey(curNode); + hashMap.put(curNode, s); + } + + if (s.nodes.size() == 0) { + // Simple segment with a single node + s.nodes.add(n); + hashMap.put(n, s); + } + } + } + } + } + + private void addEdges() { + + for (int i = 0; i < layerCount; i++) { + LayoutNode prev = null; + for (LayoutNode n : layers[i]) { + + if (prev != null) { + Segment s1 = hashMap.get(prev); + Segment s2 = hashMap.get(n); + + if (s1 != s2) { + s1.succs.add(s2); + s2.preds.add(s1); + } + } + prev = n; + + } + } + } + + private void topologicalSorting() { + + Queue queue = new LinkedList(); + + int index = 0; + ArrayList newList = new ArrayList(); + for (Segment s : segments) { + if (s.preds.size() == 0) { + s.orderNumber = index; + newList.add(s); + index++; + queue.add(s); + } + } + + while (!queue.isEmpty()) { + Segment s = queue.remove(); + + for (Segment succ : s.succs) { + succ.preds.remove(s); + if (succ.preds.size() == 0) { + queue.add(succ); + succ.orderNumber = index; + newList.add(succ); + index++; + } + } + } + + segments = newList; + } + + private void initialPositions() { + + int[] minPos = new int[layers.length]; + + for (Segment s : segments) { + int max = 0; + for (LayoutNode n : s.nodes) { + int x = minPos[n.layer]; + if (x > max) { + max = x; + } + } + + for (LayoutNode n : s.nodes) { + minPos[n.layer] = max + n.width + xOffset; + n.x = max; + } + } + } + + private int predSum(LayoutNode n) { + int sum = 0; + for (LayoutEdge e : n.preds) { + assert e.to == n; + //sum += (e.from.x + e.relativeFrom + (int)hashMap.get(e.from).d) - (e.to.x + e.relativeTo + (int)hashMap.get(e.to).d); + sum += (e.from.x + e.relativeFrom) - (e.to.x + e.relativeTo); + } + + return sum; + } + + private int succSum(LayoutNode n) { + int sum = 0; + for (LayoutEdge e : n.succs) { + + assert e.from == n; + sum += (e.to.x + e.relativeTo) - (e.from.x + e.relativeFrom); + //sum += (e.to.x + e.relativeTo + (int)hashMap.get(e.to).d) - (e.from.x + e.relativeFrom + (int)hashMap.get(e.from).d); + } + + return sum; + + } + + private void downValues() { + + for (Segment s : segments) { + downValues(s); + + } + + } + + private void downValues(Segment s) { + LayoutNode n = s.nodes.get(0); // Only first node needed, all other have same coordinate + + if (n.preds.size() == 0) { + // Value is 0.0; + if (n.succs.size() == 0) { + s.d = 0.0f; + } else { + s.d = (((float) succSum(n) / (float) n.succs.size())) / 2; + } + } else { + s.d = (float) predSum(n) / (float) n.preds.size(); + } + } + + private void upValues() { + for (Segment s : segments) { + upValues(s); + } + } + + private void upValues(Segment s) { + LayoutNode n = s.nodes.get(0); // Only first node needed, all other have same coordinate + + if (n.succs.size() == 0) { + // Value is 0.0; + if (n.preds.size() == 0) { + s.d = 0.0f; + } else { + s.d = (float) predSum(n) / (float) n.preds.size(); + } + } else { + s.d = ((float) succSum(n) / (float) n.succs.size()) / 2; + } + } + + private void sweep(boolean down) { + + if (down) { + downValues(); + } else { + upValues(); + } + + SortedSet regions = new TreeSet(regionComparator); + for (Segment s : segments) { + s.region = new Region(); + s.region.minOrderNumber = s.orderNumber; + s.region.segments.add(s); + s.region.d = s.d; + regions.add(s.region); + } + + for (Segment s : segments) { + for (LayoutNode n : s.nodes) { + if (n.pos != 0) { + LayoutNode prevNode = layers[n.layer].get(n.pos - 1); + if (prevNode.x + prevNode.width + xOffset == n.x) { + Segment other = hashMap.get(prevNode); + Region r1 = s.region; + Region r2 = other.region; + // They are close together + if (r1 != r2 && r2.d >= r1.d) { + + if (r2.segments.size() < r1.segments.size()) { + + r1.d = (r1.d * r1.segments.size() + r2.d * r2.segments.size()) / (r1.segments.size() + r2.segments.size()); + + for (Segment tempS : r2.segments) { + r1.segments.add(tempS); + tempS.region = r1; + r1.minOrderNumber = Math.min(r1.minOrderNumber, tempS.orderNumber); + } + + regions.remove(r2); + } else { + + r2.d = (r1.d * r1.segments.size() + r2.d * r2.segments.size()) / (r1.segments.size() + r2.segments.size()); + + for (Segment tempS : r1.segments) { + r2.segments.add(tempS); + tempS.region = r2; + r2.minOrderNumber = Math.min(r2.minOrderNumber, tempS.orderNumber); + } + + regions.remove(r1); + } + } + } + } + } + } + + + + ArrayList reversedRegions = new ArrayList(); + for (Region r : regions) { + if (r.d < 0) { + processRegion(r, down); + } else { + reversedRegions.add(0, r); + } + } + + for (Region r : reversedRegions) { + processRegion(r, down); + } + + } + + private void processRegion(Region r, boolean down) { + + // Do not move + if ((int) r.d == 0) { + return; + } + + ArrayList arr = new ArrayList(); + for (Segment s : r.segments) { + arr.add(s); + } + + if (r.d > 0) { + Collections.reverse(arr); + } + + for (Segment s : arr) { + + + int min = (int) r.d; + if (min < 0) { + min = -min; + } + + for (LayoutNode n : s.nodes) { + + int layer = n.layer; + int pos = n.pos; + + + if (r.d > 0) { + + if (pos != layers[layer].size() - 1) { + + int off = layers[layer].get(pos + 1).x - n.x - xOffset - n.width; + assert off >= 0; + if (off < min) { + min = off; + } + } + + } else { + + if (pos != 0) { + + int off = n.x - xOffset - layers[layer].get(pos - 1).x - layers[layer].get(pos - 1).width; + assert off >= 0; + if (off < min) { + min = off; + } + } + } + } + + assert min >= 0; + if (min != 0) { + for (LayoutNode n : s.nodes) { + if (r.d > 0) { + n.x += min; + } else { + n.x -= min; + } + + } + } + } + } + + protected void run() { + + generateSegments(); + addEdges(); + topologicalSorting(); + initialPositions(); + for (int i = 0; i < SWEEP_ITERATIONS; i++) { + + sweep(true); + sweep(true); + sweep(false); + sweep(false); + } + + sweep(true); + sweep(true); + } + } + private static Comparator crossingNodeComparator = new Comparator() { + + public int compare(LayoutNode n1, LayoutNode n2) { + return n1.crossingNumber - n2.crossingNumber; + } + }; + + private class CrossingReduction extends AlgorithmPart { + + @Override + public void preCheck() { + for (LayoutNode n : nodes) { + assert n.layer < layerCount; + } + } + + protected void run() { + + layers = new List[layerCount]; + + for (int i = 0; i < layerCount; i++) { + layers[i] = new ArrayList(); + } + + + // Generate initial ordering + HashSet visited = new HashSet(); + for (LayoutNode n : nodes) { + if (n.layer == 0) { + layers[0].add(n); + visited.add(n); + } else if (n.preds.size() == 0) { + layers[n.layer].add(n); + visited.add(n); + } + } + + for (int i = 0; i < layers.length - 1; i++) { + for (LayoutNode n : layers[i]) { + for (LayoutEdge e : n.succs) { + if (!visited.contains(e.to)) { + visited.add(e.to); + layers[i + 1].add(e.to); + } + } + } + } + + + updatePositions(); + + initX(); + + // Optimize + for (int i = 0; i < CROSSING_ITERATIONS; i++) { + downSweep(); + upSweep(); + } + + /*for(int i=0; i 0) { + sum /= n.preds.size(); + n.crossingNumber = sum; + //if(n.vertex == null) n.crossingNumber += layers[i].size(); + } + } + + + updateCrossingNumbers(i, true); + Collections.sort(layers[i], crossingNodeComparator); + updateXOfLayer(i); + + int z = 0; + for (LayoutNode n : layers[i]) { + n.pos = z; + z++; + } + } + } + + private void updateCrossingNumbers(int index, boolean down) { + for (int i = 0; i < layers[index].size(); i++) { + LayoutNode n = layers[index].get(i); + LayoutNode prev = null; + if (i > 0) { + prev = layers[index].get(i - 1); + } + LayoutNode next = null; + if (i < layers[index].size() - 1) { + next = layers[index].get(i + 1); + } + + boolean cond = (n.succs.size() == 0); + if (down) { + cond = (n.preds.size() == 0); + } + + if (cond) { + + if (prev != null && next != null) { + n.crossingNumber = (prev.crossingNumber + next.crossingNumber) / 2; + } else if (prev != null) { + n.crossingNumber = prev.crossingNumber; + } else if (next != null) { + n.crossingNumber = next.crossingNumber; + } + } + } + } + /* + private void doubleSweep() { + // Downsweep + for(int i=0; i= layerCount) { + index = 2*layerCount - i - 1; + } + for(LayoutNode n : layers[index]) { + float sum = 0.0f; + for(LayoutEdge e : n.preds) { + float cur = e.from.pos; + if(e.from.width != 0 && e.relativeFrom != 0) { + cur += (float)e.relativeFrom / (float)(e.from.width); + } + sum += cur; + } + for(LayoutEdge e : n.succs) { + float cur = e.to.pos; + if(e.to.width != 0 && e.relativeTo != 0) { + cur += (float)e.relativeTo / (float)(e.to.width); + } + sum += cur; + } + if(n.preds.size() + n.succs.size() > 0) { + sum /= n.preds.size() + n.succs.size(); + n.crossingNumber = sum; + } + } + Collections.sort(layers[index], crossingNodeComparator); + updateXOfLayer(index); + int z = 0; + for(LayoutNode n : layers[index]) { + n.pos = z; + z++; + } + } + }*/ + + private void upSweep() { + // Upsweep + for (int i = layerCount - 2; i >= 0; i--) { + + for (LayoutNode n : layers[i]) { + n.crossingNumber = 0; + } + + for (LayoutNode n : layers[i]) { + + int sum = 0; + for (LayoutEdge e : n.succs) { + int cur = e.to.x + e.relativeTo;//pos; + /* + if(e.to.width != 0 && e.relativeTo != 0) { + cur += (float)e.relativeTo / (float)(e.to.width); + }*/ + + sum += cur; + } + + if (n.succs.size() > 0) { + sum /= n.succs.size(); + n.crossingNumber = sum; + //if(n.vertex == null) n.crossingNumber += layers[i].size(); + } + + } + + updateCrossingNumbers(i, false); + Collections.sort(layers[i], crossingNodeComparator); + updateXOfLayer(i); + + int z = 0; + for (LayoutNode n : layers[i]) { + n.pos = z; + z++; + } + } + } + + private int evaluate() { + // TODO: Implement efficient evaluate / crossing min + return 0; + } + + @Override + public void postCheck() { + + HashSet visited = new HashSet(); + for (int i = 0; i < layers.length; i++) { + for (LayoutNode n : layers[i]) { + assert !visited.contains(n); + assert n.layer == i; + visited.add(n); + } + } + + } + } + + private class AssignYCoordinates extends AlgorithmPart { + + protected void run() { + int curY = 0; + //maxLayerHeight = new int[layers.length]; + for (int i = 0; i < layers.length; i++) { + int maxHeight = 0; + int baseLine = 0; + int bottomBaseLine = 0; + for (LayoutNode n : layers[i]) { + maxHeight = Math.max(maxHeight, n.height - n.yOffset - n.bottomYOffset); + baseLine = Math.max(baseLine, n.yOffset); + bottomBaseLine = Math.max(bottomBaseLine, n.bottomYOffset); + } + + int maxXOffset = 0; + for (LayoutNode n : layers[i]) { + if (n.vertex == null) { + // Dummy node + n.y = curY; + n.height = maxHeight + baseLine + bottomBaseLine; + + } else { + n.y = curY + baseLine + (maxHeight - (n.height - n.yOffset - n.bottomYOffset)) / 2 - n.yOffset; + } + + for (LayoutEdge e : n.succs) { + int curXOffset = Math.abs(n.x - e.to.x); + maxXOffset = Math.max(curXOffset, maxXOffset); + } + } + + //maxLayerHeight[i] = maxHeight + baseLine + bottomBaseLine; + + curY += maxHeight + baseLine + bottomBaseLine; + curY += layerOffset + (int) Math.sqrt(maxXOffset); + } + } + } + + private class CreateDummyNodes extends AlgorithmPart { + + private int oldNodeCount; + + @Override + protected void preCheck() { + for (LayoutNode n : nodes) { + for (LayoutEdge e : n.succs) { + assert e.from != null; + assert e.from == n; + assert e.from.layer < e.to.layer; + } + + for (LayoutEdge e : n.preds) { + assert e.to != null; + assert e.to == n; + } + } + } + + protected void run() { + oldNodeCount = nodes.size(); + + + if (combine == Combine.SAME_OUTPUTS) { + + Comparator comparator = new Comparator() { + + public int compare(LayoutEdge e1, LayoutEdge e2) { + return e1.to.layer - e2.to.layer; + } + }; + HashMap> portHash = new HashMap>(); + ArrayList currentNodes = new ArrayList(nodes); + for (LayoutNode n : currentNodes) { + portHash.clear(); + + ArrayList succs = new ArrayList(n.succs); + HashMap topNodeHash = new HashMap(); + HashMap> bottomNodeHash = new HashMap>(); + for (LayoutEdge e : succs) { + assert e.from.layer < e.to.layer; + if (e.from.layer != e.to.layer - 1) { + if (maxLayerLength != -1 && e.to.layer - e.from.layer > maxLayerLength/* && e.to.preds.size() > 1 && e.from.succs.size() > 1*/) { + assert maxLayerLength > 2; + e.to.preds.remove(e); + e.from.succs.remove(e); + + LayoutEdge topEdge = null; + + if (combine == Combine.SAME_OUTPUTS && topNodeHash.containsKey(e.relativeFrom)) { + LayoutNode topNode = topNodeHash.get(e.relativeFrom); + topEdge = new LayoutEdge(); + topEdge.relativeFrom = e.relativeFrom; + topEdge.from = e.from; + topEdge.relativeTo = topNode.width / 2; + topEdge.to = topNode; + topEdge.link = e.link; + e.from.succs.add(topEdge); + topNode.preds.add(topEdge); + } else { + + LayoutNode topNode = new LayoutNode(); + topNode.layer = e.from.layer + 1; + topNode.width = DUMMY_WIDTH; + topNode.height = DUMMY_HEIGHT; + nodes.add(topNode); + topEdge = new LayoutEdge(); + topEdge.relativeFrom = e.relativeFrom; + topEdge.from = e.from; + topEdge.relativeTo = topNode.width / 2; + topEdge.to = topNode; + topEdge.link = e.link; + e.from.succs.add(topEdge); + topNode.preds.add(topEdge); + topNodeHash.put(e.relativeFrom, topNode); + bottomNodeHash.put(e.relativeFrom, new HashMap()); + } + + HashMap hash = bottomNodeHash.get(e.relativeFrom); + + LayoutNode bottomNode = null; + if (hash.containsKey(e.to.layer)) { + bottomNode = hash.get(e.to.layer); + } else { + + bottomNode = new LayoutNode(); + bottomNode.layer = e.to.layer - 1; + bottomNode.width = DUMMY_WIDTH; + bottomNode.height = DUMMY_HEIGHT; + nodes.add(bottomNode); + hash.put(e.to.layer, bottomNode); + } + + LayoutEdge bottomEdge = new LayoutEdge(); + bottomEdge.relativeTo = e.relativeTo; + bottomEdge.to = e.to; + bottomEdge.relativeFrom = bottomNode.width / 2; + bottomEdge.from = bottomNode; + bottomEdge.link = e.link; + e.to.preds.add(bottomEdge); + bottomEdgeHash.put(topEdge, bottomEdge); + bottomNode.succs.add(bottomEdge); + + } else { + Integer i = e.relativeFrom; + if (!portHash.containsKey(i)) { + portHash.put(i, new ArrayList()); + } + + if (n.vertex.toString().equals("1012 CastPP")) { + int x = 0; + } + + portHash.get(i).add(e); + } + } + } + + succs = new ArrayList(n.succs); + for (LayoutEdge e : succs) { + + Integer i = e.relativeFrom; + if (portHash.containsKey(i)) { + + List list = portHash.get(i); + Collections.sort(list, comparator); + + if (list.size() == 1) { + processSingleEdge(list.get(0)); + } else { + + int maxLayer = list.get(0).to.layer; + for (LayoutEdge curEdge : list) { + maxLayer = Math.max(maxLayer, curEdge.to.layer); + } + + + int cnt = maxLayer - n.layer - 1; + LayoutEdge[] edges = new LayoutEdge[cnt]; + LayoutNode[] nodes = new LayoutNode[cnt]; + edges[0] = new LayoutEdge(); + edges[0].from = n; + edges[0].relativeFrom = i; + n.succs.add(edges[0]); + + nodes[0] = new LayoutNode(); + nodes[0].width = dummyWidth; + nodes[0].height = dummyHeight; + nodes[0].layer = n.layer + 1; + nodes[0].preds.add(edges[0]); + edges[0].to = nodes[0]; + edges[0].relativeTo = nodes[0].width / 2; + for (int j = 1; j < cnt; j++) { + edges[j] = new LayoutEdge(); + edges[j].from = nodes[j - 1]; + edges[j].relativeFrom = nodes[j - 1].width / 2; + nodes[j - 1].succs.add(edges[j]); + nodes[j] = new LayoutNode(); + nodes[j].width = dummyWidth; + nodes[j].height = dummyHeight; + nodes[j].layer = n.layer + j + 1; + nodes[j].preds.add(edges[j]); + edges[j].to = nodes[j]; + edges[j].relativeTo = nodes[j].width / 2; + } + + for (LayoutEdge curEdge : list) { + assert curEdge.to.layer - n.layer - 2 >= 0; + assert curEdge.to.layer - n.layer - 2 < cnt; + LayoutNode anchor = nodes[curEdge.to.layer - n.layer - 2]; + anchor.succs.add(curEdge); + curEdge.from = anchor; + curEdge.relativeFrom = anchor.width / 2; + n.succs.remove(curEdge); + } + + } + + portHash.remove(i); + } + } + } + } else if (combine == Combine.SAME_INPUTS) { + throw new UnsupportedOperationException("Currently not supported"); + } else { + ArrayList currentNodes = new ArrayList(nodes); + for (LayoutNode n : currentNodes) { + for (LayoutEdge e : n.succs) { + processSingleEdge(e); + } + } + } + } + + private void processSingleEdge(LayoutEdge e) { + LayoutNode n = e.from; + if (e.to.layer > n.layer + 1) { + LayoutEdge last = e; + for (int i = n.layer + 1; i < last.to.layer; i++) { + last = addBetween(last, i); + } + } + } + + private LayoutEdge addBetween(LayoutEdge e, int layer) { + LayoutNode n = new LayoutNode(); + n.width = dummyWidth; + n.height = dummyHeight; + n.layer = layer; + n.preds.add(e); + nodes.add(n); + LayoutEdge result = new LayoutEdge(); + n.succs.add(result); + result.from = n; + result.relativeFrom = n.width / 2; + result.to = e.to; + result.relativeTo = e.relativeTo; + e.relativeTo = n.width / 2; + e.to.preds.remove(e); + e.to.preds.add(result); + e.to = n; + return result; + } + + @Override + public void printStatistics() { + System.out.println("Dummy nodes created: " + (nodes.size() - oldNodeCount)); + } + + @Override + public void postCheck() { + ArrayList currentNodes = new ArrayList(nodes); + for (LayoutNode n : currentNodes) { + for (LayoutEdge e : n.succs) { + assert e.from.layer == e.to.layer - 1; + } + } + + for (int i = 0; i < layers.length; i++) { + assert layers[i].size() > 0; + for (LayoutNode n : layers[i]) { + assert n.layer == i; + } + } + } + } + + private class AssignLayers extends AlgorithmPart { + + @Override + public void preCheck() { + for (LayoutNode n : nodes) { + assert n.layer == -1; + } + } + + protected void run() { + HashSet set = new HashSet(); + for (LayoutNode n : nodes) { + if (n.preds.size() == 0) { + set.add(n); + n.layer = 0; + } + } + + int z = minLayerDifference; + HashSet newSet = new HashSet(); + HashSet failed = new HashSet(); + while (!set.isEmpty()) { + + newSet.clear(); + failed.clear(); + + for (LayoutNode n : set) { + + for (LayoutEdge se : n.succs) { + LayoutNode s = se.to; + if (!newSet.contains(s) && !failed.contains(s)) { + boolean ok = true; + for (LayoutEdge pe : s.preds) { + LayoutNode p = pe.from; + if (p.layer == -1) { + ok = false; + break; + } + } + + if (ok) { + newSet.add(s); + } else { + failed.add(s); + } + } + } + + } + + for (LayoutNode n : newSet) { + n.layer = z; + } + + // Swap sets + HashSet tmp = set; + set = newSet; + newSet = tmp; + z += minLayerDifference; + } + + optimize(set); + + layerCount = z - minLayerDifference; + + for (Vertex v : lastLayerHint) { + + LayoutNode n = vertexToLayoutNode.get(v); + assert n.succs.size() == 0; + n.layer = layerCount - 1; + } + + for (Vertex v : firstLayerHint) { + LayoutNode n = vertexToLayoutNode.get(v); + assert n.preds.size() == 0; + assert n.layer == 0; + } + } + + public void optimize(HashSet set) { + + for (LayoutNode n : set) { + if (n.preds.size() == 0 && n.succs.size() > 0) { + int minLayer = n.succs.get(0).to.layer; + for (LayoutEdge e : n.succs) { + minLayer = Math.min(minLayer, e.to.layer); + } + + n.layer = minLayer - 1; + } + } + + } + + @Override + public void postCheck() { + for (LayoutNode n : nodes) { + assert n.layer >= 0; + assert n.layer < layerCount; + for (LayoutEdge e : n.succs) { + assert e.from.layer < e.to.layer; + } + } + } + } + + private class ReverseEdges extends AlgorithmPart { + + private HashSet visited; + private HashSet active; + + protected void run() { + + // Remove self-edges, TODO: Special treatment + for (LayoutNode node : nodes) { + ArrayList succs = new ArrayList(node.succs); + for (LayoutEdge e : succs) { + assert e.from == node; + if (e.to == node) { + node.succs.remove(e); + node.preds.remove(e); + } + } + } + + // Reverse inputs of roots + for (LayoutNode node : nodes) { + if (node.vertex.isRoot()) { + boolean ok = true; + for (LayoutEdge e : node.preds) { + if (e.from.vertex.isRoot()) { + ok = false; + break; + } + } + if (ok) { + reverseAllInputs(node); + } + } + } + + + // Start DFS and reverse back edges + visited = new HashSet(); + active = new HashSet(); + for (LayoutNode node : nodes) { + DFS(node); + } + + + for (LayoutNode node : nodes) { + + SortedSet reversedDown = new TreeSet(); + + for (LayoutEdge e : node.succs) { + if (reversedLinks.contains(e.link)) { + reversedDown.add(e.relativeFrom); + } + } + + + SortedSet reversedUp = null; + if (reversedDown.size() == 0) { + reversedUp = new TreeSet(Collections.reverseOrder()); + } else { + reversedUp = new TreeSet(); + } + + for (LayoutEdge e : node.preds) { + if (reversedLinks.contains(e.link)) { + reversedUp.add(e.relativeTo); + } + } + + final int offset = X_OFFSET + DUMMY_WIDTH; + + int curX = 0; + int curWidth = node.width + reversedDown.size() * offset; + for (int pos : reversedDown) { + ArrayList reversedSuccs = new ArrayList(); + for (LayoutEdge e : node.succs) { + if (e.relativeFrom == pos && reversedLinks.contains(e.link)) { + reversedSuccs.add(e); + e.relativeFrom = curWidth; + } + } + + ArrayList startPoints = new ArrayList(); + startPoints.add(new Point(curWidth, curX)); + startPoints.add(new Point(pos, curX)); + startPoints.add(new Point(pos, reversedDown.size() * offset)); + for (LayoutEdge e : reversedSuccs) { + reversedLinkStartPoints.put(e.link, startPoints); + } + + node.inOffsets.put(pos, -curX); + curX += offset; + node.height += offset; + node.yOffset += offset; + curWidth -= offset; + } + node.width += reversedDown.size() * offset; + + if (reversedDown.size() == 0) { + curX = offset; + } else { + curX = -offset; + } + + curX = 0; + int minX = 0; + if (reversedDown.size() != 0) { + minX = -offset * reversedUp.size(); + } + + int oldNodeHeight = node.height; + for (int pos : reversedUp) { + ArrayList reversedPreds = new ArrayList(); + for (LayoutEdge e : node.preds) { + if (e.relativeTo == pos && reversedLinks.contains(e.link)) { + if (reversedDown.size() == 0) { + e.relativeTo = node.width + offset; + } else { + e.relativeTo = curX - offset; + } + + reversedPreds.add(e); + } + } + node.height += offset; + ArrayList endPoints = new ArrayList(); + + if (reversedDown.size() == 0) { + + curX += offset; + node.width += offset; + endPoints.add(new Point(node.width, node.height)); + + } else { + curX -= offset; + node.width += offset; + endPoints.add(new Point(curX, node.height)); + } + + node.outOffsets.put(pos - minX, curX); + curX += offset; + node.bottomYOffset += offset; + + + endPoints.add(new Point(pos, node.height)); + endPoints.add(new Point(pos, oldNodeHeight)); + for (LayoutEdge e : reversedPreds) { + reversedLinkEndPoints.put(e.link, endPoints); + } + } + + + if (minX < 0) { + for (LayoutEdge e : node.preds) { + e.relativeTo -= minX; + } + + for (LayoutEdge e : node.succs) { + e.relativeFrom -= minX; + } + + node.xOffset = -minX; + node.width += -minX; + } + } + + } + + private void DFS(LayoutNode startNode) { + if (visited.contains(startNode)) { + return; + } + + Stack stack = new Stack(); + stack.push(startNode); + + while (!stack.empty()) { + LayoutNode node = stack.pop(); + + if (visited.contains(node)) { + // Node no longer active + active.remove(node); + continue; + } + + // Repush immediately to know when no longer active + stack.push(node); + visited.add(node); + active.add(node); + + ArrayList succs = new ArrayList(node.succs); + for (LayoutEdge e : succs) { + if (active.contains(e.to)) { + assert visited.contains(e.to); + // Encountered back edge + reverseEdge(e); + } else if (!visited.contains(e.to) && (linksToFollow.size() == 0 || linksToFollow.contains(e.link))) { + stack.push(e.to); + } + } + } + } + + private void reverseAllInputs(LayoutNode node) { + for (LayoutEdge e : node.preds) { + assert !reversedLinks.contains(e.link); + reversedLinks.add(e.link); + node.succs.add(e); + e.from.preds.add(e); + e.from.succs.remove(e); + int oldRelativeFrom = e.relativeFrom; + int oldRelativeTo = e.relativeTo; + e.to = e.from; + e.from = node; + e.relativeFrom = oldRelativeTo; + e.relativeTo = oldRelativeFrom; + } + node.preds.clear(); + } + + private void reverseEdge(LayoutEdge e) { + assert !reversedLinks.contains(e.link); + reversedLinks.add(e.link); + + LayoutNode oldFrom = e.from; + LayoutNode oldTo = e.to; + int oldRelativeFrom = e.relativeFrom; + int oldRelativeTo = e.relativeTo; + + e.from = oldTo; + e.to = oldFrom; + e.relativeFrom = oldRelativeTo; + e.relativeTo = oldRelativeFrom; + + oldFrom.succs.remove(e); + oldFrom.preds.add(e); + oldTo.preds.remove(e); + oldTo.succs.add(e); + } + + @Override + public void postCheck() { + + for (LayoutNode n : nodes) { + + HashSet curVisited = new HashSet(); + Queue queue = new LinkedList(); + for (LayoutEdge e : n.succs) { + LayoutNode s = e.to; + queue.add(s); + curVisited.add(s); + } + + while (!queue.isEmpty()) { + LayoutNode curNode = queue.remove(); + + for (LayoutEdge e : curNode.succs) { + assert e.to != n; + if (!curVisited.contains(e.to)) { + queue.add(e.to); + curVisited.add(e.to); + } + } + } + } + } + } + private Comparator linkComparator = new Comparator() { + + public int compare(Link l1, Link l2) { + + int result = l1.getFrom().getVertex().compareTo(l2.getFrom().getVertex()); + if (result != 0) { + return result; + } + result = l1.getTo().getVertex().compareTo(l2.getTo().getVertex()); + if (result != 0) { + return result; + } + result = l1.getFrom().getRelativePosition().x - l2.getFrom().getRelativePosition().x; + if (result != 0) { + return result; + } + result = l1.getTo().getRelativePosition().x - l2.getTo().getRelativePosition().x; + return result; + } + }; + + private class BuildDatastructure extends AlgorithmPart { + + protected void run() { + // Set up nodes + List vertices = new ArrayList(graph.getVertices()); + Collections.sort(vertices); + + for (Vertex v : vertices) { + LayoutNode node = new LayoutNode(); + Dimension size = v.getSize(); + node.width = (int) size.getWidth(); + node.height = (int) size.getHeight(); + node.vertex = v; + nodes.add(node); + vertexToLayoutNode.put(v, node); + } + + // Set up edges + List links = new ArrayList(graph.getLinks()); + Collections.sort(links, linkComparator); + for (Link l : links) { + LayoutEdge edge = new LayoutEdge(); + assert vertexToLayoutNode.containsKey(l.getFrom().getVertex()); + assert vertexToLayoutNode.containsKey(l.getTo().getVertex()); + edge.from = vertexToLayoutNode.get(l.getFrom().getVertex()); + edge.to = vertexToLayoutNode.get(l.getTo().getVertex()); + edge.relativeFrom = l.getFrom().getRelativePosition().x; + edge.relativeTo = l.getTo().getRelativePosition().x; + edge.link = l; + edge.from.succs.add(edge); + edge.to.preds.add(edge); + //assert edge.from != edge.to; // No self-loops allowed + } + + for (Link l : importantLinks) { + if (!vertexToLayoutNode.containsKey(l.getFrom().getVertex()) || + vertexToLayoutNode.containsKey(l.getTo().getVertex())) { + continue; + } + LayoutNode from = vertexToLayoutNode.get(l.getFrom().getVertex()); + LayoutNode to = vertexToLayoutNode.get(l.getTo().getVertex()); + for (LayoutEdge e : from.succs) { + if (e.to == to) { + linksToFollow.add(e.link); + } + } + } + } + + @Override + public void postCheck() { + + assert vertexToLayoutNode.keySet().size() == nodes.size(); + assert nodes.size() == graph.getVertices().size(); + + for (Vertex v : graph.getVertices()) { + + LayoutNode node = vertexToLayoutNode.get(v); + assert node != null; + + for (LayoutEdge e : node.succs) { + assert e.from == node; + } + + for (LayoutEdge e : node.preds) { + assert e.to == node; + } + + } + } + } + + public void doRouting(LayoutGraph graph) { + // Do nothing for now + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/InterClusterConnection.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/InterClusterConnection.java new file mode 100644 index 00000000000..ef423ed753f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/InterClusterConnection.java @@ -0,0 +1,76 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.hierarchicallayout; + +import com.sun.hotspot.igv.layout.Link; +import com.sun.hotspot.igv.layout.Port; +import java.awt.Point; +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public class InterClusterConnection implements Link { + + private Port inputSlot; + private Port outputSlot; + private List intermediatePoints; + private ClusterInputSlotNode inputSlotNode; + private ClusterOutputSlotNode outputSlotNode; + + public InterClusterConnection(ClusterOutputSlotNode outputSlotNode, ClusterInputSlotNode inputSlotNode) { + this.outputSlotNode = outputSlotNode; + this.inputSlotNode = inputSlotNode; + this.inputSlot = inputSlotNode.getInputSlot(); + this.outputSlot = outputSlotNode.getOutputSlot(); + intermediatePoints = new ArrayList(); + } + + public ClusterOutputSlotNode getOutputSlotNode() { + return outputSlotNode; + } + + public Port getTo() { + return inputSlot; + } + + public Port getFrom() { + return outputSlot; + } + + public void setControlPoints(List p) { + this.intermediatePoints = p; + } + + public List getControlPoints() { + return intermediatePoints; + } + + @Override + public String toString() { + return "InterClusterConnection[from=" + getFrom() + ", to=" + getTo() + "]"; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Node.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Node.java new file mode 100644 index 00000000000..3d43e91be94 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Node.java @@ -0,0 +1,161 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.hierarchicallayout; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public class Node { + + private N data; + private List> inEdges; + private List> outEdges; + private boolean visited; + private boolean active; + private boolean reachable; + private Graph graph; + + protected boolean isVisited() { + return visited; + } + + protected void setVisited(boolean b) { + visited = b; + } + + protected boolean isReachable() { + return reachable; + } + + protected void setReachable(boolean b) { + reachable = b; + } + + protected boolean isActive() { + return active; + } + + protected void setActive(boolean b) { + active = b; + } + + public int getInDegree() { + return getInDegree(true); + } + + public int getInDegree(boolean countSelfLoops) { + if (countSelfLoops) { + return inEdges.size(); + } else { + int cnt = 0; + for (Edge e : inEdges) { + if (e.getSource() != this) { + cnt++; + } + } + return cnt; + } + } + + public int getOutDegree() { + return outEdges.size(); + } + + protected Node(Graph graph, N data) { + setData(data); + this.graph = graph; + inEdges = new ArrayList>(); + outEdges = new ArrayList>(); + } + + protected void addInEdge(Edge e) { + inEdges.add(e); + } + + public Graph getGraph() { + return graph; + } + + protected void addOutEdge(Edge e) { + outEdges.add(e); + } + + protected void removeInEdge(Edge e) { + //assert inEdges.contains(e); + inEdges.remove(e); + } + + protected void removeOutEdge(Edge e) { + //assert outEdges.contains(e); + outEdges.remove(e); + } + + public List> getInEdges() { + return Collections.unmodifiableList(inEdges); + } + + public List> getOutEdges() { + return Collections.unmodifiableList(outEdges); + } + + public List> getSuccessors() { + ArrayList> succ = new ArrayList>(); + for (Edge e : getOutEdges()) { + Node n = e.getDest(); + if (!succ.contains(n)) { + succ.add(n); + } + } + return succ; + } + + public List> getPredecessors() { + ArrayList> pred = new ArrayList>(); + for (Edge e : getInEdges()) { + Node n = e.getSource(); + if (!pred.contains(n)) { + pred.add(n); + } + } + return pred; + } + + public N getData() { + return data; + } + + public void setData(N d) { + data = d; + } + + @Override + public String toString() { + return "Node: " + data; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/OldHierarchicalLayoutManager.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/OldHierarchicalLayoutManager.java new file mode 100644 index 00000000000..5ed6c93afa1 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/OldHierarchicalLayoutManager.java @@ -0,0 +1,1222 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.hierarchicallayout; + +import java.awt.Point; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import com.sun.hotspot.igv.layout.LayoutGraph; +import com.sun.hotspot.igv.layout.LayoutManager; +import com.sun.hotspot.igv.layout.Link; +import com.sun.hotspot.igv.layout.Port; +import com.sun.hotspot.igv.layout.Vertex; + +/** + * + * @author Thomas Wuerthinger + */ +public class OldHierarchicalLayoutManager implements LayoutManager { + + public static final int DUMMY_WIDTH = 0; + public static final int DUMMY_HEIGHT = 0; + public static final int LAYER_OFFSET = 50; + public static final int OFFSET = 8; + public static final boolean VERTICAL_LAYOUT = true; + public static final boolean ASSERT = false; + public static final boolean TRACE = false; + public static final Timing initTiming = new Timing("init"); + public static final Timing removeCyclesTiming = new Timing("removeCycles"); + public static final Timing reversedEdgesTiming = new Timing("reversedEdges"); + public static final Timing assignLayersTiming = new Timing("assignLayers"); + public static final Timing dummyNodesTiming = new Timing("dummyNodes"); + public static final Timing crossingReductionTiming = new Timing("crossingReduction"); + public static final Timing assignCoordinatesTiming = new Timing("assignCoordinates"); + public static final Timing assignRealTiming = new Timing("assignReal"); + public static final Timing rootVertexTiming = new Timing("rootVertex"); + public static final Timing createEdgesTiming = new Timing("createEdges"); + public static final Timing optimizeMedianTiming = new Timing("optimizeMedian"); + private Combine combine; + + public enum Combine { + + NONE, + SAME_INPUTS, + SAME_OUTPUTS + } + + private class NodeData { + + private Map reversePositions; + private Vertex node; + private Link edge; + private int layer; + private int x; + private int y; + private int width; + + public NodeData(Vertex node) { + reversePositions = new HashMap(); + layer = -1; + this.node = node; + assert node != null; + + if (VERTICAL_LAYOUT) { + width = node.getSize().width; + } else { + width = node.getSize().height; + } + } + + public NodeData(Link edge) { + layer = -1; + this.edge = edge; + assert edge != null; + + if (VERTICAL_LAYOUT) { + width = DUMMY_WIDTH; + } else { + width = DUMMY_HEIGHT; + } + } + + public Vertex getNode() { + return node; + } + + public Link getEdge() { + return edge; + } + + public int getCoordinate() { + return x; + } + + public void setCoordinate(int x) { + this.x = x; + } + + public int getX() { + if (VERTICAL_LAYOUT) { + return x; + } else { + return y; + } + } + + public int getY() { + if (VERTICAL_LAYOUT) { + return y; + } else { + return x; + } + } + + public void setLayerCoordinate(int y) { + this.y = y; + } + + public void setLayer(int x) { + layer = x; + } + + public int getLayer() { + return layer; + } + + public boolean isDummy() { + return edge != null; + } + + public int getWidth() { + return width; + } + + public void addReversedStartEdge(Edge e) { + assert e.getData().isReversed(); + Port port = e.getData().getEdge().getTo(); + int pos = addReversedPort(port); + Point start = e.getData().getRelativeStart(); + e.getData().addStartPoint(start); + int yCoord = node.getSize().height + width - node.getSize().width; + e.getData().addStartPoint(new Point(start.x, yCoord)); + e.getData().addStartPoint(new Point(pos, yCoord)); + e.getData().setRelativeStart(new Point(pos, 0)); + } + + private int addReversedPort(Port p) { + if (reversePositions.containsKey(p)) { + return reversePositions.get(p); + } else { + width += OFFSET; + reversePositions.put(p, width); + return width; + } + } + + public void addReversedEndEdge(Edge e) { + assert e.getData().isReversed(); + int pos = addReversedPort(e.getData().getEdge().getFrom()); + Point end = e.getData().getRelativeEnd(); + e.getData().setRelativeEnd(new Point(pos, node.getSize().height)); + int yCoord = 0 - width + node.getSize().width; + e.getData().addEndPoint(new Point(pos, yCoord)); + e.getData().addEndPoint(new Point(end.x, yCoord)); + e.getData().addEndPoint(end); + } + + public int getHeight() { + if (isDummy()) { + if (VERTICAL_LAYOUT) { + return DUMMY_HEIGHT; + } else { + return DUMMY_WIDTH; + } + + } else { + if (VERTICAL_LAYOUT) { + return node.getSize().height; + } else { + return node.getSize().width; + } + } + } + + @Override + public String toString() { + if (isDummy()) { + return edge.toString() + "(layer=" + layer + ")"; + } else { + return node.toString() + "(layer=" + layer + ")"; + } + } + } + + private class EdgeData { + + private Point relativeEnd; + private Point relativeStart; + private List startPoints; + private List endPoints; + private boolean important; + private boolean reversed; + private Link edge; + + public EdgeData(Link edge) { + this(edge, false); + } + + public EdgeData(Link edge, boolean rev) { + this.edge = edge; + reversed = rev; + relativeStart = edge.getFrom().getRelativePosition(); + relativeEnd = edge.getTo().getRelativePosition(); + assert relativeStart.x >= 0 && relativeStart.x <= edge.getFrom().getVertex().getSize().width; + assert relativeStart.y >= 0 && relativeStart.y <= edge.getFrom().getVertex().getSize().height; + assert relativeEnd.x >= 0 && relativeEnd.x <= edge.getTo().getVertex().getSize().width; + assert relativeEnd.y >= 0 && relativeEnd.y <= edge.getTo().getVertex().getSize().height; + startPoints = new ArrayList(); + endPoints = new ArrayList(); + this.important = true; + } + + public boolean isImportant() { + return important; + } + + public void setImportant(boolean b) { + this.important = b; + } + + public List getStartPoints() { + return startPoints; + } + + public List getEndPoints() { + return endPoints; + } + + public List getAbsoluteEndPoints() { + if (endPoints.size() == 0) { + return endPoints; + } + + List result = new ArrayList(); + Point point = edge.getTo().getVertex().getPosition(); + for (Point p : endPoints) { + Point p2 = new Point(p.x + point.x, p.y + point.y); + result.add(p2); + } + + return result; + } + + public List getAbsoluteStartPoints() { + if (startPoints.size() == 0) { + return startPoints; + } + + List result = new ArrayList(); + Point point = edge.getFrom().getVertex().getPosition(); + for (Point p : startPoints) { + Point p2 = new Point(p.x + point.x, p.y + point.y); + result.add(p2); + } + + return result; + } + + public void addEndPoint(Point p) { + endPoints.add(p); + } + + public void addStartPoint(Point p) { + startPoints.add(p); + } + + public Link getEdge() { + return edge; + } + + public void setRelativeEnd(Point p) { + relativeEnd = p; + } + + public void setRelativeStart(Point p) { + relativeStart = p; + } + + public Point getRelativeEnd() { + return relativeEnd; + } + + public Point getRelativeStart() { + return relativeStart; + } + + public boolean isReversed() { + return reversed; + } + + public void setReversed(boolean b) { + reversed = b; + } + + @Override + public String toString() { + return "EdgeData[reversed=" + reversed + "]"; + } + } + private Graph graph; + private Map> nodeMap; + private int layerOffset; + + /** Creates a new instance of HierarchicalPositionManager */ + public OldHierarchicalLayoutManager(Combine combine) { + this(combine, LAYER_OFFSET); + } + + public OldHierarchicalLayoutManager(Combine combine, int layerOffset) { + this.combine = combine; + this.layerOffset = layerOffset; + } + + public void doRouting(LayoutGraph graph) { + } + + //public void setPositions(PositionedNode rootNode, List nodes, List edges) { + public void doLayout(LayoutGraph layoutGraph) { + doLayout(layoutGraph, new HashSet(), new HashSet()); + } + + public void doLayout(LayoutGraph layoutGraph, Set firstLayerHint, Set lastLayerHint) { + doLayout(layoutGraph, firstLayerHint, lastLayerHint, new HashSet()); + } + + public void doLayout(LayoutGraph layoutGraph, Set firstLayerHint, Set lastLayerHint, Set importantLinksHint) { + + if (TRACE) { + System.out.println("HierarchicalPositionManager.doLayout called"); + System.out.println("Vertex count = " + layoutGraph.getVertices().size() + " Link count = " + layoutGraph.getLinks().size()); + } + + // Nothing to do => quit immediately + if (layoutGraph.getVertices().size() == 0) { + return; + } + + initTiming.start(); + + // Mapping vertex to Node in graph + nodeMap = new HashMap>(); + + graph = new Graph(); + + Set> rootNodes = new HashSet>(); + Set startRootVertices = new HashSet(); + + for (Vertex v : layoutGraph.getVertices()) { + if (v.isRoot()) { + startRootVertices.add(v); + } + } + + rootVertexTiming.start(); + Set rootVertices = layoutGraph.findRootVertices(startRootVertices); + rootVertexTiming.stop(); + + + for (Vertex node : layoutGraph.getVertices()) { + + NodeData data = new NodeData(node); + Node n = graph.createNode(data, node); + nodeMap.put(node, n); + + if (rootVertices.contains(node)) { + rootNodes.add(n); + } + } + + Set links = layoutGraph.getLinks(); + Link[] linkArr = new Link[links.size()]; + links.toArray(linkArr); + + List linkList = new ArrayList(); + for (Link l : linkArr) { + linkList.add(l); + } + + createEdgesTiming.start(); + Collections.sort(linkList, new Comparator() { + + public int compare(Link o1, Link o2) { + int result = o1.getFrom().getVertex().compareTo(o2.getFrom().getVertex()); + if (result == 0) { + return o1.getTo().getVertex().compareTo(o2.getTo().getVertex()); + } else { + return result; + } + } + }); + + for (Link edge : linkList) { + EdgeData data = new EdgeData(edge); + graph.createEdge(graph.getNode(edge.getFrom().getVertex()), graph.getNode(edge.getTo().getVertex()), data, data); + if (importantLinksHint.size() > 0 && !importantLinksHint.contains(edge)) { + data.setImportant(false); + } + } + createEdgesTiming.stop(); + + initTiming.stop(); + + removeCyclesTiming.start(); + + // STEP 1: Remove cycles! + removeCycles(rootNodes); + if (ASSERT) { + assert checkRemoveCycles(); + } + + removeCyclesTiming.stop(); + + reversedEdgesTiming.start(); + + for (Node n : graph.getNodes()) { + List> edges = new ArrayList>(n.getOutEdges()); + Collections.sort(edges, new Comparator>() { + + public int compare(Edge o1, Edge o2) { + return o2.getData().getRelativeEnd().x - o1.getData().getRelativeEnd().x; + } + }); + + + for (Edge e : edges) { + + if (e.getData().isReversed()) { + e.getSource().getData().addReversedEndEdge(e); + } + } + } + + for (Node n : graph.getNodes()) { + List> edges = new ArrayList>(n.getInEdges()); + Collections.sort(edges, new Comparator>() { + + public int compare(Edge o1, Edge o2) { + return o2.getData().getRelativeStart().x - o1.getData().getRelativeStart().x; + } + }); + + + for (Edge e : edges) { + if (e.getData().isReversed()) { + e.getDest().getData().addReversedStartEdge(e); + } + } + } + + reversedEdgesTiming.stop(); + + assignLayersTiming.start(); + // STEP 2: Assign layers! + int maxLayer = assignLayers(rootNodes, firstLayerHint, lastLayerHint); + if (ASSERT) { + assert checkAssignLayers(); + } + + // Put into layer array + //int maxLayer = 0; + //for(Node n : graph.getNodes()) { + // maxLayer = Math.max(maxLayer, n.getData().getLayer()); + //} + + + ArrayList> layers[] = new ArrayList[maxLayer + 1]; + int layerSizes[] = new int[maxLayer + 1]; + for (int i = 0; i < maxLayer + 1; i++) { + layers[i] = new ArrayList>(); + } + + for (Node n : graph.getNodes()) { + int curLayer = n.getData().getLayer(); + layers[curLayer].add(n); + } + + assignLayersTiming.stop(); + + // STEP 3: Insert dummy nodes! + dummyNodesTiming.start(); + insertDummyNodes(layers); + if (ASSERT) { + assert checkDummyNodes(); + } + dummyNodesTiming.stop(); + + crossingReductionTiming.start(); + // STEP 4: Assign Y coordinates + assignLayerCoordinates(layers, layerSizes); + + // STEP 5: Crossing reduction + crossingReduction(layers); + crossingReductionTiming.stop(); + + // STEP 6: Assign Y coordinates + assignCoordinatesTiming.start(); + assignCoordinates(layers); + assignCoordinatesTiming.stop(); + + assignRealTiming.start(); + + // Assign coordinates of nodes to real objects + for (Node n : graph.getNodes()) { + if (!n.getData().isDummy()) { + + Vertex node = n.getData().getNode(); + node.setPosition(new Point(n.getData().getX(), n.getData().getY())); + } + } + + for (Node n : graph.getNodes()) { + if (!n.getData().isDummy()) { + + Vertex node = n.getData().getNode(); + + List> outEdges = n.getOutEdges(); + for (Edge e : outEdges) { + Node succ = e.getDest(); + if (succ.getData().isDummy()) { + //PositionedEdge edge = succ.getData().getEdge(); + List points = new ArrayList(); + assignToRealObjects(layerSizes, succ, points); + } else { + List points = new ArrayList(); + + EdgeData otherEdgeData = e.getData(); + points.addAll(otherEdgeData.getAbsoluteStartPoints()); + Link otherEdge = otherEdgeData.getEdge(); + Point relFrom = new Point(otherEdgeData.getRelativeStart()); + Point from = otherEdge.getFrom().getVertex().getPosition(); + relFrom.move(relFrom.x + from.x, relFrom.y + from.y); + points.add(relFrom); + + Point relTo = new Point(otherEdgeData.getRelativeEnd()); + Point to = otherEdge.getTo().getVertex().getPosition(); + relTo.move(relTo.x + to.x, relTo.y + to.y); + assert from != null; + assert to != null; + points.add(relTo); + points.addAll(otherEdgeData.getAbsoluteEndPoints()); + e.getData().getEdge().setControlPoints(points); + } + } + } + } + + assignRealTiming.stop(); + + initTiming.print(); + removeCyclesTiming.print(); + reversedEdgesTiming.print(); + assignLayersTiming.print(); + dummyNodesTiming.print(); + crossingReductionTiming.print(); + assignCoordinatesTiming.print(); + assignRealTiming.print(); + rootVertexTiming.print(); + createEdgesTiming.print(); + optimizeMedianTiming.print(); + } + + public boolean onOneLine(Point p1, Point p2, Point p3) { + int xoff1 = p1.x - p2.x; + int yoff1 = p1.y - p2.y; + int xoff2 = p3.x - p2.x; + int yoff2 = p3.y - p2.x; + + return (xoff1 * yoff2 - yoff1 * xoff2 == 0); + } + + private void assignToRealObjects(int layerSizes[], Node cur, List points) { + assert cur.getData().isDummy(); + + ArrayList otherPoints = new ArrayList(points); + + int size = layerSizes[cur.getData().getLayer()]; + otherPoints.add(new Point(cur.getData().getX(), cur.getData().getY() - size / 2)); + if (otherPoints.size() >= 3 && onOneLine(otherPoints.get(otherPoints.size() - 1), otherPoints.get(otherPoints.size() - 2), otherPoints.get(otherPoints.size() - 3))) { + otherPoints.remove(otherPoints.size() - 2); + } + otherPoints.add(new Point(cur.getData().getX(), cur.getData().getY() + size / 2)); + if (otherPoints.size() >= 3 && onOneLine(otherPoints.get(otherPoints.size() - 1), otherPoints.get(otherPoints.size() - 2), otherPoints.get(otherPoints.size() - 3))) { + otherPoints.remove(otherPoints.size() - 2); + } + + for (int i = 0; i < cur.getOutEdges().size(); i++) { + Node otherSucc = cur.getOutEdges().get(i).getDest(); + + if (otherSucc.getData().isDummy()) { + assignToRealObjects(layerSizes, otherSucc, otherPoints); + } else { + EdgeData otherEdgeData = cur.getOutEdges().get(i).getData(); + Link otherEdge = otherEdgeData.getEdge(); + + List middlePoints = new ArrayList(otherPoints); + if (cur.getOutEdges().get(i).getData().isReversed()) { + Collections.reverse(middlePoints); + } + + ArrayList copy = new ArrayList(); + Point relFrom = new Point(otherEdgeData.getRelativeStart()); + Point from = otherEdge.getFrom().getVertex().getPosition(); + //int moveUp = (size - otherEdge.getFrom().getVertex().getSize().height) / 2; + relFrom.move(relFrom.x + from.x, relFrom.y + from.y); + copy.addAll(otherEdgeData.getAbsoluteStartPoints()); + copy.add(relFrom); + copy.addAll(middlePoints); + + Point relTo = new Point(otherEdgeData.getRelativeEnd()); + Point to = otherEdge.getTo().getVertex().getPosition(); + relTo.move(relTo.x + to.x, relTo.y + to.y); + copy.add(relTo); + + copy.addAll(otherEdgeData.getAbsoluteEndPoints()); + + + otherEdge.setControlPoints(copy); + } + } + } + + private boolean checkDummyNodes() { + for (Edge e : graph.getEdges()) { + if (e.getSource().getData().getLayer() != e.getDest().getData().getLayer() - 1) { + return false; + } + } + + return true; + } + + private void insertDummyNodes(ArrayList> layers[]) { + + int sum = 0; + List> nodes = new ArrayList>(graph.getNodes()); + int edgeCount = 0; + int innerMostLoop = 0; + + for (Node n : nodes) { + List> edges = new ArrayList>(n.getOutEdges()); + for (Edge e : edges) { + + edgeCount++; + Link edge = e.getData().getEdge(); + Node destNode = e.getDest(); + Node lastNode = n; + Edge lastEdge = e; + + boolean searchForNode = (combine != Combine.NONE); + for (int i = n.getData().getLayer() + 1; i < destNode.getData().getLayer(); i++) { + + Node foundNode = null; + if (searchForNode) { + for (Node sameLayerNode : layers[i]) { + innerMostLoop++; + + if (combine == Combine.SAME_OUTPUTS) { + if (sameLayerNode.getData().isDummy() && sameLayerNode.getData().getEdge().getFrom() == edge.getFrom()) { + foundNode = sameLayerNode; + break; + } + } else if (combine == Combine.SAME_INPUTS) { + if (sameLayerNode.getData().isDummy() && sameLayerNode.getData().getEdge().getTo() == edge.getTo()) { + foundNode = sameLayerNode; + break; + } + } + } + } + + if (foundNode == null) { + searchForNode = false; + NodeData intermediateData = new NodeData(edge); + Node curNode = graph.createNode(intermediateData, null); + curNode.getData().setLayer(i); + layers[i].add(0, curNode); + sum++; + lastEdge.remove(); + graph.createEdge(lastNode, curNode, e.getData(), null); + assert lastNode.getData().getLayer() == curNode.getData().getLayer() - 1; + lastEdge = graph.createEdge(curNode, destNode, e.getData(), null); + lastNode = curNode; + } else { + lastEdge.remove(); + lastEdge = graph.createEdge(foundNode, destNode, e.getData(), null); + lastNode = foundNode; + } + + } + } + } + + if (TRACE) { + System.out.println("Number of edges: " + edgeCount); + } + if (TRACE) { + System.out.println("Dummy nodes inserted: " + sum); + } + } + + private void assignLayerCoordinates(ArrayList> layers[], int layerSizes[]) { + int cur = 0; + for (int i = 0; i < layers.length; i++) { + int maxHeight = 0; + for (Node n : layers[i]) { + maxHeight = Math.max(maxHeight, n.getData().getHeight()); + } + + layerSizes[i] = maxHeight; + for (Node n : layers[i]) { + int curCoordinate = cur + (maxHeight - n.getData().getHeight()) / 2; + n.getData().setLayerCoordinate(curCoordinate); + } + cur += maxHeight + layerOffset; + + } + } + + private void assignCoordinates(ArrayList> layers[]) { + + // TODO: change this + for (int i = 0; i < layers.length; i++) { + ArrayList> curArray = layers[i]; + int curY = 0; + for (Node n : curArray) { + + n.getData().setCoordinate(curY); + if (!n.getData().isDummy()) { + curY += n.getData().getWidth(); + } + curY += OFFSET; + + } + } + + int curSol = evaluateSolution(); + if (TRACE) { + System.out.println("First coordinate solution found: " + curSol); + } + + // Sort to correct order + for (int i = 0; i < layers.length; i++) { + Collections.sort(layers[i], new Comparator>() { + + public int compare(Node o1, Node o2) { + if (o2.getData().isDummy()) { + return 1; + } else if (o1.getData().isDummy()) { + return -1; + } + return o2.getInEdges().size() + o2.getOutEdges().size() - o1.getInEdges().size() - o1.getOutEdges().size(); + } + }); + } + + + optimizeMedianTiming.start(); + for (int i = 0; i < 2; i++) { + optimizeMedian(layers); + curSol = evaluateSolution(); + if (TRACE) { + System.out.println("Current coordinate solution found: " + curSol); + } + } + optimizeMedianTiming.stop(); + normalizeCoordinate(); + + } + + private void normalizeCoordinate() { + + int min = Integer.MAX_VALUE; + for (Node n : graph.getNodes()) { + min = Math.min(min, n.getData().getCoordinate()); + } + + for (Node n : graph.getNodes()) { + n.getData().setCoordinate(n.getData().getCoordinate() - min); + } + + } + + private void optimizeMedian(ArrayList> layers[]) { + + // Downsweep + for (int i = 1; i < layers.length; i++) { + + ArrayList> processingList = layers[i]; + ArrayList> alreadyAssigned = new ArrayList>(); + for (Node n : processingList) { + + + ArrayList> preds = new ArrayList>(n.getPredecessors()); + int pos = n.getData().getCoordinate(); + if (preds.size() > 0) { + + Collections.sort(preds, new Comparator>() { + + public int compare(Node o1, Node o2) { + return o1.getData().getCoordinate() - o2.getData().getCoordinate(); + } + }); + + if (preds.size() % 2 == 0) { + assert preds.size() >= 2; + pos = (preds.get(preds.size() / 2).getData().getCoordinate() - calcRelativeCoordinate(preds.get(preds.size() / 2), n) + preds.get(preds.size() / 2 - 1).getData().getCoordinate() - calcRelativeCoordinate(preds.get(preds.size() / 2 - 1), n)) / 2; + } else { + assert preds.size() >= 1; + pos = preds.get(preds.size() / 2).getData().getCoordinate() - calcRelativeCoordinate(preds.get(preds.size() / 2), n); + } + } + + tryAdding(alreadyAssigned, n, pos); + } + } + // Upsweep + for (int i = layers.length - 2; i >= 0; i--) { + ArrayList> processingList = layers[i]; + ArrayList> alreadyAssigned = new ArrayList>(); + for (Node n : processingList) { + + ArrayList> succs = new ArrayList>(n.getSuccessors()); + int pos = n.getData().getCoordinate(); + if (succs.size() > 0) { + + Collections.sort(succs, new Comparator>() { + + public int compare(Node o1, Node o2) { + return o1.getData().getCoordinate() - o2.getData().getCoordinate(); + } + }); + + if (succs.size() % 2 == 0) { + assert succs.size() >= 2; + pos = (succs.get(succs.size() / 2).getData().getCoordinate() - calcRelativeCoordinate(n, succs.get(succs.size() / 2)) + succs.get(succs.size() / 2 - 1).getData().getCoordinate() - calcRelativeCoordinate(n, succs.get(succs.size() / 2 - 1))) / 2; + } else { + assert succs.size() >= 1; + pos = succs.get(succs.size() / 2).getData().getCoordinate() - calcRelativeCoordinate(n, succs.get(succs.size() / 2)); + } + } + + tryAdding(alreadyAssigned, n, pos); + } + } + } + + private int median(ArrayList arr) { + assert arr.size() > 0; + Collections.sort(arr); + if (arr.size() % 2 == 0) { + return (arr.get(arr.size() / 2) + arr.get(arr.size() / 2 - 1)) / 2; + } else { + return arr.get(arr.size() / 2); + } + } + + private int calcRelativeCoordinate(Node n, Node succ) { + + if (n.getData().isDummy() && succ.getData().isDummy()) { + return 0; + } + + int pos = 0; + int pos2 = 0; + ArrayList coords2 = new ArrayList(); + ArrayList coords = new ArrayList(); + /*if(!n.getData().isDummy())*/ { + for (Edge e : n.getOutEdges()) { + + //System.out.println("reversed: " + e.getData().isReversed()); + if (e.getDest() == succ) { + + if (e.getData().isReversed()) { + if (!n.getData().isDummy()) { + coords.add(e.getData().getRelativeEnd().x); + } + + if (!succ.getData().isDummy()) { + coords2.add(e.getData().getRelativeStart().x); + } + } else { + if (!n.getData().isDummy()) { + coords.add(e.getData().getRelativeStart().x); + } + + if (!succ.getData().isDummy()) { + coords2.add(e.getData().getRelativeEnd().x); + } + } + } + } + + // assert coords.size() > 0; + if (!n.getData().isDummy()) { + pos = median(coords); + } + + if (!succ.getData().isDummy()) { + pos2 = median(coords2); + } + } + //System.out.println("coords=" + coords); + //System.out.println("coords2=" + coords2); + + return pos - pos2; + } + + private boolean intersect(int v1, int w1, int v2, int w2) { + if (v1 >= v2 && v1 < v2 + w2) { + return true; + } + if (v1 + w1 > v2 && v1 + w1 < v2 + w2) { + return true; + } + if (v1 < v2 && v1 + w1 > v2) { + return true; + } + return false; + } + + private boolean intersect(Node n1, Node n2) { + return intersect(n1.getData().getCoordinate(), n1.getData().getWidth() + OFFSET, n2.getData().getCoordinate(), n2.getData().getWidth() + OFFSET); + } + + private void tryAdding(List> alreadyAssigned, Node node, int pos) { + + boolean doesIntersect = false; + node.getData().setCoordinate(pos); + for (Node n : alreadyAssigned) { + if (n.getData().getCoordinate() + n.getData().getWidth() < pos) { + break; + } else if (intersect(node, n)) { + doesIntersect = true; + break; + } + + } + + if (!doesIntersect) { + + // Everything fine, just place the node + int z = 0; + for (Node n : alreadyAssigned) { + if (pos > n.getData().getCoordinate()) { + break; + } + z++; + } + + if (z == -1) { + z = alreadyAssigned.size(); + } + + + if (ASSERT) { + assert !findOverlap(alreadyAssigned, node); + } + alreadyAssigned.add(z, node); + + } else { + + assert alreadyAssigned.size() > 0; + + // Search for alternative location + int minOffset = Integer.MAX_VALUE; + int minIndex = -1; + int minPos = 0; + int w = node.getData().getWidth() + OFFSET; + + // Try top-most + minIndex = 0; + minPos = alreadyAssigned.get(0).getData().getCoordinate() + alreadyAssigned.get(0).getData().getWidth() + OFFSET; + minOffset = Math.abs(minPos - pos); + + // Try bottom-most + Node lastNode = alreadyAssigned.get(alreadyAssigned.size() - 1); + int lastPos = lastNode.getData().getCoordinate() - w; + int lastOffset = Math.abs(lastPos - pos); + if (lastOffset < minOffset) { + minPos = lastPos; + minOffset = lastOffset; + minIndex = alreadyAssigned.size(); + } + + // Try between + for (int i = 0; i < alreadyAssigned.size() - 1; i++) { + Node curNode = alreadyAssigned.get(i); + Node nextNode = alreadyAssigned.get(i + 1); + + int start = nextNode.getData().getCoordinate() + nextNode.getData().getWidth() + OFFSET; + int end = curNode.getData().getCoordinate() - OFFSET; + + int bestPoss = end - node.getData().getWidth(); + if (bestPoss < pos && pos - bestPoss > minOffset) { + // No better solution possible => break + break; + } + + if (end - start >= node.getData().getWidth()) { + // Node could fit here + int cand1 = start; + int cand2 = end - node.getData().getWidth(); + int off1 = Math.abs(cand1 - pos); + int off2 = Math.abs(cand2 - pos); + if (off1 < minOffset) { + minPos = cand1; + minOffset = off1; + minIndex = i + 1; + } + + if (off2 < minOffset) { + minPos = cand2; + minOffset = off2; + minIndex = i + 1; + } + } + } + + assert minIndex != -1; + node.getData().setCoordinate(minPos); + if (ASSERT) { + assert !findOverlap(alreadyAssigned, node); + } + alreadyAssigned.add(minIndex, node); + } + + } + + private boolean findOverlap(List> nodes, Node node) { + + for (Node n1 : nodes) { + if (intersect(n1, node)) { + return true; + } + } + + return false; + } + + private int evaluateSolution() { + + int sum = 0; + for (Edge e : graph.getEdges()) { + Node source = e.getSource(); + Node dest = e.getDest(); + int offset = 0; + offset = Math.abs(source.getData().getCoordinate() - dest.getData().getCoordinate()); + sum += offset; + } + + return sum; + } + + private void crossingReduction(ArrayList> layers[]) { + + for (int i = 0; i < layers.length - 1; i++) { + + ArrayList> curNodes = layers[i]; + ArrayList> nextNodes = layers[i + 1]; + for (Node n : curNodes) { + for (Node succ : n.getSuccessors()) { + if (ASSERT) { + assert nextNodes.contains(succ); + } + nextNodes.remove(succ); + nextNodes.add(succ); + } + } + + } + + } + + private void removeCycles(Set> rootNodes) { + final List> reversedEdges = new ArrayList>(); + + + int removedCount = 0; + int reversedCount = 0; + + Graph.DFSTraversalVisitor visitor = graph.new DFSTraversalVisitor() { + + @Override + public boolean visitEdge(Edge e, boolean backEdge) { + if (backEdge) { + if (ASSERT) { + assert !reversedEdges.contains(e); + } + reversedEdges.add(e); + e.getData().setReversed(!e.getData().isReversed()); + } + + return e.getData().isImportant(); + } + }; + Set> nodes = new HashSet>(); + nodes.addAll(rootNodes); + + assert nodes.size() > 0; + + this.graph.traverseDFS(nodes, visitor); + + for (Edge e : reversedEdges) { + if (e.isSelfLoop()) { + e.remove(); + removedCount++; + } else { + e.reverse(); + reversedCount++; + } + } + } + + private boolean checkRemoveCycles() { + return !graph.hasCycles(); + } + // Only used by assignLayers + private int maxLayerTemp; + + private int assignLayers(Set> rootNodes, Set firstLayerHints, + Set lastLayerHints) { + this.maxLayerTemp = -1; + for (Node n : graph.getNodes()) { + n.getData().setLayer(-1); + } + + Graph.BFSTraversalVisitor traverser = graph.new BFSTraversalVisitor() { + + @Override + public void visitNode(Node n, int depth) { + if (depth > n.getData().getLayer()) { + n.getData().setLayer(depth); + maxLayerTemp = Math.max(maxLayerTemp, depth); + } + } + }; + + for (Node n : rootNodes) { + if (n.getData().getLayer() == -1) { + this.graph.traverseBFS(n, traverser, true); + } + } + + for (Vertex v : firstLayerHints) { + assert nodeMap.containsKey(v); + nodeMap.get(v).getData().setLayer(0); + } + + for (Vertex v : lastLayerHints) { + assert nodeMap.containsKey(v); + nodeMap.get(v).getData().setLayer(maxLayerTemp); + } + + return maxLayerTemp; + } + + private boolean checkAssignLayers() { + + for (Edge e : graph.getEdges()) { + Node source = e.getSource(); + Node dest = e.getDest(); + + + if (source.getData().getLayer() >= dest.getData().getLayer()) { + return false; + } + } + int maxLayer = 0; + for (Node n : graph.getNodes()) { + assert n.getData().getLayer() >= 0; + if (n.getData().getLayer() > maxLayer) { + maxLayer = n.getData().getLayer(); + } + } + + int countPerLayer[] = new int[maxLayer + 1]; + for (Node n : graph.getNodes()) { + countPerLayer[n.getData().getLayer()]++; + } + + if (TRACE) { + System.out.println("Number of layers: " + maxLayer); + } + return true; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Timing.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Timing.java new file mode 100644 index 00000000000..fe6cd28f2a0 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Timing.java @@ -0,0 +1,67 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.hierarchicallayout; + +/** + * + * @author Thomas Wuerthinger + */ +public class Timing { + + private long lastValue; + private long sum; + private String name; + + public Timing(String name) { + this.name = name; + } + + @Override + public String toString() { + long val = sum; + if (lastValue != 0) { + // Timer running + long newValue = System.nanoTime(); + val += (newValue - lastValue); + } + return "Timing for " + name + " is: " + val / 1000000 + " ms"; + } + + public void print() { + System.out.println(toString()); + } + + public void start() { + lastValue = System.nanoTime(); + } + + public void stop() { + if (lastValue == 0) { + throw new IllegalStateException("You must call start before stop"); + } + long newValue = System.nanoTime(); + sum += newValue - lastValue; + lastValue = 0; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/build.xml new file mode 100644 index 00000000000..002f9bcc3e8 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/build.xml @@ -0,0 +1,8 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.layout. + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/manifest.mf new file mode 100644 index 00000000000..eafc2369dc6 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/manifest.mf @@ -0,0 +1,5 @@ +Manifest-Version: 1.0 +OpenIDE-Module: com.sun.hotspot.igv.layout +OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/layout/Bundle.properties +OpenIDE-Module-Specification-Version: 1.0 + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/build-impl.xml new file mode 100644 index 00000000000..84413d25676 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/build-impl.xml @@ -0,0 +1,30 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/genfiles.properties new file mode 100644 index 00000000000..f054d11726d --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=cb0889d9 +build.xml.script.CRC32=d65fccb9 +build.xml.stylesheet.CRC32=79c3b980 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=cb0889d9 +nbproject/build-impl.xml.script.CRC32=7f82736d +nbproject/build-impl.xml.stylesheet.CRC32=deb65f65 diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/platform.properties new file mode 100644 index 00000000000..68ad75e5766 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/platform.properties @@ -0,0 +1,29 @@ +# Deprecated since 5.0u1; for compatibility with 5.0: +disabled.clusters=\ + apisupport1,\ + harness,\ + ide8,\ + java1,\ + nb6.0,\ + profiler2 +disabled.modules=\ + org.netbeans.core.execution,\ + org.netbeans.core.multiview,\ + org.netbeans.core.output2,\ + org.netbeans.modules.applemenu,\ + org.netbeans.modules.autoupdate.services,\ + org.netbeans.modules.autoupdate.ui,\ + org.netbeans.modules.core.kit,\ + org.netbeans.modules.favorites,\ + org.netbeans.modules.javahelp,\ + org.netbeans.modules.masterfs,\ + org.netbeans.modules.options.keymap,\ + org.netbeans.modules.sendopts,\ + org.netbeans.modules.templates,\ + org.openide.compat,\ + org.openide.execution,\ + org.openide.util.enumerations +enabled.clusters=\ + platform7 +nbjdk.active=JDK_1.6 +nbplatform.active=default diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/project.properties new file mode 100644 index 00000000000..152f44eca60 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/project.properties @@ -0,0 +1,2 @@ +javac.source=1.5 +javac.compilerargs=-Xlint -Xlint:-serial diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/project.xml new file mode 100644 index 00000000000..edd56a5bc66 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/project.xml @@ -0,0 +1,14 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.layout + + + + com.sun.hotspot.igv.layout + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/suite.properties new file mode 100644 index 00000000000..29d7cc9bd6f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/suite.properties @@ -0,0 +1 @@ +suite.dir=${basedir}/.. diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Bundle.properties new file mode 100644 index 00000000000..578627a2b9e --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Bundle.properties @@ -0,0 +1 @@ +OpenIDE-Module-Name=Layout diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Cluster.java b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Cluster.java new file mode 100644 index 00000000000..a4bfda5fdff --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Cluster.java @@ -0,0 +1,42 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.layout; + +import java.awt.Rectangle; +import java.util.Set; + +/** + * + * @author Thomas Wuerthinger + */ +public interface Cluster extends Comparable { + + public Cluster getOuter(); + + public void setBounds(Rectangle r); + + public Set getSuccessors(); + + public Set getPredecessors(); +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/LayoutGraph.java b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/LayoutGraph.java new file mode 100644 index 00000000000..ac262c95e74 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/LayoutGraph.java @@ -0,0 +1,202 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.layout; + +import java.util.HashSet; +import java.util.Hashtable; +import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; + +/** + * + * @author Thomas Wuerthinger + */ +public class LayoutGraph { + + private Set links; + private SortedSet vertices; + private Hashtable> inputPorts; + private Hashtable> outputPorts; + private Hashtable> portLinks; + + public LayoutGraph(Set links) { + this(links, new HashSet()); + } + + public LayoutGraph(Set links, Set additionalVertices) { + this.links = links; + assert verify(); + + vertices = new TreeSet(); + portLinks = new Hashtable>(); + inputPorts = new Hashtable>(); + outputPorts = new Hashtable>(); + + for (Link l : links) { + Port p = l.getFrom(); + Port p2 = l.getTo(); + Vertex v1 = p.getVertex(); + Vertex v2 = p2.getVertex(); + + if (!vertices.contains(v1)) { + + outputPorts.put(v1, new HashSet(1)); + inputPorts.put(v1, new HashSet(3)); + vertices.add(v1); + assert vertices.contains(v1); + } + + if (!vertices.contains(v2)) { + vertices.add(v2); + assert vertices.contains(v2); + outputPorts.put(v2, new HashSet(1)); + inputPorts.put(v2, new HashSet(3)); + } + + if (!portLinks.containsKey(p)) { + HashSet hashSet = new HashSet(3); + portLinks.put(p, hashSet); + } + + if (!portLinks.containsKey(p2)) { + portLinks.put(p2, new HashSet(3)); + } + + outputPorts.get(v1).add(p); + inputPorts.get(v2).add(p2); + + portLinks.get(p).add(l); + portLinks.get(p2).add(l); + } + + for (Vertex v : additionalVertices) { + if (!vertices.contains(v)) { + outputPorts.put(v, new HashSet(1)); + inputPorts.put(v, new HashSet(3)); + vertices.add(v); + vertices.contains(v); + } + } + } + + public Set getInputPorts(Vertex v) { + return this.inputPorts.get(v); + } + + public Set getOutputPorts(Vertex v) { + return this.outputPorts.get(v); + } + + public Set getPortLinks(Port p) { + return portLinks.get(p); + } + + public Set getLinks() { + return links; + } + + public boolean verify() { + return true; + } + + public SortedSet getVertices() { + return vertices; + } + + private void markNotRoot(Set notRootSet, Vertex v, Vertex startingVertex) { + + if (notRootSet.contains(v)) { + return; + } + if (v != startingVertex) { + notRootSet.add(v); + } + Set outPorts = getOutputPorts(v); + for (Port p : outPorts) { + Set portLinks = getPortLinks(p); + for (Link l : portLinks) { + Port other = l.getTo(); + Vertex otherVertex = other.getVertex(); + if (otherVertex != startingVertex) { + markNotRoot(notRootSet, otherVertex, startingVertex); + } + } + } + } + + // Returns a set of vertices with the following properties: + // - All Vertices in the set startingRoots are elements of the set. + // - When starting a DFS at every vertex in the set, every vertex of the + // whole graph is visited. + public Set findRootVertices(Set startingRoots) { + + Set notRootSet = new HashSet(); + for (Vertex v : startingRoots) { + if (!notRootSet.contains(v)) { + markNotRoot(notRootSet, v, v); + } + } + + Set tmpVertices = getVertices(); + for (Vertex v : tmpVertices) { + if (!notRootSet.contains(v)) { + if (this.getInputPorts(v).size() == 0) { + markNotRoot(notRootSet, v, v); + } + } + } + + for (Vertex v : tmpVertices) { + if (!notRootSet.contains(v)) { + markNotRoot(notRootSet, v, v); + } + } + + Set result = new HashSet(); + for (Vertex v : tmpVertices) { + if (!notRootSet.contains(v)) { + result.add(v); + } + } + assert tmpVertices.size() == 0 || result.size() > 0; + return result; + } + + public Set findRootVertices() { + return findRootVertices(new HashSet()); + } + + public SortedSet getClusters() { + + SortedSet clusters = new TreeSet(); + for (Vertex v : getVertices()) { + if (v.getCluster() != null) { + clusters.add(v.getCluster()); + } + } + + return clusters; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/LayoutManager.java b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/LayoutManager.java new file mode 100644 index 00000000000..25d0a5eb913 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/LayoutManager.java @@ -0,0 +1,39 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.layout; + +import java.util.Set; + +/** + * + * @author Thomas Wuerthinger + */ +public interface LayoutManager { + + public void doLayout(LayoutGraph graph); + + public void doLayout(LayoutGraph graph, Set firstLayerHint, Set lastLayerHint, Set importantLinks); + + public void doRouting(LayoutGraph graph); +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Link.java b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Link.java new file mode 100644 index 00000000000..b885d4823a4 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Link.java @@ -0,0 +1,42 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.layout; + +import java.awt.Point; +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public interface Link { + + public Port getFrom(); + + public Port getTo(); + + public List getControlPoints(); + + public void setControlPoints(List list); +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Port.java b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Port.java new file mode 100644 index 00000000000..0bfe394aa83 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Port.java @@ -0,0 +1,37 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.layout; + +import java.awt.Point; + +/** + * + * @author Thomas Wuerthinger + */ +public interface Port { + + public Vertex getVertex(); + + public Point getRelativePosition(); +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Vertex.java b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Vertex.java new file mode 100644 index 00000000000..3a6020b3b9f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Vertex.java @@ -0,0 +1,44 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.layout; + +import java.awt.Dimension; +import java.awt.Point; + +/** + * + * @author Thomas Wuerthinger + */ +public interface Vertex extends Comparable { + + public Cluster getCluster(); + + public Dimension getSize(); + + public Point getPosition(); + + public void setPosition(Point p); + + public boolean isRoot(); +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/build.xml new file mode 100644 index 00000000000..4565a3d6402 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/build.xml @@ -0,0 +1,8 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.connection. + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/manifest.mf new file mode 100644 index 00000000000..791c20daf71 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/manifest.mf @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +OpenIDE-Module: com.sun.hotspot.igv.connection +OpenIDE-Module-Layer: com/sun/hotspot/igv/connection/layer.xml +OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/connection/Bundle.properties +OpenIDE-Module-Specification-Version: 1.0 + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/build-impl.xml new file mode 100644 index 00000000000..5e1c4139d0f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/build-impl.xml @@ -0,0 +1,30 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/genfiles.properties new file mode 100644 index 00000000000..0897ad916a4 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=f8e21cb6 +build.xml.script.CRC32=a265137e +build.xml.stylesheet.CRC32=79c3b980 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=f8e21cb6 +nbproject/build-impl.xml.script.CRC32=36f3138c +nbproject/build-impl.xml.stylesheet.CRC32=deb65f65 diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/project.properties new file mode 100644 index 00000000000..152f44eca60 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/project.properties @@ -0,0 +1,2 @@ +javac.source=1.5 +javac.compilerargs=-Xlint -Xlint:-serial diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/project.xml new file mode 100644 index 00000000000..5edaba9763b --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/project.xml @@ -0,0 +1,55 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.connection + + + + com.sun.hotspot.igv.data + + + + 1.0 + + + + com.sun.hotspot.igv.settings + + + + 1.0 + + + + org.openide.awt + + + + 6.11.1.1 + + + + org.openide.dialogs + + + + 7.5.1 + + + + org.openide.util + + + + 7.10.1.1 + + + + + com.sun.hotspot.igv.connection + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/suite.properties new file mode 100644 index 00000000000..29d7cc9bd6f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/suite.properties @@ -0,0 +1 @@ +suite.dir=${basedir}/.. diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupReceiver b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupReceiver new file mode 100644 index 00000000000..62561a6709f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupReceiver @@ -0,0 +1 @@ +com.sun.hotspot.igv.connection.Server \ No newline at end of file diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Bundle.properties new file mode 100644 index 00000000000..6cbad75a668 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Bundle.properties @@ -0,0 +1 @@ +OpenIDE-Module-Name=NetworkConnection diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Client.java b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Client.java new file mode 100644 index 00000000000..a16c2eced3b --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Client.java @@ -0,0 +1,96 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.connection; + +import com.sun.hotspot.igv.data.Group; +import com.sun.hotspot.igv.data.services.GroupCallback; +import com.sun.hotspot.igv.data.serialization.Parser; +import com.sun.hotspot.igv.data.Properties.RegexpPropertyMatcher; +import java.io.IOException; +import java.io.InputStream; +import java.net.Socket; +import javax.swing.JTextField; +import org.openide.util.Exceptions; +import org.openide.xml.XMLUtil; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; + +/** + * + * @author Thomas Wuerthinger + */ +public class Client implements Runnable, GroupCallback { + + private Socket socket; + private JTextField networkTextField; + private GroupCallback callback; + + public Client(Socket socket, JTextField networkTextField, GroupCallback callback) { + this.callback = callback; + this.socket = socket; + this.networkTextField = networkTextField; + } + + public void run() { + + try { + InputStream inputStream = socket.getInputStream(); + + if (networkTextField.isEnabled()) { + + socket.getOutputStream().write('y'); + InputSource is = new InputSource(inputStream); + + try { + XMLReader reader = XMLUtil.createXMLReader(); + Parser parser = new Parser(this); + parser.parse(reader, is, null); + } catch (SAXException ex) { + ex.printStackTrace(); + } + } else { + socket.getOutputStream().write('n'); + } + + socket.close(); + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + } + + public void started(final Group g) { + try { + RegexpPropertyMatcher matcher = new RegexpPropertyMatcher("name", ".*" + networkTextField.getText() + ".*"); + if (g.getProperties().selectSingle(matcher) != null && networkTextField.isEnabled()) { + socket.getOutputStream().write('y'); + callback.started(g); + } else { + socket.getOutputStream().write('n'); + } + } catch (IOException e) { + } + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Server.java b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Server.java new file mode 100644 index 00000000000..6bd3dd67bb1 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Server.java @@ -0,0 +1,145 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.connection; + +import com.sun.hotspot.igv.data.Group; +import com.sun.hotspot.igv.data.services.GroupCallback; +import com.sun.hotspot.igv.data.services.GroupReceiver; +import com.sun.hotspot.igv.settings.Settings; +import java.awt.Component; +import java.io.IOException; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.prefs.PreferenceChangeEvent; +import java.util.prefs.PreferenceChangeListener; +import javax.swing.SwingUtilities; +import org.openide.DialogDisplayer; +import org.openide.NotifyDescriptor; +import org.openide.util.RequestProcessor; + +/** + * + * @author Thomas Wuerthinger + */ +public class Server implements GroupCallback, GroupReceiver, PreferenceChangeListener { + + private javax.swing.JPanel jPanel1; + private javax.swing.JCheckBox networkCheckBox; + private javax.swing.JTextField networkTextField; + private ServerSocket serverSocket; + private GroupCallback callback; + private int port; + private Runnable serverRunnable; + + public Component init(GroupCallback callback) { + + this.callback = callback; + + jPanel1 = new javax.swing.JPanel(); + networkTextField = new javax.swing.JTextField(); + networkCheckBox = new javax.swing.JCheckBox(); + + + jPanel1.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5)); + jPanel1.setLayout(new java.awt.BorderLayout(10, 10)); + jPanel1.add(networkTextField, java.awt.BorderLayout.CENTER); + + networkCheckBox.setSelected(true); + org.openide.awt.Mnemonics.setLocalizedText(networkCheckBox, "Receive when name contains"); + networkCheckBox.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); + networkCheckBox.setMargin(new java.awt.Insets(0, 0, 0, 0)); + networkCheckBox.addChangeListener(new javax.swing.event.ChangeListener() { + + public void stateChanged(javax.swing.event.ChangeEvent evt) { + networkCheckBoxChanged(evt); + } + }); + jPanel1.add(networkCheckBox, java.awt.BorderLayout.WEST); + networkCheckBox.getAccessibleContext().setAccessibleName("Read from network when name contains"); + + initializeNetwork(); + Settings.get().addPreferenceChangeListener(this); + return jPanel1; + } + + private void networkCheckBoxChanged(javax.swing.event.ChangeEvent evt) { + networkTextField.setEnabled(networkCheckBox.isSelected()); + } + + public void preferenceChange(PreferenceChangeEvent e) { + + int curPort = Integer.parseInt(Settings.get().get(Settings.PORT, Settings.PORT_DEFAULT)); + if (curPort != port) { + initializeNetwork(); + } + } + + private void initializeNetwork() { + + int curPort = Integer.parseInt(Settings.get().get(Settings.PORT, Settings.PORT_DEFAULT)); + this.port = curPort; + try { + serverSocket = new java.net.ServerSocket(curPort); + } catch (IOException ex) { + NotifyDescriptor message = new NotifyDescriptor.Message("Could not create server. Listening for incoming data is disabled.", NotifyDescriptor.ERROR_MESSAGE); + DialogDisplayer.getDefault().notifyLater(message); + return; + } + + Runnable runnable = new Runnable() { + + public void run() { + while (true) { + try { + Socket clientSocket = serverSocket.accept(); + if (serverRunnable != this) { + clientSocket.close(); + return; + } + RequestProcessor.getDefault().post(new Client(clientSocket, networkTextField, Server.this), 0, Thread.MAX_PRIORITY); + } catch (IOException ex) { + serverSocket = null; + NotifyDescriptor message = new NotifyDescriptor.Message("Error during listening for incoming connections. Listening for incoming data is disabled.", NotifyDescriptor.ERROR_MESSAGE); + DialogDisplayer.getDefault().notifyLater(message); + return; + } + } + } + }; + + serverRunnable = runnable; + + RequestProcessor.getDefault().post(runnable, 0, Thread.MAX_PRIORITY); + } + + public void started(final Group g) { + SwingUtilities.invokeLater(new Runnable() { + + public void run() { + callback.started(g); + } + }); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/layer.xml b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/layer.xml new file mode 100644 index 00000000000..c16a8a0fed6 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/layer.xml @@ -0,0 +1,4 @@ + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/README b/hotspot/src/share/tools/IdealGraphVisualizer/README new file mode 100644 index 00000000000..80e16329506 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/README @@ -0,0 +1,45 @@ +The Ideal Graph Visualizer is a tool developed to help examine the +intermediate representation of C2 which is commonly referred to as the +"ideal graph". It was developed in collaboration with the University +of Linz in Austria and has been included as part of hotspot since that +was the primary target of the tool. The tool itself is fairly general +with only a few modules that contain C2 specific elements. + +The tool is built on top of the NetBeans 6.0 rich client +infrastructure and so requires NetBeans to build. It currently +requires Java 6 to run as it needs support for JavaScript for its +filtering mechanism and assumes it's built into the platform. It +should build out of the box whit NetBeans 6 and Java 6 or later. It's +possible to run it on 1.5 by including Rhino on the classpath though +that currently isn't working correctly. Support for exporting graphs +as SVG can be enabled by adding batik to the classpath which isn't +included by default. + +It can be built on top of NetBeans 6.1 if you change the required +modules to be platform8 instead of platform7. The tool could run on +JDK 1.5 with some reworking of the how the JavaScript support is +enabled but currently it requires some tweaking of the setup. This +will be fixed in a later setup. + +The JVM support is controlled by the flag -XX:PrintIdealGraphLevel=# +where # is: + + 0: no output, the default + 1: dumps graph after parsing, before matching, and final code. + also dumps graph for failed compiles, if available + 2: more detail, including after loop opts + 3: even more detail + 4: prints graph after parsing every bytecode (very slow) + +By default the JVM expects that it will connect to a visualizer on the +local host on port 4444. This can be configured using the options +-XX:PrintIdealGraphAddress= and -XX:PrintIdealGraphPort=. +PrintIdealGraphAddress can actually be a hostname. + +Alternatively the output can be sent to a file using +-XX:PrintIdealGraphFile=filename. Each compiler thread will get it's +own file with unique names being generated by adding a number onto the +provided file name. + +More information about the tool is available at +http://wikis.sun.com/display/HotSpotInternals/IdealGraphVisualizer. diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/build.xml new file mode 100644 index 00000000000..dfdd0922316 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/build.xml @@ -0,0 +1,8 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.rhino. + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/manifest.mf new file mode 100644 index 00000000000..18ba3a45614 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/manifest.mf @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +OpenIDE-Module: com.sun.hotspot.igv.rhino +OpenIDE-Module-Layer: com/sun/hotspot/igv/rhino/layer.xml +OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/rhino/Bundle.properties +OpenIDE-Module-Specification-Version: 1.0 + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/build-impl.xml new file mode 100644 index 00000000000..d627b3a01c1 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/build-impl.xml @@ -0,0 +1,30 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/genfiles.properties new file mode 100644 index 00000000000..e21cae5f34b --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=0c3e7912 +build.xml.script.CRC32=44d0050c +build.xml.stylesheet.CRC32=79c3b980 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=0c3e7912 +nbproject/build-impl.xml.script.CRC32=7aab3f52 +nbproject/build-impl.xml.stylesheet.CRC32=deb65f65 diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/project.properties new file mode 100644 index 00000000000..152f44eca60 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/project.properties @@ -0,0 +1,2 @@ +javac.source=1.5 +javac.compilerargs=-Xlint -Xlint:-serial diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/project.xml new file mode 100644 index 00000000000..1f9e5814f48 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/project.xml @@ -0,0 +1,31 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.rhino + + + + com.sun.hotspot.igv.filter + + + + 1.0 + + + + com.sun.hotspot.igv.graph + + + + 1.0 + + + + + com.sun.hotspot.igv.rhino + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/suite.properties new file mode 100644 index 00000000000..29d7cc9bd6f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/suite.properties @@ -0,0 +1 @@ +suite.dir=${basedir}/.. diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/META-INF/services/com.sun.hotspot.igv.filter.ScriptEngineAbstraction b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/META-INF/services/com.sun.hotspot.igv.filter.ScriptEngineAbstraction new file mode 100644 index 00000000000..11a13a78ee0 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/META-INF/services/com.sun.hotspot.igv.filter.ScriptEngineAbstraction @@ -0,0 +1 @@ +com.sun.hotspot.igv.rhino.RhinoScriptEngine \ No newline at end of file diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/Bundle.properties new file mode 100644 index 00000000000..e389254eb05 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/Bundle.properties @@ -0,0 +1 @@ +OpenIDE-Module-Name=RhinoScriptEngineProxy diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/RhinoScriptEngine.java b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/RhinoScriptEngine.java new file mode 100644 index 00000000000..187aa0567be --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/RhinoScriptEngine.java @@ -0,0 +1,85 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.rhino; + +import com.sun.hotspot.igv.filter.ScriptEngineAbstraction; +import com.sun.hotspot.igv.graph.Diagram; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * + * @author Thomas Wuerthinger + */ +public class RhinoScriptEngine implements ScriptEngineAbstraction { + + private String jsHelperText; + private Constructor importer; + private Method scope_put; + private Method cx_evaluateString; + private Method context_enter; + private Method context_exit; + + public boolean initialize(String s) { + this.jsHelperText = s; + Class importerTopLevel = null; + try { + ClassLoader cl = RhinoScriptEngine.class.getClassLoader(); + Class context = cl.loadClass("org.mozilla.javascript.Context"); + Class scriptable = cl.loadClass("org.mozilla.javascript.Scriptable"); + importerTopLevel = cl.loadClass("org.mozilla.javascript.ImporterTopLevel"); + importer = importerTopLevel.getDeclaredConstructor(context); + scope_put = importerTopLevel.getMethod("put", new Class[]{String.class, scriptable, Object.class}); + cx_evaluateString = context.getDeclaredMethod("evaluateString", new Class[]{scriptable, String.class, String.class, Integer.TYPE, Object.class}); + context_enter = context.getDeclaredMethod("enter", new Class[0]); + context_exit = context.getDeclaredMethod("exit", new Class[0]); + return true; + } catch (NoSuchMethodException nsme) { + return false; + } catch (ClassNotFoundException cnfe) { + return false; + } + } + + public void execute(Diagram d, String code) { + try { + Object cx = context_enter.invoke(null, (Object[]) null); + try { + Object scope = importer.newInstance(cx); + scope_put.invoke(scope, "IO", scope, System.out); + scope_put.invoke(scope, "graph", scope, d); + cx_evaluateString.invoke(cx, scope, jsHelperText, "jsHelper.js", 1, null); + cx_evaluateString.invoke(cx, scope, code, "", 1, null); + } finally { + // Exit from the context. + context_exit.invoke(null, (Object[]) null); + } + } catch (InvocationTargetException iae) { + } catch (IllegalAccessException iae) { + } catch (InstantiationException iae) { + } + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/layer.xml b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/layer.xml new file mode 100644 index 00000000000..c16a8a0fed6 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/layer.xml @@ -0,0 +1,4 @@ + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/build.xml new file mode 100644 index 00000000000..31a102f060e --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/build.xml @@ -0,0 +1,8 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.servercompilerscheduler. + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/manifest.mf new file mode 100644 index 00000000000..20c6b686833 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/manifest.mf @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +OpenIDE-Module: com.sun.hotspot.igv.servercompiler +OpenIDE-Module-Layer: com/sun/hotspot/igv/servercompiler/layer.xml +OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/servercompiler/Bundle.properties +OpenIDE-Module-Specification-Version: 1.0 + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/build-impl.xml new file mode 100644 index 00000000000..97fbd021e86 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/build-impl.xml @@ -0,0 +1,30 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/genfiles.properties new file mode 100644 index 00000000000..18f1a882ca0 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=d1360a65 +build.xml.script.CRC32=a9d94ef8 +build.xml.stylesheet.CRC32=79c3b980 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=d1360a65 +nbproject/build-impl.xml.script.CRC32=52847236 +nbproject/build-impl.xml.stylesheet.CRC32=deb65f65 diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/platform.properties new file mode 100644 index 00000000000..68ad75e5766 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/platform.properties @@ -0,0 +1,29 @@ +# Deprecated since 5.0u1; for compatibility with 5.0: +disabled.clusters=\ + apisupport1,\ + harness,\ + ide8,\ + java1,\ + nb6.0,\ + profiler2 +disabled.modules=\ + org.netbeans.core.execution,\ + org.netbeans.core.multiview,\ + org.netbeans.core.output2,\ + org.netbeans.modules.applemenu,\ + org.netbeans.modules.autoupdate.services,\ + org.netbeans.modules.autoupdate.ui,\ + org.netbeans.modules.core.kit,\ + org.netbeans.modules.favorites,\ + org.netbeans.modules.javahelp,\ + org.netbeans.modules.masterfs,\ + org.netbeans.modules.options.keymap,\ + org.netbeans.modules.sendopts,\ + org.netbeans.modules.templates,\ + org.openide.compat,\ + org.openide.execution,\ + org.openide.util.enumerations +enabled.clusters=\ + platform7 +nbjdk.active=JDK_1.6 +nbplatform.active=default diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/project.properties new file mode 100644 index 00000000000..152f44eca60 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/project.properties @@ -0,0 +1,2 @@ +javac.source=1.5 +javac.compilerargs=-Xlint -Xlint:-serial diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/project.xml new file mode 100644 index 00000000000..56151ed37c8 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/project.xml @@ -0,0 +1,21 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.servercompiler + + + + com.sun.hotspot.igv.data + + + + 1.0 + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/suite.properties new file mode 100644 index 00000000000..29d7cc9bd6f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/suite.properties @@ -0,0 +1 @@ +suite.dir=${basedir}/.. diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupOrganizer b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupOrganizer new file mode 100644 index 00000000000..9da82d4ca10 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupOrganizer @@ -0,0 +1 @@ +com.sun.hotspot.igv.servercompiler.JavaGroupOrganizer \ No newline at end of file diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/META-INF/services/com.sun.hotspot.igv.data.services.Scheduler b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/META-INF/services/com.sun.hotspot.igv.data.services.Scheduler new file mode 100644 index 00000000000..530080f9f70 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/META-INF/services/com.sun.hotspot.igv.data.services.Scheduler @@ -0,0 +1 @@ +com.sun.hotspot.igv.servercompiler.ServerCompilerScheduler diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/Bundle.properties new file mode 100644 index 00000000000..c5daf04b712 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/Bundle.properties @@ -0,0 +1 @@ +OpenIDE-Module-Name=ServerCompiler diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/JavaGroupOrganizer.java b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/JavaGroupOrganizer.java new file mode 100644 index 00000000000..e9cc2d62fb9 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/JavaGroupOrganizer.java @@ -0,0 +1,200 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.servercompiler; + +import com.sun.hotspot.igv.data.Group; +import com.sun.hotspot.igv.data.services.GroupOrganizer; +import com.sun.hotspot.igv.data.Pair; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public class JavaGroupOrganizer implements GroupOrganizer { + + public String getName() { + return "Java structure"; + } + + public List>> organize(List subFolders, List groups) { + + List>> result = new ArrayList>>(); + + if (subFolders.size() == 0) { + buildResult(result, groups, packageNameProvider); + } else if (subFolders.size() == 1) { + buildResult(result, groups, classNameProvider); + } else if (subFolders.size() == 2) { + for (Group g : groups) { + List children = new ArrayList(); + children.add(g); + Pair> p = new Pair>(); + p.setLeft(reducedNameProvider.getName(g)); + p.setRight(children); + result.add(p); + } + } else { + result.add(new Pair>("", groups)); + } + + return result; + } + + private void buildResult(List>> result, List groups, NameProvider provider) { + HashMap> map = new HashMap>(); + for (Group g : groups) { + String s = provider.getName(g); + + if (!map.containsKey(s)) { + List list = new ArrayList(); + Pair> pair = new Pair>(s, list); + result.add(pair); + map.put(s, list); + } + + List curList = map.get(s); + curList.add(g); + } + + Collections.sort(result, new Comparator>>() { + + public int compare(Pair> a, Pair> b) { + return a.getLeft().compareTo(b.getLeft()); + } + }); + } + + private static interface NameProvider { + + public String getName(Group g); + } + private NameProvider reducedNameProvider = new NameProvider() { + + public String getName(Group g) { + String name = g.getName(); + assert name != null : "name of group must be set!"; + final String noReducedName = name; + + int firstPoint = name.indexOf("."); + if (firstPoint == -1) { + return noReducedName; + } + + int firstParenthese = name.indexOf("("); + if (firstParenthese == -1 || firstParenthese < firstPoint) { + return noReducedName; + } + + int current = firstPoint; + while (current > 0 && name.charAt(current) != ' ') { + current--; + } + + String tmp = name.substring(0, firstParenthese); + int lastPoint = tmp.lastIndexOf("."); + if (lastPoint == -1) { + return noReducedName; + } + + name = name.substring(0, current + 1) + name.substring(lastPoint + 1); + return name; + } + }; + private NameProvider packageNameProvider = new NameProvider() { + + public String getName(Group g) { + String name = g.getName(); + assert name != null : "name of group must be set!"; + final String noPackage = ""; + + int firstPoint = name.indexOf("."); + if (firstPoint == -1) { + return noPackage; + } + + int firstParenthese = name.indexOf("("); + if (firstParenthese == -1 || firstParenthese < firstPoint) { + return noPackage; + } + + int current = firstPoint; + while (current > 0 && name.charAt(current) != ' ') { + current--; + } + + String fullClassName = name.substring(current + 1, firstParenthese); + int lastPoint = fullClassName.lastIndexOf("."); + if (lastPoint == -1) { + return noPackage; + } + lastPoint = fullClassName.lastIndexOf(".", lastPoint - 1); + if (lastPoint == -1) { + return noPackage; + } + + String packageName = fullClassName.substring(0, lastPoint); + return packageName; + } + }; + private NameProvider classNameProvider = new NameProvider() { + + public String getName(Group g) { + String name = g.getName(); + assert name != null : "name of group must be set!"; + + final String noClass = ""; + + int firstPoint = name.indexOf("."); + if (firstPoint == -1) { + return noClass; + } + + int firstParenthese = name.indexOf("("); + if (firstParenthese == -1 || firstParenthese < firstPoint) { + return noClass; + } + + int current = firstPoint; + while (current > 0 && name.charAt(current) != ' ') { + current--; + } + + String fullClassName = name.substring(current + 1, firstParenthese); + int lastPoint = fullClassName.lastIndexOf("."); + if (lastPoint == -1) { + return noClass; + } + int lastlastPoint = fullClassName.lastIndexOf(".", lastPoint - 1); + + String className = fullClassName.substring(lastlastPoint + 1, lastPoint); + return className; + } + }; +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/ServerCompilerScheduler.java b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/ServerCompilerScheduler.java new file mode 100644 index 00000000000..408f142ad8a --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/ServerCompilerScheduler.java @@ -0,0 +1,597 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.servercompiler; + +import com.sun.hotspot.igv.data.InputBlock; +import com.sun.hotspot.igv.data.InputEdge; +import com.sun.hotspot.igv.data.InputGraph; +import com.sun.hotspot.igv.data.InputNode; +import com.sun.hotspot.igv.data.services.Scheduler; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.Stack; +import java.util.Vector; + +/** + * + * @author Thomas Wuerthinger + */ +public class ServerCompilerScheduler implements Scheduler { + + private static class Node { + + public InputNode inputNode; + public Set succs = new HashSet(); + public List preds = new ArrayList(); + public InputBlock block; + public boolean isBlockProjection; + public boolean isBlockStart; + } + private InputGraph graph; + private Collection nodes; + private Map inputNodeToNode; + private Vector blocks; + private Map dominatorMap; + private Map blockIndex; + private InputBlock[][] commonDominator; + private static final Comparator edgeComparator = new Comparator() { + + public int compare(InputEdge o1, InputEdge o2) { + return o1.getToIndex() - o2.getToIndex(); + } + }; + + public void buildBlocks() { + + blocks = new Vector(); + Node root = findRoot(); + if (root == null) { + return; + } + Stack stack = new Stack(); + Set visited = new HashSet(); + stack.add(root); + int blockCount = 0; + InputBlock rootBlock = null; + + + while (!stack.isEmpty()) { + Node proj = stack.pop(); + Node parent = proj; + if (proj.isBlockProjection && proj.preds.size() > 0) { + parent = proj.preds.get(0); + } + + if (!visited.contains(parent)) { + visited.add(parent); + InputBlock block = new InputBlock(graph, "" + blockCount); + blocks.add(block); + if (parent == root) { + rootBlock = block; + } + blockCount++; + parent.block = block; + if (proj != parent && proj.succs.size() == 1 && proj.succs.contains(root)) { + // Special treatment of Halt-nodes + proj.block = block; + } + + Node p = proj; + do { + if (p.preds.size() == 0 || p.preds.get(0) == null) { + p = parent; + break; + } + p = p.preds.get(0); + + if (p.block == null) { + p.block = block; + } + } while (!p.isBlockProjection && !p.isBlockStart); + + if (block != rootBlock) { + for (Node n : p.preds) { + if (n != null && n != p) { + if (n.isBlockProjection) { + n = n.preds.get(0); + } + if (n.block != null) { + n.block.addSuccessor(block); + } + } + } + } + + for (Node n : parent.succs) { + if (n != root && n.isBlockProjection) { + for (Node n2 : n.succs) { + + if (n2 != parent && n2.block != null && n2.block != rootBlock) { + block.addSuccessor(n2.block); + } + } + } else { + if (n != parent && n.block != null && n.block != rootBlock) { + block.addSuccessor(n.block); + } + } + } + + int num_preds = p.preds.size(); + int bottom = -1; + if (isRegion(p) || isPhi(p)) { + bottom = 0; + } + + int pushed = 0; + for (int i = num_preds - 1; i > bottom; i--) { + if (p.preds.get(i) != null && p.preds.get(i) != p) { + stack.push(p.preds.get(i)); + pushed++; + } + } + + if (pushed == 0 && p == root) { + // TODO: special handling when root backedges are not built yet + } + } + } + + for (Node n : nodes) { + InputBlock block = n.block; + if (block != null) { + block.addNode(n.inputNode.getId()); + } + } + + int z = 0; + blockIndex = new HashMap(); + for (InputBlock b : blocks) { + blockIndex.put(b, z); + z++; + } + } + + private String getBlockName(InputNode n) { + return n.getProperties().get("block"); + } + + public Collection schedule(InputGraph graph) { + if (graph.getBlocks().size() > 0) { + Collection tmpNodes = new ArrayList(graph.getNodes()); + for (InputNode n : tmpNodes) { + String block = getBlockName(n); + if (graph.getBlock(n) == null) { + graph.getBlock(block).addNode(n); + assert graph.getBlock(n) != null; + } + } + return graph.getBlocks(); + } else { + nodes = new ArrayList(); + inputNodeToNode = new HashMap(); + + this.graph = graph; + buildUpGraph(); + buildBlocks(); + buildDominators(); + buildCommonDominators(); + scheduleLatest(); + + for (InputNode n : graph.getNodes()) { + assert graph.getBlock(n) != null; + } + + return blocks; + } + } + + public void scheduleLatest() { + + + Node root = findRoot(); + + // Mark all nodes reachable in backward traversal from root + Set reachable = new HashSet(); + reachable.add(root); + Stack stack = new Stack(); + stack.push(root); + while (!stack.isEmpty()) { + Node cur = stack.pop(); + for (Node n : cur.preds) { + if (!reachable.contains(n)) { + reachable.add(n); + stack.push(n); + } + } + } + + Set unscheduled = new HashSet(); + for (Node n : this.nodes) { + if (n.block == null && reachable.contains(n)) { + unscheduled.add(n); + } + } + + while (unscheduled.size() > 0) { + boolean progress = false; + + Set newUnscheduled = new HashSet(); + for (Node n : unscheduled) { + + InputBlock block = null; + if (this.isPhi(n) && n.preds.get(0) != null) { + // Phi nodes in same block as region nodes + block = n.preds.get(0).block; + } else { + for (Node s : n.succs) { + if (reachable.contains(s)) { + if (s.block == null) { + block = null; + break; + } else { + if (block == null) { + block = s.block; + } else { + block = commonDominator[this.blockIndex.get(block)][blockIndex.get(s.block)]; + } + } + } + } + } + + if (block != null) { + n.block = block; + block.addNode(n.inputNode.getId()); + progress = true; + } else { + newUnscheduled.add(n); + } + } + + unscheduled = newUnscheduled; + + if (!progress) { + break; + } + } + + Set curReachable = new HashSet(reachable); + for (Node n : curReachable) { + if (n.block != null) { + for (Node s : n.succs) { + if (!reachable.contains(s)) { + markWithBlock(s, n.block, reachable); + } + } + } + } + + } + + private void markWithBlock(Node n, InputBlock b, Set reachable) { + assert !reachable.contains(n); + Stack stack = new Stack(); + stack.push(n); + n.block = b; + b.addNode(n.inputNode.getId()); + reachable.add(n); + + while (!stack.isEmpty()) { + Node cur = stack.pop(); + for (Node s : cur.succs) { + if (!reachable.contains(s)) { + reachable.add(s); + s.block = b; + b.addNode(s.inputNode.getId()); + stack.push(s); + } + } + + for (Node s : cur.preds) { + if (!reachable.contains(s)) { + reachable.add(s); + s.block = b; + b.addNode(s.inputNode.getId()); + stack.push(s); + } + } + } + } + + private class BlockIntermediate { + + InputBlock block; + int index; + int dominator; + int semi; + int parent; + int label; + int ancestor; + List pred; + List bucket; + } + + public void buildCommonDominators() { + commonDominator = new InputBlock[this.blocks.size()][this.blocks.size()]; + for (int i = 0; i < blocks.size(); i++) { + for (int j = 0; j < blocks.size(); j++) { + commonDominator[i][j] = getCommonDominator(i, j); + } + } + } + + public InputBlock getCommonDominator(int a, int b) { + InputBlock ba = blocks.get(a); + InputBlock bb = blocks.get(b); + if (ba == bb) { + return ba; + } + Set visited = new HashSet(); + while (ba != null) { + visited.add(ba); + ba = dominatorMap.get(ba); + } + + while (bb != null) { + if (visited.contains(bb)) { + return bb; + } + bb = dominatorMap.get(bb); + } + + assert false; + return null; + } + + public void buildDominators() { + dominatorMap = new HashMap(); + if (blocks.size() == 0) { + return; + } + Vector intermediate = new Vector(); + Map map = new HashMap(); + int z = 0; + for (InputBlock b : blocks) { + BlockIntermediate bi = new BlockIntermediate(); + bi.block = b; + bi.index = z; + bi.dominator = -1; + bi.semi = -1; + bi.parent = -1; + bi.label = z; + bi.ancestor = -1; + bi.pred = new ArrayList(); + bi.bucket = new ArrayList(); + intermediate.add(bi); + map.put(b, bi); + z++; + } + Stack stack = new Stack(); + stack.add(0); + + Vector array = new Vector(); + intermediate.get(0).dominator = 0; + + int n = 0; + while (!stack.isEmpty()) { + int index = stack.pop(); + BlockIntermediate ib = intermediate.get(index); + ib.semi = n; + array.add(ib); + n = n + 1; + for (InputBlock b : ib.block.getSuccessors()) { + BlockIntermediate succ = map.get(b); + if (succ.semi == -1) { + succ.parent = index; + stack.push(succ.index); // TODO: check if same node could be pushed twice + } + succ.pred.add(index); + } + } + + for (int i = n - 1; i > 0; i--) { + BlockIntermediate block = array.get(i); + int block_index = block.index; + for (int predIndex : block.pred) { + int curIndex = eval(predIndex, intermediate); + BlockIntermediate curBlock = intermediate.get(curIndex); + if (curBlock.semi < block.semi) { + block.semi = curBlock.semi; + } + } + + + int semiIndex = block.semi; + BlockIntermediate semiBlock = array.get(semiIndex); + semiBlock.bucket.add(block_index); + + link(block.parent, block_index, intermediate); + BlockIntermediate parentBlock = intermediate.get(block.parent); + + for (int j = 0; j < parentBlock.bucket.size(); j++) { + for (int curIndex : parentBlock.bucket) { + int newIndex = eval(curIndex, intermediate); + BlockIntermediate curBlock = intermediate.get(curIndex); + BlockIntermediate newBlock = intermediate.get(newIndex); + int dom = block.parent; + if (newBlock.semi < curBlock.semi) { + dom = newIndex; + } + + curBlock.dominator = dom; + } + } + + + parentBlock.bucket.clear(); + } + + for (int i = 1; i < n; i++) { + + BlockIntermediate block = array.get(i); + int block_index = block.index; + + int semi_index = block.semi; + BlockIntermediate semi_block = array.get(semi_index); + + if (block.dominator != semi_block.index) { + int new_dom = intermediate.get(block.dominator).dominator; + block.dominator = new_dom; + } + } + + for (BlockIntermediate ib : intermediate) { + if (ib.dominator == -1) { + ib.dominator = 0; + } + } + + for (BlockIntermediate bi : intermediate) { + InputBlock b = bi.block; + int dominator = bi.dominator; + InputBlock dominatorBlock = null; + if (dominator != -1) { + dominatorBlock = intermediate.get(dominator).block; + } + + if (dominatorBlock == b) { + dominatorBlock = null; + } + this.dominatorMap.put(b, dominatorBlock); + } + } + + private void compress(int index, Vector blocks) { + BlockIntermediate block = blocks.get(index); + + int ancestor = block.ancestor; + assert ancestor != -1; + + BlockIntermediate ancestor_block = blocks.get(ancestor); + if (ancestor_block.ancestor != -1) { + compress(ancestor, blocks); + + int label = block.label; + BlockIntermediate label_block = blocks.get(label); + + int ancestor_label = ancestor_block.label; + BlockIntermediate ancestor_label_block = blocks.get(label); + if (ancestor_label_block.semi < label_block.semi) { + block.label = ancestor_label; + } + + block.ancestor = ancestor_block.ancestor; + } + } + + private int eval(int index, Vector blocks) { + BlockIntermediate block = blocks.get(index); + if (block.ancestor == -1) { + return index; + } else { + compress(index, blocks); + return block.label; + } + } + + private void link(int index1, int index2, Vector blocks) { + BlockIntermediate block2 = blocks.get(index2); + block2.ancestor = index1; + } + + private boolean isRegion(Node n) { + return n.inputNode.getProperties().get("name").equals("Region"); + } + + private boolean isPhi(Node n) { + return n.inputNode.getProperties().get("name").equals("Phi"); + } + + private Node findRoot() { + + for (Node n : nodes) { + InputNode inputNode = n.inputNode; + if (inputNode.getProperties().get("name").equals("Root")) { + return n; + } + } + + return null; + } + + public void buildUpGraph() { + + for (InputNode n : graph.getNodes()) { + Node node = new Node(); + node.inputNode = n; + nodes.add(node); + String p = n.getProperties().get("is_block_proj"); + node.isBlockProjection = (p != null && p.equals("true")); + p = n.getProperties().get("is_block_start"); + node.isBlockStart = (p != null && p.equals("true")); + inputNodeToNode.put(n, node); + } + + Map> edgeMap = new HashMap>(); + for (InputEdge e : graph.getEdges()) { + + int to = e.getTo(); + if (!edgeMap.containsKey(to)) { + edgeMap.put(to, new ArrayList()); + } + + + List list = edgeMap.get(to); + list.add(e); + } + + + for (Integer i : edgeMap.keySet()) { + + List list = edgeMap.get(i); + Collections.sort(list, edgeComparator); + + int to = i; + InputNode toInputNode = graph.getNode(to); + Node toNode = inputNodeToNode.get(toInputNode); + for (InputEdge e : list) { + assert to == e.getTo(); + int from = e.getFrom(); + InputNode fromInputNode = graph.getNode(from); + Node fromNode = inputNodeToNode.get(fromInputNode); + fromNode.succs.add(toNode); + toNode.preds.add(fromNode); + } + } + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/color.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/color.filter new file mode 100644 index 00000000000..3ad07276df8 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/color.filter @@ -0,0 +1,5 @@ +colorize("name", ".*", yellow); +colorize("name", "Catch.*", blue); + +colorize("name", "Region|Loop|CountedLoop|Root", red); +colorize("name", "CProj|IfFalse|IfTrue|JProj|CatchProj", magenta); diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/combine.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/combine.filter new file mode 100644 index 00000000000..8e5c5a0a7c7 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/combine.filter @@ -0,0 +1,4 @@ +var f = new CombineFilter("Combine Filter"); +f.addRule(new CombineFilter.CombineRule(new Properties.RegexpPropertyMatcher("name", ".*"), new Properties.RegexpPropertyMatcher("name", "Proj|IfFalse|IfTrue|JProj|MachProj|JumpProj|CatchProj"))); +f.addRule(new CombineFilter.CombineRule(new Properties.RegexpPropertyMatcher("name", "Cmp.*"), new Properties.RegexpPropertyMatcher("name", "Bool"))); +f.apply(graph); \ No newline at end of file diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/difference.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/difference.filter new file mode 100644 index 00000000000..53277373d60 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/difference.filter @@ -0,0 +1,4 @@ +colorize("state", "same", white); +colorize("state", "changed", orange); +colorize("state", "new", green); +colorize("state", "deleted", red); diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/extendedColor.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/extendedColor.filter new file mode 100644 index 00000000000..1ea0fb36abe --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/extendedColor.filter @@ -0,0 +1,3 @@ +colorize("name", "Con.*", orange); +colorize("name", "Parm|Proj", lightGray); +colorize("bci", "..*", magenta); \ No newline at end of file diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/linestyle.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/linestyle.filter new file mode 100644 index 00000000000..9aa15e79298 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/linestyle.filter @@ -0,0 +1,7 @@ +var f = new ColorFilter("Line Style filter"); +f.addRule(new ColorFilter.ColorRule(new MatcherSelector(new Properties.StringPropertyMatcher("type", "int:")), null, Color.BLUE, null)); +f.addRule(new ColorFilter.ColorRule(new MatcherSelector(new Properties.StringPropertyMatcher("type", "control")), null, Color.RED, null)); +f.addRule(new ColorFilter.ColorRule(new MatcherSelector(new Properties.StringPropertyMatcher("type", "memory")), null, Color.GREEN, null)); +f.addRule(new ColorFilter.ColorRule(new MatcherSelector(new Properties.StringPropertyMatcher("type", "tuple:")), null, Color.MAGENTA, null)); +f.addRule(new ColorFilter.ColorRule(new MatcherSelector(new Properties.StringPropertyMatcher("type", "bottom")), null, Color.LIGHT_GRAY, null)); +f.apply(graph); \ No newline at end of file diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/matchingFlags.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/matchingFlags.filter new file mode 100644 index 00000000000..0f18448e162 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/matchingFlags.filter @@ -0,0 +1,3 @@ +colorize("is_dontcare", "false", white); +colorize("is_shared", "true", green); +colorize("is_dontcare", "true", red); diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/onlyControlFlow.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/onlyControlFlow.filter new file mode 100644 index 00000000000..7230576a2ac --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/onlyControlFlow.filter @@ -0,0 +1,24 @@ +var f = new RemoveFilter("Show only control flow"); +f.addRule( + new RemoveFilter.RemoveRule( + new InvertSelector( + new OrSelector( + new OrSelector( + new SuccessorSelector( + new MatcherSelector( + new Properties.StringPropertyMatcher("type", "control") + ) + ), + new MatcherSelector( + new Properties.StringPropertyMatcher("type", "control") + ) + ), + new MatcherSelector( + new Properties.StringPropertyMatcher("name", "Start") + ) + ) + ), false + ) +); +f.addRule( new RemoveFilter.RemoveRule(new MatcherSelector(new Properties.RegexpPropertyMatcher("name", "Phi|Store.")), false)); +f.apply(graph); \ No newline at end of file diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/register.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/register.filter new file mode 100644 index 00000000000..5328246d288 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/register.filter @@ -0,0 +1,4 @@ +colorize("reg", "EAX", green); +colorize("reg", "EFLAGS", gray); +colorize("reg", "EBP", orange); +colorize("reg", "ECX", cyan); diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/remove.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/remove.filter new file mode 100644 index 00000000000..0333fccb337 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/remove.filter @@ -0,0 +1 @@ +remove("dump_spec", "FramePtr|ReturnAdr|I_O"); \ No newline at end of file diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeMemory.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeMemory.filter new file mode 100644 index 00000000000..842caed3b7f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeMemory.filter @@ -0,0 +1,7 @@ + +//var f = new RemoveFilter("Remove Memory"); +//f.addRule(new RemoveFilter.RemoveRule(new MatcherSelector(new Properties.StringPropertyMatcher("dump_spec", "Memory")), false)); +//f.addRule(new RemoveFilter.RemoveRule(new AndSelector(new MatcherSelector(new Properties.StringPropertyMatcher("name", "Proj")), new MatcherSelector(new Properties.StringPropertyMatcher("type", "memory"))), false)); +//f.apply(graph); + +remove("dump_spec", "Memory"); diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeRootInputs.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeRootInputs.filter new file mode 100644 index 00000000000..8f6aacd4c4d --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeRootInputs.filter @@ -0,0 +1 @@ +removeInputs("name", "Root"); \ No newline at end of file diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeSafepointInputs.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeSafepointInputs.filter new file mode 100644 index 00000000000..b2abf0ee717 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeSafepointInputs.filter @@ -0,0 +1,4 @@ +removeInputs("name", "SafePoint|CallStaticJava|CallDynamicJava|CallJava|CallLeaf|CallRuntime|AbstractLock|CallLeafNoFP|Call|CallStaticJavaDirect", 5); +removeInputs("name", "Unlock|Lock", 7); +removeInputs("name", "Allocate", 7); +removeInputs("name", "AllocateArray", 9); diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeSelfLoops.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeSelfLoops.filter new file mode 100644 index 00000000000..debfd596de0 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeSelfLoops.filter @@ -0,0 +1,2 @@ +var f = new RemoveSelfLoopsFilter("Remove Self-Loops"); +f.apply(graph); \ No newline at end of file diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/split.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/split.filter new file mode 100644 index 00000000000..5f344ca6d76 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/split.filter @@ -0,0 +1,2 @@ +split("name", "BoxLock"); +split("name", "(Con.*)|(loadCon.*)"); \ No newline at end of file diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/layer.xml b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/layer.xml new file mode 100644 index 00000000000..461692d832e --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/layer.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/build.xml new file mode 100644 index 00000000000..7ba84f5cc6d --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/build.xml @@ -0,0 +1,8 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.settings. + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/manifest.mf new file mode 100644 index 00000000000..15f55c9f985 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/manifest.mf @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +OpenIDE-Module: com.sun.hotspot.igv.settings +OpenIDE-Module-Layer: com/sun/hotspot/igv/settings/layer.xml +OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/settings/Bundle.properties +OpenIDE-Module-Specification-Version: 1.0 + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/build-impl.xml new file mode 100644 index 00000000000..ca15154cf9f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/build-impl.xml @@ -0,0 +1,30 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/genfiles.properties new file mode 100644 index 00000000000..d7271112dad --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=8869440a +build.xml.script.CRC32=7ef09117 +build.xml.stylesheet.CRC32=79c3b980 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=8869440a +nbproject/build-impl.xml.script.CRC32=1a0e7f21 +nbproject/build-impl.xml.stylesheet.CRC32=deb65f65 diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/platform.properties new file mode 100644 index 00000000000..68ad75e5766 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/platform.properties @@ -0,0 +1,29 @@ +# Deprecated since 5.0u1; for compatibility with 5.0: +disabled.clusters=\ + apisupport1,\ + harness,\ + ide8,\ + java1,\ + nb6.0,\ + profiler2 +disabled.modules=\ + org.netbeans.core.execution,\ + org.netbeans.core.multiview,\ + org.netbeans.core.output2,\ + org.netbeans.modules.applemenu,\ + org.netbeans.modules.autoupdate.services,\ + org.netbeans.modules.autoupdate.ui,\ + org.netbeans.modules.core.kit,\ + org.netbeans.modules.favorites,\ + org.netbeans.modules.javahelp,\ + org.netbeans.modules.masterfs,\ + org.netbeans.modules.options.keymap,\ + org.netbeans.modules.sendopts,\ + org.netbeans.modules.templates,\ + org.openide.compat,\ + org.openide.execution,\ + org.openide.util.enumerations +enabled.clusters=\ + platform7 +nbjdk.active=JDK_1.6 +nbplatform.active=default diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/project.properties new file mode 100644 index 00000000000..152f44eca60 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/project.properties @@ -0,0 +1,2 @@ +javac.source=1.5 +javac.compilerargs=-Xlint -Xlint:-serial diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/project.xml new file mode 100644 index 00000000000..0748a12fcaf --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/project.xml @@ -0,0 +1,49 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.settings + + + + org.jdesktop.layout + + + + 1 + 1.4 + + + + org.netbeans.modules.options.api + + + + 1 + 1.5 + + + + org.openide.awt + + + + 6.11.0.1 + + + + org.openide.util + + + + 7.9.0.1 + + + + + com.sun.hotspot.igv.settings + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/suite.properties new file mode 100644 index 00000000000..29d7cc9bd6f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/suite.properties @@ -0,0 +1 @@ +suite.dir=${basedir}/.. diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/Bundle.properties new file mode 100644 index 00000000000..2c701a08276 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/Bundle.properties @@ -0,0 +1,5 @@ +AdvancedOption_DisplayName_Settings=Settings +AdvancedOption_Tooltip_Settings=Application Settings +OpenIDE-Module-Name=Settings +OptionsCategory_Name_View=General +OptionsCategory_Title_View=View Settings diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/Settings.java b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/Settings.java new file mode 100644 index 00000000000..af7627cdeca --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/Settings.java @@ -0,0 +1,47 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.settings; + +import java.util.prefs.Preferences; + +/** + * + * @author Thomas Wuerthinger + */ +public class Settings { + + public final static String NODE_TEXT = "nodeText"; + public final static String NODE_TEXT_DEFAULT = "[idx] [name]"; + public final static String NODE_WIDTH = "nodeWidth"; + public final static String NODE_WIDTH_DEFAULT = "100"; + public final static String PORT = "port"; + public final static String PORT_DEFAULT = "4444"; + public final static String DIRECTORY = "directory"; + public final static String DIRECTORY_DEFAULT = System.getProperty("user.dir"); + + public static Preferences get() { + return Preferences.userNodeForPackage(Settings.class); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewOptionsCategory.java b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewOptionsCategory.java new file mode 100644 index 00000000000..857f87edd33 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewOptionsCategory.java @@ -0,0 +1,55 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.settings; + +import javax.swing.Icon; +import javax.swing.ImageIcon; +import org.netbeans.spi.options.OptionsCategory; +import org.netbeans.spi.options.OptionsPanelController; +import org.openide.util.NbBundle; +import org.openide.util.Utilities; + +/** + * + * @author Thomas Wuerthinger + */ +public final class ViewOptionsCategory extends OptionsCategory { + + @Override + public Icon getIcon() { + return new ImageIcon(Utilities.loadImage("com/sun/hotspot/igv/settings/settings.gif")); + } + + public String getCategoryName() { + return NbBundle.getMessage(ViewOptionsCategory.class, "OptionsCategory_Name_View"); + } + + public String getTitle() { + return NbBundle.getMessage(ViewOptionsCategory.class, "OptionsCategory_Title_View"); + } + + public OptionsPanelController create() { + return new ViewOptionsPanelController(); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewOptionsPanelController.java b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewOptionsPanelController.java new file mode 100644 index 00000000000..0e6c09a2422 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewOptionsPanelController.java @@ -0,0 +1,95 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.settings; + +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; +import javax.swing.JComponent; +import org.netbeans.spi.options.OptionsPanelController; +import org.openide.util.HelpCtx; +import org.openide.util.Lookup; + +/** + * + * @author Thomas Wuerthinger + */ +final class ViewOptionsPanelController extends OptionsPanelController { + + private ViewPanel panel; + private final PropertyChangeSupport pcs = new PropertyChangeSupport(this); + private boolean changed; + + public void update() { + getPanel().load(); + changed = false; + } + + public void applyChanges() { + getPanel().store(); + changed = false; + } + + public void cancel() { + // need not do anything special, if no changes have been persisted yet + } + + public boolean isValid() { + return getPanel().valid(); + } + + public boolean isChanged() { + return changed; + } + + public HelpCtx getHelpCtx() { + return null; // new HelpCtx("...ID") if you have a help set + } + + public JComponent getComponent(Lookup masterLookup) { + return getPanel(); + } + + public void addPropertyChangeListener(PropertyChangeListener l) { + pcs.addPropertyChangeListener(l); + } + + public void removePropertyChangeListener(PropertyChangeListener l) { + pcs.removePropertyChangeListener(l); + } + + private ViewPanel getPanel() { + if (panel == null) { + panel = new ViewPanel(this); + } + return panel; + } + + void changed() { + if (!changed) { + changed = true; + pcs.firePropertyChange(OptionsPanelController.PROP_CHANGED, false, true); + } + pcs.firePropertyChange(OptionsPanelController.PROP_VALID, null, null); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewPanel.form b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewPanel.form new file mode 100644 index 00000000000..9b3fc1ec942 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewPanel.form @@ -0,0 +1,121 @@ + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewPanel.java b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewPanel.java new file mode 100644 index 00000000000..b02644a5866 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewPanel.java @@ -0,0 +1,144 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.settings; + +/** + * + * @author Thomas Wuerthinger + */ +final class ViewPanel extends javax.swing.JPanel { + + private final ViewOptionsPanelController controller; + + ViewPanel(ViewOptionsPanelController controller) { + this.controller = controller; + initComponents(); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + jPanel1 = new javax.swing.JPanel(); + jLabel1 = new javax.swing.JLabel(); + jLabel2 = new javax.swing.JLabel(); + portSpinner = new javax.swing.JSpinner(); + jScrollPane1 = new javax.swing.JScrollPane(); + nodeTextArea = new javax.swing.JTextArea(); + nodeWidthSpinner = new javax.swing.JSpinner(); + jLabel3 = new javax.swing.JLabel(); + + org.openide.awt.Mnemonics.setLocalizedText(jLabel1, "Node Text"); + + org.openide.awt.Mnemonics.setLocalizedText(jLabel2, "Node Width"); + + nodeTextArea.setColumns(20); + nodeTextArea.setRows(5); + jScrollPane1.setViewportView(nodeTextArea); + + org.openide.awt.Mnemonics.setLocalizedText(jLabel3, "Network Port"); + + org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1); + jPanel1.setLayout(jPanel1Layout); + jPanel1Layout.setHorizontalGroup( + jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(org.jdesktop.layout.GroupLayout.TRAILING, jPanel1Layout.createSequentialGroup() + .addContainerGap() + .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(jLabel1) + .add(jLabel3) + .add(jLabel2)) + .add(39, 39, 39) + .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(portSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 63, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) + .add(nodeWidthSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 63, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) + .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 365, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) + .addContainerGap()) + ); + jPanel1Layout.setVerticalGroup( + jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(jPanel1Layout.createSequentialGroup() + .addContainerGap() + .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(jPanel1Layout.createSequentialGroup() + .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) + .add(18, 18, 18) + .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) + .add(nodeWidthSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) + .add(jLabel2)) + .add(18, 18, 18) + .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) + .add(portSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) + .add(jLabel3))) + .add(jLabel1)) + .add(73, 73, 73)) + ); + + org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(layout.createSequentialGroup() + .addContainerGap() + .add(jPanel1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(layout.createSequentialGroup() + .addContainerGap() + .add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 232, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) + .addContainerGap(206, Short.MAX_VALUE)) + ); + }// //GEN-END:initComponents + void load() { + nodeTextArea.setText(Settings.get().get(Settings.NODE_TEXT, Settings.NODE_TEXT_DEFAULT)); + nodeWidthSpinner.setValue(Integer.parseInt(Settings.get().get(Settings.NODE_WIDTH, Settings.NODE_WIDTH_DEFAULT))); + portSpinner.setValue(Integer.parseInt(Settings.get().get(Settings.PORT, Settings.PORT_DEFAULT))); + } + + void store() { + Settings.get().put(Settings.NODE_TEXT, nodeTextArea.getText()); + Settings.get().put(Settings.NODE_WIDTH, nodeWidthSpinner.getValue().toString()); + Settings.get().put(Settings.PORT, portSpinner.getValue().toString()); + } + + boolean valid() { + return true; + } + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel2; + private javax.swing.JLabel jLabel3; + private javax.swing.JPanel jPanel1; + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JTextArea nodeTextArea; + private javax.swing.JSpinner nodeWidthSpinner; + private javax.swing.JSpinner portSpinner; + // End of variables declaration//GEN-END:variables +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/layer.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/layer.xml new file mode 100644 index 00000000000..f7a7aba5018 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/layer.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/settings.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/settings.gif new file mode 100644 index 00000000000..030be8228d7 Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/settings.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Util/build.xml new file mode 100644 index 00000000000..1af1e360034 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/build.xml @@ -0,0 +1,8 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.util. + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/Util/manifest.mf new file mode 100644 index 00000000000..9c10b50e24f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/manifest.mf @@ -0,0 +1,5 @@ +Manifest-Version: 1.0 +OpenIDE-Module: com.sun.hotspot.igv.util +OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/util/Bundle.properties +OpenIDE-Module-Specification-Version: 1.0 + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/build-impl.xml new file mode 100644 index 00000000000..8a444c36b55 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/build-impl.xml @@ -0,0 +1,30 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/genfiles.properties new file mode 100644 index 00000000000..494d2b8ef84 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=a470a16f +build.xml.script.CRC32=466cf03b +build.xml.stylesheet.CRC32=05353c81 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=a470a16f +nbproject/build-impl.xml.script.CRC32=39f45e01 +nbproject/build-impl.xml.stylesheet.CRC32=3f8b4615 diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/platform.properties new file mode 100644 index 00000000000..68ad75e5766 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/platform.properties @@ -0,0 +1,29 @@ +# Deprecated since 5.0u1; for compatibility with 5.0: +disabled.clusters=\ + apisupport1,\ + harness,\ + ide8,\ + java1,\ + nb6.0,\ + profiler2 +disabled.modules=\ + org.netbeans.core.execution,\ + org.netbeans.core.multiview,\ + org.netbeans.core.output2,\ + org.netbeans.modules.applemenu,\ + org.netbeans.modules.autoupdate.services,\ + org.netbeans.modules.autoupdate.ui,\ + org.netbeans.modules.core.kit,\ + org.netbeans.modules.favorites,\ + org.netbeans.modules.javahelp,\ + org.netbeans.modules.masterfs,\ + org.netbeans.modules.options.keymap,\ + org.netbeans.modules.sendopts,\ + org.netbeans.modules.templates,\ + org.openide.compat,\ + org.openide.execution,\ + org.openide.util.enumerations +enabled.clusters=\ + platform7 +nbjdk.active=JDK_1.6 +nbplatform.active=default diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/project.properties new file mode 100644 index 00000000000..152f44eca60 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/project.properties @@ -0,0 +1,2 @@ +javac.source=1.5 +javac.compilerargs=-Xlint -Xlint:-serial diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/project.xml new file mode 100644 index 00000000000..3ae7755b1aa --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/project.xml @@ -0,0 +1,47 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.util + + + + com.sun.hotspot.igv.data + + + + 1.0 + + + + org.netbeans.api.visual + + + + 2.9 + + + + org.openide.nodes + + + + 7.2.1.1 + + + + org.openide.util + + + + 7.10.1.1 + + + + + com.sun.hotspot.igv.util + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/suite.properties new file mode 100644 index 00000000000..29d7cc9bd6f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/suite.properties @@ -0,0 +1 @@ +suite.dir=${basedir}/.. diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/BoundedZoomAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/BoundedZoomAction.java new file mode 100644 index 00000000000..f79113fea4c --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/BoundedZoomAction.java @@ -0,0 +1,182 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.util; + +import java.awt.Container; +import java.awt.Dimension; +import java.awt.Point; +import java.awt.Rectangle; +import javax.swing.JComponent; +import javax.swing.JScrollPane; +import org.netbeans.api.visual.action.WidgetAction; +import org.netbeans.api.visual.action.WidgetAction.State; +import org.netbeans.api.visual.action.WidgetAction.WidgetMouseWheelEvent; +import org.netbeans.api.visual.animator.SceneAnimator; +import org.netbeans.api.visual.widget.Scene; +import org.netbeans.api.visual.widget.Widget; + +/** + * + * @author Thomas Wuerthinger + */ +public class BoundedZoomAction extends WidgetAction.Adapter { + + private double minFactor = 0.0; + private double maxFactor = Double.MAX_VALUE; + private double zoomMultiplier; + private boolean useAnimator; + + public BoundedZoomAction(double zoomMultiplier, boolean useAnimator) { + this.zoomMultiplier = zoomMultiplier; + this.useAnimator = useAnimator; + } + + public double getMinFactor() { + return minFactor; + } + + public void setMinFactor(double d) { + minFactor = d; + } + + public double getMaxFactor() { + return maxFactor; + } + + public void setMaxFactor(double d) { + maxFactor = d; + } + + private JScrollPane findScrollPane(JComponent component) { + for (;;) { + if (component == null) { + return null; + } + if (component instanceof JScrollPane) { + return ((JScrollPane) component); + } + Container parent = component.getParent(); + if (!(parent instanceof JComponent)) { + return null; + } + component = (JComponent) parent; + } + } + + @Override + public State mouseWheelMoved(Widget widget, WidgetMouseWheelEvent event) { + final Scene scene = widget.getScene(); + int amount = event.getWheelRotation(); + JScrollPane scrollPane = findScrollPane(scene.getView()); + Point viewPosition = null; + Point mouseLocation = scene.convertSceneToView(event.getPoint()); + int xOffset = 0; + int yOffset = 0; + Point oldViewPosition = null; + Rectangle bounds = new Rectangle(scene.getBounds()); + Dimension componentSize = new Dimension(scene.getView().getPreferredSize()); + + if (scrollPane != null) { + viewPosition = new Point(scrollPane.getViewport().getViewPosition()); + oldViewPosition = new Point(viewPosition); + xOffset = (mouseLocation.x - viewPosition.x); + yOffset = (mouseLocation.y - viewPosition.y); + viewPosition.x += xOffset; + viewPosition.y += yOffset; + } + + if (useAnimator) { + SceneAnimator sceneAnimator = scene.getSceneAnimator(); + synchronized (sceneAnimator) { + double zoom = sceneAnimator.isAnimatingZoomFactor() ? sceneAnimator.getTargetZoomFactor() : scene.getZoomFactor(); + while (amount > 0 && zoom / zoomMultiplier >= minFactor && zoom / zoomMultiplier <= maxFactor) { + zoom /= zoomMultiplier; + if (viewPosition != null) { + viewPosition.x /= zoomMultiplier; + viewPosition.y /= zoomMultiplier; + bounds.width /= zoomMultiplier; + bounds.height /= zoomMultiplier; + componentSize.width /= zoomMultiplier; + componentSize.height /= zoomMultiplier; + } + amount--; + } + while (amount < 0 && zoom * zoomMultiplier >= minFactor && zoom * zoomMultiplier <= maxFactor) { + zoom *= zoomMultiplier; + if (viewPosition != null) { + viewPosition.x *= zoomMultiplier; + viewPosition.y *= zoomMultiplier; + bounds.width *= zoomMultiplier; + bounds.height *= zoomMultiplier; + componentSize.width *= zoomMultiplier; + componentSize.height *= zoomMultiplier; + } + amount++; + } + sceneAnimator.animateZoomFactor(zoom); + } + } else { + double zoom = scene.getZoomFactor(); + while (amount > 0 && zoom / zoomMultiplier >= minFactor && zoom / zoomMultiplier <= maxFactor) { + zoom /= zoomMultiplier; + if (viewPosition != null) { + viewPosition.x /= zoomMultiplier; + viewPosition.y /= zoomMultiplier; + bounds.width /= zoomMultiplier; + bounds.height /= zoomMultiplier; + componentSize.width /= zoomMultiplier; + componentSize.height /= zoomMultiplier; + } + amount--; + } + while (amount < 0 && zoom * zoomMultiplier >= minFactor && zoom * zoomMultiplier <= maxFactor) { + zoom *= zoomMultiplier; + if (viewPosition != null) { + viewPosition.x *= zoomMultiplier; + viewPosition.y *= zoomMultiplier; + bounds.width *= zoomMultiplier; + bounds.height *= zoomMultiplier; + componentSize.width *= zoomMultiplier; + componentSize.height *= zoomMultiplier; + } + amount++; + } + scene.setZoomFactor(zoom); + } + + if (scrollPane != null) { + scene.validate(); // Call validate to update size of scene + Dimension size = scrollPane.getViewport().getExtentSize(); + viewPosition.x -= xOffset; + viewPosition.y -= yOffset; + scene.resolveBounds(scene.getLocation(), bounds); + scene.getView().setPreferredSize(componentSize); + scene.getView().revalidate(); + scene.getView().addNotify(); + scrollPane.getViewport().setViewPosition(viewPosition); + } + + return WidgetAction.State.CONSUMED; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/Bundle.properties new file mode 100644 index 00000000000..ad93affc8a5 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/Bundle.properties @@ -0,0 +1 @@ +OpenIDE-Module-Name=Util diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ColorIcon.java b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ColorIcon.java new file mode 100644 index 00000000000..2c0c2ff8d23 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ColorIcon.java @@ -0,0 +1,55 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.util; + +import java.awt.Color; +import java.awt.Component; +import java.awt.Graphics; +import javax.swing.Icon; + +/** + * + * @author Thomas Wuerthinger + */ +public class ColorIcon implements Icon { + + private Color color; + + public ColorIcon(Color c) { + color = c; + } + + public void paintIcon(Component c, Graphics g, int x, int y) { + g.setColor(color); + g.fillRect(x, y, 16, 16); + } + + public int getIconWidth() { + return 16; + } + + public int getIconHeight() { + return 16; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ContextAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ContextAction.java new file mode 100644 index 00000000000..cc82017ca24 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ContextAction.java @@ -0,0 +1,95 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.util; + +import java.awt.EventQueue; +import org.openide.util.ContextAwareAction; +import org.openide.util.Lookup; +import org.openide.util.LookupEvent; +import org.openide.util.LookupListener; +import org.openide.util.Utilities; +import org.openide.util.actions.CallableSystemAction; + +/** + * + * @author Thomas Wuerthinger + */ +public abstract class ContextAction extends CallableSystemAction implements LookupListener, ContextAwareAction { + + private Lookup context = null; + private Lookup.Result result = null; + + public ContextAction() { + this(Utilities.actionsGlobalContext()); + } + + public ContextAction(Lookup context) { + init(context); + } + + private void init(Lookup context) { + this.context = context; + result = context.lookupResult(contextClass()); + result.addLookupListener(this); + resultChanged(null); + } + + public void resultChanged(LookupEvent e) { + if (result.allItems().size() != 0) { + update(result.allInstances().iterator().next()); + } else { + update(null); + } + } + + @Override + public void performAction() { + final T t = result.allInstances().iterator().next(); + + // Ensure it's AWT event thread + EventQueue.invokeLater(new Runnable() { + + public void run() { + performAction(t); + } + }); + } + + public void update(T t) { + if (t == null) { + setEnabled(false); + } else { + setEnabled(isEnabled(t)); + } + } + + public boolean isEnabled(T context) { + return true; + } + + public abstract Class contextClass(); + + public abstract void performAction(T context); +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/DoubleClickAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/DoubleClickAction.java new file mode 100644 index 00000000000..e01f8c8b131 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/DoubleClickAction.java @@ -0,0 +1,49 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.util; + +import org.netbeans.api.visual.action.WidgetAction; +import org.netbeans.api.visual.widget.Widget; + +/** + * + * @author Thomas Wuerthinger + */ +public class DoubleClickAction extends WidgetAction.Adapter { + + private DoubleClickHandler handler; + + public DoubleClickAction(DoubleClickHandler handler) { + this.handler = handler; + } + + @Override + public WidgetAction.State mouseClicked(Widget widget, WidgetAction.WidgetMouseEvent event) { + if (event.getClickCount() > 1) { + handler.handleDoubleClick(widget, event); + return WidgetAction.State.CONSUMED; + } + return WidgetAction.State.REJECTED; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/DoubleClickHandler.java b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/DoubleClickHandler.java new file mode 100644 index 00000000000..61ccaed0bf0 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/DoubleClickHandler.java @@ -0,0 +1,36 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.util; + +import org.netbeans.api.visual.action.WidgetAction.WidgetMouseEvent; +import org.netbeans.api.visual.widget.Widget; + +/** + * + * @author Thomas Wuerthinger + */ +public interface DoubleClickHandler { + + public void handleDoubleClick(Widget w, WidgetMouseEvent e); +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ExtendedSatelliteComponent.java b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ExtendedSatelliteComponent.java new file mode 100644 index 00000000000..81cf5c7ba92 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ExtendedSatelliteComponent.java @@ -0,0 +1,195 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.util; + +import org.netbeans.api.visual.widget.Scene; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; + +/** + * @author David Kaspar + * @author Thomas Wuerthinger + */ +public class ExtendedSatelliteComponent extends JComponent implements MouseListener, MouseMotionListener, Scene.SceneListener, ComponentListener { + + private Scene scene; + private Image image; + private int imageWidth; + private int imageHeight; + + public ExtendedSatelliteComponent(Scene scene) { + this.scene = scene; + setDoubleBuffered(true); + setPreferredSize(new Dimension(128, 128)); + addMouseListener(this); + addMouseMotionListener(this); + } + + @Override + public void addNotify() { + super.addNotify(); + scene.addSceneListener(this); + JComponent viewComponent = scene.getView(); + if (viewComponent == null) { + viewComponent = scene.createView(); + } + viewComponent.addComponentListener(this); + repaint(); + } + + @Override + public void removeNotify() { + scene.getView().removeComponentListener(this); + scene.removeSceneListener(this); + super.removeNotify(); + } + + public void update() { + this.image = null; + repaint(); + } + + @Override + public void paint(Graphics g) { + Graphics2D gr = (Graphics2D) g; + super.paint(g); + Rectangle bounds = scene.getBounds(); + Dimension size = getSize(); + + double sx = bounds.width > 0 ? (double) size.width / bounds.width : 0.0; + double sy = bounds.width > 0 ? (double) size.height / bounds.height : 0.0; + double scale = Math.min(sx, sy); + + int vw = (int) (scale * bounds.width); + int vh = (int) (scale * bounds.height); + int vx = (size.width - vw) / 2; + int vy = (size.height - vh) / 2; + + + if (image == null || vw != imageWidth || vh != imageHeight) { + + imageWidth = vw; + imageHeight = vh; + image = this.createImage(imageWidth, imageHeight); + Graphics2D ig = (Graphics2D) image.getGraphics(); + ig.scale(scale, scale); + scene.paint(ig); + } + + gr.drawImage(image, vx, vy, this); + + JComponent component = scene.getView(); + double zoomFactor = scene.getZoomFactor(); + Rectangle viewRectangle = component != null ? component.getVisibleRect() : null; + if (viewRectangle != null) { + Rectangle window = new Rectangle( + (int) ((double) viewRectangle.x * scale / zoomFactor), + (int) ((double) viewRectangle.y * scale / zoomFactor), + (int) ((double) viewRectangle.width * scale / zoomFactor), + (int) ((double) viewRectangle.height * scale / zoomFactor)); + window.translate(vx, vy); + gr.setColor(new Color(200, 200, 200, 128)); + gr.fill(window); + gr.setColor(Color.BLACK); + gr.drawRect(window.x, window.y, window.width - 1, window.height - 1); + } + } + + public void mouseClicked(MouseEvent e) { + } + + public void mousePressed(MouseEvent e) { + moveVisibleRect(e.getPoint()); + } + + public void mouseReleased(MouseEvent e) { + moveVisibleRect(e.getPoint()); + } + + public void mouseEntered(MouseEvent e) { + } + + public void mouseExited(MouseEvent e) { + } + + public void mouseDragged(MouseEvent e) { + moveVisibleRect(e.getPoint()); + } + + public void mouseMoved(MouseEvent e) { + } + + private void moveVisibleRect(Point center) { + JComponent component = scene.getView(); + if (component == null) { + return; + } + double zoomFactor = scene.getZoomFactor(); + Rectangle bounds = scene.getBounds(); + Dimension size = getSize(); + + double sx = bounds.width > 0 ? (double) size.width / bounds.width : 0.0; + double sy = bounds.width > 0 ? (double) size.height / bounds.height : 0.0; + double scale = Math.min(sx, sy); + + int vw = (int) (scale * bounds.width); + int vh = (int) (scale * bounds.height); + int vx = (size.width - vw) / 2; + int vy = (size.height - vh) / 2; + + int cx = (int) ((double) (center.x - vx) / scale * zoomFactor); + int cy = (int) ((double) (center.y - vy) / scale * zoomFactor); + + Rectangle visibleRect = component.getVisibleRect(); + visibleRect.x = cx - visibleRect.width / 2; + visibleRect.y = cy - visibleRect.height / 2; + component.scrollRectToVisible(visibleRect); + + } + + public void sceneRepaint() { + } + + public void sceneValidating() { + } + + public void sceneValidated() { + } + + public void componentResized(ComponentEvent e) { + repaint(); + } + + public void componentMoved(ComponentEvent e) { + repaint(); + } + + public void componentShown(ComponentEvent e) { + } + + public void componentHidden(ComponentEvent e) { + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ExtendedSelectAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ExtendedSelectAction.java new file mode 100644 index 00000000000..7501c14720b --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ExtendedSelectAction.java @@ -0,0 +1,69 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.util; + +import java.awt.event.MouseEvent; +import javax.swing.JPanel; +import org.netbeans.api.visual.action.ActionFactory; +import org.netbeans.api.visual.action.SelectProvider; +import org.netbeans.api.visual.action.WidgetAction; +import org.netbeans.api.visual.action.WidgetAction.State; +import org.netbeans.api.visual.action.WidgetAction.WidgetKeyEvent; +import org.netbeans.api.visual.action.WidgetAction.WidgetMouseEvent; +import org.netbeans.api.visual.widget.Widget; + +/** + * + * @author Thomas Wuerthinger + */ +public class ExtendedSelectAction extends WidgetAction.Adapter { + + private WidgetAction innerAction; + private JPanel panel; + + public ExtendedSelectAction(SelectProvider provider) { + innerAction = ActionFactory.createSelectAction(provider); + panel = new JPanel(); + } + + @Override + public State mousePressed(Widget widget, WidgetMouseEvent event) { + // TODO: Solve this differently? + if (event.getButton() != MouseEvent.BUTTON2) { + return innerAction.mousePressed(widget, new WidgetMouseEvent(event.getEventID(), new MouseEvent(panel, (int) event.getEventID(), event.getWhen(), event.getModifiersEx(), event.getPoint().x, event.getPoint().y, event.getClickCount(), event.isPopupTrigger(), MouseEvent.BUTTON1))); + } else { + return super.mousePressed(widget, event); + } + } + + @Override + public State mouseReleased(Widget widget, WidgetMouseEvent event) { + return innerAction.mouseReleased(widget, event); + } + + @Override + public State keyTyped(Widget widget, WidgetKeyEvent event) { + return innerAction.keyTyped(widget, event); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/PropertiesSheet.java b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/PropertiesSheet.java new file mode 100644 index 00000000000..f058edda6ae --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/PropertiesSheet.java @@ -0,0 +1,71 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.util; + +import com.sun.hotspot.igv.data.Properties; +import com.sun.hotspot.igv.data.Property; +import java.lang.reflect.InvocationTargetException; +import org.openide.nodes.Node; +import org.openide.nodes.Sheet; + +/** + * + * @author Thomas Wuerthinger + */ +public class PropertiesSheet { + + public static void initializeSheet(Properties properties, Sheet s) { + + Sheet.Set set1 = Sheet.createPropertiesSet(); + set1.setDisplayName("Properties"); + for (final Property p : properties.getProperties()) { + Node.Property prop = new Node.Property(String.class) { + + @Override + public boolean canRead() { + return true; + } + + @Override + public String getValue() throws IllegalAccessException, InvocationTargetException { + return p.getValue(); + } + + @Override + public boolean canWrite() { + return false; + } + + @Override + public void setValue(String arg0) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { + p.setValue(arg0); + } + }; + prop.setName(p.getName()); + set1.put(prop); + } + s.put(set1); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/RangeSlider.java b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/RangeSlider.java new file mode 100644 index 00000000000..c5f3100f205 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/RangeSlider.java @@ -0,0 +1,360 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.util; + +import com.sun.hotspot.igv.data.ChangedListener; +import java.awt.Color; +import java.awt.Cursor; +import java.awt.Dimension; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.RenderingHints; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; +import java.util.List; +import javax.swing.JComponent; + +/** + * + * @author Thomas Wuerthinger + */ +public class RangeSlider extends JComponent implements ChangedListener, MouseListener, MouseMotionListener { + + public static final int HEIGHT = 40; + public static final int BAR_HEIGHT = 22; + public static final int BAR_SELECTION_ENDING_HEIGHT = 16; + public static final int BAR_SELECTION_HEIGHT = 10; + public static final int BAR_THICKNESS = 2; + public static final int BAR_CIRCLE_SIZE = 9; + public static final int MOUSE_ENDING_OFFSET = 3; + public static final Color BACKGROUND_COLOR = Color.white; + public static final Color BAR_COLOR = Color.black; + public static final Color BAR_SELECTION_COLOR = new Color(255, 0, 0, 120); + public static final Color BAR_SELECTION_COLOR_ROLLOVER = new Color(255, 0, 255, 120); + public static final Color BAR_SELECTION_COLOR_DRAG = new Color(0, 0, 255, 120); + private RangeSliderModel model; + private State state; + private Point startPoint; + private RangeSliderModel tempModel; + private boolean isOverBar; + + private enum State { + + Initial, + DragBar, + DragFirstPosition, + DragSecondPosition + } + + public RangeSlider() { + state = State.Initial; + this.addMouseMotionListener(this); + this.addMouseListener(this); + } + + public void setModel(RangeSliderModel newModel) { + if (model != null) { + model.getChangedEvent().removeListener(this); + model.getColorChangedEvent().removeListener(this); + } + if (newModel != null) { + newModel.getChangedEvent().addListener(this); + newModel.getColorChangedEvent().addListener(this); + } + this.model = newModel; + update(); + } + + private RangeSliderModel getPaintingModel() { + if (tempModel != null) { + return tempModel; + } + return model; + } + + @Override + public Dimension getPreferredSize() { + Dimension d = super.getPreferredSize(); + d.height = HEIGHT; + return d; + } + + public void changed(RangeSliderModel source) { + update(); + } + + private void update() { + this.repaint(); + } + + private int getXPosition(int index) { + assert index >= 0 && index < getPaintingModel().getPositions().size(); + return getXOffset() * (index + 1); + } + + private int getXOffset() { + int size = getPaintingModel().getPositions().size(); + int width = getWidth(); + return (width / (size + 1)); + } + + private int getEndXPosition(int index) { + return getXPosition(index) + getXOffset() / 2; + } + + private int getStartXPosition(int index) { + return getXPosition(index) - getXOffset() / 2; + } + + @Override + public void paint(Graphics g) { + super.paint(g); + Graphics2D g2 = (Graphics2D) g; + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + int width = getWidth(); + int height = getHeight(); + + g2.setColor(BACKGROUND_COLOR); + g2.fillRect(0, 0, width, height); + + // Nothing to paint? + if (getPaintingModel() == null || getPaintingModel().getPositions().size() == 0) { + return; + } + + int firstPos = getPaintingModel().getFirstPosition(); + int secondPos = getPaintingModel().getSecondPosition(); + + paintSelected(g2, firstPos, secondPos); + paintBar(g2); + + } + + private int getBarStartY() { + return getHeight() - BAR_HEIGHT; + } + + private void paintBar(Graphics2D g) { + List list = getPaintingModel().getPositions(); + int barStartY = getBarStartY(); + + g.setColor(BAR_COLOR); + g.fillRect(getXPosition(0), barStartY + BAR_HEIGHT / 2 - BAR_THICKNESS / 2, getXPosition(list.size() - 1) - getXPosition(0), BAR_THICKNESS); + + int circleCenterY = barStartY + BAR_HEIGHT / 2; + for (int i = 0; i < list.size(); i++) { + int curX = getXPosition(i); + g.setColor(getPaintingModel().getColors().get(i)); + g.fillOval(curX - BAR_CIRCLE_SIZE / 2, circleCenterY - BAR_CIRCLE_SIZE / 2, BAR_CIRCLE_SIZE, BAR_CIRCLE_SIZE); + g.setColor(Color.black); + g.drawOval(curX - BAR_CIRCLE_SIZE / 2, circleCenterY - BAR_CIRCLE_SIZE / 2, BAR_CIRCLE_SIZE, BAR_CIRCLE_SIZE); + + + String curS = list.get(i); + if (curS != null && curS.length() > 0) { + int startX = getStartXPosition(i); + int endX = getEndXPosition(i); + FontMetrics metrics = g.getFontMetrics(); + Rectangle bounds = metrics.getStringBounds(curS, g).getBounds(); + if (bounds.width < endX - startX && bounds.height < barStartY) { + g.setColor(Color.black); + g.drawString(curS, startX + (endX - startX) / 2 - bounds.width / 2, barStartY / 2 + bounds.height / 2); + } + } + } + + } + + private void paintSelected(Graphics2D g, int start, int end) { + + int startX = getStartXPosition(start); + int endX = getEndXPosition(end); + int barStartY = getBarStartY(); + int barSelectionEndingStartY = barStartY + BAR_HEIGHT / 2 - BAR_SELECTION_ENDING_HEIGHT / 2; + paintSelectedEnding(g, startX, barSelectionEndingStartY); + paintSelectedEnding(g, endX, barSelectionEndingStartY); + + g.setColor(BAR_SELECTION_COLOR); + if (state == State.DragBar) { + g.setColor(BAR_SELECTION_COLOR_DRAG); + } else if (isOverBar) { + g.setColor(BAR_SELECTION_COLOR_ROLLOVER); + } + g.fillRect(startX, barStartY + BAR_HEIGHT / 2 - BAR_SELECTION_HEIGHT / 2, endX - startX, BAR_SELECTION_HEIGHT); + } + + private void paintSelectedEnding(Graphics g, int x, int y) { + g.setColor(BAR_COLOR); + g.fillRect(x - BAR_THICKNESS / 2, y, BAR_THICKNESS, BAR_SELECTION_ENDING_HEIGHT); + } + + private boolean isOverSecondPosition(Point p) { + if (p.y >= getBarStartY()) { + int destX = getEndXPosition(getPaintingModel().getSecondPosition()); + int off = Math.abs(destX - p.x); + return off <= MOUSE_ENDING_OFFSET; + } + return false; + } + + private boolean isOverFirstPosition(Point p) { + if (p.y >= getBarStartY()) { + int destX = getStartXPosition(getPaintingModel().getFirstPosition()); + int off = Math.abs(destX - p.x); + return off <= MOUSE_ENDING_OFFSET; + } + return false; + } + + private boolean isOverSelection(Point p) { + if (p.y >= getBarStartY() && !isOverFirstPosition(p) && !isOverSecondPosition(p)) { + return p.x > getStartXPosition(getPaintingModel().getFirstPosition()) && p.x < getEndXPosition(getPaintingModel().getSecondPosition()); + } + return false; + } + + public void mouseDragged(MouseEvent e) { + if (state == State.DragBar) { + int firstX = this.getStartXPosition(model.getFirstPosition()); + int newFirstX = firstX + e.getPoint().x - startPoint.x; + int newIndex = getIndexFromPosition(newFirstX) + 1; + if (newIndex + model.getSecondPosition() - model.getFirstPosition() >= model.getPositions().size()) { + newIndex = model.getPositions().size() - (model.getSecondPosition() - model.getFirstPosition()) - 1; + } + int secondPosition = newIndex + model.getSecondPosition() - model.getFirstPosition(); + tempModel.setPositions(newIndex, secondPosition); + update(); + } else if (state == State.DragFirstPosition) { + int firstPosition = getIndexFromPosition(e.getPoint().x) + 1; + int secondPosition = model.getSecondPosition(); + if (firstPosition > secondPosition) { + firstPosition--; + } + tempModel.setPositions(firstPosition, secondPosition); + update(); + } else if (state == State.DragSecondPosition) { + int firstPosition = model.getFirstPosition(); + int secondPosition = getIndexFromPosition(e.getPoint().x); + if (secondPosition < firstPosition) { + secondPosition++; + } + tempModel.setPositions(firstPosition, secondPosition); + update(); + } + } + + private int getIndexFromPosition(int x) { + if (x < getXPosition(0)) { + return -1; + } + for (int i = 0; i < getPaintingModel().getPositions().size() - 1; i++) { + int startX = getXPosition(i); + int endX = getXPosition(i + 1); + if (x >= startX && x <= endX) { + return i; + } + } + return getPaintingModel().getPositions().size() - 1; + } + + private int getCircleIndexFromPosition(int x) { + int result = 0; + for (int i = 1; i < getPaintingModel().getPositions().size() - 1; i++) { + if (x > getStartXPosition(i)) { + result = i; + } + } + return result; + } + + public void mouseMoved(MouseEvent e) { + isOverBar = false; + if (model == null) { + return; + } + + + Point p = e.getPoint(); + if (isOverFirstPosition(p) || isOverSecondPosition(p)) { + setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR)); + } else if (isOverSelection(p)) { + isOverBar = true; + setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + } else { + this.setCursor(Cursor.getDefaultCursor()); + } + repaint(); + } + + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() > 1) { + // Double click + int index = getCircleIndexFromPosition(e.getPoint().x); + model.setPositions(index, index); + } + } + + public void mousePressed(MouseEvent e) { + if (model == null) { + return; + } + + Point p = e.getPoint(); + if (isOverFirstPosition(p)) { + state = State.DragFirstPosition; + } else if (isOverSecondPosition(p)) { + state = State.DragSecondPosition; + } else if (isOverSelection(p)) { + state = State.DragBar; + } else { + return; + } + + startPoint = e.getPoint(); + tempModel = model.copy(); + } + + public void mouseReleased(MouseEvent e) { + if (model == null || tempModel == null) { + return; + } + state = State.Initial; + model.setPositions(tempModel.getFirstPosition(), tempModel.getSecondPosition()); + tempModel = null; + } + + public void mouseEntered(MouseEvent e) { + } + + public void mouseExited(MouseEvent e) { + isOverBar = false; + repaint(); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/RangeSliderModel.java b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/RangeSliderModel.java new file mode 100644 index 00000000000..71766ec3b67 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/RangeSliderModel.java @@ -0,0 +1,130 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.util; + +import com.sun.hotspot.igv.data.ChangedEventProvider; +import com.sun.hotspot.igv.data.ChangedEvent; +import java.awt.Color; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * + * @author Thomas Wuerthinger + */ +public class RangeSliderModel implements ChangedEventProvider { + + // Warning: Update setData method if fields are added + private ChangedEvent changedEvent; + private ChangedEvent colorChangedEvent; + private List positions; + private int firstPosition; + private int secondPosition; + private List colors; + + public void setData(RangeSliderModel model) { + boolean changed = false; + changed |= (positions != model.positions); + positions = model.positions; + changed |= (firstPosition != model.firstPosition); + firstPosition = model.firstPosition; + changed |= (secondPosition != model.secondPosition); + secondPosition = model.secondPosition; + boolean colorChanged = (colors != model.colors); + colors = model.colors; + if (changed) { + changedEvent.fire(); + } + if (colorChanged) { + colorChangedEvent.fire(); + } + } + + public RangeSliderModel(List positions) { + assert positions.size() > 0; + this.positions = positions; + this.changedEvent = new ChangedEvent(this); + this.colorChangedEvent = new ChangedEvent(this); + colors = new ArrayList(); + for (int i = 0; i < positions.size(); i++) { + colors.add(Color.black); + } + } + + public void setColors(List colors) { + this.colors = colors; + colorChangedEvent.fire(); + } + + public List getColors() { + return colors; + } + + public RangeSliderModel copy() { + RangeSliderModel newModel = new RangeSliderModel(positions); + newModel.firstPosition = firstPosition; + newModel.secondPosition = secondPosition; + newModel.colors = colors; + return newModel; + } + + public List getPositions() { + return Collections.unmodifiableList(positions); + } + + public int getFirstPosition() { + return firstPosition; + } + + public int getSecondPosition() { + return secondPosition; + } + + public void setPositions(int fp, int sp) { + assert fp >= 0 && fp < positions.size(); + assert sp >= 0 && sp < positions.size(); + firstPosition = fp; + secondPosition = sp; + ensureOrder(); + changedEvent.fire(); + } + + private void ensureOrder() { + if (secondPosition < firstPosition) { + int tmp = secondPosition; + secondPosition = firstPosition; + firstPosition = tmp; + } + } + + public ChangedEvent getColorChangedEvent() { + return colorChangedEvent; + } + + public ChangedEvent getChangedEvent() { + return changedEvent; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/View/build.xml new file mode 100644 index 00000000000..c0c4cd49d7a --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/build.xml @@ -0,0 +1,8 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.view. + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/View/manifest.mf new file mode 100644 index 00000000000..870dc9065a6 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/manifest.mf @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +OpenIDE-Module: com.sun.hotspot.igv.view +OpenIDE-Module-Layer: com/sun/hotspot/igv/view/layer.xml +OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/view/Bundle.properties +OpenIDE-Module-Specification-Version: 1.0 + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/build-impl.xml new file mode 100644 index 00000000000..0de8e534ead --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/build-impl.xml @@ -0,0 +1,30 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/genfiles.properties new file mode 100644 index 00000000000..8d7a4ea4c02 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=2de95ef6 +build.xml.script.CRC32=31afe4b1 +build.xml.stylesheet.CRC32=79c3b980 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=2de95ef6 +nbproject/build-impl.xml.script.CRC32=fa7a4119 +nbproject/build-impl.xml.stylesheet.CRC32=deb65f65 diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/platform.properties new file mode 100644 index 00000000000..68ad75e5766 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/platform.properties @@ -0,0 +1,29 @@ +# Deprecated since 5.0u1; for compatibility with 5.0: +disabled.clusters=\ + apisupport1,\ + harness,\ + ide8,\ + java1,\ + nb6.0,\ + profiler2 +disabled.modules=\ + org.netbeans.core.execution,\ + org.netbeans.core.multiview,\ + org.netbeans.core.output2,\ + org.netbeans.modules.applemenu,\ + org.netbeans.modules.autoupdate.services,\ + org.netbeans.modules.autoupdate.ui,\ + org.netbeans.modules.core.kit,\ + org.netbeans.modules.favorites,\ + org.netbeans.modules.javahelp,\ + org.netbeans.modules.masterfs,\ + org.netbeans.modules.options.keymap,\ + org.netbeans.modules.sendopts,\ + org.netbeans.modules.templates,\ + org.openide.compat,\ + org.openide.execution,\ + org.openide.util.enumerations +enabled.clusters=\ + platform7 +nbjdk.active=JDK_1.6 +nbplatform.active=default diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/project.properties new file mode 100644 index 00000000000..152f44eca60 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/project.properties @@ -0,0 +1,2 @@ +javac.source=1.5 +javac.compilerargs=-Xlint -Xlint:-serial diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/project.xml new file mode 100644 index 00000000000..96b103188e9 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/project.xml @@ -0,0 +1,151 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.view + + + + com.sun.hotspot.igv.data + + + + 1.0 + + + + com.sun.hotspot.igv.difference + + + + 1.0 + + + + com.sun.hotspot.igv.filter + + + + 1.0 + + + + com.sun.hotspot.igv.graph + + + + 1.0 + + + + com.sun.hotspot.igv.hierarchicallayout + + + + 1.0 + + + + com.sun.hotspot.igv.layout + + + + 1.0 + + + + com.sun.hotspot.igv.settings + + + + 1.0 + + + + com.sun.hotspot.igv.svg + + + + 1.0 + + + + com.sun.hotspot.igv.util + + + + 1.0 + + + + org.netbeans.api.visual + + + + 2.9 + + + + org.openide.actions + + + + 6.6.0.1 + + + + org.openide.awt + + + + 6.11.0.1 + + + + org.openide.dialogs + + + + 7.5.1 + + + + org.openide.loaders + + + + 6.7 + + + + org.openide.nodes + + + + 7.2.1.1 + + + + org.openide.util + + + + 7.9.0.1 + + + + org.openide.windows + + + + 6.16 + + + + + com.sun.hotspot.igv.view + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/suite.properties new file mode 100644 index 00000000000..29d7cc9bd6f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/suite.properties @@ -0,0 +1 @@ +suite.dir=${basedir}/.. diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/META-INF/services/com.sun.hotspot.igv.data.services.GraphViewer b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/META-INF/services/com.sun.hotspot.igv.data.services.GraphViewer new file mode 100644 index 00000000000..ad042e6fb3d --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/META-INF/services/com.sun.hotspot.igv.data.services.GraphViewer @@ -0,0 +1 @@ +com.sun.hotspot.igv.view.GraphViewerImplementation diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/META-INF/services/com.sun.hotspot.igv.data.services.InputGraphProvider b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/META-INF/services/com.sun.hotspot.igv.data.services.InputGraphProvider new file mode 100644 index 00000000000..e057d732d3d --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/META-INF/services/com.sun.hotspot.igv.data.services.InputGraphProvider @@ -0,0 +1 @@ +com.sun.hotspot.igv.view.EditorInputGraphProvider diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/BoundedZoomAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/BoundedZoomAction.java new file mode 100644 index 00000000000..87b8fd3cf57 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/BoundedZoomAction.java @@ -0,0 +1,175 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view; + +import java.awt.Container; +import java.awt.Dimension; +import java.awt.Point; +import java.awt.Rectangle; +import javax.swing.JComponent; +import javax.swing.JScrollPane; +import org.netbeans.api.visual.action.WidgetAction; +import org.netbeans.api.visual.action.WidgetAction.State; +import org.netbeans.api.visual.action.WidgetAction.WidgetMouseWheelEvent; +import org.netbeans.api.visual.animator.SceneAnimator; +import org.netbeans.api.visual.widget.Scene; +import org.netbeans.api.visual.widget.Widget; + +/** + * + * @author Thomas Wuerthinger + */ +public class BoundedZoomAction extends WidgetAction.Adapter { + + private double minFactor = 0.0; + private double maxFactor = Double.MAX_VALUE; + private double zoomMultiplier; + private boolean useAnimator; + + public BoundedZoomAction(double zoomMultiplier, boolean useAnimator) { + assert zoomMultiplier > 1.0; + this.zoomMultiplier = zoomMultiplier; + this.useAnimator = useAnimator; + } + + public double getMinFactor() { + return minFactor; + } + + public void setMinFactor(double d) { + minFactor = d; + } + + public double getMaxFactor() { + return maxFactor; + } + + public void setMaxFactor(double d) { + maxFactor = d; + } + + private JScrollPane findScrollPane(JComponent component) { + for (;;) { + if (component == null) { + return null; + } + if (component instanceof JScrollPane) { + return ((JScrollPane) component); + } + Container parent = component.getParent(); + if (!(parent instanceof JComponent)) { + return null; + } + component = (JComponent) parent; + } + } + + @Override + public State mouseWheelMoved(Widget widget, WidgetMouseWheelEvent event) { + final Scene scene = widget.getScene(); + int amount = event.getWheelRotation(); + JScrollPane scrollPane = findScrollPane(scene.getView()); + Point viewPosition = null; + Point mouseLocation = scene.convertSceneToView(event.getPoint()); + int xOffset = 0; + int yOffset = 0; + Rectangle bounds = new Rectangle(scene.getBounds()); + Dimension componentSize = new Dimension(scene.getView().getPreferredSize()); + if (scrollPane != null) { + viewPosition = new Point(scrollPane.getViewport().getViewPosition()); + xOffset = (mouseLocation.x - viewPosition.x); + yOffset = (mouseLocation.y - viewPosition.y); + viewPosition.x += xOffset; + viewPosition.y += yOffset; + } + + if (useAnimator) { + SceneAnimator sceneAnimator = scene.getSceneAnimator(); + synchronized (sceneAnimator) { + double zoom = sceneAnimator.isAnimatingZoomFactor() ? sceneAnimator.getTargetZoomFactor() : scene.getZoomFactor(); + while (amount > 0 && zoom / zoomMultiplier >= minFactor) { + zoom /= zoomMultiplier; + if (viewPosition != null) { + viewPosition.x /= zoomMultiplier; + viewPosition.y /= zoomMultiplier; + bounds.width /= zoomMultiplier; + bounds.height /= zoomMultiplier; + componentSize.width /= zoomMultiplier; + componentSize.height /= zoomMultiplier; + } + amount--; + } + while (amount < 0 && zoom * zoomMultiplier <= maxFactor) { + zoom *= zoomMultiplier; + if (viewPosition != null) { + viewPosition.x *= zoomMultiplier; + viewPosition.y *= zoomMultiplier; + bounds.width *= zoomMultiplier; + bounds.height *= zoomMultiplier; + componentSize.width *= zoomMultiplier; + componentSize.height *= zoomMultiplier; + } + amount++; + } + sceneAnimator.animateZoomFactor(zoom); + } + } else { + double zoom = scene.getZoomFactor(); + while (amount > 0 && zoom / zoomMultiplier >= minFactor) { + zoom /= zoomMultiplier; + if (viewPosition != null) { + viewPosition.x /= zoomMultiplier; + viewPosition.y /= zoomMultiplier; + bounds.width /= zoomMultiplier; + bounds.height /= zoomMultiplier; + componentSize.width /= zoomMultiplier; + componentSize.height /= zoomMultiplier; + } + amount--; + } + while (amount < 0 && zoom * zoomMultiplier <= maxFactor) { + zoom *= zoomMultiplier; + if (viewPosition != null) { + viewPosition.x *= zoomMultiplier; + viewPosition.y *= zoomMultiplier; + bounds.width *= zoomMultiplier; + bounds.height *= zoomMultiplier; + componentSize.width *= zoomMultiplier; + componentSize.height *= zoomMultiplier; + } + amount++; + } + scene.setZoomFactor(zoom); + } + + if (scrollPane != null) { + viewPosition.x -= xOffset; + viewPosition.y -= yOffset; + scrollPane.getViewport().setViewPosition(viewPosition); + } + + + return WidgetAction.State.CONSUMED; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/Bundle.properties new file mode 100644 index 00000000000..4593549d591 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/Bundle.properties @@ -0,0 +1,3 @@ +HINT_EditorTopComponent=This is a Editor window +OpenIDE-Module-Name=View +CTL_EditorTopComponent=Editor Window diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ConnectionAnchor.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ConnectionAnchor.java new file mode 100644 index 00000000000..3ede4ba1731 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ConnectionAnchor.java @@ -0,0 +1,84 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view; + +import com.sun.hotspot.igv.view.widgets.SlotWidget; +import java.awt.Point; +import java.awt.Rectangle; +import org.netbeans.api.visual.anchor.Anchor; +import org.netbeans.api.visual.anchor.Anchor.Entry; +import org.netbeans.api.visual.anchor.Anchor.Result; +import org.netbeans.api.visual.widget.Widget; + +/** + * + * @author Thomas Wuerthinger + */ +public class ConnectionAnchor extends Anchor { + + public enum HorizontalAlignment { + + Left, + Center, + Right + } + private HorizontalAlignment alignment; + + public ConnectionAnchor(Widget widget) { + this(HorizontalAlignment.Center, widget); + } + + public ConnectionAnchor(HorizontalAlignment alignment, Widget widget) { + super(widget); + this.alignment = alignment; + } + + public Result compute(Entry entry) { + return new Result(getRelatedSceneLocation(), Anchor.DIRECTION_ANY); + } + + @Override + public Point getRelatedSceneLocation() { + Point p = null; + Widget w = getRelatedWidget(); + if (w != null) { + if (w instanceof SlotWidget) { + p = ((SlotWidget) w).getAnchorPosition(); + } else { + Rectangle r = w.convertLocalToScene(w.getBounds()); + int y = r.y + r.height / 2; + int x = r.x; + if (alignment == HorizontalAlignment.Center) { + x = r.x + r.width / 2; + } else if (alignment == HorizontalAlignment.Right) { + x = r.x + r.width; + } + + p = new Point(x, y); + } + } + + return p; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramScene.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramScene.java new file mode 100644 index 00000000000..2ee3067acfe --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramScene.java @@ -0,0 +1,1254 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view; + +import com.sun.hotspot.igv.view.widgets.BlockWidget; +import com.sun.hotspot.igv.view.widgets.LineWidget; +import com.sun.hotspot.igv.util.DoubleClickAction; +import com.sun.hotspot.igv.data.InputBlock; +import com.sun.hotspot.igv.data.InputNode; +import com.sun.hotspot.igv.graph.Connection; +import com.sun.hotspot.igv.graph.Diagram; +import com.sun.hotspot.igv.graph.Figure; +import com.sun.hotspot.igv.graph.InputSlot; +import com.sun.hotspot.igv.graph.OutputSlot; +import com.sun.hotspot.igv.graph.Slot; +import com.sun.hotspot.igv.hierarchicallayout.HierarchicalClusterLayoutManager; +import com.sun.hotspot.igv.hierarchicallayout.OldHierarchicalLayoutManager; +import com.sun.hotspot.igv.hierarchicallayout.HierarchicalLayoutManager; +import com.sun.hotspot.igv.view.widgets.FigureWidget; +import com.sun.hotspot.igv.view.widgets.InputSlotWidget; +import com.sun.hotspot.igv.view.widgets.OutputSlotWidget; +import com.sun.hotspot.igv.view.widgets.SlotWidget; +import com.sun.hotspot.igv.layout.LayoutGraph; +import com.sun.hotspot.igv.data.services.Scheduler; +import com.sun.hotspot.igv.data.ChangedListener; +import com.sun.hotspot.igv.graph.Block; +import com.sun.hotspot.igv.util.ColorIcon; +import com.sun.hotspot.igv.util.ExtendedSelectAction; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.event.ActionEvent; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; +import java.awt.event.MouseWheelEvent; +import java.awt.event.MouseWheelListener; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.List; +import java.util.Map; +import java.util.Set; +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.BorderFactory; +import javax.swing.JComponent; +import javax.swing.JPopupMenu; +import javax.swing.JScrollPane; +import javax.swing.SwingUtilities; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.event.UndoableEditEvent; +import javax.swing.undo.AbstractUndoableEdit; +import javax.swing.undo.CannotRedoException; +import javax.swing.undo.CannotUndoException; +import org.netbeans.api.visual.action.ActionFactory; +import org.netbeans.api.visual.action.PopupMenuProvider; +import org.netbeans.api.visual.action.RectangularSelectDecorator; +import org.netbeans.api.visual.action.RectangularSelectProvider; +import org.netbeans.api.visual.action.SelectProvider; +import org.netbeans.api.visual.action.WidgetAction; +import org.netbeans.api.visual.animator.SceneAnimator; +import org.netbeans.api.visual.layout.LayoutFactory; +import org.netbeans.api.visual.widget.ConnectionWidget; +import org.netbeans.api.visual.widget.LayerWidget; +import org.netbeans.api.visual.widget.Scene; +import org.netbeans.api.visual.widget.Widget; +import org.netbeans.api.visual.widget.LabelWidget; +import org.openide.awt.UndoRedo; +import org.openide.util.Lookup; +import org.openide.util.lookup.AbstractLookup; +import org.openide.util.lookup.InstanceContent; + +/** + * + * @author Thomas Wuerthinger + */ +public class DiagramScene extends Scene implements ChangedListener { + + private Hashtable figureWidgets; + private Hashtable slotWidgets; + private Hashtable connectionWidgets; + private Hashtable blockWidgets; + private Widget hoverWidget; + private WidgetAction hoverAction; + private List selectedWidgets; + private Lookup lookup; + private InstanceContent content; + private Action[] actions; + private LayerWidget connectionLayer; + private JScrollPane scrollPane; + private UndoRedo.Manager undoRedoManager; + private LayerWidget mainLayer; + private LayerWidget slotLayer; + private LayerWidget blockLayer; + private double realZoomFactor; + private BoundedZoomAction zoomAction; + private WidgetAction panAction; + private Widget topLeft; + private Widget bottomRight; + private LayerWidget startLayer; + private LabelWidget startLabel; + private DiagramViewModel model; + private DiagramViewModel modelCopy; + public static final int AFTER = 1; + public static final int BEFORE = 1; + public static final float ALPHA = 0.4f; + public static final int GRID_SIZE = 30; + public static final int BORDER_SIZE = 20; + public static final int UNDOREDO_LIMIT = 100; + public static final int SCROLL_UNIT_INCREMENT = 80; + public static final int SCROLL_BLOCK_INCREMENT = 400; + public static final float ZOOM_MAX_FACTOR = 3.0f; + public static final float ZOOM_MIN_FACTOR = 0.0f;//0.15f; + public static final float ZOOM_INCREMENT = 1.5f; + public static final int SLOT_OFFSET = 6; + public static final int ANIMATION_LIMIT = 40; + private PopupMenuProvider popupMenuProvider = new PopupMenuProvider() { + + public JPopupMenu getPopupMenu(Widget widget, Point localLocation) { + return DiagramScene.this.createPopupMenu(); + } + }; + private RectangularSelectDecorator rectangularSelectDecorator = new RectangularSelectDecorator() { + + public Widget createSelectionWidget() { + Widget widget = new Widget(DiagramScene.this); + widget.setBorder(BorderFactory.createLineBorder(Color.black, 2)); + widget.setForeground(Color.red); + return widget; + } + }; + private RectangularSelectProvider rectangularSelectProvider = new RectangularSelectProvider() { + + public void performSelection(Rectangle rectangle) { + if (rectangle.width < 0) { + rectangle.x += rectangle.width; + rectangle.width *= -1; + } + + if (rectangle.height < 0) { + rectangle.y += rectangle.height; + rectangle.height *= -1; + } + + boolean updated = false; + for (Figure f : getModel().getDiagramToView().getFigures()) { + FigureWidget w = figureWidgets.get(f); + Rectangle r = new Rectangle(w.getBounds()); + r.setLocation(w.getLocation()); + if (r.intersects(rectangle)) { + if (!selectedWidgets.contains(w)) { + addToSelection(w); + updated = true; + } + } else { + if (selectedWidgets.contains(w)) { + selectedWidgets.remove(w); + content.remove(w.getNode()); + w.setState(w.getState().deriveSelected(false)); + updated = true; + } + } + } + + if (updated) { + selectionUpdated(); + } + } + }; + private SelectProvider selectProvider = new SelectProvider() { + + public boolean isAimingAllowed(Widget widget, Point point, boolean b) { + return false; + } + + public boolean isSelectionAllowed(Widget widget, Point point, boolean b) { + return widget instanceof FigureWidget || widget == DiagramScene.this; + } + + public void select(Widget w, Point point, boolean change) { + + boolean updated = false; + + if (w == DiagramScene.this) { + if (DiagramScene.this.selectedWidgets.size() != 0) { + clearSelection(); + selectionUpdated(); + } + return; + } + + FigureWidget widget = (FigureWidget) w; + + + if (change) { + if (widget.getState().isSelected()) { + assert selectedWidgets.contains(widget); + widget.setState(widget.getState().deriveSelected(false)); + selectedWidgets.remove(widget); + content.remove(widget.getNode()); + updated = true; + } else { + assert !selectedWidgets.contains(widget); + addToSelection(widget); + updated = true; + assert widget.getState().isSelected(); + } + } else { + + if (widget.getState().isSelected()) { + assert selectedWidgets.contains(widget); + } else { + + assert !selectedWidgets.contains(widget); + clearSelection(); + addToSelection(widget); + updated = true; + assert widget.getState().isSelected(); + } + } + + if (updated) { + selectionUpdated(); + } + + } + }; + + private FigureWidget getFigureWidget(Figure f) { + return figureWidgets.get(f); + } + private FocusListener focusListener = new FocusListener() { + + public void focusGained(FocusEvent e) { + DiagramScene.this.getView().requestFocus(); + } + + public void focusLost(FocusEvent e) { + } + }; + private MouseWheelListener mouseWheelListener = new MouseWheelListener() { + + public void mouseWheelMoved(MouseWheelEvent e) { + DiagramScene.this.zoomAction.mouseWheelMoved(DiagramScene.this, new WidgetAction.WidgetMouseWheelEvent(0, e)); + DiagramScene.this.validate(); + } + }; + private MouseListener mouseListener = new MouseListener() { + + public void mouseClicked(MouseEvent e) { + DiagramScene.this.panAction.mouseClicked(DiagramScene.this, new WidgetAction.WidgetMouseEvent(0, e)); + } + + public void mousePressed(MouseEvent e) { + DiagramScene.this.panAction.mousePressed(DiagramScene.this, new WidgetAction.WidgetMouseEvent(0, e)); + } + + public void mouseReleased(MouseEvent e) { + DiagramScene.this.panAction.mouseReleased(DiagramScene.this, new WidgetAction.WidgetMouseEvent(0, e)); + } + + public void mouseEntered(MouseEvent e) { + DiagramScene.this.panAction.mouseEntered(DiagramScene.this, new WidgetAction.WidgetMouseEvent(0, e)); + } + + public void mouseExited(MouseEvent e) { + DiagramScene.this.panAction.mouseExited(DiagramScene.this, new WidgetAction.WidgetMouseEvent(0, e)); + } + }; + private MouseMotionListener mouseMotionListener = new MouseMotionListener() { + + public void mouseDragged(MouseEvent e) { + DiagramScene.this.panAction.mouseDragged(DiagramScene.this, new WidgetAction.WidgetMouseEvent(0, e)); + } + + public void mouseMoved(MouseEvent e) { + } + }; + private ScrollChangeListener scrollChangeListener = new ScrollChangeListener(); + + private class ScrollChangeListener implements ChangeListener { + + private Map relativePositions = new HashMap(); + private Point oldPosition; + + public void register(Widget w, Point p) { + relativePositions.put(w, p); + } + + public void unregister(Widget w) { + relativePositions.remove(w); + } + + public void stateChanged(ChangeEvent e) { + Point p = DiagramScene.this.getScrollPane().getViewport().getViewPosition(); + if (oldPosition == null || !p.equals(oldPosition)) { + for (Widget w : relativePositions.keySet()) { + Point curPoint = relativePositions.get(w); + Point newPoint = new Point(p.x + curPoint.x, p.y + curPoint.y); + w.setPreferredLocation(newPoint); + DiagramScene.this.validate(); + } + oldPosition = p; + } + } + } + + public Point getScrollPosition() { + return getScrollPane().getViewport().getViewPosition(); + } + + public void setScrollPosition(Point p) { + getScrollPane().getViewport().setViewPosition(p); + } + + public DiagramScene(Action[] actions, DiagramViewModel model) { + this.actions = actions; + selectedWidgets = new ArrayList(); + content = new InstanceContent(); + lookup = new AbstractLookup(content); + this.setCheckClipping(true); + this.getInputBindings().setZoomActionModifiers(0); + + JComponent comp = this.createView(); + comp.setDoubleBuffered(true); + comp.setBackground(Color.WHITE); + comp.setOpaque(true); + + this.setBackground(Color.WHITE); + this.setOpaque(true); + scrollPane = new JScrollPane(comp); + scrollPane.setBackground(Color.WHITE); + scrollPane.getVerticalScrollBar().setUnitIncrement(SCROLL_UNIT_INCREMENT); + scrollPane.getVerticalScrollBar().setBlockIncrement(SCROLL_BLOCK_INCREMENT); + scrollPane.getHorizontalScrollBar().setUnitIncrement(SCROLL_UNIT_INCREMENT); + scrollPane.getHorizontalScrollBar().setBlockIncrement(SCROLL_BLOCK_INCREMENT); + scrollPane.getViewport().addChangeListener(scrollChangeListener); + hoverAction = this.createWidgetHoverAction(); + + blockLayer = new LayerWidget(this); + this.addChild(blockLayer); + + startLayer = new LayerWidget(this); + this.addChild(startLayer); + // TODO: String startLabelString = "Loading graph with " + originalDiagram.getFigures().size() + " figures and " + originalDiagram.getConnections().size() + " connections..."; + String startLabelString = ""; + LabelWidget w = new LabelWidget(this, startLabelString); + scrollChangeListener.register(w, new Point(10, 10)); + w.setAlignment(LabelWidget.Alignment.CENTER); + startLabel = w; + startLayer.addChild(w); + + mainLayer = new LayerWidget(this); + this.addChild(mainLayer); + + topLeft = new Widget(this); + topLeft.setPreferredLocation(new Point(-BORDER_SIZE, -BORDER_SIZE)); + this.addChild(topLeft); + + + bottomRight = new Widget(this); + bottomRight.setPreferredLocation(new Point(-BORDER_SIZE, -BORDER_SIZE)); + this.addChild(bottomRight); + + slotLayer = new LayerWidget(this); + this.addChild(slotLayer); + + connectionLayer = new LayerWidget(this); + this.addChild(connectionLayer); + + LayerWidget selectionLayer = new LayerWidget(this); + this.addChild(selectionLayer); + + this.setLayout(LayoutFactory.createAbsoluteLayout()); + + this.getActions().addAction(hoverAction); + zoomAction = new BoundedZoomAction(1.1, false); + zoomAction.setMaxFactor(ZOOM_MAX_FACTOR); + zoomAction.setMinFactor(ZOOM_MIN_FACTOR); + this.getActions().addAction(ActionFactory.createMouseCenteredZoomAction(1.1)); + panAction = new ExtendedPanAction(); + this.getActions().addAction(panAction); + this.getActions().addAction(ActionFactory.createPopupMenuAction(popupMenuProvider)); + + LayerWidget selectLayer = new LayerWidget(this); + this.addChild(selectLayer); + this.getActions().addAction(ActionFactory.createRectangularSelectAction(rectangularSelectDecorator, selectLayer, rectangularSelectProvider)); + + blockWidgets = new Hashtable(); + + boolean b = this.getUndoRedoEnabled(); + this.setUndoRedoEnabled(false); + this.setNewModel(model); + this.setUndoRedoEnabled(b); + } + + private void selectionUpdated() { + getModel().setSelectedNodes(this.getSelectedNodes()); + addUndo(); + } + + public DiagramViewModel getModel() { + return model; + } + + public void setRealZoomFactor(double d) { + this.realZoomFactor = d; + } + + public double getRealZoomFactor() { + if (realZoomFactor == 0.0) { + return getZoomFactor(); + } else { + return realZoomFactor; + } + } + + public JScrollPane getScrollPane() { + return scrollPane; + } + + public boolean isAllVisible() { + return getModel().getHiddenNodes().size() == 0; + } + + public Action createGotoAction(final Figure f) { + final DiagramScene diagramScene = this; + Action a = new AbstractAction() { + + public void actionPerformed(ActionEvent e) { + diagramScene.gotoFigure(f); + } + }; + + a.setEnabled(true); + a.putValue(Action.SMALL_ICON, new ColorIcon(f.getColor())); + String name = f.getLines()[0]; + + name += " ("; + + if (f.getCluster() != null) { + name += "B" + f.getCluster().toString(); + } + if (!this.getFigureWidget(f).isVisible()) { + if (f.getCluster() != null) { + name += ", "; + } + name += "hidden"; + } + name += ")"; + a.putValue(Action.NAME, name); + return a; + } + + public void setNewModel(DiagramViewModel model) { + if (this.model != null) { + this.model.getDiagramChangedEvent().removeListener(this); + this.model.getViewPropertiesChangedEvent().removeListener(this); + } + this.model = model; + + if (this.model == null) { + this.modelCopy = null; + } else { + this.modelCopy = this.model.copy(); + } + + model.getDiagramChangedEvent().addListener(this); + model.getViewPropertiesChangedEvent().addListener(this); + + update(); + } + + private void update() { + + /*if (startLabel != null) { + // Animate fade-out + final LabelWidget labelWidget = this.startLabel; + labelWidget.setVisible(true); + RequestProcessor.getDefault().post(new Runnable() { + public void run() { + final int Sleep = 200; + final int Progress = 10; + for (int i = 0; i < 255 / Progress + 1; i++) { + try { + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + Color c = labelWidget.getForeground(); + int v = c.getRed(); + v += Progress; + if (v > 255) { + v = 255; + } + labelWidget.setForeground(new Color(v, v, v, 255 - v)); + labelWidget.getScene().validate(); + } + }); + } catch (InterruptedException ex) { + } catch (InvocationTargetException ex) { + } + try { + Thread.sleep(Sleep); + } catch (InterruptedException ex) { + } + } + labelWidget.setVisible(false); + DiagramScene.this.scrollChangeListener.unregister(labelWidget); + } + }, 1000); + startLabel = null; + }*/ + + slotLayer.removeChildren(); + mainLayer.removeChildren(); + blockLayer.removeChildren(); + + blockWidgets.clear(); + figureWidgets = new Hashtable(); + slotWidgets = new Hashtable(); + connectionWidgets = new Hashtable(); + + WidgetAction selectAction = new ExtendedSelectAction(selectProvider); + Diagram d = getModel().getDiagramToView(); + + if (getModel().getShowBlocks()) { + Scheduler s = Lookup.getDefault().lookup(Scheduler.class); + Collection newBlocks = new ArrayList(s.schedule(d.getGraph())); + d.schedule(newBlocks); + } + + for (Figure f : d.getFigures()) { + FigureWidget w = new FigureWidget(f, this, mainLayer); + w.getActions().addAction(selectAction); + w.getActions().addAction(hoverAction); + w.getActions().addAction(ActionFactory.createPopupMenuAction(w)); + w.getActions().addAction(new DoubleClickAction(w)); + w.setVisible(false); + + figureWidgets.put(f, w); + + for (InputSlot s : f.getInputSlots()) { + SlotWidget sw = new InputSlotWidget(s, this, slotLayer, w); + slotWidgets.put(s, sw); + sw.getActions().addAction(selectAction); + } + + for (OutputSlot s : f.getOutputSlots()) { + SlotWidget sw = new OutputSlotWidget(s, this, slotLayer, w); + slotWidgets.put(s, sw); + sw.getActions().addAction(selectAction); + } + } + + if (getModel().getShowBlocks()) { + for (InputBlock bn : d.getGraph().getBlocks()) { + BlockWidget w = new BlockWidget(this, d, bn); + w.setVisible(false); + blockWidgets.put(bn, w); + blockLayer.addChild(w); + } + } + + this.smallUpdate(true); + + } + + private void smallUpdate(boolean relayout) { + + this.updateHiddenNodes(model.getHiddenNodes(), relayout); + boolean b = this.getUndoRedoEnabled(); + this.setUndoRedoEnabled(false); + this.setSelection(getModel().getSelectedNodes()); + this.setUndoRedoEnabled(b); + this.validate(); + } + + private boolean isVisible(Connection c) { + FigureWidget w1 = figureWidgets.get(c.getInputSlot().getFigure()); + FigureWidget w2 = figureWidgets.get(c.getOutputSlot().getFigure()); + + if (w1.isVisible() && w2.isVisible()) { + return true; + } + + return false; + } + + private void relayout(Set oldVisibleWidgets) { + + Diagram diagram = getModel().getDiagramToView(); + + HashSet
    figures = new HashSet
    (); + + for (Figure f : diagram.getFigures()) { + FigureWidget w = figureWidgets.get(f); + if (w.isVisible()) { + figures.add(f); + } + } + + HashSet edges = new HashSet(); + + for (Connection c : diagram.getConnections()) { + if (isVisible(c)) { + edges.add(c); + } + } + + if (getModel().getShowBlocks()) { + HierarchicalClusterLayoutManager m = new HierarchicalClusterLayoutManager(OldHierarchicalLayoutManager.Combine.SAME_OUTPUTS); + HierarchicalLayoutManager manager = new HierarchicalLayoutManager(HierarchicalLayoutManager.Combine.SAME_OUTPUTS); + manager.setMaxLayerLength(9); + manager.setMinLayerDifference(3); + m.setManager(manager); + m.setSubManager(new HierarchicalLayoutManager(HierarchicalLayoutManager.Combine.SAME_OUTPUTS)); + m.doLayout(new LayoutGraph(edges, figures)); + + } else { + HierarchicalLayoutManager manager = new HierarchicalLayoutManager(HierarchicalLayoutManager.Combine.SAME_OUTPUTS); + manager.setMaxLayerLength(10); + manager.doLayout(new LayoutGraph(edges, figures)); + } + + int maxX = -BORDER_SIZE; + int maxY = -BORDER_SIZE; + for (Figure f : diagram.getFigures()) { + FigureWidget w = figureWidgets.get(f); + if (w.isVisible()) { + Point p = f.getPosition(); + Dimension d = f.getSize(); + maxX = Math.max(maxX, p.x + d.width); + maxY = Math.max(maxY, p.y + d.height); + } + } + + for (Connection c : diagram.getConnections()) { + List points = c.getControlPoints(); + FigureWidget w1 = figureWidgets.get((Figure) c.getTo().getVertex()); + FigureWidget w2 = figureWidgets.get((Figure) c.getFrom().getVertex()); + if (w1.isVisible() && w2.isVisible()) { + for (Point p : points) { + if (p != null) { + maxX = Math.max(maxX, p.x); + maxY = Math.max(maxY, p.y); + } + } + } + } + + if (getModel().getShowBlocks()) { + for (Block b : diagram.getBlocks()) { + BlockWidget w = blockWidgets.get(b.getInputBlock()); + if (w != null && w.isVisible()) { + Rectangle r = b.getBounds(); + maxX = Math.max(maxX, r.x + r.width); + maxY = Math.max(maxY, r.y + r.height); + } + } + } + + bottomRight.setPreferredLocation(new Point(maxX + BORDER_SIZE, maxY + BORDER_SIZE)); + int offx = 0; + int offy = 0; + int curWidth = maxX + 2 * BORDER_SIZE; + int curHeight = maxY + 2 * BORDER_SIZE; + + Rectangle bounds = this.getScrollPane().getBounds(); + if (curWidth < bounds.width) { + offx = (bounds.width - curWidth) / 2; + } + + if (curHeight < bounds.height) { + offy = (bounds.height - curHeight) / 2; + } + + final int offx2 = offx; + final int offy2 = offy; + + SceneAnimator animator = this.getSceneAnimator(); + connectionLayer.removeChildren(); + int visibleFigureCount = 0; + for (Figure f : diagram.getFigures()) { + if (figureWidgets.get(f).isVisible()) { + visibleFigureCount++; + } + } + + for (Figure f : diagram.getFigures()) { + for (OutputSlot s : f.getOutputSlots()) { + SceneAnimator anim = animator; + if (visibleFigureCount > ANIMATION_LIMIT) { + anim = null; + } + processOutputSlot(s, s.getConnections(), 0, null, null, offx2, offy2, anim); + } + } + + for (Figure f : diagram.getFigures()) { + FigureWidget w = figureWidgets.get(f); + if (w.isVisible()) { + Point p = f.getPosition(); + Point p2 = new Point(p.x + offx2, p.y + offy2); + Rectangle r = new Rectangle(p.x + offx2, p.y + offy2, f.getSize().width, f.getSize().height); + if (oldVisibleWidgets.contains(w)) { + if (visibleFigureCount > ANIMATION_LIMIT) { + w.setPreferredLocation(p2); + } else { + animator.animatePreferredLocation(w, p2); + } + } else { + w.setPreferredLocation(p2); + } + } + } + + if (getModel().getShowBlocks()) { + for (Block b : diagram.getBlocks()) { + BlockWidget w = blockWidgets.get(b.getInputBlock()); + if (w != null && w.isVisible()) { + Point location = new Point(b.getBounds().x + offx2, b.getBounds().y + offy2); + Rectangle r = new Rectangle(location.x, location.y, b.getBounds().width, b.getBounds().height); + if (oldVisibleWidgets.contains(w)) { + if (visibleFigureCount > ANIMATION_LIMIT) { + w.setPreferredBounds(r); + } else { + animator.animatePreferredBounds(w, r); + } + } else { + w.setPreferredBounds(r); + } + } + } + } + } + private final Point specialNullPoint = new Point(Integer.MAX_VALUE, Integer.MAX_VALUE); + + private void processOutputSlot(OutputSlot s, List connections, int controlPointIndex, Point lastPoint, LineWidget predecessor, int offx, int offy, SceneAnimator animator) { + Map> pointMap = new HashMap>(); + + for (Connection c : connections) { + + if (!isVisible(c)) { + continue; + } + + List controlPoints = c.getControlPoints(); + if (controlPointIndex >= controlPoints.size()) { + continue; + } + + Point cur = controlPoints.get(controlPointIndex); + if (cur == null) { + cur = specialNullPoint; + } else if (controlPointIndex == 0 && !s.getShowName()) { + cur = new Point(cur.x, cur.y - SLOT_OFFSET); + } else if (controlPointIndex == controlPoints.size() - 1 && !c.getInputSlot().getShowName()) { + cur = new Point(cur.x, cur.y + SLOT_OFFSET); + } + + if (pointMap.containsKey(cur)) { + pointMap.get(cur).add(c); + } else { + List newList = new ArrayList(2); + newList.add(c); + pointMap.put(cur, newList); + } + + } + + for (Point p : pointMap.keySet()) { + List connectionList = pointMap.get(p); + + boolean isBold = false; + boolean isDashed = true; + + for (Connection c : connectionList) { + + if (c.getStyle() == Connection.ConnectionStyle.BOLD) { + isBold = true; + } + + if (c.getStyle() != Connection.ConnectionStyle.DASHED) { + isDashed = false; + } + } + + LineWidget newPredecessor = predecessor; + if (p == specialNullPoint) { + + } else if (lastPoint == specialNullPoint) { + + } else if (lastPoint != null) { + Point p1 = new Point(lastPoint.x + offx, lastPoint.y + offy); + Point p2 = new Point(p.x + offx, p.y + offy); + LineWidget w = new LineWidget(this, s, connectionList, p1, p2, predecessor, animator, isBold, isDashed); + newPredecessor = w; + connectionLayer.addChild(w); + w.getActions().addAction(hoverAction); + } + + processOutputSlot(s, connectionList, controlPointIndex + 1, p, newPredecessor, offx, offy, animator); + } + } + + private void clearSelection() { + if (selectedWidgets.size() == 0) { + return; + } + for (FigureWidget w : selectedWidgets) { + assert w.getState().isSelected(); + w.setState(w.getState().deriveSelected(false)); + content.remove(w.getNode()); + } + selectedWidgets.clear(); + } + + public Lookup getLookup() { + return lookup; + } + + public void gotoFigures(final List
    figures) { + Rectangle overall = null; + showFigures(figures); + for (Figure f : figures) { + + FigureWidget fw = getFigureWidget(f); + if (fw != null) { + Rectangle r = fw.getBounds(); + Point p = fw.getLocation(); + Rectangle r2 = new Rectangle(p.x, p.y, r.width, r.height); + + if (overall == null) { + overall = r2; + } else { + overall = overall.union(r2); + } + } + } + if (overall != null) { + centerRectangle(overall); + } + } + + private Point calcCenter(Rectangle r) { + + Point center = new Point((int) r.getCenterX(), (int) r.getCenterY()); + center.x -= getScrollPane().getViewport().getViewRect().width / 2; + center.y -= getScrollPane().getViewport().getViewRect().height / 2; + + // Ensure to be within area + center.x = Math.max(0, center.x); + center.x = Math.min(getScrollPane().getViewport().getViewSize().width - getScrollPane().getViewport().getViewRect().width, center.x); + center.y = Math.max(0, center.y); + center.y = Math.min(getScrollPane().getViewport().getViewSize().height - getScrollPane().getViewport().getViewRect().height, center.y); + + return center; + } + + private void centerRectangle(Rectangle r) { + + if (getScrollPane().getViewport().getViewRect().width == 0 || getScrollPane().getViewport().getViewRect().height == 0) { + return; + } + + Rectangle r2 = new Rectangle(r.x, r.y, r.width, r.height); + r2 = convertSceneToView(r2); + + double factorX = (double) r2.width / (double) getScrollPane().getViewport().getViewRect().width; + double factorY = (double) r2.height / (double) getScrollPane().getViewport().getViewRect().height; + double factor = Math.max(factorX, factorY); + if (factor >= 1.0) { + Point p = getScrollPane().getViewport().getViewPosition(); + setZoomFactor(getZoomFactor() / factor); + r2.x /= factor; + r2.y /= factor; + r2.width /= factor; + r2.height /= factor; + getScrollPane().getViewport().setViewPosition(calcCenter(r2)); + } else { + getScrollPane().getViewport().setViewPosition(calcCenter(r2)); + } + } + + private void addToSelection(Figure f) { + FigureWidget w = getFigureWidget(f); + addToSelection(w); + } + + private void addToSelection(FigureWidget w) { + assert !selectedWidgets.contains(w); + selectedWidgets.add(w); + content.add(w.getNode()); + w.setState(w.getState().deriveSelected(true)); + } + + private void setSelection(Set nodes) { + clearSelection(); + for (Figure f : getModel().getDiagramToView().getFigures()) { + if (doesIntersect(f.getSource().getSourceNodesAsSet(), nodes)) { + addToSelection(f); + } + } + selectionUpdated(); + this.validate(); + } + + public void setSelection(Collection
    list) { + clearSelection(); + for (Figure f : list) { + addToSelection(f); + } + + selectionUpdated(); + this.validate(); + } + + public Set
    getSelectedFigures() { + Set
    result = new HashSet
    (); + for (Widget w : selectedWidgets) { + if (w instanceof FigureWidget) { + FigureWidget fw = (FigureWidget) w; + if (fw.getState().isSelected()) { + result.add(fw.getFigure()); + } + } + } + return result; + } + + public Set getSelectedNodes() { + Set result = new HashSet(); + for (Widget w : selectedWidgets) { + if (w instanceof FigureWidget) { + FigureWidget fw = (FigureWidget) w; + if (fw.getState().isSelected()) { + result.addAll(fw.getFigure().getSource().getSourceNodesAsSet()); + } + } + } + return result; + } + + private UndoRedo.Manager getUndoRedoManager() { + if (undoRedoManager == null) { + undoRedoManager = new UndoRedo.Manager(); + undoRedoManager.setLimit(UNDOREDO_LIMIT); + } + + return undoRedoManager; + } + + public UndoRedo getUndoRedo() { + return getUndoRedoManager(); + } + + private boolean isVisible(Figure f) { + for (Integer n : f.getSource().getSourceNodesAsSet()) { + if (getModel().getHiddenNodes().contains(n)) { + return false; + } + } + return true; + } + + private boolean doesIntersect(Set s1, Set s2) { + if (s1.size() > s2.size()) { + Set tmp = s1; + s1 = s2; + s2 = tmp; + } + + for (Object o : s1) { + if (s2.contains(o)) { + return true; + } + } + + return false; + } + + public void showNot(final Set nodes) { + updateHiddenNodes(nodes, true); + } + + public void showOnly(final Set nodes) { + HashSet allNodes = new HashSet(getModel().getGraphToView().getGroup().getAllNodes()); + allNodes.removeAll(nodes); + updateHiddenNodes(allNodes, true); + } + + private void updateHiddenNodes(Set newHiddenNodes, boolean doRelayout) { + + Set visibleBlocks = new HashSet(); + + Diagram diagram = getModel().getDiagramToView(); + assert diagram != null; + + Set oldVisibleWidgets = new HashSet(); + + for (Figure f : diagram.getFigures()) { + FigureWidget w = figureWidgets.get(f); + if (w.isVisible()) { + oldVisibleWidgets.add(w); + } + } + + if (getModel().getShowBlocks()) { + for (InputBlock b : diagram.getGraph().getBlocks()) { + BlockWidget w = blockWidgets.get(b); + if (w.isVisible()) { + oldVisibleWidgets.add(w); + } + } + } + + for (Figure f : diagram.getFigures()) { + boolean hiddenAfter = doesIntersect(f.getSource().getSourceNodesAsSet(), newHiddenNodes); + + FigureWidget w = this.figureWidgets.get(f); + w.setBoundary(false); + if (!hiddenAfter) { + // Figure is shown + w.setVisible(true); + for (InputNode n : f.getSource().getSourceNodes()) { + visibleBlocks.add(diagram.getGraph().getBlock(n)); + } + } else { + // Figure is hidden + w.setVisible(false); + } + } + + if (getModel().getShowNodeHull()) { + List boundaries = new ArrayList(); + for (Figure f : diagram.getFigures()) { + FigureWidget w = this.figureWidgets.get(f); + if (!w.isVisible()) { + Set
    set = new HashSet
    (f.getPredecessorSet()); + set.addAll(f.getSuccessorSet()); + + boolean b = false; + for (Figure neighbor : set) { + FigureWidget neighborWidget = figureWidgets.get(neighbor); + if (neighborWidget.isVisible()) { + b = true; + break; + } + } + + if (b) { + w.setBoundary(true); + for (InputNode n : f.getSource().getSourceNodes()) { + visibleBlocks.add(diagram.getGraph().getBlock(n)); + } + boundaries.add(w); + } + } + } + + for (FigureWidget w : boundaries) { + if (w.isBoundary()) { + w.setVisible(true); + } + } + } + + if (getModel().getShowBlocks()) { + for (InputBlock b : diagram.getGraph().getBlocks()) { + + boolean visibleAfter = visibleBlocks.contains(b); + + BlockWidget w = blockWidgets.get(b); + if (visibleAfter) { + // Block must be shown + w.setVisible(true); + } else { + // Block must be hidden + w.setVisible(false); + } + } + } + + getModel().setHiddenNodes(newHiddenNodes); + if (doRelayout) { + relayout(oldVisibleWidgets); + } + this.validate(); + addUndo(); + } + + private void showFigures(Collection
    f) { + HashSet newHiddenNodes = new HashSet(getModel().getHiddenNodes()); + for (Figure fig : f) { + newHiddenNodes.removeAll(fig.getSource().getSourceNodesAsSet()); + } + updateHiddenNodes(newHiddenNodes, true); + } + + private void showFigure(Figure f) { + HashSet newHiddenNodes = new HashSet(getModel().getHiddenNodes()); + newHiddenNodes.removeAll(f.getSource().getSourceNodesAsSet()); + updateHiddenNodes(newHiddenNodes, true); + } + + public void showAll(final Collection
    f) { + showFigures(f); + + } + + public void show(final Figure f) { + showFigure(f); + } + + public void gotoFigure(final Figure f) { + + if (!isVisible(f)) { + showFigure(f); + } + + FigureWidget fw = getFigureWidget(f); + if (fw != null) { + Rectangle r = fw.getBounds(); + Point p = fw.getLocation(); + centerRectangle(new Rectangle(p.x, p.y, r.width, r.height)); + + // Select figure + clearSelection(); + addToSelection(fw); + selectionUpdated(); + } + } + + public JPopupMenu createPopupMenu() { + JPopupMenu menu = new JPopupMenu(); + for (Action a : actions) { + if (a == null) { + menu.addSeparator(); + } else { + menu.add(a); + } + } + return menu; + } + + private static class DiagramUndoRedo extends AbstractUndoableEdit implements ChangedListener { + + private DiagramViewModel oldModel; + private DiagramViewModel newModel; + private Point oldScrollPosition; + private DiagramScene scene; + + public DiagramUndoRedo(DiagramScene scene, Point oldScrollPosition, DiagramViewModel oldModel, DiagramViewModel newModel) { + assert oldModel != null; + assert newModel != null; + this.oldModel = oldModel; + this.newModel = newModel; + this.scene = scene; + this.oldScrollPosition = oldScrollPosition; + } + + @Override + public void redo() throws CannotRedoException { + super.redo(); + boolean b = scene.getUndoRedoEnabled(); + scene.setUndoRedoEnabled(false); + scene.getModel().getViewChangedEvent().addListener(this); + scene.getModel().setData(newModel); + scene.getModel().getViewChangedEvent().removeListener(this); + scene.setUndoRedoEnabled(b); + } + + @Override + public void undo() throws CannotUndoException { + super.undo(); + boolean b = scene.getUndoRedoEnabled(); + scene.setUndoRedoEnabled(false); + scene.getModel().getViewChangedEvent().addListener(this); + scene.getModel().setData(oldModel); + scene.getModel().getViewChangedEvent().removeListener(this); + + SwingUtilities.invokeLater(new Runnable() { + + public void run() { + scene.setScrollPosition(oldScrollPosition); + } + }); + + scene.setUndoRedoEnabled(b); + } + + public void changed(DiagramViewModel source) { + scene.getModel().getViewChangedEvent().removeListener(this); + if (oldModel.getSelectedNodes().equals(newModel.getHiddenNodes())) { + scene.smallUpdate(false); + } else { + scene.smallUpdate(true); + } + } + } + private boolean undoRedoEnabled = true; + + public void setUndoRedoEnabled(boolean b) { + this.undoRedoEnabled = b; + } + + public boolean getUndoRedoEnabled() { + return undoRedoEnabled; + } + + public void changed(DiagramViewModel source) { + assert source == model : "Receive only changed event from current model!"; + assert source != null; + update(); + } + + private void addUndo() { + + DiagramViewModel newModelCopy = model.copy(); + + if (undoRedoEnabled) { + this.getUndoRedoManager().undoableEditHappened(new UndoableEditEvent(this, new DiagramUndoRedo(this, this.getScrollPosition(), modelCopy, newModelCopy))); + } + + this.modelCopy = newModelCopy; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramViewModel.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramViewModel.java new file mode 100644 index 00000000000..e374873b584 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramViewModel.java @@ -0,0 +1,303 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.view; + +import com.sun.hotspot.igv.data.Group; +import com.sun.hotspot.igv.data.InputGraph; +import com.sun.hotspot.igv.data.InputNode; +import com.sun.hotspot.igv.difference.Difference; +import com.sun.hotspot.igv.filter.FilterChain; +import com.sun.hotspot.igv.graph.Diagram; +import com.sun.hotspot.igv.data.ChangedEvent; +import com.sun.hotspot.igv.util.RangeSliderModel; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import com.sun.hotspot.igv.data.ChangedListener; +import com.sun.hotspot.igv.settings.Settings; +import java.awt.Color; + +/** + * + * @author Thomas Wuerthinger + */ +public class DiagramViewModel extends RangeSliderModel implements ChangedListener { + + // Warning: Update setData method if fields are added + private Group group; + private Set hiddenNodes; + private Set onScreenNodes; + private Set selectedNodes; + private FilterChain filterChain; + private FilterChain sequenceFilterChain; + private Diagram diagram; + private ChangedEvent diagramChangedEvent; + private ChangedEvent viewChangedEvent; + private ChangedEvent viewPropertiesChangedEvent; + private boolean showBlocks; + private boolean showNodeHull; + private ChangedListener filterChainChangedListener = new ChangedListener() { + + public void changed(FilterChain source) { + diagramChanged(); + } + }; + + public DiagramViewModel copy() { + DiagramViewModel result = new DiagramViewModel(group, filterChain, sequenceFilterChain); + result.setData(this); + return result; + } + + public void setData(DiagramViewModel newModel) { + super.setData(newModel); + boolean diagramChanged = false; + boolean viewChanged = false; + boolean viewPropertiesChanged = false; + + this.group = newModel.group; + diagramChanged |= (filterChain != newModel.filterChain); + this.filterChain = newModel.filterChain; + diagramChanged |= (sequenceFilterChain != newModel.sequenceFilterChain); + this.sequenceFilterChain = newModel.sequenceFilterChain; + diagramChanged |= (diagram != newModel.diagram); + this.diagram = newModel.diagram; + viewChanged |= (hiddenNodes != newModel.hiddenNodes); + this.hiddenNodes = newModel.hiddenNodes; + viewChanged |= (onScreenNodes != newModel.onScreenNodes); + this.onScreenNodes = newModel.onScreenNodes; + viewChanged |= (selectedNodes != newModel.selectedNodes); + this.selectedNodes = newModel.selectedNodes; + viewPropertiesChanged |= (showBlocks != newModel.showBlocks); + this.showBlocks = newModel.showBlocks; + viewPropertiesChanged |= (showNodeHull != newModel.showNodeHull); + this.showNodeHull = newModel.showNodeHull; + + if (diagramChanged) { + diagramChangedEvent.fire(); + } + if (viewPropertiesChanged) { + viewPropertiesChangedEvent.fire(); + } + if (viewChanged) { + viewChangedEvent.fire(); + } + } + + public boolean getShowBlocks() { + return showBlocks; + } + + public void setShowBlocks(boolean b) { + showBlocks = b; + viewPropertiesChangedEvent.fire(); + } + + public boolean getShowNodeHull() { + return showNodeHull; + } + + public void setShowNodeHull(boolean b) { + showNodeHull = b; + viewPropertiesChangedEvent.fire(); + } + + public DiagramViewModel(Group g, FilterChain filterChain, FilterChain sequenceFilterChain) { + super(calculateStringList(g)); + + this.showNodeHull = true; + this.showBlocks = true; + this.group = g; + assert filterChain != null; + this.filterChain = filterChain; + assert sequenceFilterChain != null; + this.sequenceFilterChain = sequenceFilterChain; + hiddenNodes = new HashSet(); + onScreenNodes = new HashSet(); + selectedNodes = new HashSet(); + super.getChangedEvent().addListener(this); + diagramChangedEvent = new ChangedEvent(this); + viewChangedEvent = new ChangedEvent(this); + viewPropertiesChangedEvent = new ChangedEvent(this); + + filterChain.getChangedEvent().addListener(filterChainChangedListener); + sequenceFilterChain.getChangedEvent().addListener(filterChainChangedListener); + } + + public ChangedEvent getDiagramChangedEvent() { + return diagramChangedEvent; + } + + public ChangedEvent getViewChangedEvent() { + return viewChangedEvent; + } + + public ChangedEvent getViewPropertiesChangedEvent() { + return viewPropertiesChangedEvent; + } + + public Set getSelectedNodes() { + return Collections.unmodifiableSet(selectedNodes); + } + + public Set getHiddenNodes() { + return Collections.unmodifiableSet(hiddenNodes); + } + + public Set getOnScreenNodes() { + return Collections.unmodifiableSet(onScreenNodes); + } + + public void setSelectedNodes(Set nodes) { + this.selectedNodes = nodes; + List colors = new ArrayList(); + for (String s : getPositions()) { + colors.add(Color.black); + } + if (nodes.size() >= 1) { + for (Integer id : nodes) { + if (id < 0) { + id = -id; + } + InputNode last = null; + int index = 0; + for (InputGraph g : group.getGraphs()) { + Color curColor = colors.get(index); + InputNode cur = g.getNode(id); + if (cur != null) { + if (last == null) { + curColor = Color.green; + } else { + if (last.equals(cur)) { + if (curColor == Color.black) { + curColor = Color.white; + } + } else { + if (curColor != Color.green) { + curColor = Color.orange; + } + } + } + } + last = cur; + colors.set(index, curColor); + index++; + } + } + this.setColors(colors); + } + setColors(colors); + viewChangedEvent.fire(); + } + + public void setHiddenNodes(Set nodes) { + this.hiddenNodes = nodes; + viewChangedEvent.fire(); + } + + public void setOnScreenNodes(Set onScreenNodes) { + this.onScreenNodes = onScreenNodes; + viewChangedEvent.fire(); + } + + public FilterChain getSequenceFilterChain() { + return filterChain; + } + + public void setSequenceFilterChain(FilterChain chain) { + assert chain != null : "sequenceFilterChain must never be null"; + sequenceFilterChain.getChangedEvent().removeListener(filterChainChangedListener); + sequenceFilterChain = chain; + sequenceFilterChain.getChangedEvent().addListener(filterChainChangedListener); + diagramChanged(); + } + + private void diagramChanged() { + // clear diagram + diagram = null; + getDiagramChangedEvent().fire(); + + } + + public FilterChain getFilterChain() { + return filterChain; + } + + public void setFilterChain(FilterChain chain) { + assert chain != null : "filterChain must never be null"; + filterChain.getChangedEvent().removeListener(filterChainChangedListener); + filterChain = chain; + filterChain.getChangedEvent().addListener(filterChainChangedListener); + diagramChanged(); + } + + private static List calculateStringList(Group g) { + List result = new ArrayList(); + for (InputGraph graph : g.getGraphs()) { + result.add(graph.getName()); + } + return result; + } + + public InputGraph getFirstGraph() { + return group.getGraphs().get(getFirstPosition()); + } + + public InputGraph getSecondGraph() { + return group.getGraphs().get(getSecondPosition()); + } + + public void selectGraph(InputGraph g) { + int index = group.getGraphs().indexOf(g); + assert index != -1; + setPositions(index, index); + } + + public Diagram getDiagramToView() { + + if (diagram == null) { + diagram = Diagram.createDiagram(getGraphToView(), Settings.get().get(Settings.NODE_TEXT, Settings.NODE_TEXT_DEFAULT)); + getFilterChain().apply(diagram, getSequenceFilterChain()); + } + + return diagram; + } + + public InputGraph getGraphToView() { + if (getFirstGraph() != getSecondGraph()) { + InputGraph inputGraph = Difference.createDiffGraph(getSecondGraph(), getFirstGraph()); + return inputGraph; + } else { + InputGraph inputGraph = getFirstGraph(); + return inputGraph; + } + } + + public void changed(RangeSliderModel source) { + diagramChanged(); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorInputGraphProvider.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorInputGraphProvider.java new file mode 100644 index 00000000000..f1c3f042985 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorInputGraphProvider.java @@ -0,0 +1,52 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.view; + +import com.sun.hotspot.igv.data.InputGraph; +import com.sun.hotspot.igv.data.services.InputGraphProvider; +import com.sun.hotspot.igv.data.InputNode; +import java.util.Set; + +/** + * + * @author Thomas Wuerthinger + */ +public class EditorInputGraphProvider implements InputGraphProvider { + + public InputGraph getGraph() { + EditorTopComponent e = EditorTopComponent.getActive(); + if (e == null) { + return null; + } + return e.getDiagramModel().getGraphToView(); + } + + public void setSelectedNodes(Set nodes) { + EditorTopComponent e = EditorTopComponent.getActive(); + if (e != null) { + e.setSelectedNodes(nodes); + } + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.form b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.form new file mode 100644 index 00000000000..dc990facd9c --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.form @@ -0,0 +1,31 @@ + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.java new file mode 100644 index 00000000000..e923544eda1 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.java @@ -0,0 +1,577 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view; + +import com.sun.hotspot.igv.data.InputNode; +import com.sun.hotspot.igv.filter.FilterChain; +import com.sun.hotspot.igv.graph.Diagram; +import com.sun.hotspot.igv.graph.Figure; +import com.sun.hotspot.igv.view.actions.EnableBlockLayoutAction; +import com.sun.hotspot.igv.view.actions.ExpandPredecessorsAction; +import com.sun.hotspot.igv.view.actions.ExpandSuccessorsAction; +import com.sun.hotspot.igv.view.actions.ExtractAction; +import com.sun.hotspot.igv.view.actions.HideAction; +import com.sun.hotspot.igv.view.actions.NextDiagramAction; +import com.sun.hotspot.igv.view.actions.NodeFindAction; +import com.sun.hotspot.igv.view.actions.OverviewAction; +import com.sun.hotspot.igv.view.actions.PredSuccAction; +import com.sun.hotspot.igv.view.actions.PrevDiagramAction; +import com.sun.hotspot.igv.view.actions.ShowAllAction; +import com.sun.hotspot.igv.view.actions.ZoomInAction; +import com.sun.hotspot.igv.view.actions.ZoomOutAction; +import com.sun.hotspot.igv.data.ChangedListener; +import com.sun.hotspot.igv.data.Properties; +import com.sun.hotspot.igv.data.Properties.PropertyMatcher; +import com.sun.hotspot.igv.filter.FilterChainProvider; +import com.sun.hotspot.igv.util.RangeSlider; +import com.sun.hotspot.igv.util.RangeSliderModel; +import com.sun.hotspot.igv.svg.BatikSVG; +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.event.HierarchyBoundsListener; +import java.awt.event.HierarchyEvent; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.UnsupportedEncodingException; +import java.io.Writer; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import javax.swing.Action; +import javax.swing.ActionMap; +import javax.swing.JPanel; +import javax.swing.JToggleButton; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.border.Border; +import org.openide.DialogDisplayer; +import org.openide.actions.FindAction; +import org.openide.actions.RedoAction; +import org.openide.actions.UndoAction; +import org.openide.awt.Toolbar; +import org.openide.awt.ToolbarPool; +import org.openide.awt.UndoRedo; +import org.openide.util.Lookup; +import org.openide.util.NbBundle; +import org.openide.util.actions.CallbackSystemAction; +import org.openide.util.actions.SystemAction; +import org.openide.util.lookup.AbstractLookup; +import org.openide.util.lookup.InstanceContent; +import org.openide.util.lookup.ProxyLookup; +import org.openide.windows.Mode; +import org.openide.windows.TopComponent; +import org.openide.windows.WindowManager; +import org.openide.NotifyDescriptor; + +/** + * + * @author Thomas Wuerthinger + */ +public final class EditorTopComponent extends TopComponent implements ChangedListener, PropertyChangeListener { + + private DiagramScene scene; + private InstanceContent content; + private FindPanel findPanel; + private EnableBlockLayoutAction blockLayoutAction; + private OverviewAction overviewAction; + private PredSuccAction predSuccAction; + private boolean notFirstTime; + private ExtendedSatelliteComponent satelliteComponent; + private JPanel centerPanel; + private CardLayout cardLayout; + private RangeSlider rangeSlider; + private JToggleButton overviewButton; + private static final String PREFERRED_ID = "EditorTopComponent"; + private static final String SATELLITE_STRING = "satellite"; + private static final String SCENE_STRING = "scene"; + private DiagramViewModel rangeSliderModel; + private ExportCookie exportCookie = new ExportCookie() { + + public void export(File f) { + + Graphics2D svgGenerator = BatikSVG.createGraphicsObject(); + + if (svgGenerator == null) { + NotifyDescriptor message = new NotifyDescriptor.Message("For export to SVG files the Batik SVG Toolkit must be intalled.", NotifyDescriptor.ERROR_MESSAGE); + DialogDisplayer.getDefault().notifyLater(message); + } else { + scene.paint(svgGenerator); + FileOutputStream os = null; + try { + os = new FileOutputStream(f); + Writer out = new OutputStreamWriter(os, "UTF-8"); + BatikSVG.printToStream(svgGenerator, out, true); + } catch (FileNotFoundException e) { + NotifyDescriptor message = new NotifyDescriptor.Message("For export to SVG files the Batik SVG Toolkit must be intalled.", NotifyDescriptor.ERROR_MESSAGE); + DialogDisplayer.getDefault().notifyLater(message); + + } catch (UnsupportedEncodingException e) { + } finally { + if (os != null) { + try { + os.close(); + } catch (IOException e) { + } + } + } + + } + } + }; + + private void updateDisplayName() { + setDisplayName(getDiagram().getName()); + } + + public EditorTopComponent(Diagram diagram) { + + FilterChain filterChain = null; + FilterChain sequence = null; + FilterChainProvider provider = Lookup.getDefault().lookup(FilterChainProvider.class); + if (provider == null) { + filterChain = new FilterChain(); + sequence = new FilterChain(); + } else { + filterChain = provider.getFilterChain(); + sequence = provider.getSequence(); + } + + setName(NbBundle.getMessage(EditorTopComponent.class, "CTL_EditorTopComponent")); + setToolTipText(NbBundle.getMessage(EditorTopComponent.class, "HINT_EditorTopComponent")); + + Action[] actions = new Action[]{ + PrevDiagramAction.get(PrevDiagramAction.class), + NextDiagramAction.get(NextDiagramAction.class), + null, + ExtractAction.get(ExtractAction.class), + ShowAllAction.get(HideAction.class), + ShowAllAction.get(ShowAllAction.class), + null, + ZoomInAction.get(ZoomInAction.class), + ZoomOutAction.get(ZoomOutAction.class), + null, + ExpandPredecessorsAction.get(ExpandPredecessorsAction.class), + ExpandSuccessorsAction.get(ExpandSuccessorsAction.class) + }; + + + initComponents(); + + ActionMap actionMap = getActionMap(); + + ToolbarPool.getDefault().setPreferredIconSize(16); + Toolbar toolBar = new Toolbar(); + Border b = (Border) UIManager.get("Nb.Editor.Toolbar.border"); //NOI18N + toolBar.setBorder(b); + JPanel container = new JPanel(); + this.add(container, BorderLayout.NORTH); + container.setLayout(new BorderLayout()); + container.add(BorderLayout.NORTH, toolBar); + + rangeSliderModel = new DiagramViewModel(diagram.getGraph().getGroup(), filterChain, sequence); + rangeSliderModel.selectGraph(diagram.getGraph()); + rangeSlider = new RangeSlider(); + rangeSlider.setModel(rangeSliderModel); + rangeSliderModel.getChangedEvent().addListener(this); + container.add(BorderLayout.CENTER, rangeSlider); + + scene = new DiagramScene(actions, rangeSliderModel); + content = new InstanceContent(); + this.associateLookup(new ProxyLookup(new Lookup[]{scene.getLookup(), new AbstractLookup(content)})); + content.add(exportCookie); + content.add(rangeSliderModel); + + + findPanel = new FindPanel(diagram.getFigures()); + findPanel.setMaximumSize(new Dimension(200, 50)); + toolBar.add(findPanel); + toolBar.add(NodeFindAction.get(NodeFindAction.class)); + toolBar.addSeparator(); + toolBar.add(NextDiagramAction.get(NextDiagramAction.class)); + toolBar.add(PrevDiagramAction.get(PrevDiagramAction.class)); + toolBar.addSeparator(); + toolBar.add(ExtractAction.get(ExtractAction.class)); + toolBar.add(ShowAllAction.get(HideAction.class)); + toolBar.add(ShowAllAction.get(ShowAllAction.class)); + toolBar.addSeparator(); + toolBar.add(ShowAllAction.get(ZoomInAction.class)); + toolBar.add(ShowAllAction.get(ZoomOutAction.class)); + + blockLayoutAction = new EnableBlockLayoutAction(); + JToggleButton button = new JToggleButton(blockLayoutAction); + button.setSelected(true); + toolBar.add(button); + blockLayoutAction.addPropertyChangeListener(this); + + overviewAction = new OverviewAction(); + overviewButton = new JToggleButton(overviewAction); + overviewButton.setSelected(false); + toolBar.add(overviewButton); + overviewAction.addPropertyChangeListener(this); + + predSuccAction = new PredSuccAction(); + button = new JToggleButton(predSuccAction); + button.setSelected(true); + toolBar.add(button); + predSuccAction.addPropertyChangeListener(this); + + toolBar.addSeparator(); + toolBar.add(UndoAction.get(UndoAction.class)); + toolBar.add(RedoAction.get(RedoAction.class)); + + centerPanel = new JPanel(); + this.add(centerPanel, BorderLayout.CENTER); + cardLayout = new CardLayout(); + centerPanel.setLayout(cardLayout); + centerPanel.add(SCENE_STRING, scene.getScrollPane()); + centerPanel.setBackground(Color.WHITE); + satelliteComponent = new ExtendedSatelliteComponent(scene); + satelliteComponent.setSize(200, 200); + centerPanel.add(SATELLITE_STRING, satelliteComponent); + + CallbackSystemAction callFindAction = (CallbackSystemAction) SystemAction.get(FindAction.class); + NodeFindAction findAction = NodeFindAction.get(NodeFindAction.class); + Object key = callFindAction.getActionMapKey(); + actionMap.put(key, findAction); + + scene.getScrollPane().addKeyListener(keyListener); + scene.getView().addKeyListener(keyListener); + satelliteComponent.addKeyListener(keyListener); + + scene.getScrollPane().addHierarchyBoundsListener(new HierarchyBoundsListener() { + + public void ancestorMoved(HierarchyEvent e) { + } + + public void ancestorResized(HierarchyEvent e) { + if (!notFirstTime && scene.getScrollPane().getBounds().width > 0) { + notFirstTime = true; + SwingUtilities.invokeLater(new Runnable() { + + public void run() { + Figure f = EditorTopComponent.this.scene.getModel().getDiagramToView().getRootFigure(); + if (f != null) { + scene.setUndoRedoEnabled(false); + scene.gotoFigure(f); + scene.setUndoRedoEnabled(true); + } + } + }); + } + } + }); + + updateDisplayName(); + } + private KeyListener keyListener = new KeyListener() { + + public void keyTyped(KeyEvent e) { + } + + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_S) { + EditorTopComponent.this.overviewButton.setSelected(true); + EditorTopComponent.this.overviewAction.setState(true); + } + } + + public void keyReleased(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_S) { + EditorTopComponent.this.overviewButton.setSelected(false); + EditorTopComponent.this.overviewAction.setState(false); + } + } + }; + + public DiagramViewModel getDiagramModel() { + return scene.getModel(); + } + + private void showSatellite() { + cardLayout.show(centerPanel, SATELLITE_STRING); + satelliteComponent.requestFocus(); + + } + + private void showScene() { + cardLayout.show(centerPanel, SCENE_STRING); + scene.getView().requestFocus(); + } + + public void findNode() { + findPanel.find(); + } + + public void zoomOut() { + double zoom = scene.getZoomFactor(); + Point viewPosition = scene.getScrollPane().getViewport().getViewPosition(); + double newZoom = zoom / DiagramScene.ZOOM_INCREMENT; + if (newZoom > DiagramScene.ZOOM_MIN_FACTOR) { + scene.setZoomFactor(newZoom); + scene.validate(); + scene.getScrollPane().getViewport().setViewPosition(new Point((int) (viewPosition.x / DiagramScene.ZOOM_INCREMENT), (int) (viewPosition.y / DiagramScene.ZOOM_INCREMENT))); + this.satelliteComponent.update(); + } + } + + public void zoomIn() { + double zoom = scene.getZoomFactor(); + Point viewPosition = scene.getScrollPane().getViewport().getViewPosition(); + double newZoom = zoom * DiagramScene.ZOOM_INCREMENT; + if (newZoom < DiagramScene.ZOOM_MAX_FACTOR) { + scene.setZoomFactor(newZoom); + scene.validate(); + scene.getScrollPane().getViewport().setViewPosition(new Point((int) (viewPosition.x * DiagramScene.ZOOM_INCREMENT), (int) (viewPosition.y * DiagramScene.ZOOM_INCREMENT))); + this.satelliteComponent.update(); + } + } + + public void showPrevDiagram() { + int fp = getModel().getFirstPosition(); + int sp = getModel().getSecondPosition(); + if (fp != 0) { + fp--; + sp--; + getModel().setPositions(fp, sp); + } + } + + public DiagramViewModel getModel() { + return scene.getModel(); + } + + public FilterChain getFilterChain() { + return this.scene.getModel().getFilterChain(); + } + + public static EditorTopComponent getActive() { + Set modes = WindowManager.getDefault().getModes(); + for (Mode m : modes) { + TopComponent tc = m.getSelectedTopComponent(); + if (tc instanceof EditorTopComponent) { + return (EditorTopComponent) tc; + } + } + return null; + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + jCheckBox1 = new javax.swing.JCheckBox(); + + org.openide.awt.Mnemonics.setLocalizedText(jCheckBox1, "jCheckBox1"); + jCheckBox1.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); + jCheckBox1.setMargin(new java.awt.Insets(0, 0, 0, 0)); + + setLayout(new java.awt.BorderLayout()); + + }// //GEN-END:initComponents + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JCheckBox jCheckBox1; + // End of variables declaration//GEN-END:variables + @Override + public int getPersistenceType() { + return TopComponent.PERSISTENCE_NEVER; + } + + @Override + public void componentOpened() { + } + + @Override + public void componentClosed() { + } + + @Override + protected String preferredID() { + return PREFERRED_ID; + } + + public void changed(RangeSliderModel model) { + updateDisplayName(); + } + + public boolean showPredSucc() { + return (Boolean) predSuccAction.getValue(PredSuccAction.STATE); + } + + public void setSelection(PropertyMatcher matcher) { + + Properties.PropertySelector
    selector = new Properties.PropertySelector
    (scene.getModel().getDiagramToView().getFigures()); + List
    list = selector.selectMultiple(matcher); + boolean b = scene.getUndoRedoEnabled(); + scene.setUndoRedoEnabled(false); + scene.gotoFigures(list); + scene.setUndoRedoEnabled(b); + scene.setSelection(list); + } + + public void setSelectedNodes(Set nodes) { + + List
    list = new ArrayList
    (); + Set ids = new HashSet(); + for (InputNode n : nodes) { + ids.add(n.getId()); + } + + for (Figure f : scene.getModel().getDiagramToView().getFigures()) { + for (InputNode n : f.getSource().getSourceNodes()) { + if (ids.contains(n.getId())) { + list.add(f); + break; + } + } + } + + scene.gotoFigures(list); + scene.setSelection(list); + } + + public void propertyChange(PropertyChangeEvent evt) { + if (evt.getSource() == this.predSuccAction) { + boolean b = (Boolean) predSuccAction.getValue(PredSuccAction.STATE); + this.getModel().setShowNodeHull(b); + } else if (evt.getSource() == this.overviewAction) { + boolean b = (Boolean) overviewAction.getValue(OverviewAction.STATE); + if (b) { + showSatellite(); + } else { + showScene(); + } + } else if (evt.getSource() == this.blockLayoutAction) { + boolean b = (Boolean) blockLayoutAction.getValue(EnableBlockLayoutAction.STATE); + System.out.println("Showblocks = " + b); + this.getModel().setShowBlocks(b); + } else { + assert false : "Unknown event source"; + } + } + + public void extract() { + scene.showOnly(scene.getSelectedNodes()); + } + + public void hideNodes() { + Set selectedNodes = this.scene.getSelectedNodes(); + HashSet nodes = new HashSet(scene.getModel().getHiddenNodes()); + nodes.addAll(selectedNodes); + this.scene.showNot(nodes); + } + + public void expandPredecessors() { + Set
    oldSelection = scene.getSelectedFigures(); + Set
    figures = new HashSet
    (); + + for (Figure f : this.getDiagramModel().getDiagramToView().getFigures()) { + boolean ok = false; + if (oldSelection.contains(f)) { + ok = true; + } else { + for (Figure pred : f.getSuccessors()) { + if (oldSelection.contains(pred)) { + ok = true; + break; + } + } + } + + if (ok) { + figures.add(f); + } + } + + scene.showAll(figures); + } + + public void expandSuccessors() { + Set
    oldSelection = scene.getSelectedFigures(); + Set
    figures = new HashSet
    (); + + for (Figure f : this.getDiagramModel().getDiagramToView().getFigures()) { + boolean ok = false; + if (oldSelection.contains(f)) { + ok = true; + } else { + for (Figure succ : f.getPredecessors()) { + if (oldSelection.contains(succ)) { + ok = true; + break; + } + } + } + + if (ok) { + figures.add(f); + } + } + + scene.showAll(figures); + } + + public void showAll() { + scene.showNot(new HashSet()); + } + + public Diagram getDiagram() { + return getDiagramModel().getDiagramToView(); + } + + @Override + protected void componentActivated() { + } + + @Override + public void requestFocus() { + super.requestFocus(); + scene.getView().requestFocus(); + } + + @Override + public boolean requestFocusInWindow() { + super.requestFocusInWindow(); + return scene.getView().requestFocusInWindow(); + } + + @Override + public UndoRedo getUndoRedo() { + return scene.getUndoRedo(); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExportCookie.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExportCookie.java new file mode 100644 index 00000000000..539865e2bc2 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExportCookie.java @@ -0,0 +1,36 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.hotspot.igv.view; + +import java.io.File; + +/** + * + * @author Thomas Wuerthinger + */ +public interface ExportCookie { + + void export(File f); +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExtendedPanAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExtendedPanAction.java new file mode 100644 index 00000000000..15ae3218b26 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExtendedPanAction.java @@ -0,0 +1,131 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view; + +import java.awt.Container; +import java.awt.Dimension; +import java.awt.Point; +import org.netbeans.api.visual.widget.Scene; +import org.netbeans.api.visual.widget.Widget; +import org.netbeans.api.visual.action.WidgetAction; + +import java.awt.event.MouseEvent; +import javax.swing.JComponent; +import javax.swing.JScrollPane; +import javax.swing.SwingUtilities; + +/** + * @author David Kaspar + * @author Thomas Wuerthinger + */ +public class ExtendedPanAction extends WidgetAction.LockedAdapter { + + private Scene scene; + private JScrollPane scrollPane; + private Point lastLocation; + + protected boolean isLocked() { + return scrollPane != null; + } + + @Override + public State mousePressed(Widget widget, WidgetMouseEvent event) { + if (event.getButton() == MouseEvent.BUTTON2 || event.getButton() == MouseEvent.BUTTON1 && ((event.getModifiers() & MouseEvent.CTRL_MASK) != 0)) { + scene = widget.getScene(); + scrollPane = findScrollPane(scene.getView()); + if (scrollPane != null) { + lastLocation = scene.convertSceneToView(widget.convertLocalToScene(event.getPoint())); + SwingUtilities.convertPointToScreen(lastLocation, scrollPane.getViewport().getView()); + return State.createLocked(widget, this); + } + } + return State.REJECTED; + } + + private JScrollPane findScrollPane(JComponent component) { + for (;;) { + if (component == null) { + return null; + } + if (component instanceof JScrollPane) { + return ((JScrollPane) component); + } + Container parent = component.getParent(); + if (!(parent instanceof JComponent)) { + return null; + } + component = (JComponent) parent; + } + } + + @Override + public State mouseReleased(Widget widget, WidgetMouseEvent event) { + boolean state = pan(widget, event.getPoint()); + if (state) { + scrollPane = null; + } + return state ? State.createLocked(widget, this) : State.REJECTED; + } + + @Override + public State mouseDragged(Widget widget, WidgetMouseEvent event) { + return pan(widget, event.getPoint()) ? State.createLocked(widget, this) : State.REJECTED; + } + + private boolean pan(Widget widget, Point newLocation) { + if (scrollPane == null || scene != widget.getScene()) { + return false; + } + newLocation = scene.convertSceneToView(widget.convertLocalToScene(newLocation)); + SwingUtilities.convertPointToScreen(newLocation, scrollPane.getViewport().getView()); + Point viewPosition = scrollPane.getViewport().getViewPosition(); + Dimension viewSize = scrollPane.getViewport().getViewSize(); + Dimension viewPortSize = scrollPane.getViewport().getSize(); + + int xOffset = lastLocation.x - newLocation.x; + int yOffset = lastLocation.y - newLocation.y; + + if (viewPortSize.height == viewSize.height) { + yOffset = 0; + } + + if (viewPortSize.width == viewSize.width) { + xOffset = 0; + } + + if (xOffset == 0 && yOffset == 0) { + return true; + } + viewPosition = new Point(viewPosition.x + xOffset, viewPosition.y + yOffset); + viewPosition.x = Math.max(viewPosition.x, 0); + viewPosition.y = Math.max(viewPosition.y, 0); + viewPosition.x = Math.min(viewPosition.x, scrollPane.getViewport().getView().getSize().width - scrollPane.getViewport().getSize().width); + viewPosition.y = Math.min(viewPosition.y, scrollPane.getViewport().getView().getSize().height - scrollPane.getViewport().getSize().height); + + scrollPane.getViewport().setViewPosition(viewPosition); + scrollPane.getViewport().getView().repaint(); + lastLocation = newLocation; + return true; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExtendedSatelliteComponent.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExtendedSatelliteComponent.java new file mode 100644 index 00000000000..cd3e8940933 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExtendedSatelliteComponent.java @@ -0,0 +1,200 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view; + +import org.netbeans.api.visual.widget.Scene; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; + +/** + * @author David Kaspar + * @author Thomas Wuerthinger + */ +public class ExtendedSatelliteComponent extends JComponent implements MouseListener, MouseMotionListener, Scene.SceneListener, ComponentListener { + + private DiagramScene scene; + private Image image; + private int imageWidth; + private int imageHeight; + + public ExtendedSatelliteComponent(DiagramScene scene) { + this.scene = scene; + setDoubleBuffered(true); + setPreferredSize(new Dimension(128, 128)); + addMouseListener(this); + addMouseMotionListener(this); + } + + public void addNotify() { + super.addNotify(); + scene.addSceneListener(this); + JComponent viewComponent = scene.getView(); + if (viewComponent == null) { + viewComponent = scene.createView(); + } + viewComponent.addComponentListener(this); + repaint(); + } + + public void removeNotify() { + scene.getView().removeComponentListener(this); + scene.removeSceneListener(this); + super.removeNotify(); + } + + public void update() { + this.image = null; + if (this.isVisible()) { + repaint(); + revalidate(); + validate(); + } + } + + public void paint(Graphics g) { + Graphics2D gr = (Graphics2D) g; + super.paint(g); + Rectangle bounds = scene.getBounds(); + Dimension size = getSize(); + + double sx = bounds.width > 0 ? (double) size.width / bounds.width : 0.0; + double sy = bounds.width > 0 ? (double) size.height / bounds.height : 0.0; + double scale = Math.min(sx, sy); + + int vw = (int) (scale * bounds.width); + int vh = (int) (scale * bounds.height); + int vx = (size.width - vw) / 2; + int vy = (size.height - vh) / 2; + + + if (image == null || vw != imageWidth || vh != imageHeight) { + + imageWidth = vw; + imageHeight = vh; + image = this.createImage(imageWidth, imageHeight); + Graphics2D ig = (Graphics2D) image.getGraphics(); + ig.scale(scale, scale); + scene.setRealZoomFactor(scale); + scene.paint(ig); + scene.setRealZoomFactor(0.0); + } + + gr.drawImage(image, vx, vy, this); + + JComponent component = scene.getView(); + double zoomFactor = scene.getZoomFactor(); + Rectangle viewRectangle = component != null ? component.getVisibleRect() : null; + if (viewRectangle != null) { + Rectangle window = new Rectangle( + (int) ((double) viewRectangle.x * scale / zoomFactor), + (int) ((double) viewRectangle.y * scale / zoomFactor), + (int) ((double) viewRectangle.width * scale / zoomFactor), + (int) ((double) viewRectangle.height * scale / zoomFactor)); + window.translate(vx, vy); + gr.setColor(new Color(200, 200, 200, 128)); + gr.fill(window); + gr.setColor(Color.BLACK); + gr.drawRect(window.x, window.y, window.width - 1, window.height - 1); + } + } + + public void mouseClicked(MouseEvent e) { + } + + public void mousePressed(MouseEvent e) { + moveVisibleRect(e.getPoint()); + } + + public void mouseReleased(MouseEvent e) { + moveVisibleRect(e.getPoint()); + } + + public void mouseEntered(MouseEvent e) { + } + + public void mouseExited(MouseEvent e) { + } + + public void mouseDragged(MouseEvent e) { + moveVisibleRect(e.getPoint()); + } + + public void mouseMoved(MouseEvent e) { + } + + private void moveVisibleRect(Point center) { + JComponent component = scene.getView(); + if (component == null) { + return; + } + double zoomFactor = scene.getZoomFactor(); + Rectangle bounds = scene.getBounds(); + Dimension size = getSize(); + + double sx = bounds.width > 0 ? (double) size.width / bounds.width : 0.0; + double sy = bounds.width > 0 ? (double) size.height / bounds.height : 0.0; + double scale = Math.min(sx, sy); + + int vw = (int) (scale * bounds.width); + int vh = (int) (scale * bounds.height); + int vx = (size.width - vw) / 2; + int vy = (size.height - vh) / 2; + + int cx = (int) ((double) (center.x - vx) / scale * zoomFactor); + int cy = (int) ((double) (center.y - vy) / scale * zoomFactor); + + Rectangle visibleRect = component.getVisibleRect(); + visibleRect.x = cx - visibleRect.width / 2; + visibleRect.y = cy - visibleRect.height / 2; + component.scrollRectToVisible(visibleRect); + + this.repaint(); + } + + public void sceneRepaint() { + //repaint (); + } + + public void sceneValidating() { + } + + public void sceneValidated() { + } + + public void componentResized(ComponentEvent e) { + repaint(); + } + + public void componentMoved(ComponentEvent e) { + repaint(); + } + + public void componentShown(ComponentEvent e) { + } + + public void componentHidden(ComponentEvent e) { + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/FindPanel.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/FindPanel.java new file mode 100644 index 00000000000..7d45f1b35c6 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/FindPanel.java @@ -0,0 +1,111 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view; + +import com.sun.hotspot.igv.graph.Figure; +import com.sun.hotspot.igv.data.Properties; +import com.sun.hotspot.igv.data.Properties.RegexpPropertyMatcher; +import com.sun.hotspot.igv.data.Property; +import java.awt.GridLayout; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.util.List; +import java.util.SortedSet; +import java.util.TreeSet; +import javax.swing.JComboBox; +import javax.swing.JPanel; +import javax.swing.JTextField; + +/** + * + * @author Thomas Wuerthinger + */ +class FindPanel extends JPanel implements KeyListener { + + private JComboBox nameComboBox; + private JTextField valueTextField; + + public FindPanel(List
    figures) { + createDesign(); + updateComboBox(figures); + } + + protected void createDesign() { + setLayout(new GridLayout()); + nameComboBox = new JComboBox(); + valueTextField = new JTextField(); + add(nameComboBox); + add(valueTextField); + valueTextField.addKeyListener(this); + } + + public void updateComboBox(List
    figures) { + + String sel = (String) nameComboBox.getSelectedItem(); + SortedSet propertyNames = new TreeSet(); + + for (Figure f : figures) { + Properties prop = f.getProperties(); + for (Property p : prop.getProperties()) { + if (!propertyNames.contains(p.getName())) { + propertyNames.add(p.getName()); + } + } + } + + for (String s : propertyNames) { + nameComboBox.addItem(s); + } + nameComboBox.setSelectedItem(sel); + } + + public String getNameText() { + return (String) nameComboBox.getSelectedItem(); + } + + public String getValueText() { + return valueTextField.getText(); + } + + public void keyTyped(KeyEvent e) { + } + + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_ENTER) { + find(); + } + } + + public void find() { + EditorTopComponent comp = EditorTopComponent.getActive(); + if (comp != null) { + RegexpPropertyMatcher matcher = new RegexpPropertyMatcher(getNameText(), getValueText()); + comp.setSelection(matcher); + } + } + + public void keyReleased(KeyEvent e) { + + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/GraphViewerImplementation.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/GraphViewerImplementation.java new file mode 100644 index 00000000000..e303b51aab9 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/GraphViewerImplementation.java @@ -0,0 +1,43 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view; + +import com.sun.hotspot.igv.data.InputGraph; +import com.sun.hotspot.igv.data.services.GraphViewer; +import com.sun.hotspot.igv.graph.Diagram; +import com.sun.hotspot.igv.settings.Settings; + +/** + * + * @author Thomas Wuerthinger + */ +public class GraphViewerImplementation implements GraphViewer { + + public void view(InputGraph graph) { + Diagram diagram = Diagram.createDiagram(graph, Settings.get().get(Settings.NODE_TEXT, Settings.NODE_TEXT_DEFAULT)); + EditorTopComponent tc = new EditorTopComponent(diagram); + tc.open(); + tc.requestActive(); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/PreferenceConstants.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/PreferenceConstants.java new file mode 100644 index 00000000000..31df010ea86 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/PreferenceConstants.java @@ -0,0 +1,34 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view; + +/** + * + * @author Thomas Wuerthinger + */ +public class PreferenceConstants { + + public static final String KEY_LINE_GENERATOR = "lineGenerator"; + public static final String DEFAULT_LINE_GENERATOR = "com.sun.hotspot.igv.positioning.BasicLineGenerator"; +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/SlotLayout.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/SlotLayout.java new file mode 100644 index 00000000000..9176297c771 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/SlotLayout.java @@ -0,0 +1,171 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view; + +import java.awt.Point; +import java.awt.Rectangle; +import java.util.Collection; +import java.util.List; +import org.netbeans.api.visual.layout.Layout; +import org.netbeans.api.visual.layout.LayoutFactory; +import org.netbeans.api.visual.widget.Widget; + +/** + * + * @author Thomas Wuerthinger + */ +public class SlotLayout implements Layout { + + public enum HorizontalAlignment { + + Left, + Center, + Right + } + private Layout baseLayout; + private HorizontalAlignment alignment; + private boolean vertical; + + public SlotLayout() { + this(HorizontalAlignment.Center, false); + } + + public SlotLayout(HorizontalAlignment alignment, boolean vertical) { + this.alignment = alignment; + baseLayout = LayoutFactory.createVerticalFlowLayout(); + this.vertical = vertical; + } + + public void layout(Widget widget) { + if (!vertical) { + Collection children = widget.getChildren(); + int gap = 0; + int max = 0; + for (Widget child : children) { + Rectangle preferredBounds = child.getPreferredBounds(); + int i = preferredBounds.width; + if (i > max) { + max = i; + } + } + int pos = 0; + for (Widget child : children) { + Rectangle preferredBounds = child.getPreferredBounds(); + int x = preferredBounds.x; + int y = preferredBounds.y; + int width = preferredBounds.width; + int height = preferredBounds.height; + if (pos == 0) { + pos += height / 2; + } + int lx = -x; + int ly = pos - y; + switch (alignment) { + case Center: + lx += (max - width) / 2; + break; + case Left: + break; + case Right: + lx += max - width; + break; + } + child.resolveBounds(new Point(lx, ly), new Rectangle(x, y, width, height)); + pos += height + gap; + } + } else { + + Collection children = widget.getChildren(); + int gap = 0; + int max = 0; + for (Widget child : children) { + Rectangle preferredBounds = child.getPreferredBounds(); + int i = preferredBounds.height; + if (i > max) { + max = i; + } + } + int pos = 0; + for (Widget child : children) { + Rectangle preferredBounds = child.getPreferredBounds(); + int x = preferredBounds.x; + int y = preferredBounds.y; + int width = preferredBounds.width; + int height = preferredBounds.height; + if (pos == 0) { + pos += width / 2; + } + int lx = pos - x; + int ly = -y; + switch (alignment) { + case Center: + ly += (max - height) / 2; + break; + case Left: + break; + case Right: + ly += max - height; + break; + } + child.resolveBounds(new Point(lx, ly), new Rectangle(x, y, width, height)); + pos += width + gap; + } + + } + } + + public boolean requiresJustification(Widget widget) { + return true; + } + + public void justify(Widget widget) { + baseLayout.justify(widget); + + Rectangle client = widget.getClientArea(); + List children = widget.getChildren(); + + int count = children.size(); + int z = 0; + + int maxWidth = 0; + for (Widget c : children) { + if (c.getPreferredBounds().width > maxWidth) { + maxWidth = c.getPreferredBounds().width; + } + } + + for (Widget c : children) { + z++; + Point curLocation = c.getLocation(); + Rectangle curBounds = c.getBounds(); + + + Point location = new Point(curLocation.x, client.y + client.height * z / (count + 1) - curBounds.height / 2); + if (vertical) { + location = new Point(client.x + client.width * z / (count + 1) - maxWidth / 2, curLocation.y); + } + c.resolveBounds(location, null); + } + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/Bundle.properties new file mode 100644 index 00000000000..2f1fad50024 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/Bundle.properties @@ -0,0 +1,7 @@ +CTL_EditorAction=Open Editor Window +CTL_LineGeneratorAction=Line Generator +CTL_NextDiagramAction=Show next graph +CTL_EnableBlockLayoutAction=Enable block layout +CTL_NodeFindAction=Find +CTL_PrevDiagramAction=Show previous graph +CTL_ExportAction=Export... diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/EnableBlockLayoutAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/EnableBlockLayoutAction.java new file mode 100644 index 00000000000..231d5c18d77 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/EnableBlockLayoutAction.java @@ -0,0 +1,55 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view.actions; + +import java.awt.event.ActionEvent; +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.ImageIcon; + +/** + * + * @author Thomas Wuerthinger + */ +public class EnableBlockLayoutAction extends AbstractAction { + + private boolean state; + public static final String STATE = "state"; + + public EnableBlockLayoutAction() { + state = true; + putValue(AbstractAction.SMALL_ICON, new ImageIcon(org.openide.util.Utilities.loadImage(iconResource()))); + putValue(STATE, true); + putValue(Action.SHORT_DESCRIPTION, "Cluster nodes into blocks"); + } + + public void actionPerformed(ActionEvent ev) { + this.state = !state; + this.putValue(STATE, state); + } + + protected String iconResource() { + return "com/sun/hotspot/igv/view/images/blocks.gif"; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExpandPredecessorsAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExpandPredecessorsAction.java new file mode 100644 index 00000000000..3bb9dbeba02 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExpandPredecessorsAction.java @@ -0,0 +1,60 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view.actions; + +import com.sun.hotspot.igv.view.EditorTopComponent; +import org.openide.util.HelpCtx; +import org.openide.util.actions.CallableSystemAction; + +/** + * + * @author Thomas Wuerthinger + */ +public final class ExpandPredecessorsAction extends CallableSystemAction { + + public void performAction() { + EditorTopComponent editor = EditorTopComponent.getActive(); + if (editor != null) { + editor.expandPredecessors(); + } + } + + public String getName() { + return "Expand Predecessors"; + } + + @Override + protected void initialize() { + super.initialize(); + } + + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + protected boolean asynchronous() { + return false; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExpandSuccessorsAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExpandSuccessorsAction.java new file mode 100644 index 00000000000..6ca1508f2ab --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExpandSuccessorsAction.java @@ -0,0 +1,60 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view.actions; + +import com.sun.hotspot.igv.view.EditorTopComponent; +import org.openide.util.HelpCtx; +import org.openide.util.actions.CallableSystemAction; + +/** + * + * @author Thomas Wuerthinger + */ +public final class ExpandSuccessorsAction extends CallableSystemAction { + + public void performAction() { + EditorTopComponent editor = EditorTopComponent.getActive(); + if (editor != null) { + editor.expandSuccessors(); + } + } + + public String getName() { + return "Expand Successors"; + } + + @Override + protected void initialize() { + super.initialize(); + } + + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + protected boolean asynchronous() { + return false; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExportAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExportAction.java new file mode 100644 index 00000000000..771e25c895e --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExportAction.java @@ -0,0 +1,117 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view.actions; + +import com.sun.hotspot.igv.settings.Settings; +import com.sun.hotspot.igv.view.ExportCookie; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; +import java.io.File; +import javax.swing.Action; +import javax.swing.JFileChooser; +import javax.swing.KeyStroke; +import javax.swing.filechooser.FileFilter; +import org.openide.util.HelpCtx; +import org.openide.util.Lookup; +import org.openide.util.LookupEvent; +import org.openide.util.LookupListener; +import org.openide.util.NbBundle; +import org.openide.util.Utilities; +import org.openide.util.actions.CallableSystemAction; + +/** + * + * @author Thomas Wuerthinger + */ +public final class ExportAction extends CallableSystemAction implements LookupListener { + + private final Lookup lookup; + private final Lookup.Result result; + + public ExportAction() { + putValue(Action.SHORT_DESCRIPTION, "Export current graph as an SVG file"); + putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.CTRL_MASK)); + lookup = Utilities.actionsGlobalContext(); + result = lookup.lookup(new Lookup.Template(ExportCookie.class)); + result.addLookupListener(this); + resultChanged(null); + } + + public void resultChanged(LookupEvent e) { + super.setEnabled(result.allInstances().size() > 0); + } + + public void performAction() { + + JFileChooser fc = new JFileChooser(); + fc.setFileFilter(new FileFilter() { + + public boolean accept(File f) { + return true; + } + + public String getDescription() { + return "SVG files (*.svg)"; + } + }); + fc.setCurrentDirectory(new File(Settings.get().get(Settings.DIRECTORY, Settings.DIRECTORY_DEFAULT))); + + + if (fc.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) { + File file = fc.getSelectedFile(); + if (!file.getName().contains(".")) { + file = new File(file.getAbsolutePath() + ".svg"); + } + + File dir = file; + if (!dir.isDirectory()) { + dir = dir.getParentFile(); + } + + Settings.get().put(Settings.DIRECTORY, dir.getAbsolutePath()); + ExportCookie cookie = Utilities.actionsGlobalContext().lookup(ExportCookie.class); + if (cookie != null) { + cookie.export(file); + } + } + } + + public String getName() { + return NbBundle.getMessage(ExportAction.class, "CTL_ExportAction"); + } + + @Override + protected String iconResource() { + return "com/sun/hotspot/igv/view/images/export.gif"; + } + + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + protected boolean asynchronous() { + return false; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExtractAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExtractAction.java new file mode 100644 index 00000000000..008ba3c3861 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExtractAction.java @@ -0,0 +1,74 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view.actions; + +import com.sun.hotspot.igv.view.EditorTopComponent; +import java.awt.Event; +import java.awt.event.KeyEvent; +import javax.swing.Action; +import javax.swing.KeyStroke; +import org.openide.util.HelpCtx; +import org.openide.util.actions.CallableSystemAction; + +/** + * + * @author Thomas Wuerthinger + */ +public final class ExtractAction extends CallableSystemAction { + + public void performAction() { + EditorTopComponent editor = EditorTopComponent.getActive(); + if (editor != null) { + editor.extract(); + } + } + + public ExtractAction() { + putValue(Action.SHORT_DESCRIPTION, "Extract current set of selected nodes"); + putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_X, Event.CTRL_MASK, false)); + } + + public String getName() { + return "Extract action"; + } + + @Override + protected void initialize() { + super.initialize(); + } + + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + protected boolean asynchronous() { + return false; + } + + @Override + protected String iconResource() { + return "com/sun/hotspot/igv/view/images/extract.gif"; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/HideAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/HideAction.java new file mode 100644 index 00000000000..8ac2ffb629f --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/HideAction.java @@ -0,0 +1,74 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view.actions; + +import com.sun.hotspot.igv.view.EditorTopComponent; +import java.awt.Event; +import java.awt.event.KeyEvent; +import javax.swing.Action; +import javax.swing.KeyStroke; +import org.openide.util.HelpCtx; +import org.openide.util.actions.CallableSystemAction; + +/** + * + * @author Thomas Wuerthinger + */ +public final class HideAction extends CallableSystemAction { + + public void performAction() { + EditorTopComponent editor = EditorTopComponent.getActive(); + if (editor != null) { + editor.hideNodes(); + } + } + + public HideAction() { + putValue(Action.SHORT_DESCRIPTION, "Hide selected nodes"); + putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_H, Event.CTRL_MASK, false)); + } + + public String getName() { + return "Hide"; + } + + @Override + protected void initialize() { + super.initialize(); + } + + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + protected boolean asynchronous() { + return false; + } + + @Override + protected String iconResource() { + return "com/sun/hotspot/igv/view/images/hide.gif"; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/MouseOverAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/MouseOverAction.java new file mode 100644 index 00000000000..10afb7c20a7 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/MouseOverAction.java @@ -0,0 +1,59 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view.actions; + +import org.netbeans.api.visual.action.HoverProvider; +import org.netbeans.api.visual.action.WidgetAction; +import org.netbeans.api.visual.action.WidgetAction.State; +import org.netbeans.api.visual.widget.Widget; + +/** + * + * @author Thomas Wuerthinger + */ +public class MouseOverAction extends WidgetAction.Adapter { + + private long eventID = Integer.MIN_VALUE; + private HoverProvider provider; + + public MouseOverAction(HoverProvider provider) { + this.provider = provider; + } + + @Override + public State mouseMoved(Widget widget, WidgetMouseEvent event) { + long id = event.getEventID(); + if (id != eventID) { + eventID = id; + provider.widgetHovered(widget); + } + return State.REJECTED; + } + + @Override + public State mouseExited(Widget widget, WidgetMouseEvent event) { + provider.widgetHovered(null); + return State.REJECTED; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/NextDiagramAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/NextDiagramAction.java new file mode 100644 index 00000000000..d7f7216f2a4 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/NextDiagramAction.java @@ -0,0 +1,105 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view.actions; + +import com.sun.hotspot.igv.view.DiagramViewModel; +import com.sun.hotspot.igv.data.ChangedListener; +import com.sun.hotspot.igv.util.ContextAction; +import javax.swing.Action; +import javax.swing.ImageIcon; +import org.openide.util.HelpCtx; +import org.openide.util.Lookup; +import org.openide.util.NbBundle; +import org.openide.util.Utilities; + +/** + * + * @author Thomas Wuerthinger + */ +public final class NextDiagramAction extends ContextAction implements ChangedListener { + + private DiagramViewModel model; + + public NextDiagramAction() { + this(Utilities.actionsGlobalContext()); + } + + public NextDiagramAction(Lookup lookup) { + putValue(Action.SHORT_DESCRIPTION, "Show next graph of current group"); + putValue(Action.SMALL_ICON, new ImageIcon(Utilities.loadImage("com/sun/hotspot/igv/view/images/next_diagram.png"))); + } + + public String getName() { + return NbBundle.getMessage(NextDiagramAction.class, "CTL_NextDiagramAction"); + } + + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + public Class contextClass() { + return DiagramViewModel.class; + } + + @Override + public void performAction(DiagramViewModel model) { + int fp = model.getFirstPosition(); + int sp = model.getSecondPosition(); + if (sp != model.getPositions().size() - 1) { + int nfp = fp + 1; + int nsp = sp + 1; + model.setPositions(nfp, nsp); + } + } + + @Override + public void update(DiagramViewModel model) { + super.update(model); + + if (this.model != model) { + if (this.model != null) { + this.model.getDiagramChangedEvent().removeListener(this); + } + + this.model = model; + if (this.model != null) { + this.model.getDiagramChangedEvent().addListener(this); + } + } + } + + @Override + public boolean isEnabled(DiagramViewModel model) { + return model.getSecondPosition() != model.getPositions().size() - 1; + } + + public Action createContextAwareInstance(Lookup arg0) { + return new NextDiagramAction(arg0); + } + + public void changed(DiagramViewModel source) { + update(source); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/NodeFindAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/NodeFindAction.java new file mode 100644 index 00000000000..03911b0d224 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/NodeFindAction.java @@ -0,0 +1,71 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view.actions; + +import com.sun.hotspot.igv.view.EditorTopComponent; +import javax.swing.Action; +import org.openide.util.HelpCtx; +import org.openide.util.NbBundle; +import org.openide.util.actions.CallableSystemAction; + +/** + * + * @author Thomas Wuerthinger + */ +public final class NodeFindAction extends CallableSystemAction { + + public void performAction() { + EditorTopComponent comp = EditorTopComponent.getActive(); + if (comp != null) { + comp.findNode(); + } + } + + public NodeFindAction() { + putValue(Action.SHORT_DESCRIPTION, "Find nodes"); + } + + public String getName() { + return NbBundle.getMessage(NodeFindAction.class, "CTL_NodeFindAction"); + } + + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + protected boolean asynchronous() { + return false; + } + + @Override + public boolean isEnabled() { + return true; + } + + @Override + protected String iconResource() { + return "com/sun/hotspot/igv/view/images/search.gif"; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/OverviewAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/OverviewAction.java new file mode 100644 index 00000000000..0a54ca0bad2 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/OverviewAction.java @@ -0,0 +1,58 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view.actions; + +import java.awt.event.ActionEvent; +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.ImageIcon; + +/** + * + * @author Thomas Wuerthinger + */ +public class OverviewAction extends AbstractAction { + + private boolean state; + public static final String STATE = "state"; + + public OverviewAction() { + putValue(AbstractAction.SMALL_ICON, new ImageIcon(org.openide.util.Utilities.loadImage(iconResource()))); + putValue(Action.SHORT_DESCRIPTION, "Show satellite view of whole graph"); + setState(false); + } + + public void actionPerformed(ActionEvent ev) { + setState(!state); + } + + public void setState(boolean b) { + this.putValue(STATE, b); + this.state = b; + } + + protected String iconResource() { + return "com/sun/hotspot/igv/view/images/overview.gif"; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/PredSuccAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/PredSuccAction.java new file mode 100644 index 00000000000..6e2d79b213b --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/PredSuccAction.java @@ -0,0 +1,55 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view.actions; + +import java.awt.event.ActionEvent; +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.ImageIcon; + +/** + * + * @author Thomas Wuerthinger + */ +public class PredSuccAction extends AbstractAction { + + private boolean state; + public static final String STATE = "state"; + + public PredSuccAction() { + state = true; + putValue(AbstractAction.SMALL_ICON, new ImageIcon(org.openide.util.Utilities.loadImage(iconResource()))); + putValue(STATE, true); + putValue(Action.SHORT_DESCRIPTION, "Show neighboring nodes of fully visible nodes semi-transparent"); + } + + public void actionPerformed(ActionEvent ev) { + this.state = !state; + this.putValue(STATE, state); + } + + protected String iconResource() { + return "com/sun/hotspot/igv/view/images/predsucc.gif"; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/PrevDiagramAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/PrevDiagramAction.java new file mode 100644 index 00000000000..2945c200392 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/PrevDiagramAction.java @@ -0,0 +1,105 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view.actions; + +import com.sun.hotspot.igv.data.ChangedListener; +import com.sun.hotspot.igv.view.DiagramViewModel; +import com.sun.hotspot.igv.util.ContextAction; +import javax.swing.Action; +import javax.swing.ImageIcon; +import org.openide.util.HelpCtx; +import org.openide.util.Lookup; +import org.openide.util.NbBundle; +import org.openide.util.Utilities; + +/** + * + * @author Thomas Wuerthinger + */ +public final class PrevDiagramAction extends ContextAction implements ChangedListener { + + private DiagramViewModel model; + + public PrevDiagramAction() { + this(Utilities.actionsGlobalContext()); + } + + public PrevDiagramAction(Lookup lookup) { + putValue(Action.SHORT_DESCRIPTION, "Show previous graph of current group"); + putValue(Action.SMALL_ICON, new ImageIcon(Utilities.loadImage("com/sun/hotspot/igv/view/images/prev_diagram.png"))); + } + + public String getName() { + return NbBundle.getMessage(PrevDiagramAction.class, "CTL_PrevDiagramAction"); + } + + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + public Class contextClass() { + return DiagramViewModel.class; + } + + @Override + public void performAction(DiagramViewModel model) { + int fp = model.getFirstPosition(); + int sp = model.getSecondPosition(); + if (fp != 0) { + int nfp = fp - 1; + int nsp = sp - 1; + model.setPositions(nfp, nsp); + } + } + + @Override + public void update(DiagramViewModel model) { + super.update(model); + + if (this.model != model) { + if (this.model != null) { + this.model.getDiagramChangedEvent().removeListener(this); + } + + this.model = model; + if (this.model != null) { + this.model.getDiagramChangedEvent().addListener(this); + } + } + } + + @Override + public boolean isEnabled(DiagramViewModel model) { + return model.getFirstPosition() != 0; + } + + public Action createContextAwareInstance(Lookup arg0) { + return new PrevDiagramAction(arg0); + } + + public void changed(DiagramViewModel source) { + update(source); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ShowAllAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ShowAllAction.java new file mode 100644 index 00000000000..f9f3b4be670 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ShowAllAction.java @@ -0,0 +1,74 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view.actions; + +import com.sun.hotspot.igv.view.*; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; +import javax.swing.Action; +import javax.swing.KeyStroke; +import org.openide.util.HelpCtx; +import org.openide.util.actions.CallableSystemAction; + +/** + * + * @author Thomas Wuerthinger + */ +public final class ShowAllAction extends CallableSystemAction { + + public void performAction() { + EditorTopComponent editor = EditorTopComponent.getActive(); + if (editor != null) { + editor.showAll(); + } + } + + public ShowAllAction() { + putValue(Action.SHORT_DESCRIPTION, "Show all nodes"); + putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK)); + } + + public String getName() { + return "Show all"; + } + + @Override + protected void initialize() { + super.initialize(); + } + + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + protected boolean asynchronous() { + return false; + } + + @Override + protected String iconResource() { + return "com/sun/hotspot/igv/view/images/expand.gif"; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ZoomInAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ZoomInAction.java new file mode 100644 index 00000000000..9b059725562 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ZoomInAction.java @@ -0,0 +1,69 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view.actions; + +import com.sun.hotspot.igv.view.EditorTopComponent; +import java.awt.Event; +import java.awt.event.KeyEvent; +import javax.swing.Action; +import javax.swing.KeyStroke; +import org.openide.util.HelpCtx; +import org.openide.util.actions.CallableSystemAction; + +/** + * + * @author Thomas Wuerthinger + */ +public final class ZoomInAction extends CallableSystemAction { + + public void performAction() { + EditorTopComponent editor = EditorTopComponent.getActive(); + if (editor != null) { + editor.zoomIn(); + } + } + + public String getName() { + return "Zoom in"; + } + + public ZoomInAction() { + putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_EQUALS, Event.CTRL_MASK, false)); + putValue(Action.SHORT_DESCRIPTION, "Zoom in"); + } + + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + protected boolean asynchronous() { + return false; + } + + @Override + protected String iconResource() { + return "com/sun/hotspot/igv/view/images/zoomin.gif"; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ZoomOutAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ZoomOutAction.java new file mode 100644 index 00000000000..6ec6d24216e --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ZoomOutAction.java @@ -0,0 +1,75 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view.actions; + +import com.sun.hotspot.igv.view.EditorTopComponent; +import java.awt.Event; +import java.awt.event.KeyEvent; +import javax.swing.Action; +import javax.swing.KeyStroke; +import org.openide.util.HelpCtx; +import org.openide.util.actions.CallableSystemAction; + +/** + * + * @author Thomas Wuerthinger + */ +public final class ZoomOutAction extends CallableSystemAction { + + public void performAction() { + EditorTopComponent editor = EditorTopComponent.getActive(); + if (editor != null) { + editor.zoomOut(); + } + } + + public ZoomOutAction() { + + putValue(Action.SHORT_DESCRIPTION, "Zoom out"); + putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_MINUS, Event.CTRL_MASK, false)); + } + + public String getName() { + return "Zoom out"; + } + + @Override + protected void initialize() { + super.initialize(); + } + + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + } + + @Override + protected boolean asynchronous() { + return false; + } + + @Override + protected String iconResource() { + return "com/sun/hotspot/igv/view/images/zoomout.gif"; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/blocks.gif b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/blocks.gif new file mode 100644 index 00000000000..71aa946d539 Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/blocks.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/expand.gif b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/expand.gif new file mode 100644 index 00000000000..ebc418d0539 Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/expand.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/export.gif b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/export.gif new file mode 100644 index 00000000000..d15a80acc5f Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/export.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/extract.gif b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/extract.gif new file mode 100644 index 00000000000..7a0f1aa85e9 Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/extract.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/hide.gif b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/hide.gif new file mode 100644 index 00000000000..25a0c0ff3a5 Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/hide.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/next_diagram.png b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/next_diagram.png new file mode 100644 index 00000000000..b0a40e670d3 Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/next_diagram.png differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/overview.gif b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/overview.gif new file mode 100644 index 00000000000..abafbe28cfa Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/overview.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/predsucc.gif b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/predsucc.gif new file mode 100644 index 00000000000..5009b345c75 Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/predsucc.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/prev_diagram.png b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/prev_diagram.png new file mode 100644 index 00000000000..7eabfd938f5 Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/prev_diagram.png differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/search.gif b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/search.gif new file mode 100644 index 00000000000..9e488969a62 Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/search.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/zoomin.gif b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/zoomin.gif new file mode 100644 index 00000000000..2329426e481 Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/zoomin.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/zoomout.gif b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/zoomout.gif new file mode 100644 index 00000000000..f9f7565878f Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/zoomout.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/layer.xml b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/layer.xml new file mode 100644 index 00000000000..eff917a44bf --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/layer.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/BlockWidget.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/BlockWidget.java new file mode 100644 index 00000000000..9465d25f8e2 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/BlockWidget.java @@ -0,0 +1,82 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view.widgets; + +import com.sun.hotspot.igv.data.InputBlock; +import com.sun.hotspot.igv.graph.Diagram; +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Font; +import java.awt.Graphics2D; +import java.awt.Rectangle; +import java.awt.Stroke; +import java.awt.geom.Rectangle2D; +import org.netbeans.api.visual.widget.Scene; +import org.netbeans.api.visual.widget.Widget; + +/** + * + * @author Thomas Wuerthinger + */ +public class BlockWidget extends Widget { + + public static final int BORDER = 20; + public static final Color BACKGROUND_COLOR = new Color(235, 235, 255); + private static final Font titleFont = new Font("Serif", Font.PLAIN, 14).deriveFont(Font.BOLD); + private InputBlock blockNode; + private Diagram diagram; + + public BlockWidget(Scene scene, Diagram d, InputBlock blockNode) { + super(scene); + this.blockNode = blockNode; + this.diagram = d; + this.setBackground(BACKGROUND_COLOR); + this.setOpaque(true); + this.setCheckClipping(true); + } + + @Override + protected void paintWidget() { + super.paintWidget(); + Graphics2D g = this.getGraphics(); + Stroke old = g.getStroke(); + g.setColor(Color.BLUE); + Rectangle r = new Rectangle(this.getPreferredBounds()); + r.width--; + r.height--; + if (this.getBounds().width > 0 && this.getBounds().height > 0) { + g.setStroke(new BasicStroke(2)); + g.drawRect(r.x, r.y, r.width, r.height); + } + + Color titleColor = Color.BLACK; + g.setColor(titleColor); + g.setFont(titleFont); + + String s = "B" + blockNode.toString(); + Rectangle2D r1 = g.getFontMetrics().getStringBounds(s, g); + g.drawString(s, r.x + 5, r.y + (int) r1.getHeight()); + g.setStroke(old); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/DiagramConnectionWidget.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/DiagramConnectionWidget.java new file mode 100644 index 00000000000..98e696151db --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/DiagramConnectionWidget.java @@ -0,0 +1,251 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view.widgets; + +import com.sun.hotspot.igv.graph.Connection; +import com.sun.hotspot.igv.graph.Figure; +import com.sun.hotspot.igv.view.DiagramScene; +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Composite; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Stroke; +import java.util.ArrayList; +import java.util.List; +import org.netbeans.api.visual.anchor.AnchorShape; +import org.netbeans.api.visual.model.ObjectState; +import org.netbeans.api.visual.widget.ConnectionWidget; +import org.netbeans.api.visual.widget.Scene; + +/** + * + * @author Thomas Wuerthinger + */ +public class DiagramConnectionWidget extends ConnectionWidget { + + private static Stroke DASHED_STROKE = new BasicStroke( + 1, + BasicStroke.CAP_BUTT, + BasicStroke.JOIN_ROUND, + 0, + new float[]{2}, + 0); + private static Stroke NORMAL_STROKE = new BasicStroke(1); + private static Stroke BOLD_STROKE = new BasicStroke(3); + public static int WHITE_FACTOR = 5; + private Connection connection; + private Color color; + private Point lastSourceAnchor; + private Point lastTargetAnchor; + private List controlPoints; + private Rectangle clientArea; + private boolean split; + private int[] xPoints; + private int[] yPoints; + private int pointCount; + + /** Creates a new instance of ConnectionWidget */ + public DiagramConnectionWidget(Connection connection, Scene scene) { + super(scene); + this.connection = connection; + color = connection.getColor(); + if (connection.getStyle() == Connection.ConnectionStyle.DASHED) { + this.setStroke(DASHED_STROKE); + } else if (connection.getStyle() == Connection.ConnectionStyle.BOLD) { + this.setStroke(BOLD_STROKE); + } else { + this.setStroke(NORMAL_STROKE); + } + this.setCheckClipping(true); + clientArea = new Rectangle(); + updateControlPoints(); + } + + public Connection getConnection() { + return connection; + } + + public void updateControlPoints() { + List newControlPoints = connection.getControlPoints(); + Connection c = connection; + Figure f = c.getInputSlot().getFigure(); + Point p = new Point(f.getPosition()); + p.translate(c.getInputSlot().getRelativePosition().x, f.getSize().height / 2); + Point p4 = new Point(f.getPosition()); + p4.translate(c.getInputSlot().getRelativePosition().x, c.getInputSlot().getRelativePosition().y); + + Figure f2 = c.getOutputSlot().getFigure(); + Point p2 = new Point(f2.getPosition()); + p2.translate(c.getOutputSlot().getRelativePosition().x, f2.getSize().height / 2); + Point p3 = new Point(f2.getPosition()); + p3.translate(c.getOutputSlot().getRelativePosition().x, c.getOutputSlot().getRelativePosition().y); + + /*if(controlPoints.size() >= 2) { + String className = Preferences.userNodeForPackage(PreferenceConstants.class).get(PreferenceConstants.KEY_LINE_GENERATOR, PreferenceConstants.DEFAULT_LINE_GENERATOR); + try { + LineGenerator lg = (LineGenerator)Class.forName(className).newInstance(); + controlPoints = lg.createLine(controlPoints, p2, p); + } catch (InstantiationException ex) { + } catch (IllegalAccessException ex) { + } catch (ClassNotFoundException ex) { + } + }*/ + + this.controlPoints = newControlPoints; + pointCount = newControlPoints.size(); + xPoints = new int[pointCount]; + yPoints = new int[pointCount]; + int minX = Integer.MAX_VALUE; + int maxX = Integer.MIN_VALUE; + int minY = Integer.MAX_VALUE; + int maxY = Integer.MIN_VALUE; + split = false; + for (int i = 0; i < pointCount; i++) { + if (newControlPoints.get(i) == null) { + split = true; + } else { + int curX = newControlPoints.get(i).x; + int curY = newControlPoints.get(i).y; + this.xPoints[i] = curX; + this.yPoints[i] = curY; + minX = Math.min(minX, curX); + maxX = Math.max(maxX, curX); + minY = Math.min(minY, curY); + maxY = Math.max(maxY, curY); + } + } + + this.clientArea = new Rectangle(minX, minY, maxX - minX, maxY - minY); + } + + @Override + protected void paintWidget() { + Graphics2D g = this.getGraphics(); + + if (xPoints.length == 0 || Math.abs(xPoints[0] - xPoints[xPoints.length - 1]) > 2000) { + return; + } + + //g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); + //g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED); + //g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); + + DiagramScene ds = (DiagramScene) this.getScene(); + boolean shouldHide = false;//ds.getShouldHide(this); + + Composite oldComposite = null; + if (shouldHide) { + Color c = new Color(255 - (255 - color.getRed()) / WHITE_FACTOR, 255 - (255 - color.getGreen()) / WHITE_FACTOR, 255 - (255 - color.getBlue()) / WHITE_FACTOR); + g.setPaint(c); + } else { + g.setPaint(color); + } + + if (split) { + for (int i = 1; i < controlPoints.size(); i++) { + Point prev = controlPoints.get(i - 1); + Point cur = controlPoints.get(i); + if (cur == null || prev == null) { + continue; + } + + g.drawLine(prev.x, prev.y, cur.x, cur.y); + } + } else { + g.drawPolyline(xPoints, yPoints, pointCount); + } + + /*for(int i=0; i= 2) { + Graphics2D g2 = (Graphics2D) g.create(); + int xOff = xPoints[xPoints.length - 2] - xPoints[xPoints.length - 1]; + int yOff = yPoints[yPoints.length - 2] - yPoints[yPoints.length - 1]; + if (xOff == 0 && yOff == 0 && yPoints.length >= 3) { + xOff = xPoints[xPoints.length - 3] - xPoints[xPoints.length - 1]; + yOff = yPoints[yPoints.length - 3] - yPoints[yPoints.length - 1]; + } + g2.translate(xPoints[xPoints.length - 1], yPoints[yPoints.length - 1]); + g2.rotate(Math.atan2(yOff, xOff)); + + g2.scale(0.55, 0.80); + AnchorShape.TRIANGLE_FILLED.paint(g2, false); + } + } + + @Override + public void notifyStateChanged(ObjectState previousState, ObjectState state) { + + if (previousState.isHovered() != state.isHovered()) { + color = connection.getColor(); + if (state.isHovered()) { + this.setStroke(BOLD_STROKE); + } else { + this.setStroke(NORMAL_STROKE); + } + + if (state.isHovered()) { + this.setStroke(BOLD_STROKE); + } else { + this.setStroke(NORMAL_STROKE); + } + + repaint(); + } + super.notifyStateChanged(previousState, state); + } + + @Override + public List getControlPoints() { + if (split) { + ArrayList result = new ArrayList(); + for (Point p : controlPoints) { + if (p != null) { + result.add(p); + } + } + return result; + } else { + return controlPoints; + } + } + + @Override + public String toString() { + return "ConnectionWidget[" + connection + "]"; + } + + @Override + protected Rectangle calculateClientArea() { + Rectangle result = new Rectangle(clientArea); + result.grow(10, 10); + return result; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/FigureWidget.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/FigureWidget.java new file mode 100644 index 00000000000..ea65e028262 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/FigureWidget.java @@ -0,0 +1,358 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view.widgets; + +import com.sun.hotspot.igv.graph.Figure; +import com.sun.hotspot.igv.view.DiagramScene; +import com.sun.hotspot.igv.view.SlotLayout; +import com.sun.hotspot.igv.util.DoubleClickHandler; +import com.sun.hotspot.igv.data.Properties; +import com.sun.hotspot.igv.util.PropertiesSheet; +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Composite; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.Point; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; +import javax.swing.Action; +import javax.swing.BorderFactory; +import javax.swing.JMenu; +import javax.swing.JPopupMenu; +import org.netbeans.api.visual.action.PopupMenuProvider; +import org.netbeans.api.visual.action.WidgetAction; +import org.netbeans.api.visual.model.ObjectState; +import org.netbeans.api.visual.widget.Widget; +import org.netbeans.api.visual.layout.LayoutFactory; +import org.netbeans.api.visual.widget.LabelWidget; +import org.openide.nodes.AbstractNode; +import org.openide.nodes.Children; +import org.openide.nodes.Node; +import org.openide.nodes.Sheet; + +/** + * + * @author Thomas Wuerthinger + */ +public class FigureWidget extends Widget implements Properties.Provider, PopupMenuProvider, DoubleClickHandler { + + public static final boolean VERTICAL_LAYOUT = true; + public static final int DEPTH = 5; + public static final int MAX_STRING_LENGTH = 20; + private static final double LABEL_ZOOM_FACTOR = 0.3; + private static final double ZOOM_FACTOR = 0.1; + private Font font; + private Font boldFont; + private Figure figure; + private Widget leftWidget; + private Widget rightWidget; + private Widget middleWidget; + private ArrayList labelWidgets; + private DiagramScene diagramScene; + private boolean boundary; + private Node node; + + public void setBoundary(boolean b) { + boundary = b; + } + + public boolean isBoundary() { + return boundary; + } + + public Node getNode() { + return node; + } + + private String shortenString(String string) { + if (string.length() > MAX_STRING_LENGTH) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < string.length(); i++) { + char c = string.charAt(i); + if (!Character.isLetter(c) || Character.isUpperCase(c)) { + sb.append(c); + } + } + string = sb.toString(); + } + return string; + } + + public FigureWidget(final Figure f, DiagramScene s, Widget parent) { + + super(s); + + + font = f.getDiagram().getFont(); + boldFont = f.getDiagram().getFont().deriveFont(Font.BOLD); + this.setCheckClipping(true); + this.diagramScene = s; + + parent.addChild(this); + this.figure = f; + this.resolveBounds(null, calculateClientArea()); + + leftWidget = new Widget(s); + this.addChild(leftWidget); + leftWidget.setLayout(new SlotLayout(SlotLayout.HorizontalAlignment.Right, VERTICAL_LAYOUT));//LayoutFactory.createVerticalFlowLayout(LayoutFactory.SerialAlignment.JUSTIFY, 0)); + + middleWidget = new Widget(s); + this.addChild(middleWidget); + + if (VERTICAL_LAYOUT) { + this.setLayout(LayoutFactory.createVerticalFlowLayout()); + } else { + this.setLayout(LayoutFactory.createHorizontalFlowLayout()); + } + + middleWidget.setLayout(LayoutFactory.createVerticalFlowLayout()); + + middleWidget.setBackground(f.getColor()); + middleWidget.setOpaque(true); + assert this.getScene() != null; + assert this.getScene().getView() != null; + middleWidget.setBorder(BorderFactory.createLineBorder(Color.BLACK)); + + + labelWidgets = new ArrayList(); + + String[] strings = figure.getLines(); + + for (String cur : strings) { + + String displayString = cur; + + LabelWidget lw = new LabelWidget(s); + labelWidgets.add(lw); + middleWidget.addChild(lw); + lw.setLabel(displayString); + + lw.setFont(font); + lw.setForeground(Color.BLACK); + lw.setAlignment(LabelWidget.Alignment.CENTER); + lw.setVerticalAlignment(LabelWidget.VerticalAlignment.CENTER); + lw.setMaximumSize(new Dimension(f.getWidth(), 20000)); + lw.setMinimumSize(new Dimension(f.getWidth(), 20)); + } + + rightWidget = new Widget(s); + this.addChild(rightWidget); + rightWidget.setLayout(new SlotLayout(SlotLayout.HorizontalAlignment.Left, VERTICAL_LAYOUT));//LayoutFactory.createVerticalLayout(LayoutFactory.SerialAlignment.JUSTIFY, 0)); + + // Initialize node for property sheet + node = new AbstractNode(Children.LEAF) { + + @Override + protected Sheet createSheet() { + Sheet s = super.createSheet(); + PropertiesSheet.initializeSheet(f.getProperties(), s); + return s; + } + }; + node.setDisplayName(getName()); + } + private boolean firstTime = true; + + @Override + protected void paintWidget() { + if (firstTime) { + firstTime = false; + for (LabelWidget w : labelWidgets) { + String cur = w.getLabel(); + Graphics graphics = this.getGraphics(); + if (graphics.getFontMetrics().stringWidth(cur) > figure.getWidth()) { + w.setLabel(shortenString(cur)); + } + } + } + super.paintWidget(); + } + + public Widget getLeftWidget() { + return leftWidget; + } + + public Widget getRightWidget() { + return rightWidget; + } + + @Override + protected void notifyStateChanged(ObjectState previousState, ObjectState state) { + super.notifyStateChanged(previousState, state); + + Color borderColor = Color.BLACK; + int thickness = 1; + boolean repaint = false; + Font f = font; + if (state.isSelected()) { + thickness = 1; + f = boldFont; + } + + if (state.isHovered()) { + borderColor = Color.BLUE; + } + + if (state.isHovered() != previousState.isHovered()) { + repaint = true; + } + + if (state.isSelected() != previousState.isSelected()) { + repaint = true; + } + + if (repaint) { + middleWidget.setBorder(BorderFactory.createLineBorder(borderColor, thickness)); + for (LabelWidget labelWidget : labelWidgets) { + labelWidget.setFont(f); + } + repaint(); + } + } + + public String getName() { + return getProperties().get("name"); + } + + public Properties getProperties() { + return figure.getProperties(); + } + + public Figure getFigure() { + return figure; + } + + @Override + protected void paintChildren() { + + if (diagramScene.getRealZoomFactor() < ZOOM_FACTOR && diagramScene.getModel().getShowBlocks()) { + return; + } + + Composite oldComposite = null; + if (boundary) { + oldComposite = getScene().getGraphics().getComposite(); + float alpha = DiagramScene.ALPHA; + this.getScene().getGraphics().setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha)); + } + + if (diagramScene.getRealZoomFactor() < LABEL_ZOOM_FACTOR) { + + for (LabelWidget labelWidget : labelWidgets) { + labelWidget.setVisible(false); + } + super.paintChildren(); + for (LabelWidget labelWidget : labelWidgets) { + labelWidget.setVisible(true); + } + + } else { + super.paintChildren(); + } + + if (boundary) { + getScene().getGraphics().setComposite(oldComposite); + } + } + + public JPopupMenu getPopupMenu(Widget widget, Point point) { + JPopupMenu m = diagramScene.createPopupMenu(); + + JMenu predecessors = new JMenu("Predecessors"); + addFigureToSubMenu(predecessors, getFigure(), false, DEPTH); + + JMenu successors = new JMenu("Successors"); + addFigureToSubMenu(successors, getFigure(), true, DEPTH); + + m.addSeparator(); + m.add(predecessors); + m.add(successors); + return m; + } + + public void addFigureToSubMenu(JMenu subMenu, final Figure f, boolean successor, int depth) { + Set
    set = f.getPredecessorSet(); + if (successor) { + set = f.getSuccessorSet(); + } + + int count = set.size(); + if (set.contains(f)) { + count--; + } + + for (Figure f2 : set) { + if (f2 == f) { + continue; + } + + count--; + addFigureToMenu(subMenu, f2, successor, depth - 1); + if (count > 0) { + subMenu.addSeparator(); + } + } + } + + public void addFigureToMenu(JMenu m, final Figure f, boolean successor, int depth) { + + Action a = diagramScene.createGotoAction(f); + + + m.add(a); + + if (depth > 0) { + String name = "Predecessors"; + if (successor) { + name = "Successors"; + } + + JMenu subMenu = new JMenu(name); + addFigureToSubMenu(subMenu, f, successor, depth); + m.add(subMenu); + } + + } + + public void handleDoubleClick(Widget w, WidgetAction.WidgetMouseEvent e) { + + if (diagramScene.isAllVisible()) { + Set hiddenNodes = new HashSet(diagramScene.getModel().getGraphToView().getGroup().getAllNodes()); + hiddenNodes.removeAll(this.getFigure().getSource().getSourceNodesAsSet()); + this.diagramScene.showNot(hiddenNodes); + } else if (isBoundary()) { + + Set hiddenNodes = new HashSet(diagramScene.getModel().getHiddenNodes()); + hiddenNodes.removeAll(this.getFigure().getSource().getSourceNodesAsSet()); + this.diagramScene.showNot(hiddenNodes); + } else { + Set hiddenNodes = new HashSet(diagramScene.getModel().getHiddenNodes()); + hiddenNodes.addAll(this.getFigure().getSource().getSourceNodesAsSet()); + this.diagramScene.showNot(hiddenNodes); + } + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/InputSlotWidget.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/InputSlotWidget.java new file mode 100644 index 00000000000..a6028aa71ee --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/InputSlotWidget.java @@ -0,0 +1,61 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view.widgets; + +import com.sun.hotspot.igv.graph.InputSlot; +import com.sun.hotspot.igv.view.DiagramScene; +import java.awt.Point; +import java.util.List; +import org.netbeans.api.visual.widget.Widget; + +/** + * + * @author Thomas Wuerthinger + */ +public class InputSlotWidget extends SlotWidget { + + private InputSlot inputSlot; + + public InputSlotWidget(InputSlot slot, DiagramScene scene, Widget parent, FigureWidget fw) { + super(slot, scene, parent, fw); + inputSlot = slot; + init(); + getFigureWidget().getLeftWidget().addChild(this); + } + + public InputSlot getInputSlot() { + return inputSlot; + } + + protected Point calculateRelativeLocation() { + if (getFigureWidget().getBounds() == null) { + return new Point(0, 0); + } + + double x = 0; + List slots = inputSlot.getFigure().getInputSlots(); + assert slots.contains(inputSlot); + return new Point((int) x, (int) (calculateRelativeY(slots.size(), slots.indexOf(inputSlot)))); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/LineWidget.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/LineWidget.java new file mode 100644 index 00000000000..902413eac87 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/LineWidget.java @@ -0,0 +1,293 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view.widgets; + +import com.sun.hotspot.igv.graph.Connection; +import com.sun.hotspot.igv.graph.InputSlot; +import com.sun.hotspot.igv.graph.OutputSlot; +import com.sun.hotspot.igv.view.DiagramScene; +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Stroke; +import java.awt.geom.Line2D; +import java.util.ArrayList; +import java.util.List; +import javax.swing.JPopupMenu; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; +import org.netbeans.api.visual.action.ActionFactory; +import org.netbeans.api.visual.action.PopupMenuProvider; +import org.netbeans.api.visual.animator.SceneAnimator; +import org.netbeans.api.visual.model.ObjectState; +import org.netbeans.api.visual.widget.Widget; + +/** + * + * @author Thomas Wuerthinger + */ +public class LineWidget extends Widget implements PopupMenuProvider { + + public final int BORDER = 8; + public final int ARROW_SIZE = 6; + public final int BOLD_ARROW_SIZE = 7; + public final int HOVER_ARROW_SIZE = 8; + public final int BOLD_STROKE_WIDTH = 2; + public final int HOVER_STROKE_WIDTH = 3; + private static double ZOOM_FACTOR = 0.1; + private OutputSlot outputSlot; + private DiagramScene scene; + private List connections; + private Point from; + private Point to; + private Rectangle clientArea; + private Color color = Color.BLACK; + private LineWidget predecessor; + private List successors; + private boolean highlighted; + private boolean popupVisible; + private boolean isBold; + private boolean isDashed; + + public LineWidget(DiagramScene scene, OutputSlot s, List connections, Point from, Point to, LineWidget predecessor, SceneAnimator animator, boolean isBold, boolean isDashed) { + super(scene); + this.scene = scene; + this.outputSlot = s; + this.connections = connections; + this.from = from; + this.to = to; + this.predecessor = predecessor; + this.successors = new ArrayList(); + if (predecessor != null) { + predecessor.addSuccessor(this); + } + + this.isBold = isBold; + this.isDashed = isDashed; + + int minX = from.x; + int minY = from.y; + int maxX = to.x; + int maxY = to.y; + if (minX > maxX) { + int tmp = minX; + minX = maxX; + maxX = tmp; + } + + if (minY > maxY) { + int tmp = minY; + minY = maxY; + maxY = tmp; + } + + clientArea = new Rectangle(minX, minY, maxX - minX + 1, maxY - minY + 1); + clientArea.grow(BORDER, BORDER); + + if (connections.size() > 0) { + color = connections.get(0).getColor(); + } + + this.setCheckClipping(true); + + this.getActions().addAction(ActionFactory.createPopupMenuAction(this)); + if (animator == null) { + this.setBackground(color); + } else { + this.setBackground(Color.WHITE); + animator.animateBackgroundColor(this, color); + } + } + + public Point getFrom() { + return from; + } + + public Point getTo() { + return to; + } + + private void addSuccessor(LineWidget widget) { + this.successors.add(widget); + } + + @Override + protected Rectangle calculateClientArea() { + return clientArea; + } + + @Override + protected void paintWidget() { + if (scene.getRealZoomFactor() < ZOOM_FACTOR) { + return; + } + + Graphics2D g = getScene().getGraphics(); + g.setPaint(this.getBackground()); + ObjectState state = this.getState(); + float width = 1.0f; + + if (isBold) { + width = BOLD_STROKE_WIDTH; + } + + if (highlighted || popupVisible) { + width = HOVER_STROKE_WIDTH; + } + + Stroke oldStroke = g.getStroke(); + if (isDashed) { + float[] dashPattern = {5, 5, 5, 5}; + g.setStroke(new BasicStroke(width, BasicStroke.CAP_BUTT, + BasicStroke.JOIN_MITER, 10, + dashPattern, 0)); + } else { + g.setStroke(new BasicStroke(width)); + } + + g.drawLine(from.x, from.y, to.x, to.y); + + boolean sameFrom = false; + boolean sameTo = successors.size() == 0; + for (LineWidget w : successors) { + if (w.getFrom().equals(getTo())) { + sameTo = true; + } + } + + if (predecessor == null || predecessor.getTo().equals(getFrom())) { + sameFrom = true; + } + + + int size = ARROW_SIZE; + if (isBold) { + size = BOLD_ARROW_SIZE; + } + if (highlighted || popupVisible) { + size = HOVER_ARROW_SIZE; + } + if (!sameFrom) { + g.fillPolygon( + new int[]{from.x - size / 2, from.x + size / 2, from.x}, + new int[]{from.y - size / 2, from.y - size / 2, from.y + size / 2}, + 3); + } + if (!sameTo) { + g.fillPolygon( + new int[]{to.x - size / 2, to.x + size / 2, to.x}, + new int[]{to.y - size / 2, to.y - size / 2, to.y + size / 2}, + 3); + } + g.setStroke(oldStroke); + } + + private void setHighlighted(boolean b) { + this.highlighted = b; + this.revalidate(true); + } + + private void setPopupVisible(boolean b) { + this.popupVisible = b; + this.revalidate(true); + } + + @Override + public boolean isHitAt(Point localPoint) { + return Line2D.ptLineDistSq(from.x, from.y, to.x, to.y, localPoint.x, localPoint.y) <= BORDER * BORDER; + } + + @Override + protected void notifyStateChanged(ObjectState previousState, ObjectState state) { + if (previousState.isHovered() != state.isHovered()) { + setRecursiveHighlighted(state.isHovered()); + } + } + + private void setRecursiveHighlighted(boolean b) { + LineWidget cur = predecessor; + while (cur != null) { + cur.setHighlighted(b); + cur = cur.predecessor; + } + + highlightSuccessors(b); + this.setHighlighted(b); + } + + private void highlightSuccessors(boolean b) { + for (LineWidget s : successors) { + s.setHighlighted(b); + s.highlightSuccessors(b); + } + } + + private void setRecursivePopupVisible(boolean b) { + LineWidget cur = predecessor; + while (cur != null) { + cur.setPopupVisible(b); + cur = cur.predecessor; + } + + popupVisibleSuccessors(b); + setPopupVisible(b); + } + + private void popupVisibleSuccessors(boolean b) { + for (LineWidget s : successors) { + s.setPopupVisible(b); + s.popupVisibleSuccessors(b); + } + } + + public JPopupMenu getPopupMenu(Widget widget, Point localLocation) { + JPopupMenu menu = new JPopupMenu(); + menu.add(scene.createGotoAction(outputSlot.getFigure())); + menu.addSeparator(); + + for (Connection c : connections) { + InputSlot s = c.getInputSlot(); + menu.add(scene.createGotoAction(s.getFigure())); + } + + final LineWidget w = this; + menu.addPopupMenuListener(new PopupMenuListener() { + + public void popupMenuWillBecomeVisible(PopupMenuEvent e) { + w.setRecursivePopupVisible(true); + } + + public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { + w.setRecursivePopupVisible(false); + } + + public void popupMenuCanceled(PopupMenuEvent e) { + } + }); + + return menu; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/MultiConnectionWidget.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/MultiConnectionWidget.java new file mode 100644 index 00000000000..b65c5eab1cf --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/MultiConnectionWidget.java @@ -0,0 +1,281 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view.widgets; + +import com.sun.hotspot.igv.graph.Connection; +import com.sun.hotspot.igv.graph.InputSlot; +import com.sun.hotspot.igv.graph.OutputSlot; +import com.sun.hotspot.igv.graph.Slot; +import com.sun.hotspot.igv.view.DiagramScene; +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Stroke; +import java.awt.geom.Line2D; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.SortedSet; +import java.util.TreeSet; +import javax.swing.JPopupMenu; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; +import org.netbeans.api.visual.action.PopupMenuProvider; +import org.netbeans.api.visual.model.ObjectState; +import org.netbeans.api.visual.widget.Widget; + +/** + * + * @author Thomas Wuerthinger + */ +public class MultiConnectionWidget extends Widget implements PopupMenuProvider { + + public final int BORDER = 4; + public final int HOVER_STROKE_WIDTH = 3; + + private static class Route { + + public Point from; + public Point to; + public SortedSet inputSlots; + public boolean decorateStart; + public boolean decorateEnd; + + public Route(Point from, Point to) { + assert from != null; + assert to != null; + this.from = from; + this.to = to; + this.inputSlots = new TreeSet(); + } + + @Override + public boolean equals(Object obj) { + + if (obj instanceof Route) { + Route r = (Route) obj; + return r.from.equals(from) && r.to.equals(to); + } + + return super.equals(obj); + } + + @Override + public int hashCode() { + return ((((from.x * 1711) + from.y) * 1711 + to.x) * 1711 + to.y); + } + } + private Rectangle clientArea; + private OutputSlot outputSlot; + private Map> routeMap; + private List routeList; + private Color color; + private DiagramScene diagramScene; + private boolean popupVisible; + + /** Creates a new instance of MultiConnectionWidget */ + public MultiConnectionWidget(OutputSlot outputSlot, DiagramScene scene) { + super(scene); + + this.diagramScene = scene; + this.outputSlot = outputSlot; + this.setCheckClipping(true); + + routeMap = new HashMap>(); + routeList = new ArrayList(); + color = Color.BLACK; + + for (Connection c : outputSlot.getConnections()) { + List controlPoints = c.getControlPoints(); + InputSlot inputSlot = (InputSlot) c.getTo(); + color = c.getColor(); + + for (int i = 1; i < controlPoints.size(); i++) { + Point prev = controlPoints.get(i - 1); + Point cur = controlPoints.get(i); + + if (prev != null && cur != null) { + Route r = new Route(prev, cur); + if (routeMap.containsKey(r)) { + SortedSet set = routeMap.get(r); + set.add(inputSlot); + } else { + SortedSet set = new TreeSet(Slot.slotFigureComparator); + set.add(inputSlot); + routeMap.put(r, set); + routeList.add(r); + } + } + } + } + + if (routeList.size() == 0) { + clientArea = new Rectangle(); + } else { + for (Route r : routeList) { + + int x = r.from.x; + int y = r.from.y; + + int x2 = r.to.x; + int y2 = r.to.y; + + if (x > x2) { + int tmp = x; + x = x2; + x2 = tmp; + } + + if (y > y2) { + int tmp = y; + y = y2; + y2 = tmp; + } + + int width = x2 - x + 1; + int height = y2 - y + 1; + + Rectangle rect = new Rectangle(x, y, width, height); + if (clientArea == null) { + clientArea = rect; + } else { + clientArea = clientArea.union(rect); + } + } + + clientArea.grow(BORDER, BORDER); + } + } + + private void setHoverPosition(Point location) { + Route r = getNearest(location); + } + + private Route getNearest(Point localLocation) { + + double minDist = Double.MAX_VALUE; + Route result = null; + for (Route r : routeList) { + double dist = Line2D.ptSegDistSq((double) r.from.x, (double) r.from.y, (double) r.to.x, (double) r.to.y, (double) localLocation.x, (double) localLocation.y); + if (dist < minDist) { + result = r; + minDist = dist; + } + } + + assert result != null; + + return result; + } + + @Override + public boolean isHitAt(Point localLocation) { + if (!super.isHitAt(localLocation)) { + return false; + } + + for (Route r : routeList) { + double dist = Line2D.ptSegDistSq((double) r.from.x, (double) r.from.y, (double) r.to.x, (double) r.to.y, (double) localLocation.x, (double) localLocation.y); + if (dist < BORDER * BORDER) { + setHoverPosition(localLocation); + return true; + } + } + + return false; + } + + @Override + protected Rectangle calculateClientArea() { + return clientArea; + } + + @Override + protected void paintWidget() { + Graphics2D g = getScene().getGraphics(); + //g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); + g.setColor(this.color); + ObjectState state = this.getState(); + float width = 1.0f; + if (state.isHovered() || this.popupVisible) { + width = HOVER_STROKE_WIDTH; + } + + Stroke oldStroke = g.getStroke(); + g.setStroke(new BasicStroke(width)); + for (Route r : routeList) { + g.drawLine(r.from.x, r.from.y, r.to.x, r.to.y); + } + g.setStroke(oldStroke); + } + + @Override + protected void notifyStateChanged(ObjectState previousState, ObjectState state) { + + boolean repaint = false; + + if (state.isHovered() != previousState.isHovered()) { + repaint = true; + } + + repaint(); + } + + public JPopupMenu getPopupMenu(Widget widget, Point localLocation) { + JPopupMenu menu = new JPopupMenu(); + Route r = getNearest(localLocation); + assert r != null; + assert routeMap.containsKey(r); + + menu.add(diagramScene.createGotoAction(outputSlot.getFigure())); + menu.addSeparator(); + + SortedSet set = this.routeMap.get(r); + for (InputSlot s : set) { + menu.add(diagramScene.createGotoAction(s.getFigure())); + } + + final MultiConnectionWidget w = this; + menu.addPopupMenuListener(new PopupMenuListener() { + + public void popupMenuWillBecomeVisible(PopupMenuEvent e) { + w.popupVisible = true; + w.repaint(); + } + + public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { + w.popupVisible = false; + w.repaint(); + } + + public void popupMenuCanceled(PopupMenuEvent e) { + } + }); + + return menu; + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/OutputSlotWidget.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/OutputSlotWidget.java new file mode 100644 index 00000000000..351e6ddd7b4 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/OutputSlotWidget.java @@ -0,0 +1,61 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view.widgets; + +import com.sun.hotspot.igv.graph.OutputSlot; +import com.sun.hotspot.igv.view.DiagramScene; +import java.awt.Point; +import java.util.List; +import org.netbeans.api.visual.widget.Widget; + +/** + * + * @author Thomas Wuerthinger + */ +public class OutputSlotWidget extends SlotWidget { + + private OutputSlot outputSlot; + + public OutputSlotWidget(OutputSlot slot, DiagramScene scene, Widget parent, FigureWidget fw) { + super(slot, scene, parent, fw); + outputSlot = slot; + init(); + getFigureWidget().getRightWidget().addChild(this); + } + + public OutputSlot getOutputSlot() { + return outputSlot; + } + + protected Point calculateRelativeLocation() { + if (getFigureWidget().getBounds() == null) { + return new Point(0, 0); + } + + double x = this.getFigureWidget().getBounds().width; + List slots = outputSlot.getFigure().getOutputSlots(); + assert slots.contains(outputSlot); + return new Point((int) x, (int) (calculateRelativeY(slots.size(), slots.indexOf(outputSlot)))); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/SlotWidget.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/SlotWidget.java new file mode 100644 index 00000000000..d5aac2f6feb --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/SlotWidget.java @@ -0,0 +1,126 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ +package com.sun.hotspot.igv.view.widgets; + +import com.sun.hotspot.igv.graph.Figure; +import com.sun.hotspot.igv.graph.OutputSlot; +import com.sun.hotspot.igv.graph.Slot; +import com.sun.hotspot.igv.view.*; +import java.awt.Color; +import java.awt.Font; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.geom.Rectangle2D; +import org.netbeans.api.visual.widget.Widget; + +/** + * + * @author Thomas Wuerthinger + */ +public abstract class SlotWidget extends Widget { + + private Slot slot; + private FigureWidget figureWidget; + private Image bufferImage; + private static double TEXT_ZOOM_FACTOR = 0.9; + private static double ZOOM_FACTOR = 0.6; + private DiagramScene scene; + + public SlotWidget(Slot slot, DiagramScene scene, Widget parent, FigureWidget fw) { + super(scene); + this.scene = scene; + this.slot = slot; + figureWidget = fw; + this.setToolTipText("" + slot.getName() + ""); + this.setCheckClipping(true); + } + + public Point getAnchorPosition() { + Point p = new Point(figureWidget.getFigure().getPosition()); + Point p2 = slot.getRelativePosition(); + p.translate(p2.x, p2.y); + return p; + } + + protected void init() { + + Point p = calculateRelativeLocation(); + Rectangle r = calculateClientArea(); + p = new Point(p.x, p.y - r.height / 2); + this.setPreferredLocation(p); + } + + public Slot getSlot() { + return slot; + } + + public FigureWidget getFigureWidget() { + return figureWidget; + } + + @Override + protected void paintWidget() { + + if (scene.getRealZoomFactor() < ZOOM_FACTOR) { + return; + } + + if (bufferImage == null) { + Graphics2D g = this.getGraphics(); + g.setColor(Color.DARK_GRAY); + int w = this.getBounds().width; + int h = this.getBounds().height; + + if (getSlot().getShortName() != null && getSlot().getShortName().length() > 0 && scene.getRealZoomFactor() >= TEXT_ZOOM_FACTOR) { + Font f = new Font("Arial", Font.PLAIN, 8); + g.setFont(f.deriveFont(7.5f)); + Rectangle2D r1 = g.getFontMetrics().getStringBounds(getSlot().getShortName(), g); + g.drawString(getSlot().getShortName(), (int) (this.getBounds().width - r1.getWidth()) / 2, (int) (this.getBounds().height + r1.getHeight()) / 2); + } else { + + if (slot instanceof OutputSlot) { + g.fillArc(w / 4, -h / 4 - 1, w / 2, h / 2, 180, 180); + } else { + g.fillArc(w / 4, 3 * h / 4, w / 2, h / 2, 0, 180); + } + } + } + } + + @Override + protected Rectangle calculateClientArea() { + return new Rectangle(0, 0, Figure.SLOT_WIDTH, Figure.SLOT_WIDTH); + } + + protected abstract Point calculateRelativeLocation(); + + protected double calculateRelativeY(int size, int index) { + assert index >= 0 && index < size; + assert size > 0; + double height = getFigureWidget().getBounds().getHeight(); + return height * (index + 1) / (size + 1); + } +} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties new file mode 100644 index 00000000000..196dde41698 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties @@ -0,0 +1,7 @@ +currentVersion=IdealGraphVisualizer {0} +LBL_splash_window_title=Starting IdealGraphVisualizer +SPLASH_WIDTH=475 +SplashProgressBarBounds=0,268,473,6 +SplashProgressBarColor=0xFFFFFF +SplashRunningTextBounds=269,253,205,12 +SplashRunningTextColor=0xFFFFFF diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/frame.gif b/hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/frame.gif new file mode 100644 index 00000000000..43353c9e2e1 Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/frame.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/splash.gif b/hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/splash.gif new file mode 100644 index 00000000000..949861e8fd7 Binary files /dev/null and b/hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/splash.gif differ diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties new file mode 100644 index 00000000000..1263cad01ec --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties @@ -0,0 +1,2 @@ +CTL_MainWindow_Title=IdealGraphVisualizer {0} +CTL_MainWindow_Title_No_Project=IdealGraphVisualizer {0} diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/build.xml new file mode 100644 index 00000000000..fb95e5f39d5 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/build.xml @@ -0,0 +1,8 @@ + + + + + + Builds the module suite IdealGraphVisualizer. + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/build-impl.xml new file mode 100644 index 00000000000..f056e104db4 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/build-impl.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/genfiles.properties new file mode 100644 index 00000000000..758cede0149 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=72833581 +build.xml.script.CRC32=e9c757c5 +build.xml.stylesheet.CRC32=531c622b +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=72833581 +nbproject/build-impl.xml.script.CRC32=1b6f3648 +nbproject/build-impl.xml.stylesheet.CRC32=196c7090 diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/platform.properties new file mode 100644 index 00000000000..4768730f129 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/platform.properties @@ -0,0 +1,29 @@ +# Deprecated since 5.0u1; for compatibility with 5.0: +disabled.clusters=\ + apisupport1,\ + harness,\ + ide8,\ + java1,\ + nb6.0,\ + profiler2 +disabled.modules=\ + org.netbeans.core.execution,\ + org.netbeans.core.multiview,\ + org.netbeans.core.output2,\ + org.netbeans.modules.applemenu,\ + org.netbeans.modules.autoupdate.services,\ + org.netbeans.modules.autoupdate.ui,\ + org.netbeans.modules.core.kit,\ + org.netbeans.modules.favorites,\ + org.netbeans.modules.javahelp,\ + org.netbeans.modules.masterfs,\ + org.netbeans.modules.options.keymap,\ + org.netbeans.modules.sendopts,\ + org.netbeans.modules.templates,\ + org.openide.compat,\ + org.openide.execution,\ + org.openide.util.enumerations +enabled.clusters=\ + platform7 +nbjdk.active=default +nbplatform.active=default diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/project.properties new file mode 100644 index 00000000000..1b524d231f3 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/project.properties @@ -0,0 +1,40 @@ +app.icon=branding/core/core.jar/org/netbeans/core/startup/frame48.gif +app.name=idealgraphvisualizer +app.title=IdealGraphVisualizer +branding.token=${app.name} +modules=\ + ${project.com.sun.hotspot.igv.graph}:\ + ${project.com.sun.hotspot.igv.coordinator}:\ + ${project.com.sun.hotspot.igv.filter}:\ + ${project.com.sun.hotspot.igv.hierarchicallayout}:\ + ${project.com.sun.hotspot.igv.layout}:\ + ${project.com.sun.hotspot.igv.controlflow}:\ + ${project.com.sun.hotspot.igv.data}:\ + ${project.com.sun.hotspot.igv.view}:\ + ${project.com.sun.hotspot.igv.bytecodes}:\ + ${project.com.sun.hotspot.igv.difference}:\ + ${project.com.sun.hotspot.igv.settings}:\ + ${project.com.sun.hotspot.igv.util}:\ + ${project.com.sun.hotspot.igv.rhino}:\ + ${project.com.sun.hotspot.igv.svg}:\ + ${project.com.sun.hotspot.connection}:\ + ${project.com.sun.hotspot.igv.servercompilerscheduler}:\ + ${project.com.sun.hotspot.igv.filterwindow} +project.com.sun.hotspot.connection=NetworkConnection +project.com.sun.hotspot.igv.bytecodes=Bytecodes +project.com.sun.hotspot.igv.controlflow=ControlFlow +project.com.sun.hotspot.igv.coordinator=Coordinator +project.com.sun.hotspot.igv.data=Data +project.com.sun.hotspot.igv.difference=Difference +project.com.sun.hotspot.igv.filter=Filter +project.com.sun.hotspot.igv.filterwindow=FilterWindow +project.com.sun.hotspot.igv.graph=Graph +project.com.sun.hotspot.igv.hierarchicallayout=HierarchicalLayout +project.com.sun.hotspot.igv.layout=Layout +project.com.sun.hotspot.igv.rhino=RhinoScriptEngineProxy +project.com.sun.hotspot.igv.servercompilerscheduler=ServerCompiler +project.com.sun.hotspot.igv.settings=Settings +project.com.sun.hotspot.igv.svg=BatikSVGProxy +project.com.sun.hotspot.igv.view=View +project.com.sun.hotspot.igv.util=Util +run.args = -server -J-Xms64m -J-Xmx512m -J-da diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/project.xml new file mode 100644 index 00000000000..47400216ae9 --- /dev/null +++ b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/project.xml @@ -0,0 +1,9 @@ + + + org.netbeans.modules.apisupport.project.suite + + + IdealGraphVisualizer + + + diff --git a/hotspot/src/share/tools/MakeDeps/Database.java b/hotspot/src/share/tools/MakeDeps/Database.java index c26ef1d6fc3..5cec93b7d03 100644 --- a/hotspot/src/share/tools/MakeDeps/Database.java +++ b/hotspot/src/share/tools/MakeDeps/Database.java @@ -36,6 +36,7 @@ public class Database { private FileList outerFiles; private FileList indivIncludes; private FileList grandInclude; // the results for the grand include file + private HashMap platformDepFiles; private long threshold; private int nOuterFiles; private int nPrecompiledFiles; @@ -57,6 +58,7 @@ public class Database { outerFiles = new FileList("outerFiles", plat); indivIncludes = new FileList("IndivIncludes", plat); grandInclude = new FileList(plat.getGIFileTemplate().nameOfList(), plat); + platformDepFiles = new HashMap(); threshold = t; nOuterFiles = 0; @@ -209,6 +211,10 @@ public class Database { FileList p = allFiles.listForFile(includer); p.setPlatformDependentInclude(pdName.dirPreStemSuff()); + // Record the implicit include of this file so that the + // dependencies for precompiled headers can mention it. + platformDepFiles.put(newIncluder, includer); + // Add an implicit dependency on platform // specific file for the generic file @@ -408,6 +414,12 @@ public class Database { for (Iterator iter = grandInclude.iterator(); iter.hasNext(); ) { FileList list = (FileList) iter.next(); gd.println(list.getName() + " \\"); + String platformDep = platformDepFiles.get(list.getName()); + if (platformDep != null) { + // make sure changes to the platform dependent file will + // cause regeneration of the pch file. + gd.println(platformDep + " \\"); + } } gd.println(); gd.println(); diff --git a/hotspot/src/share/vm/adlc/adlc.hpp b/hotspot/src/share/vm/adlc/adlc.hpp index fc81ee00a5e..14bc5d6b738 100644 --- a/hotspot/src/share/vm/adlc/adlc.hpp +++ b/hotspot/src/share/vm/adlc/adlc.hpp @@ -29,11 +29,7 @@ // standard library constants #include "stdio.h" #include "stdlib.h" -#if _MSC_VER >= 1300 // Visual C++ 7.0 or later #include -#else -#include -#endif #include "string.h" #include "ctype.h" #include "stdarg.h" diff --git a/hotspot/src/share/vm/adlc/archDesc.cpp b/hotspot/src/share/vm/adlc/archDesc.cpp index 534c62a3311..0aa15064c5b 100644 --- a/hotspot/src/share/vm/adlc/archDesc.cpp +++ b/hotspot/src/share/vm/adlc/archDesc.cpp @@ -1,5 +1,5 @@ // -// Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. // // This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/adlc/filebuff.hpp b/hotspot/src/share/vm/adlc/filebuff.hpp index fa84e09bd2a..fdfa985db4c 100644 --- a/hotspot/src/share/vm/adlc/filebuff.hpp +++ b/hotspot/src/share/vm/adlc/filebuff.hpp @@ -23,13 +23,9 @@ */ // FILEBUFF.HPP - Definitions for parser file buffering routines - -#if _MSC_VER >= 1300 // Visual C++ 7.0 or later #include -#else -#include -#endif +using namespace std; // STRUCTURE FOR HANDLING INPUT AND OUTPUT FILES typedef struct { const char *_name; diff --git a/hotspot/src/share/vm/adlc/forms.cpp b/hotspot/src/share/vm/adlc/forms.cpp index 7bd2093851e..e9d7de211ea 100644 --- a/hotspot/src/share/vm/adlc/forms.cpp +++ b/hotspot/src/share/vm/adlc/forms.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -252,6 +252,7 @@ Form::DataType Form::is_load_from_memory(const char *opType) const { if( strcmp(opType,"LoadF")==0 ) return Form::idealF; if( strcmp(opType,"LoadI")==0 ) return Form::idealI; if( strcmp(opType,"LoadKlass")==0 ) return Form::idealP; + if( strcmp(opType,"LoadNKlass")==0 ) return Form::idealN; if( strcmp(opType,"LoadL")==0 ) return Form::idealL; if( strcmp(opType,"LoadL_unaligned")==0 ) return Form::idealL; if( strcmp(opType,"LoadPLocked")==0 ) return Form::idealP; diff --git a/hotspot/src/share/vm/adlc/forms.hpp b/hotspot/src/share/vm/adlc/forms.hpp index dfa34454733..c510ac43aef 100644 --- a/hotspot/src/share/vm/adlc/forms.hpp +++ b/hotspot/src/share/vm/adlc/forms.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/adlc/formssel.cpp b/hotspot/src/share/vm/adlc/formssel.cpp index eab02499c2d..47fe6ae04eb 100644 --- a/hotspot/src/share/vm/adlc/formssel.cpp +++ b/hotspot/src/share/vm/adlc/formssel.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -729,6 +729,7 @@ bool InstructForm::captures_bottom_type() const { !strcmp(_matrule->_rChild->_opType,"DecodeN") || !strcmp(_matrule->_rChild->_opType,"EncodeP") || !strcmp(_matrule->_rChild->_opType,"LoadN") || + !strcmp(_matrule->_rChild->_opType,"LoadNKlass") || !strcmp(_matrule->_rChild->_opType,"CreateEx") || // type of exception !strcmp(_matrule->_rChild->_opType,"CheckCastPP")) ) return true; else if ( is_ideal_load() == Form::idealP ) return true; @@ -3313,7 +3314,7 @@ int MatchNode::needs_ideal_memory_edge(FormDict &globals) const { "Store8B","Store4B","Store8C","Store4C","Store2C", "Load4I" ,"Load2I" ,"Load2L" ,"Load2D" ,"Load4F" ,"Load2F" ,"Load16B" , "Load8B" ,"Load4B" ,"Load8C" ,"Load4C" ,"Load2C" ,"Load8S", "Load4S","Load2S", - "LoadRange", "LoadKlass", "LoadL_unaligned", "LoadD_unaligned", + "LoadRange", "LoadKlass", "LoadNKlass", "LoadL_unaligned", "LoadD_unaligned", "LoadPLocked", "LoadLLocked", "StorePConditional", "StoreLConditional", "CompareAndSwapI", "CompareAndSwapL", "CompareAndSwapP", "CompareAndSwapN", diff --git a/hotspot/src/share/vm/adlc/output_c.cpp b/hotspot/src/share/vm/adlc/output_c.cpp index 168b932179c..eb33e67b376 100644 --- a/hotspot/src/share/vm/adlc/output_c.cpp +++ b/hotspot/src/share/vm/adlc/output_c.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/adlc/output_h.cpp b/hotspot/src/share/vm/adlc/output_h.cpp index 0640f0a3250..78f16078381 100644 --- a/hotspot/src/share/vm/adlc/output_h.cpp +++ b/hotspot/src/share/vm/adlc/output_h.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/asm/assembler.cpp b/hotspot/src/share/vm/asm/assembler.cpp index 62c9d232f72..dcf1f0dcd94 100644 --- a/hotspot/src/share/vm/asm/assembler.cpp +++ b/hotspot/src/share/vm/asm/assembler.cpp @@ -246,6 +246,24 @@ void AbstractAssembler::block_comment(const char* comment) { } } +bool MacroAssembler::needs_explicit_null_check(intptr_t offset) { + // Exception handler checks the nmethod's implicit null checks table + // only when this method returns false. +#ifndef SPARC + // Sparc does not have based addressing + if (UseCompressedOops) { + // The first page after heap_base is unmapped and + // the 'offset' is equal to [heap_base + offset] for + // narrow oop implicit null checks. + uintptr_t heap_base = (uintptr_t)Universe::heap_base(); + if ((uintptr_t)offset >= heap_base) { + // Normalize offset for the next check. + offset = (intptr_t)(pointer_delta((void*)offset, (void*)heap_base, 1)); + } + } +#endif // SPARC + return offset < 0 || os::vm_page_size() <= offset; +} #ifndef PRODUCT void Label::print_instructions(MacroAssembler* masm) const { diff --git a/hotspot/src/share/vm/asm/codeBuffer.cpp b/hotspot/src/share/vm/asm/codeBuffer.cpp index cd88a2ab160..cbd16d3e8b3 100644 --- a/hotspot/src/share/vm/asm/codeBuffer.cpp +++ b/hotspot/src/share/vm/asm/codeBuffer.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/asm/codeBuffer.hpp b/hotspot/src/share/vm/asm/codeBuffer.hpp index 87f02215d97..6880fc59d5f 100644 --- a/hotspot/src/share/vm/asm/codeBuffer.hpp +++ b/hotspot/src/share/vm/asm/codeBuffer.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/c1/c1_LIR.cpp b/hotspot/src/share/vm/c1/c1_LIR.cpp index 46e725b5a14..7335abb0731 100644 --- a/hotspot/src/share/vm/c1/c1_LIR.cpp +++ b/hotspot/src/share/vm/c1/c1_LIR.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/c1/c1_Runtime1.cpp b/hotspot/src/share/vm/c1/c1_Runtime1.cpp index 8f42fe14327..e7321ccc351 100644 --- a/hotspot/src/share/vm/c1/c1_Runtime1.cpp +++ b/hotspot/src/share/vm/c1/c1_Runtime1.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/ci/bcEscapeAnalyzer.cpp b/hotspot/src/share/vm/ci/bcEscapeAnalyzer.cpp index fc875ca552d..4b3526df31b 100644 --- a/hotspot/src/share/vm/ci/bcEscapeAnalyzer.cpp +++ b/hotspot/src/share/vm/ci/bcEscapeAnalyzer.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -218,6 +218,13 @@ void BCEscapeAnalyzer::invoke(StateInfo &state, Bytecodes::Code code, ciMethod* ciInstanceKlass* callee_holder = ciEnv::get_instance_klass_for_declared_method_holder(holder); ciInstanceKlass* actual_recv = callee_holder; + // some methods are obviously bindable without any type checks so + // convert them directly to an invokespecial. + if (target->is_loaded() && !target->is_abstract() && + target->can_be_statically_bound() && code == Bytecodes::_invokevirtual) { + code = Bytecodes::_invokespecial; + } + // compute size of arguments int arg_size = target->arg_size(); if (!target->is_loaded() && code == Bytecodes::_invokestatic) { diff --git a/hotspot/src/share/vm/ci/bcEscapeAnalyzer.hpp b/hotspot/src/share/vm/ci/bcEscapeAnalyzer.hpp index 3af67e1fd59..8c5122c1486 100644 --- a/hotspot/src/share/vm/ci/bcEscapeAnalyzer.hpp +++ b/hotspot/src/share/vm/ci/bcEscapeAnalyzer.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/ci/ciField.hpp b/hotspot/src/share/vm/ci/ciField.hpp index 72a64c03a63..193d848d41c 100644 --- a/hotspot/src/share/vm/ci/ciField.hpp +++ b/hotspot/src/share/vm/ci/ciField.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/ci/ciInstanceKlass.cpp b/hotspot/src/share/vm/ci/ciInstanceKlass.cpp index ab9b059f0ce..1053727a93f 100644 --- a/hotspot/src/share/vm/ci/ciInstanceKlass.cpp +++ b/hotspot/src/share/vm/ci/ciInstanceKlass.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -392,12 +392,12 @@ int ciInstanceKlass::compute_nonstatic_fields() { assert(!is_java_lang_Object(), "bootstrap OK"); // Size in bytes of my fields, including inherited fields. - int fsize = nonstatic_field_size() * wordSize; + int fsize = nonstatic_field_size() * heapOopSize; ciInstanceKlass* super = this->super(); GrowableArray* super_fields = NULL; if (super != NULL && super->has_nonstatic_fields()) { - int super_fsize = super->nonstatic_field_size() * wordSize; + int super_fsize = super->nonstatic_field_size() * heapOopSize; int super_flen = super->nof_nonstatic_fields(); super_fields = super->_nonstatic_fields; assert(super_flen == 0 || super_fields != NULL, "first get nof_fields"); @@ -438,7 +438,7 @@ int ciInstanceKlass::compute_nonstatic_fields() { // This is a minor inefficiency classFileParser.cpp. last_offset = offset + size; } - assert(last_offset <= (int)sizeof(oopDesc) + fsize, "no overflow"); + assert(last_offset <= (int)instanceOopDesc::base_offset_in_bytes() + fsize, "no overflow"); #endif _nonstatic_fields = fields; diff --git a/hotspot/src/share/vm/ci/ciInstanceKlass.hpp b/hotspot/src/share/vm/ci/ciInstanceKlass.hpp index a843a9251ea..a60020adc34 100644 --- a/hotspot/src/share/vm/ci/ciInstanceKlass.hpp +++ b/hotspot/src/share/vm/ci/ciInstanceKlass.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/ci/ciMethod.cpp b/hotspot/src/share/vm/ci/ciMethod.cpp index 2c6c5aa272d..c23944d35c6 100644 --- a/hotspot/src/share/vm/ci/ciMethod.cpp +++ b/hotspot/src/share/vm/ci/ciMethod.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -878,7 +878,7 @@ int ciMethod::instructions_size() { (TieredCompilation && code->compiler() != NULL && code->compiler()->is_c1())) { return 0; } - return code->code_size(); + return code->code_end() - code->verified_entry_point(); ) } diff --git a/hotspot/src/share/vm/ci/ciMethodBlocks.cpp b/hotspot/src/share/vm/ci/ciMethodBlocks.cpp index 4c596bbc4fb..9bfba219b88 100644 --- a/hotspot/src/share/vm/ci/ciMethodBlocks.cpp +++ b/hotspot/src/share/vm/ci/ciMethodBlocks.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/ci/ciMethodBlocks.hpp b/hotspot/src/share/vm/ci/ciMethodBlocks.hpp index b4398f39f4a..edfdf19b07e 100644 --- a/hotspot/src/share/vm/ci/ciMethodBlocks.hpp +++ b/hotspot/src/share/vm/ci/ciMethodBlocks.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/ci/ciMethodData.cpp b/hotspot/src/share/vm/ci/ciMethodData.cpp index 68591961bce..adb854680d8 100644 --- a/hotspot/src/share/vm/ci/ciMethodData.cpp +++ b/hotspot/src/share/vm/ci/ciMethodData.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/ci/ciMethodData.hpp b/hotspot/src/share/vm/ci/ciMethodData.hpp index 91ed83f61eb..cd7fa830e22 100644 --- a/hotspot/src/share/vm/ci/ciMethodData.hpp +++ b/hotspot/src/share/vm/ci/ciMethodData.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/ci/ciObjectFactory.cpp b/hotspot/src/share/vm/ci/ciObjectFactory.cpp index 649b7354315..1f862f85e12 100644 --- a/hotspot/src/share/vm/ci/ciObjectFactory.cpp +++ b/hotspot/src/share/vm/ci/ciObjectFactory.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/classfile/classFileParser.cpp b/hotspot/src/share/vm/classfile/classFileParser.cpp index 580aa41ef0c..7ee8ce98403 100644 --- a/hotspot/src/share/vm/classfile/classFileParser.cpp +++ b/hotspot/src/share/vm/classfile/classFileParser.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -44,6 +44,7 @@ // Used for backward compatibility reasons: // - to check for javac bug fixes that happened after 1.5 +// - also used as the max version when running in jdk6 #define JAVA_6_VERSION 50 @@ -2664,8 +2665,8 @@ instanceKlassHandle ClassFileParser::parseClassFile(symbolHandle name, fac.static_byte_count ), wordSize ); static_field_size = (next_static_type_offset - next_static_oop_offset) / wordSize; - first_nonstatic_field_offset = (instanceOopDesc::header_size() + - nonstatic_field_size) * wordSize; + first_nonstatic_field_offset = instanceOopDesc::base_offset_in_bytes() + + nonstatic_field_size * heapOopSize; next_nonstatic_field_offset = first_nonstatic_field_offset; // Add fake fields for java.lang.Class instances (also see below) @@ -2734,9 +2735,9 @@ instanceKlassHandle ClassFileParser::parseClassFile(symbolHandle name, next_nonstatic_byte_offset = next_nonstatic_short_offset + (nonstatic_short_count * BytesPerShort); next_nonstatic_type_offset = align_size_up((next_nonstatic_byte_offset + - nonstatic_byte_count ), wordSize ); + nonstatic_byte_count ), heapOopSize ); orig_nonstatic_field_size = nonstatic_field_size + - ((next_nonstatic_type_offset - first_nonstatic_field_offset)/wordSize); + ((next_nonstatic_type_offset - first_nonstatic_field_offset)/heapOopSize); } #endif bool compact_fields = CompactFields; @@ -2791,18 +2792,8 @@ instanceKlassHandle ClassFileParser::parseClassFile(symbolHandle name, int nonstatic_short_space_offset; int nonstatic_byte_space_offset; - bool compact_into_header = (UseCompressedOops && - allocation_style == 1 && compact_fields && - !super_has_nonstatic_fields); - - if( compact_into_header || nonstatic_double_count > 0 ) { - int offset; - // Pack something in with the header if no super klass has done so. - if (compact_into_header) { - offset = oopDesc::klass_gap_offset_in_bytes(); - } else { - offset = next_nonstatic_double_offset; - } + if( nonstatic_double_count > 0 ) { + int offset = next_nonstatic_double_offset; next_nonstatic_double_offset = align_size_up(offset, BytesPerLong); if( compact_fields && offset != next_nonstatic_double_offset ) { // Allocate available fields into the gap before double field. @@ -2830,8 +2821,7 @@ instanceKlassHandle ClassFileParser::parseClassFile(symbolHandle name, } // Allocate oop field in the gap if there are no other fields for that. nonstatic_oop_space_offset = offset; - if(!compact_into_header && length >= heapOopSize && - nonstatic_oop_count > 0 && + if( length >= heapOopSize && nonstatic_oop_count > 0 && allocation_style != 0 ) { // when oop fields not first nonstatic_oop_count -= 1; nonstatic_oop_space_count = 1; // Only one will fit @@ -2854,14 +2844,13 @@ instanceKlassHandle ClassFileParser::parseClassFile(symbolHandle name, } else { // allocation_style == 1 next_nonstatic_oop_offset = next_nonstatic_byte_offset + nonstatic_byte_count; if( nonstatic_oop_count > 0 ) { - notaligned_offset = next_nonstatic_oop_offset; next_nonstatic_oop_offset = align_size_up(next_nonstatic_oop_offset, heapOopSize); } notaligned_offset = next_nonstatic_oop_offset + (nonstatic_oop_count * heapOopSize); } - next_nonstatic_type_offset = align_size_up(notaligned_offset, wordSize ); + next_nonstatic_type_offset = align_size_up(notaligned_offset, heapOopSize ); nonstatic_field_size = nonstatic_field_size + ((next_nonstatic_type_offset - - first_nonstatic_field_offset)/wordSize); + - first_nonstatic_field_offset)/heapOopSize); // Iterate over fields again and compute correct offsets. // The field allocation type was temporarily stored in the offset slot. @@ -2962,9 +2951,10 @@ instanceKlassHandle ClassFileParser::parseClassFile(symbolHandle name, // Size of instances int instance_size; + next_nonstatic_type_offset = align_size_up(notaligned_offset, wordSize ); instance_size = align_object_size(next_nonstatic_type_offset / wordSize); - assert(instance_size == align_object_size(instanceOopDesc::header_size() + nonstatic_field_size), "consistent layout helper value"); + assert(instance_size == align_object_size(align_size_up((instanceOopDesc::base_offset_in_bytes() + nonstatic_field_size*heapOopSize), wordSize) / wordSize), "consistent layout helper value"); // Size of non-static oop map blocks (in words) allocated at end of klass int nonstatic_oop_map_size = compute_oop_map_size(super_klass, nonstatic_oop_map_count, first_nonstatic_oop_offset); @@ -3122,13 +3112,15 @@ instanceKlassHandle ClassFileParser::parseClassFile(symbolHandle name, #ifndef PRODUCT if( PrintCompactFieldsSavings ) { if( nonstatic_field_size < orig_nonstatic_field_size ) { - tty->print("[Saved %d of %3d words in %s]\n", - orig_nonstatic_field_size - nonstatic_field_size, - orig_nonstatic_field_size, this_klass->external_name()); + tty->print("[Saved %d of %d bytes in %s]\n", + (orig_nonstatic_field_size - nonstatic_field_size)*heapOopSize, + orig_nonstatic_field_size*heapOopSize, + this_klass->external_name()); } else if( nonstatic_field_size > orig_nonstatic_field_size ) { - tty->print("[Wasted %d over %3d words in %s]\n", - nonstatic_field_size - orig_nonstatic_field_size, - orig_nonstatic_field_size, this_klass->external_name()); + tty->print("[Wasted %d over %d bytes in %s]\n", + (nonstatic_field_size - orig_nonstatic_field_size)*heapOopSize, + orig_nonstatic_field_size*heapOopSize, + this_klass->external_name()); } } #endif @@ -3516,9 +3508,11 @@ bool ClassFileParser::has_illegal_visibility(jint flags) { } bool ClassFileParser::is_supported_version(u2 major, u2 minor) { + u2 max_version = JDK_Version::is_gte_jdk17x_version() ? + JAVA_MAX_SUPPORTED_VERSION : JAVA_6_VERSION; return (major >= JAVA_MIN_SUPPORTED_VERSION) && - (major <= JAVA_MAX_SUPPORTED_VERSION) && - ((major != JAVA_MAX_SUPPORTED_VERSION) || + (major <= max_version) && + ((major != max_version) || (minor <= JAVA_MAX_SUPPORTED_MINOR_VERSION)); } diff --git a/hotspot/src/share/vm/classfile/dictionary.cpp b/hotspot/src/share/vm/classfile/dictionary.cpp index 43d1ab9030d..5ec717c5857 100644 --- a/hotspot/src/share/vm/classfile/dictionary.cpp +++ b/hotspot/src/share/vm/classfile/dictionary.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/classfile/javaClasses.cpp b/hotspot/src/share/vm/classfile/javaClasses.cpp index 713ee547520..65a07231a72 100644 --- a/hotspot/src/share/vm/classfile/javaClasses.cpp +++ b/hotspot/src/share/vm/classfile/javaClasses.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1872,7 +1872,7 @@ oop java_lang_boxing_object::create(BasicType type, jvalue* value, TRAPS) { box->float_field_put(value_offset, value->f); break; case T_DOUBLE: - box->double_field_put(value_offset, value->d); + box->double_field_put(long_value_offset, value->d); break; case T_BYTE: box->byte_field_put(value_offset, value->b); @@ -1884,7 +1884,7 @@ oop java_lang_boxing_object::create(BasicType type, jvalue* value, TRAPS) { box->int_field_put(value_offset, value->i); break; case T_LONG: - box->long_field_put(value_offset, value->j); + box->long_field_put(long_value_offset, value->j); break; default: return NULL; @@ -1915,7 +1915,7 @@ BasicType java_lang_boxing_object::get_value(oop box, jvalue* value) { value->f = box->float_field(value_offset); break; case T_DOUBLE: - value->d = box->double_field(value_offset); + value->d = box->double_field(long_value_offset); break; case T_BYTE: value->b = box->byte_field(value_offset); @@ -1927,7 +1927,7 @@ BasicType java_lang_boxing_object::get_value(oop box, jvalue* value) { value->i = box->int_field(value_offset); break; case T_LONG: - value->j = box->long_field(value_offset); + value->j = box->long_field(long_value_offset); break; default: return T_ILLEGAL; @@ -1949,7 +1949,7 @@ BasicType java_lang_boxing_object::set_value(oop box, jvalue* value) { box->float_field_put(value_offset, value->f); break; case T_DOUBLE: - box->double_field_put(value_offset, value->d); + box->double_field_put(long_value_offset, value->d); break; case T_BYTE: box->byte_field_put(value_offset, value->b); @@ -1961,7 +1961,7 @@ BasicType java_lang_boxing_object::set_value(oop box, jvalue* value) { box->int_field_put(value_offset, value->i); break; case T_LONG: - box->long_field_put(value_offset, value->j); + box->long_field_put(long_value_offset, value->j); break; default: return T_ILLEGAL; @@ -2163,6 +2163,7 @@ int java_lang_reflect_Field::modifiers_offset; int java_lang_reflect_Field::signature_offset; int java_lang_reflect_Field::annotations_offset; int java_lang_boxing_object::value_offset; +int java_lang_boxing_object::long_value_offset; int java_lang_ref_Reference::referent_offset; int java_lang_ref_Reference::queue_offset; int java_lang_ref_Reference::next_offset; @@ -2282,10 +2283,7 @@ oop java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj( // are not available to determine the offset_of_static_fields. void JavaClasses::compute_hard_coded_offsets() { const int x = heapOopSize; - // Objects don't get allocated in the gap in the header with compressed oops - // for these special classes because hard coded offsets can't be conditional - // so base_offset_in_bytes() is wrong here, allocate after the header. - const int header = sizeof(instanceOopDesc); + const int header = instanceOopDesc::base_offset_in_bytes(); // Do the String Class java_lang_String::value_offset = java_lang_String::hc_value_offset * x + header; @@ -2308,7 +2306,8 @@ void JavaClasses::compute_hard_coded_offsets() { java_lang_Throwable::stackTrace_offset = java_lang_Throwable::hc_stackTrace_offset * x + header; // java_lang_boxing_object - java_lang_boxing_object::value_offset = java_lang_boxing_object::hc_value_offset * x + header; + java_lang_boxing_object::value_offset = java_lang_boxing_object::hc_value_offset + header; + java_lang_boxing_object::long_value_offset = align_size_up((java_lang_boxing_object::hc_value_offset + header), BytesPerLong); // java_lang_ref_Reference: java_lang_ref_Reference::referent_offset = java_lang_ref_Reference::hc_referent_offset * x + header; @@ -2322,7 +2321,7 @@ void JavaClasses::compute_hard_coded_offsets() { java_lang_ref_Reference::number_of_fake_oop_fields = 1; // java_lang_ref_SoftReference Class - java_lang_ref_SoftReference::timestamp_offset = java_lang_ref_SoftReference::hc_timestamp_offset * x + header; + java_lang_ref_SoftReference::timestamp_offset = align_size_up((java_lang_ref_SoftReference::hc_timestamp_offset * x + header), BytesPerLong); // Don't multiply static fields because they are always in wordSize units java_lang_ref_SoftReference::static_clock_offset = java_lang_ref_SoftReference::hc_static_clock_offset * x; @@ -2469,6 +2468,9 @@ void JavaClasses::check_offsets() { #define CHECK_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \ valid &= check_offset(klass_name, cpp_klass_name :: field_name ## _offset, #field_name, field_sig) +#define CHECK_LONG_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \ + valid &= check_offset(klass_name, cpp_klass_name :: long_ ## field_name ## _offset, #field_name, field_sig) + #define CHECK_STATIC_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \ valid &= check_static_offset(klass_name, cpp_klass_name :: static_ ## field_name ## _offset, #field_name, field_sig) @@ -2501,11 +2503,11 @@ void JavaClasses::check_offsets() { CHECK_OFFSET("java/lang/Boolean", java_lang_boxing_object, value, "Z"); CHECK_OFFSET("java/lang/Character", java_lang_boxing_object, value, "C"); CHECK_OFFSET("java/lang/Float", java_lang_boxing_object, value, "F"); - CHECK_OFFSET("java/lang/Double", java_lang_boxing_object, value, "D"); + CHECK_LONG_OFFSET("java/lang/Double", java_lang_boxing_object, value, "D"); CHECK_OFFSET("java/lang/Byte", java_lang_boxing_object, value, "B"); CHECK_OFFSET("java/lang/Short", java_lang_boxing_object, value, "S"); CHECK_OFFSET("java/lang/Integer", java_lang_boxing_object, value, "I"); - CHECK_OFFSET("java/lang/Long", java_lang_boxing_object, value, "J"); + CHECK_LONG_OFFSET("java/lang/Long", java_lang_boxing_object, value, "J"); // java.lang.ClassLoader diff --git a/hotspot/src/share/vm/classfile/javaClasses.hpp b/hotspot/src/share/vm/classfile/javaClasses.hpp index 0331be3e12b..933d5b82d83 100644 --- a/hotspot/src/share/vm/classfile/javaClasses.hpp +++ b/hotspot/src/share/vm/classfile/javaClasses.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -653,6 +653,7 @@ class java_lang_boxing_object: AllStatic { hc_value_offset = 0 }; static int value_offset; + static int long_value_offset; static oop initialize_and_allocate(BasicType type, TRAPS); public: @@ -665,7 +666,10 @@ class java_lang_boxing_object: AllStatic { static bool is_instance(oop box) { return basic_type(box) != T_ILLEGAL; } static bool is_instance(oop box, BasicType type) { return basic_type(box) == type; } - static int value_offset_in_bytes() { return value_offset; } + static int value_offset_in_bytes(BasicType type) { + return ( type == T_LONG || type == T_DOUBLE ) ? long_value_offset : + value_offset; + } // Debugging friend class JavaClasses; @@ -747,7 +751,7 @@ class java_lang_ref_SoftReference: public java_lang_ref_Reference { public: enum { // The timestamp is a long field and may need to be adjusted for alignment. - hc_timestamp_offset = align_object_offset_(hc_discovered_offset + 1) + hc_timestamp_offset = hc_discovered_offset + 1 }; enum { hc_static_clock_offset = 0 diff --git a/hotspot/src/share/vm/classfile/systemDictionary.cpp b/hotspot/src/share/vm/classfile/systemDictionary.cpp index 8d06a8abe90..772716311a2 100644 --- a/hotspot/src/share/vm/classfile/systemDictionary.cpp +++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/classfile/systemDictionary.hpp b/hotspot/src/share/vm/classfile/systemDictionary.hpp index 4b5bc16ff38..38d27d84841 100644 --- a/hotspot/src/share/vm/classfile/systemDictionary.hpp +++ b/hotspot/src/share/vm/classfile/systemDictionary.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/classfile/verifier.cpp b/hotspot/src/share/vm/classfile/verifier.cpp index 5ece3847b77..8373f9beaa0 100644 --- a/hotspot/src/share/vm/classfile/verifier.cpp +++ b/hotspot/src/share/vm/classfile/verifier.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/classfile/vmSymbols.cpp b/hotspot/src/share/vm/classfile/vmSymbols.cpp index 36bab9ae5ac..c805af344e7 100644 --- a/hotspot/src/share/vm/classfile/vmSymbols.cpp +++ b/hotspot/src/share/vm/classfile/vmSymbols.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/classfile/vmSymbols.hpp b/hotspot/src/share/vm/classfile/vmSymbols.hpp index 00a131f4e97..6a5a796d010 100644 --- a/hotspot/src/share/vm/classfile/vmSymbols.hpp +++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -283,6 +283,7 @@ template(cache_field_name, "cache") \ template(value_name, "value") \ template(frontCacheEnabled_name, "frontCacheEnabled") \ + template(stringCacheEnabled_name, "stringCacheEnabled") \ \ /* non-intrinsic name/signature pairs: */ \ template(register_method_name, "register") \ @@ -564,6 +565,10 @@ do_name( copyOfRange_name, "copyOfRange") \ do_signature(copyOfRange_signature, "([Ljava/lang/Object;IILjava/lang/Class;)[Ljava/lang/Object;") \ \ + do_intrinsic(_equalsC, java_util_Arrays, equals_name, equalsC_signature, F_S) \ + do_name( equals_name, "equals") \ + do_signature(equalsC_signature, "([C[C)Z") \ + \ do_intrinsic(_invoke, java_lang_reflect_Method, invoke_name, object_array_object_object_signature, F_R) \ /* (symbols invoke_name and invoke_signature defined above) */ \ \ diff --git a/hotspot/src/share/vm/code/codeCache.hpp b/hotspot/src/share/vm/code/codeCache.hpp index 3c027641ab3..6327bd11045 100644 --- a/hotspot/src/share/vm/code/codeCache.hpp +++ b/hotspot/src/share/vm/code/codeCache.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/code/debugInfo.cpp b/hotspot/src/share/vm/code/debugInfo.cpp index a84cee16fab..59ad7a6b771 100644 --- a/hotspot/src/share/vm/code/debugInfo.cpp +++ b/hotspot/src/share/vm/code/debugInfo.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/code/dependencies.cpp b/hotspot/src/share/vm/code/dependencies.cpp index 5660b84b7e9..8af296fd489 100644 --- a/hotspot/src/share/vm/code/dependencies.cpp +++ b/hotspot/src/share/vm/code/dependencies.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/code/nmethod.cpp b/hotspot/src/share/vm/code/nmethod.cpp index 14b10ea410c..282a4876262 100644 --- a/hotspot/src/share/vm/code/nmethod.cpp +++ b/hotspot/src/share/vm/code/nmethod.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/code/nmethod.hpp b/hotspot/src/share/vm/code/nmethod.hpp index 4cfb4b9c3f5..d2c4af89501 100644 --- a/hotspot/src/share/vm/code/nmethod.hpp +++ b/hotspot/src/share/vm/code/nmethod.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/code/scopeDesc.cpp b/hotspot/src/share/vm/code/scopeDesc.cpp index 96942b2ec59..7aed17f76a3 100644 --- a/hotspot/src/share/vm/code/scopeDesc.cpp +++ b/hotspot/src/share/vm/code/scopeDesc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/code/vmreg.cpp b/hotspot/src/share/vm/code/vmreg.cpp index 3d2aa69274d..bd11f3ca57d 100644 --- a/hotspot/src/share/vm/code/vmreg.cpp +++ b/hotspot/src/share/vm/code/vmreg.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/code/vmreg.hpp b/hotspot/src/share/vm/code/vmreg.hpp index 399cba3497b..af3942b196a 100644 --- a/hotspot/src/share/vm/code/vmreg.hpp +++ b/hotspot/src/share/vm/code/vmreg.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/compiler/oopMap.cpp b/hotspot/src/share/vm/compiler/oopMap.cpp index 2984d647ea8..ccad14450d4 100644 --- a/hotspot/src/share/vm/compiler/oopMap.cpp +++ b/hotspot/src/share/vm/compiler/oopMap.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/compiler/oopMap.hpp b/hotspot/src/share/vm/compiler/oopMap.hpp index ac05d570c04..5dc1046cd15 100644 --- a/hotspot/src/share/vm/compiler/oopMap.hpp +++ b/hotspot/src/share/vm/compiler/oopMap.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/binaryTreeDictionary.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/binaryTreeDictionary.cpp index 91d381d5501..2bef9fe5a1f 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/binaryTreeDictionary.cpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/binaryTreeDictionary.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/binaryTreeDictionary.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/binaryTreeDictionary.hpp index faedf5f7fdf..d45193be9fb 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/binaryTreeDictionary.hpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/binaryTreeDictionary.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -130,6 +130,7 @@ class TreeChunk : public FreeChunk { const size_t MIN_TREE_CHUNK_SIZE = sizeof(TreeChunk)/HeapWordSize; class BinaryTreeDictionary: public FreeBlockDictionary { + friend class VMStructs; bool _splay; size_t _totalSize; size_t _totalFreeBlocks; diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp index 09d0db5e02b..6bddefce163 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -805,28 +805,30 @@ size_t CompactibleFreeListSpace::block_size(const HeapWord* p) const { // This must be volatile, or else there is a danger that the compiler // will compile the code below into a sometimes-infinite loop, by keeping // the value read the first time in a register. - oop o = (oop)p; - volatile oop* second_word_addr = o->klass_addr(); while (true) { - klassOop k = (klassOop)(*second_word_addr); // We must do this until we get a consistent view of the object. - if (FreeChunk::secondWordIndicatesFreeChunk((intptr_t)k)) { - FreeChunk* fc = (FreeChunk*)p; - volatile size_t* sz_addr = (volatile size_t*)(fc->size_addr()); - size_t res = (*sz_addr); - klassOop k2 = (klassOop)(*second_word_addr); // Read to confirm. - if (k == k2) { + if (FreeChunk::indicatesFreeChunk(p)) { + volatile FreeChunk* fc = (volatile FreeChunk*)p; + size_t res = fc->size(); + // If the object is still a free chunk, return the size, else it + // has been allocated so try again. + if (FreeChunk::indicatesFreeChunk(p)) { + assert(res != 0, "Block size should not be 0"); + return res; + } + } else { + // must read from what 'p' points to in each loop. + klassOop k = ((volatile oopDesc*)p)->klass_or_null(); + if (k != NULL) { + assert(k->is_oop(true /* ignore mark word */), "Should really be klass oop."); + oop o = (oop)p; + assert(o->is_parsable(), "Should be parsable"); + assert(o->is_oop(true /* ignore mark word */), "Should be an oop."); + size_t res = o->size_given_klass(k->klass_part()); + res = adjustObjectSize(res); assert(res != 0, "Block size should not be 0"); return res; } - } else if (k != NULL) { - assert(k->is_oop(true /* ignore mark word */), "Should really be klass oop."); - assert(o->is_parsable(), "Should be parsable"); - assert(o->is_oop(true /* ignore mark word */), "Should be an oop."); - size_t res = o->size_given_klass(k->klass_part()); - res = adjustObjectSize(res); - assert(res != 0, "Block size should not be 0"); - return res; } } } @@ -845,31 +847,31 @@ const { // This must be volatile, or else there is a danger that the compiler // will compile the code below into a sometimes-infinite loop, by keeping // the value read the first time in a register. - oop o = (oop)p; - volatile oop* second_word_addr = o->klass_addr(); DEBUG_ONLY(uint loops = 0;) while (true) { - klassOop k = (klassOop)(*second_word_addr); // We must do this until we get a consistent view of the object. - if (FreeChunk::secondWordIndicatesFreeChunk((intptr_t)k)) { - FreeChunk* fc = (FreeChunk*)p; - volatile size_t* sz_addr = (volatile size_t*)(fc->size_addr()); - size_t res = (*sz_addr); - klassOop k2 = (klassOop)(*second_word_addr); // Read to confirm. - if (k == k2) { + if (FreeChunk::indicatesFreeChunk(p)) { + volatile FreeChunk* fc = (volatile FreeChunk*)p; + size_t res = fc->size(); + if (FreeChunk::indicatesFreeChunk(p)) { assert(res != 0, "Block size should not be 0"); assert(loops == 0, "Should be 0"); return res; } - } else if (k != NULL && o->is_parsable()) { - assert(k->is_oop(), "Should really be klass oop."); - assert(o->is_oop(), "Should be an oop"); - size_t res = o->size_given_klass(k->klass_part()); - res = adjustObjectSize(res); - assert(res != 0, "Block size should not be 0"); - return res; } else { - return c->block_size_if_printezis_bits(p); + // must read from what 'p' points to in each loop. + klassOop k = ((volatile oopDesc*)p)->klass_or_null(); + if (k != NULL && ((oopDesc*)p)->is_parsable()) { + assert(k->is_oop(), "Should really be klass oop."); + oop o = (oop)p; + assert(o->is_oop(), "Should be an oop"); + size_t res = o->size_given_klass(k->klass_part()); + res = adjustObjectSize(res); + assert(res != 0, "Block size should not be 0"); + return res; + } else { + return c->block_size_if_printezis_bits(p); + } } assert(loops == 0, "Can loop at most once"); DEBUG_ONLY(loops++;) @@ -907,9 +909,8 @@ bool CompactibleFreeListSpace::block_is_obj(const HeapWord* p) const { // and those objects (if garbage) may have been modified to hold // live range information. // assert(ParallelGCThreads > 0 || _bt.block_start(p) == p, "Should be a block boundary"); - klassOop k = oop(p)->klass(); - intptr_t ki = (intptr_t)k; - if (FreeChunk::secondWordIndicatesFreeChunk(ki)) return false; + if (FreeChunk::indicatesFreeChunk(p)) return false; + klassOop k = oop(p)->klass_or_null(); if (k != NULL) { // Ignore mark word because it may have been used to // chain together promoted objects (the last one @@ -1027,7 +1028,7 @@ HeapWord* CompactibleFreeListSpace::allocate(size_t size) { FreeChunk* fc = (FreeChunk*)res; fc->markNotFree(); assert(!fc->isFree(), "shouldn't be marked free"); - assert(oop(fc)->klass() == NULL, "should look uninitialized"); + assert(oop(fc)->klass_or_null() == NULL, "should look uninitialized"); // Verify that the block offset table shows this to // be a single block, but not one which is unallocated. _bt.verify_single_block(res, size); @@ -2593,7 +2594,7 @@ HeapWord* CFLS_LAB::alloc(size_t word_sz) { } res->markNotFree(); assert(!res->isFree(), "shouldn't be marked free"); - assert(oop(res)->klass() == NULL, "should look uninitialized"); + assert(oop(res)->klass_or_null() == NULL, "should look uninitialized"); // mangle a just allocated object with a distinct pattern. debug_only(res->mangleAllocated(word_sz)); return (HeapWord*)res; diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp index 729556baecf..9ac7b03d40d 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp index 8ab7bdd1b58..83854fe202c 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -190,7 +190,8 @@ ConcurrentMarkSweepGeneration::ConcurrentMarkSweepGeneration( // depends on this property. debug_only( FreeChunk* junk = NULL; - assert(junk->prev_addr() == (void*)(oop(junk)->klass_addr()), + assert(UseCompressedOops || + junk->prev_addr() == (void*)(oop(junk)->klass_addr()), "Offset of FreeChunk::_prev within FreeChunk must match" " that of OopDesc::_klass within OopDesc"); ) @@ -1039,7 +1040,7 @@ void CMSCollector::direct_allocated(HeapWord* start, size_t size) { // mark end of object } // check that oop looks uninitialized - assert(oop(start)->klass() == NULL, "_klass should be NULL"); + assert(oop(start)->klass_or_null() == NULL, "_klass should be NULL"); } void CMSCollector::promoted(bool par, HeapWord* start, @@ -1309,17 +1310,25 @@ ConcurrentMarkSweepGeneration::par_promote(int thread_num, } } oop obj = oop(obj_ptr); - assert(obj->klass() == NULL, "Object should be uninitialized here."); + assert(obj->klass_or_null() == NULL, "Object should be uninitialized here."); // Otherwise, copy the object. Here we must be careful to insert the // klass pointer last, since this marks the block as an allocated object. + // Except with compressed oops it's the mark word. HeapWord* old_ptr = (HeapWord*)old; if (word_sz > (size_t)oopDesc::header_size()) { Copy::aligned_disjoint_words(old_ptr + oopDesc::header_size(), obj_ptr + oopDesc::header_size(), word_sz - oopDesc::header_size()); } + + if (UseCompressedOops) { + // Copy gap missed by (aligned) header size calculation above + obj->set_klass_gap(old->klass_gap()); + } + // Restore the mark word copied above. obj->set_mark(m); + // Now we can track the promoted object, if necessary. We take care // To delay the transition from uninitialized to full object // (i.e., insertion of klass pointer) until after, so that it @@ -1327,7 +1336,8 @@ ConcurrentMarkSweepGeneration::par_promote(int thread_num, if (promoInfo->tracking()) { promoInfo->track((PromotedObject*)obj, old->klass()); } - // Finally, install the klass pointer. + + // Finally, install the klass pointer (this should be volatile). obj->set_klass(old->klass()); assert(old->is_oop(), "Will dereference klass ptr below"); @@ -6165,7 +6175,7 @@ size_t CMSCollector::block_size_if_printezis_bits(HeapWord* addr) const { HeapWord* CMSCollector::next_card_start_after_block(HeapWord* addr) const { size_t sz = 0; oop p = (oop)addr; - if (p->klass() != NULL && p->is_parsable()) { + if (p->klass_or_null() != NULL && p->is_parsable()) { sz = CompactibleFreeListSpace::adjustObjectSize(p->size()); } else { sz = block_size_using_printezis_bits(addr); @@ -6602,7 +6612,7 @@ size_t ScanMarkedObjectsAgainCarefullyClosure::do_object_careful_m( } if (_bitMap->isMarked(addr)) { // it's marked; is it potentially uninitialized? - if (p->klass() != NULL) { + if (p->klass_or_null() != NULL) { if (CMSPermGenPrecleaningEnabled && !p->is_parsable()) { // Signal precleaning to redirty the card since // the klass pointer is already installed. @@ -6615,11 +6625,8 @@ size_t ScanMarkedObjectsAgainCarefullyClosure::do_object_careful_m( if (p->is_objArray()) { // objArrays are precisely marked; restrict scanning // to dirty cards only. - size = p->oop_iterate(_scanningClosure, mr); - assert(size == CompactibleFreeListSpace::adjustObjectSize(size), - "adjustObjectSize should be the identity for array sizes, " - "which are necessarily larger than minimum object size of " - "two heap words"); + size = CompactibleFreeListSpace::adjustObjectSize( + p->oop_iterate(_scanningClosure, mr)); } else { // A non-array may have been imprecisely marked; we need // to scan object in its entirety. @@ -6653,7 +6660,7 @@ size_t ScanMarkedObjectsAgainCarefullyClosure::do_object_careful_m( } } else { // Either a not yet marked object or an uninitialized object - if (p->klass() == NULL || !p->is_parsable()) { + if (p->klass_or_null() == NULL || !p->is_parsable()) { // An uninitialized object, skip to the next card, since // we may not be able to read its P-bits yet. assert(size == 0, "Initial value"); @@ -6710,7 +6717,7 @@ size_t SurvivorSpacePrecleanClosure::do_object_careful(oop p) { HeapWord* addr = (HeapWord*)p; DEBUG_ONLY(_collector->verify_work_stacks_empty();) assert(!_span.contains(addr), "we are scanning the survivor spaces"); - assert(p->klass() != NULL, "object should be initializd"); + assert(p->klass_or_null() != NULL, "object should be initializd"); assert(p->is_parsable(), "must be parsable."); // an initialized object; ignore mark word in verification below // since we are running concurrent with mutators @@ -6868,7 +6875,7 @@ void MarkFromRootsClosure::do_bit(size_t offset) { assert(_skipBits == 0, "tautology"); _skipBits = 2; // skip next two marked bits ("Printezis-marks") oop p = oop(addr); - if (p->klass() == NULL || !p->is_parsable()) { + if (p->klass_or_null() == NULL || !p->is_parsable()) { DEBUG_ONLY(if (!_verifying) {) // We re-dirty the cards on which this object lies and increase // the _threshold so that we'll come back to scan this object @@ -6890,7 +6897,7 @@ void MarkFromRootsClosure::do_bit(size_t offset) { if (_threshold < end_card_addr) { _threshold = end_card_addr; } - if (p->klass() != NULL) { + if (p->klass_or_null() != NULL) { // Redirty the range of cards... _mut->mark_range(redirty_range); } // ...else the setting of klass will dirty the card anyway. @@ -7048,7 +7055,7 @@ void Par_MarkFromRootsClosure::do_bit(size_t offset) { assert(_skip_bits == 0, "tautology"); _skip_bits = 2; // skip next two marked bits ("Printezis-marks") oop p = oop(addr); - if (p->klass() == NULL || !p->is_parsable()) { + if (p->klass_or_null() == NULL || !p->is_parsable()) { // in the case of Clean-on-Enter optimization, redirty card // and avoid clearing card by increasing the threshold. return; @@ -8023,7 +8030,7 @@ size_t SweepClosure::doLiveChunk(FreeChunk* fc) { "alignment problem"); #ifdef DEBUG - if (oop(addr)->klass() != NULL && + if (oop(addr)->klass_or_null() != NULL && ( !_collector->should_unload_classes() || oop(addr)->is_parsable())) { // Ignore mark word because we are running concurrent with mutators @@ -8036,7 +8043,7 @@ size_t SweepClosure::doLiveChunk(FreeChunk* fc) { } else { // This should be an initialized object that's alive. - assert(oop(addr)->klass() != NULL && + assert(oop(addr)->klass_or_null() != NULL && (!_collector->should_unload_classes() || oop(addr)->is_parsable()), "Should be an initialized object"); diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp index 6d5546eeb95..dd8956cfd0b 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.inline.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.inline.hpp index 8dd2ca4abe4..208bafd86b6 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.inline.hpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeBlockDictionary.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeBlockDictionary.hpp index 2b140d0e369..309bc7a19c6 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeBlockDictionary.hpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeBlockDictionary.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,88 +22,6 @@ * */ -// -// Free block maintenance for Concurrent Mark Sweep Generation -// -// The main data structure for free blocks are -// . an indexed array of small free blocks, and -// . a dictionary of large free blocks -// - -// No virtuals in FreeChunk (don't want any vtables). - -// A FreeChunk is merely a chunk that can be in a doubly linked list -// and has a size field. NOTE: FreeChunks are distinguished from allocated -// objects in two ways (by the sweeper). The second word (prev) has the -// LSB set to indicate a free chunk; allocated objects' klass() pointers -// don't have their LSB set. The corresponding bit in the CMSBitMap is -// set when the chunk is allocated. There are also blocks that "look free" -// but are not part of the free list and should not be coalesced into larger -// free blocks. These free blocks have their two LSB's set. - -class FreeChunk VALUE_OBJ_CLASS_SPEC { - friend class VMStructs; - FreeChunk* _next; - FreeChunk* _prev; - size_t _size; - - public: - NOT_PRODUCT(static const size_t header_size();) - // Returns "true" if the "wrd", which is required to be the second word - // of a block, indicates that the block represents a free chunk. - static bool secondWordIndicatesFreeChunk(intptr_t wrd) { - return (wrd & 0x1) == 0x1; - } - bool isFree() const { - return secondWordIndicatesFreeChunk((intptr_t)_prev); - } - bool cantCoalesce() const { return (((intptr_t)_prev) & 0x3) == 0x3; } - FreeChunk* next() const { return _next; } - FreeChunk* prev() const { return (FreeChunk*)(((intptr_t)_prev) & ~(0x3)); } - debug_only(void* prev_addr() const { return (void*)&_prev; }) - - void linkAfter(FreeChunk* ptr) { - linkNext(ptr); - if (ptr != NULL) ptr->linkPrev(this); - } - void linkAfterNonNull(FreeChunk* ptr) { - assert(ptr != NULL, "precondition violation"); - linkNext(ptr); - ptr->linkPrev(this); - } - void linkNext(FreeChunk* ptr) { _next = ptr; } - void linkPrev(FreeChunk* ptr) { _prev = (FreeChunk*)((intptr_t)ptr | 0x1); } - void clearPrev() { _prev = NULL; } - void clearNext() { _next = NULL; } - void dontCoalesce() { - // the block should be free - assert(isFree(), "Should look like a free block"); - _prev = (FreeChunk*)(((intptr_t)_prev) | 0x2); - } - void markFree() { _prev = (FreeChunk*)((intptr_t)_prev | 0x1); } - void markNotFree() { _prev = NULL; } - - size_t size() const { return _size; } - void setSize(size_t size) { _size = size; } - - // For volatile reads: - size_t* size_addr() { return &_size; } - - // Return the address past the end of this chunk - HeapWord* end() const { return ((HeapWord*) this) + _size; } - - // debugging - void verify() const PRODUCT_RETURN; - void verifyList() const PRODUCT_RETURN; - void mangleAllocated(size_t size) PRODUCT_RETURN; - void mangleFreed(size_t size) PRODUCT_RETURN; -}; - -// Alignment helpers etc. -#define numQuanta(x,y) ((x+y-1)/y) -enum AlignmentConstants { - MinChunkSize = numQuanta(sizeof(FreeChunk), MinObjAlignmentInBytes) * MinObjAlignment -}; // A FreeBlockDictionary is an abstract superclass that will allow // a number of alternative implementations in the future. diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.cpp index b5153971b4e..494c090c6fb 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.cpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -47,15 +47,15 @@ void FreeChunk::mangleAllocated(size_t size) { Copy::fill_to_words(addr + hdr, size - hdr, baadbabeHeapWord); } -void FreeChunk::mangleFreed(size_t size) { +void FreeChunk::mangleFreed(size_t sz) { assert(baadbabeHeapWord != deadbeefHeapWord, "Need distinct patterns"); // mangle all but the header of a just-freed block of storage // just prior to passing it to the storage dictionary - assert(size >= MinChunkSize, "smallest size of object"); - assert(size == _size, "just checking"); + assert(sz >= MinChunkSize, "smallest size of object"); + assert(sz == size(), "just checking"); HeapWord* addr = (HeapWord*)this; size_t hdr = header_size(); - Copy::fill_to_words(addr + hdr, size - hdr, deadbeefHeapWord); + Copy::fill_to_words(addr + hdr, sz - hdr, deadbeefHeapWord); } void FreeChunk::verifyList() const { diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.hpp new file mode 100644 index 00000000000..10112108386 --- /dev/null +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.hpp @@ -0,0 +1,137 @@ +/* + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ + +// +// Free block maintenance for Concurrent Mark Sweep Generation +// +// The main data structure for free blocks are +// . an indexed array of small free blocks, and +// . a dictionary of large free blocks +// + +// No virtuals in FreeChunk (don't want any vtables). + +// A FreeChunk is merely a chunk that can be in a doubly linked list +// and has a size field. NOTE: FreeChunks are distinguished from allocated +// objects in two ways (by the sweeper), depending on whether the VM is 32 or +// 64 bits. +// In 32 bits or 64 bits without CompressedOops, the second word (prev) has the +// LSB set to indicate a free chunk; allocated objects' klass() pointers +// don't have their LSB set. The corresponding bit in the CMSBitMap is +// set when the chunk is allocated. There are also blocks that "look free" +// but are not part of the free list and should not be coalesced into larger +// free blocks. These free blocks have their two LSB's set. + +class FreeChunk VALUE_OBJ_CLASS_SPEC { + friend class VMStructs; + // For 64 bit compressed oops, the markOop encodes both the size and the + // indication that this is a FreeChunk and not an object. + volatile size_t _size; + FreeChunk* _prev; + FreeChunk* _next; + + markOop mark() const volatile { return (markOop)_size; } + void set_mark(markOop m) { _size = (size_t)m; } + + public: + NOT_PRODUCT(static const size_t header_size();) + + // Returns "true" if the address indicates that the block represents + // a free chunk. + static bool indicatesFreeChunk(const HeapWord* addr) { + // Force volatile read from addr because value might change between + // calls. We really want the read of _mark and _prev from this pointer + // to be volatile but making the fields volatile causes all sorts of + // compilation errors. + return ((volatile FreeChunk*)addr)->isFree(); + } + + bool isFree() const volatile { + LP64_ONLY(if (UseCompressedOops) return mark()->is_cms_free_chunk(); else) + return (((intptr_t)_prev) & 0x1) == 0x1; + } + bool cantCoalesce() const { + assert(isFree(), "can't get coalesce bit on not free"); + return (((intptr_t)_prev) & 0x2) == 0x2; + } + void dontCoalesce() { + // the block should be free + assert(isFree(), "Should look like a free block"); + _prev = (FreeChunk*)(((intptr_t)_prev) | 0x2); + } + FreeChunk* prev() const { + return (FreeChunk*)(((intptr_t)_prev) & ~(0x3)); + } + + debug_only(void* prev_addr() const { return (void*)&_prev; }) + + size_t size() const volatile { + LP64_ONLY(if (UseCompressedOops) return mark()->get_size(); else ) + return _size; + } + void setSize(size_t sz) { + LP64_ONLY(if (UseCompressedOops) set_mark(markOopDesc::set_size_and_free(sz)); else ) + _size = sz; + } + + FreeChunk* next() const { return _next; } + + void linkAfter(FreeChunk* ptr) { + linkNext(ptr); + if (ptr != NULL) ptr->linkPrev(this); + } + void linkAfterNonNull(FreeChunk* ptr) { + assert(ptr != NULL, "precondition violation"); + linkNext(ptr); + ptr->linkPrev(this); + } + void linkNext(FreeChunk* ptr) { _next = ptr; } + void linkPrev(FreeChunk* ptr) { + LP64_ONLY(if (UseCompressedOops) _prev = ptr; else) + _prev = (FreeChunk*)((intptr_t)ptr | 0x1); + } + void clearPrev() { _prev = NULL; } + void clearNext() { _next = NULL; } + void markNotFree() { + LP64_ONLY(if (UseCompressedOops) set_mark(markOopDesc::prototype());) + // Also set _prev to null + _prev = NULL; + } + + // Return the address past the end of this chunk + HeapWord* end() const { return ((HeapWord*) this) + size(); } + + // debugging + void verify() const PRODUCT_RETURN; + void verifyList() const PRODUCT_RETURN; + void mangleAllocated(size_t size) PRODUCT_RETURN; + void mangleFreed(size_t size) PRODUCT_RETURN; +}; + +// Alignment helpers etc. +#define numQuanta(x,y) ((x+y-1)/y) +enum AlignmentConstants { + MinChunkSize = numQuanta(sizeof(FreeChunk), MinObjAlignmentInBytes) * MinObjAlignment +}; + diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeList.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeList.cpp index e7b1b3aae8d..79503deb81d 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeList.cpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeList.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeList.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeList.hpp index b553dd3fe47..581317643c7 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeList.hpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeList.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,6 +38,7 @@ class Mutex; class FreeList VALUE_OBJ_CLASS_SPEC { friend class CompactibleFreeListSpace; + friend class VMStructs; friend class printTreeCensusClosure; FreeChunk* _head; // List of free chunks FreeChunk* _tail; // Tail of list of free chunks 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 bce90cab897..4bebd43810e 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/vmStructs_cms.hpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/vmStructs_cms.hpp @@ -23,6 +23,7 @@ */ #define VM_STRUCTS_CMS(nonstatic_field, \ + volatile_nonstatic_field, \ static_field) \ nonstatic_field(CompactibleFreeListSpace, _collector, CMSCollector*) \ nonstatic_field(CompactibleFreeListSpace, _bt, BlockOffsetArrayNonContigSpace) \ @@ -36,9 +37,17 @@ 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(FreeChunk, _size, size_t) + nonstatic_field(LinearAllocBlock, _word_size, size_t) \ + nonstatic_field(FreeList, _size, size_t) \ + nonstatic_field(FreeList, _count, ssize_t) \ + nonstatic_field(BinaryTreeDictionary, _totalSize, size_t) \ + nonstatic_field(CompactibleFreeListSpace, _dictionary, FreeBlockDictionary*) \ + nonstatic_field(CompactibleFreeListSpace, _indexedFreeList[0], FreeList) \ + nonstatic_field(CompactibleFreeListSpace, _smallLinearAllocBlock, LinearAllocBlock) + #define VM_TYPES_CMS(declare_type, \ declare_toplevel_type) \ @@ -57,7 +66,14 @@ declare_toplevel_type(SurrogateLockerThread*) \ declare_toplevel_type(CompactibleFreeListSpace*) \ declare_toplevel_type(CMSCollector*) \ - declare_toplevel_type(FreeChunk*) + declare_toplevel_type(FreeChunk*) \ + declare_toplevel_type(BinaryTreeDictionary*) \ + declare_toplevel_type(FreeBlockDictionary*) \ + declare_toplevel_type(FreeList*) \ + declare_toplevel_type(FreeList) \ + declare_toplevel_type(LinearAllocBlock) \ + declare_toplevel_type(FreeBlockDictionary) \ + declare_type(BinaryTreeDictionary, FreeBlockDictionary) #define VM_INT_CONSTANTS_CMS(declare_constant) \ declare_constant(Generation::ConcurrentMarkSweep) \ diff --git a/hotspot/src/share/vm/gc_implementation/includeDB_gc_concurrentMarkSweep b/hotspot/src/share/vm/gc_implementation/includeDB_gc_concurrentMarkSweep index f715c15c0b0..580a83167fa 100644 --- a/hotspot/src/share/vm/gc_implementation/includeDB_gc_concurrentMarkSweep +++ b/hotspot/src/share/vm/gc_implementation/includeDB_gc_concurrentMarkSweep @@ -1,5 +1,5 @@ // -// Copyright 2004-2006 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 2004-2008 Sun Microsystems, Inc. All Rights Reserved. // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. // // This code is free software; you can redistribute it and/or modify it @@ -206,6 +206,7 @@ freeBlockDictionary.cpp thread_.inline.hpp freeBlockDictionary.hpp allocation.hpp freeBlockDictionary.hpp debug.hpp +freeBlockDictionary.hpp freeChunk.hpp freeBlockDictionary.hpp globalDefinitions.hpp freeBlockDictionary.hpp memRegion.hpp freeBlockDictionary.hpp mutex.hpp @@ -214,6 +215,14 @@ freeBlockDictionary.hpp ostream.hpp freeChunk.cpp copy.hpp freeChunk.cpp freeBlockDictionary.hpp +freeChunk.hpp allocation.hpp +freeChunk.hpp debug.hpp +freeChunk.hpp globalDefinitions.hpp +freeChunk.hpp markOop.hpp +freeChunk.hpp memRegion.hpp +freeChunk.hpp mutex.hpp +freeChunk.hpp ostream.hpp + freeList.cpp freeBlockDictionary.hpp freeList.cpp freeList.hpp freeList.cpp globals.hpp diff --git a/hotspot/src/share/vm/gc_implementation/includeDB_gc_parallelScavenge b/hotspot/src/share/vm/gc_implementation/includeDB_gc_parallelScavenge index 8a2a7a6127b..98ce44ea95d 100644 --- a/hotspot/src/share/vm/gc_implementation/includeDB_gc_parallelScavenge +++ b/hotspot/src/share/vm/gc_implementation/includeDB_gc_parallelScavenge @@ -1,5 +1,5 @@ // -// Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. // // This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/includeDB_gc_shared b/hotspot/src/share/vm/gc_implementation/includeDB_gc_shared index ca8a47fa2fa..f1d70f8bbba 100644 --- a/hotspot/src/share/vm/gc_implementation/includeDB_gc_shared +++ b/hotspot/src/share/vm/gc_implementation/includeDB_gc_shared @@ -1,5 +1,5 @@ // -// Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. // // This code is free software; you can redistribute it and/or modify it @@ -54,6 +54,7 @@ isGCActiveMark.hpp parallelScavengeHeap.hpp markSweep.inline.hpp psParallelCompact.hpp mutableNUMASpace.cpp mutableNUMASpace.hpp +mutableNUMASpace.cpp oop.inline.hpp mutableNUMASpace.cpp sharedHeap.hpp mutableNUMASpace.cpp thread_.inline.hpp diff --git a/hotspot/src/share/vm/gc_implementation/parNew/asParNewGeneration.cpp b/hotspot/src/share/vm/gc_implementation/parNew/asParNewGeneration.cpp index fa4a554b976..203bd7ddc70 100644 --- a/hotspot/src/share/vm/gc_implementation/parNew/asParNewGeneration.cpp +++ b/hotspot/src/share/vm/gc_implementation/parNew/asParNewGeneration.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.cpp b/hotspot/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.cpp index 4a3bf249229..94377a3beb4 100644 --- a/hotspot/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.cpp +++ b/hotspot/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.hpp b/hotspot/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.hpp index d8caac661e2..89331a81bd3 100644 --- a/hotspot/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.hpp +++ b/hotspot/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp index 36b8bb2476b..ed990a463a1 100644 --- a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp +++ b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1169,18 +1169,18 @@ ParNewGeneration::take_from_overflow_list(ParScanThreadState* par_scan_state) { // Trim off a prefix of at most objsFromOverflow items int i = 1; oop cur = prefix; - while (i < objsFromOverflow && cur->klass() != NULL) { + while (i < objsFromOverflow && cur->klass_or_null() != NULL) { i++; cur = oop(cur->klass()); } // Reattach remaining (suffix) to overflow list - if (cur->klass() != NULL) { + if (cur->klass_or_null() != NULL) { oop suffix = oop(cur->klass()); cur->set_klass_to_list_ptr(NULL); // Find last item of suffix list oop last = suffix; - while (last->klass() != NULL) { + while (last->klass_or_null() != NULL) { last = oop(last->klass()); } // Atomically prepend suffix to current overflow list diff --git a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp index 19564e7b670..a9e2d199f6c 100644 --- a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp +++ b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/asPSYoungGen.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/asPSYoungGen.cpp index 7ef34bb89bd..c8555fdfcaa 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/asPSYoungGen.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/asPSYoungGen.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.cpp index 2b2c6f87c51..c0a4d5857bc 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.hpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.hpp index 8722e0f3b28..df1e6e2aeae 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.hpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.hpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.hpp index 4f284a5d572..b3322db384f 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.hpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp index 7281b10f7db..204bf39171b 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -61,6 +61,8 @@ ParMarkBitMap::initialize(MemRegion covered_region) if (_virtual_space != NULL) { delete _virtual_space; _virtual_space = NULL; + // Release memory reserved in the space. + rs.release(); } return false; } diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp index 6fd50b39fc5..6814abf6b44 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -108,8 +108,8 @@ jint ParallelScavengeHeap::initialize() { // size than is needed or wanted for the perm gen. Use the "compound // alignment" ReservedSpace ctor to avoid having to use the same page size for // all gens. - ReservedSpace heap_rs(pg_max_size, pg_align, og_max_size + yg_max_size, - og_align); + ReservedHeapSpace heap_rs(pg_max_size, pg_align, og_max_size + yg_max_size, + og_align); os::trace_page_sizes("ps perm", pg_min_size, pg_max_size, pg_page_sz, heap_rs.base(), pg_max_size); os::trace_page_sizes("ps main", og_min_size + yg_min_size, diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp index d26eec48882..75c6830cdc1 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/pcTasks.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/pcTasks.cpp index 994e627ed9d..2237542f523 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/pcTasks.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/pcTasks.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/prefetchQueue.hpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/prefetchQueue.hpp index 53775a79de6..5266d67319b 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/prefetchQueue.hpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/prefetchQueue.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweepDecorator.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweepDecorator.cpp index cec3a48db1a..8c8bff54dff 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweepDecorator.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweepDecorator.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp index 98b347cf6e1..7bfbdb53978 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -422,6 +422,8 @@ ParallelCompactData::create_vspace(size_t count, size_t element_size) return vspace; } delete vspace; + // Release memory reserved in the space. + rs.release(); } return 0; @@ -1004,6 +1006,9 @@ void PSParallelCompact::pre_compact(PreGCValues* pre_gc_values) DEBUG_ONLY(mark_bitmap()->verify_clear();) DEBUG_ONLY(summary_data().verify_clear();) + + // Have worker threads release resources the next time they run a task. + gc_task_manager()->release_all_resources(); } void PSParallelCompact::post_compact() @@ -1949,12 +1954,6 @@ void PSParallelCompact::invoke_no_policy(bool maximum_heap_compaction) { TimeStamp compaction_start; TimeStamp collection_exit; - // "serial_CM" is needed until the parallel implementation - // of the move and update is done. - ParCompactionManager* serial_CM = new ParCompactionManager(); - // Don't initialize more than once. - // serial_CM->initialize(&summary_data(), mark_bitmap()); - ParallelScavengeHeap* heap = gc_heap(); GCCause::Cause gc_cause = heap->gc_cause(); PSYoungGen* young_gen = heap->young_gen(); @@ -1969,6 +1968,10 @@ void PSParallelCompact::invoke_no_policy(bool maximum_heap_compaction) { PreGCValues pre_gc_values; pre_compact(&pre_gc_values); + // Get the compaction manager reserved for the VM thread. + ParCompactionManager* const vmthread_cm = + ParCompactionManager::manager_array(gc_task_manager()->workers()); + // Place after pre_compact() where the number of invocations is incremented. AdaptiveSizePolicyOutput(size_policy, heap->total_collections()); @@ -2008,7 +2011,7 @@ void PSParallelCompact::invoke_no_policy(bool maximum_heap_compaction) { bool marked_for_unloading = false; marking_start.update(); - marking_phase(serial_CM, maximum_heap_compaction); + marking_phase(vmthread_cm, maximum_heap_compaction); #ifndef PRODUCT if (TraceParallelOldGCMarkingPhase) { @@ -2039,7 +2042,7 @@ void PSParallelCompact::invoke_no_policy(bool maximum_heap_compaction) { #endif bool max_on_system_gc = UseMaximumCompactionOnSystemGC && is_system_gc; - summary_phase(serial_CM, maximum_heap_compaction || max_on_system_gc); + summary_phase(vmthread_cm, maximum_heap_compaction || max_on_system_gc); #ifdef ASSERT if (VerifyParallelOldWithMarkSweep && @@ -2067,13 +2070,13 @@ void PSParallelCompact::invoke_no_policy(bool maximum_heap_compaction) { // code can use the the forwarding pointers to // check the new pointer calculation. The restore_marks() // has to be done before the real compact. - serial_CM->set_action(ParCompactionManager::VerifyUpdate); - compact_perm(serial_CM); - compact_serial(serial_CM); - serial_CM->set_action(ParCompactionManager::ResetObjects); - compact_perm(serial_CM); - compact_serial(serial_CM); - serial_CM->set_action(ParCompactionManager::UpdateAndCopy); + vmthread_cm->set_action(ParCompactionManager::VerifyUpdate); + compact_perm(vmthread_cm); + compact_serial(vmthread_cm); + vmthread_cm->set_action(ParCompactionManager::ResetObjects); + compact_perm(vmthread_cm); + compact_serial(vmthread_cm); + vmthread_cm->set_action(ParCompactionManager::UpdateAndCopy); // For debugging only PSMarkSweep::restore_marks(); @@ -2084,16 +2087,14 @@ void PSParallelCompact::invoke_no_policy(bool maximum_heap_compaction) { compaction_start.update(); // Does the perm gen always have to be done serially because // klasses are used in the update of an object? - compact_perm(serial_CM); + compact_perm(vmthread_cm); if (UseParallelOldGCCompacting) { compact(); } else { - compact_serial(serial_CM); + compact_serial(vmthread_cm); } - delete serial_CM; - // Reset the mark bitmap, summary data, and do other bookkeeping. Must be // done before resizing. post_compact(); diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp index 9566821169b..e680a000919 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.cpp index 8a1893f2132..fc35aa33f60 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.hpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.hpp index ee8c2d78338..f5af16546e7 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.hpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2002 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.cpp index 92a5002d80e..dd74617ebb3 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.hpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.hpp index b18674ea819..674a951bfcc 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.hpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.inline.hpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.inline.hpp index 73cc15f32ae..f1a9e64fe93 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.inline.hpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp index 5f960dc9ece..cd5652de3f1 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.hpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.hpp index 1f8ad940713..1ca050823a4 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.hpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.inline.hpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.inline.hpp index 08b576c775e..40b14d4b88d 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.inline.hpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psTasks.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psTasks.cpp index dd5d1045fc1..52913e07518 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psTasks.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psTasks.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.cpp index 912f5414cc9..001f579e5d2 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.cpp @@ -71,13 +71,8 @@ bool PSVirtualSpace::contains(void* p) const { void PSVirtualSpace::release() { DEBUG_ONLY(PSVirtualSpaceVerifier this_verifier(this)); - if (reserved_low_addr() != NULL) { - if (special()) { - os::release_memory_special(reserved_low_addr(), reserved_size()); - } else { - (void)os::release_memory(reserved_low_addr(), reserved_size()); - } - } + // This may not release memory it didn't reserve. + // Use rs.release() to release the underlying memory instead. _reserved_low_addr = _reserved_high_addr = NULL; _committed_low_addr = _committed_high_addr = NULL; _special = false; diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.cpp index b7088556bdc..26452649c6b 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/shared/allocationStats.cpp b/hotspot/src/share/vm/gc_implementation/shared/allocationStats.cpp index 2145394123b..fc8518f1ac3 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/allocationStats.cpp +++ b/hotspot/src/share/vm/gc_implementation/shared/allocationStats.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/shared/allocationStats.hpp b/hotspot/src/share/vm/gc_implementation/shared/allocationStats.hpp index a60fc2bc164..4772f7c45bc 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/allocationStats.hpp +++ b/hotspot/src/share/vm/gc_implementation/shared/allocationStats.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/shared/immutableSpace.cpp b/hotspot/src/share/vm/gc_implementation/shared/immutableSpace.cpp index 2485fee4a05..35af5fcf60f 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/immutableSpace.cpp +++ b/hotspot/src/share/vm/gc_implementation/shared/immutableSpace.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -66,7 +66,7 @@ void ImmutableSpace::print() const { #endif -void ImmutableSpace::verify(bool allow_dirty) const { +void ImmutableSpace::verify(bool allow_dirty) { HeapWord* p = bottom(); HeapWord* t = end(); HeapWord* prev_p = NULL; diff --git a/hotspot/src/share/vm/gc_implementation/shared/immutableSpace.hpp b/hotspot/src/share/vm/gc_implementation/shared/immutableSpace.hpp index 4d62bd8e7ae..3f28ec710e4 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/immutableSpace.hpp +++ b/hotspot/src/share/vm/gc_implementation/shared/immutableSpace.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -59,5 +59,5 @@ class ImmutableSpace: public CHeapObj { // Debugging virtual void print() const PRODUCT_RETURN; virtual void print_short() const PRODUCT_RETURN; - virtual void verify(bool allow_dirty) const; + virtual void verify(bool allow_dirty); }; diff --git a/hotspot/src/share/vm/gc_implementation/shared/markSweep.cpp b/hotspot/src/share/vm/gc_implementation/shared/markSweep.cpp index ee77a7f52df..c18d6e877bd 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/markSweep.cpp +++ b/hotspot/src/share/vm/gc_implementation/shared/markSweep.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/shared/markSweep.hpp b/hotspot/src/share/vm/gc_implementation/shared/markSweep.hpp index d0ede4efba7..b2e8d22d153 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/markSweep.hpp +++ b/hotspot/src/share/vm/gc_implementation/shared/markSweep.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/shared/markSweep.inline.hpp b/hotspot/src/share/vm/gc_implementation/shared/markSweep.inline.hpp index c4045ee988e..fdcf48db842 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/markSweep.inline.hpp +++ b/hotspot/src/share/vm/gc_implementation/shared/markSweep.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp b/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp index 959c4e1b6bf..48bfea8b6ff 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp +++ b/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp @@ -1,6 +1,6 @@ /* - * Copyright 2006-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -599,12 +599,28 @@ void MutableNUMASpace::initialize(MemRegion mr, bool clear_space) { // Mark the the holes in chunks below the top() as invalid. void MutableNUMASpace::set_top(HeapWord* value) { bool found_top = false; - for (int i = 0; i < lgrp_spaces()->length(); i++) { + for (int i = 0; i < lgrp_spaces()->length();) { LGRPSpace *ls = lgrp_spaces()->at(i); MutableSpace *s = ls->space(); HeapWord *top = MAX2((HeapWord*)round_down((intptr_t)s->top(), page_size()), s->bottom()); if (s->contains(value)) { + // Check if setting the chunk's top to a given value would create a hole less than + // a minimal object; assuming that's not the last chunk in which case we don't care. + if (i < lgrp_spaces()->length() - 1) { + size_t remainder = pointer_delta(s->end(), value); + const size_t minimal_object_size = oopDesc::header_size(); + if (remainder < minimal_object_size && remainder > 0) { + // Add a filler object of a minimal size, it will cross the chunk boundary. + SharedHeap::fill_region_with_object(MemRegion(value, minimal_object_size)); + value += minimal_object_size; + assert(!s->contains(value), "Should be in the next chunk"); + // Restart the loop from the same chunk, since the value has moved + // to the next one. + continue; + } + } + if (!os::numa_has_static_binding() && top < value && top < s->end()) { ls->add_invalid_region(MemRegion(top, value)); } @@ -620,6 +636,7 @@ void MutableNUMASpace::set_top(HeapWord* value) { s->set_top(s->end()); } } + i++; } MutableSpace::set_top(value); } @@ -700,12 +717,14 @@ HeapWord* MutableNUMASpace::cas_allocate(size_t size) { MutableSpace *s = lgrp_spaces()->at(i)->space(); HeapWord *p = s->cas_allocate(size); if (p != NULL) { - size_t remainder = pointer_delta(s->end(), p); + size_t remainder = pointer_delta(s->end(), p + size); if (remainder < (size_t)oopDesc::header_size() && remainder > 0) { if (s->cas_deallocate(p, size)) { // We were the last to allocate and created a fragment less than // a minimal object. p = NULL; + } else { + guarantee(false, "Deallocation should always succeed"); } } } @@ -761,10 +780,12 @@ void MutableNUMASpace::print_on(outputStream* st) const { } } -void MutableNUMASpace::verify(bool allow_dirty) const { - for (int i = 0; i < lgrp_spaces()->length(); i++) { - lgrp_spaces()->at(i)->space()->verify(allow_dirty); - } +void MutableNUMASpace::verify(bool allow_dirty) { + // This can be called after setting an arbitary value to the space's top, + // so an object can cross the chunk boundary. We ensure the parsablity + // of the space and just walk the objects in linear fashion. + ensure_parsability(); + MutableSpace::verify(allow_dirty); } // Scan pages and gather stats about page placement and size. diff --git a/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.hpp b/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.hpp index a0fd5791ad7..2cde6413eda 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.hpp +++ b/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2006-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -192,7 +192,7 @@ class MutableNUMASpace : public MutableSpace { // Debugging virtual void print_on(outputStream* st) const; virtual void print_short_on(outputStream* st) const; - virtual void verify(bool allow_dirty) const; + virtual void verify(bool allow_dirty); virtual void set_top(HeapWord* value); }; diff --git a/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.cpp b/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.cpp index 5c3a9e01029..26621da944e 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.cpp +++ b/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -118,7 +118,7 @@ void MutableSpace::print_on(outputStream* st) const { bottom(), top(), end()); } -void MutableSpace::verify(bool allow_dirty) const { +void MutableSpace::verify(bool allow_dirty) { HeapWord* p = bottom(); HeapWord* t = top(); HeapWord* prev_p = NULL; diff --git a/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.hpp b/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.hpp index f9d43ba262f..91586c5068f 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.hpp +++ b/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -98,5 +98,5 @@ class MutableSpace: public ImmutableSpace { virtual void print_on(outputStream* st) const; virtual void print_short() const; virtual void print_short_on(outputStream* st) const; - virtual void verify(bool allow_dirty) const; + virtual void verify(bool allow_dirty); }; diff --git a/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.cpp b/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.cpp index 7cab57dd727..eee135f67df 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.cpp +++ b/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp b/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp index 7777dc71c84..fcce0cc3b51 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp +++ b/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_interface/collectedHeap.cpp b/hotspot/src/share/vm/gc_interface/collectedHeap.cpp index ecfab9ed6cd..8ddf46a48e2 100644 --- a/hotspot/src/share/vm/gc_interface/collectedHeap.cpp +++ b/hotspot/src/share/vm/gc_interface/collectedHeap.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_interface/collectedHeap.hpp b/hotspot/src/share/vm/gc_interface/collectedHeap.hpp index ef55f14676e..492801e983e 100644 --- a/hotspot/src/share/vm/gc_interface/collectedHeap.hpp +++ b/hotspot/src/share/vm/gc_interface/collectedHeap.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/gc_interface/collectedHeap.inline.hpp b/hotspot/src/share/vm/gc_interface/collectedHeap.inline.hpp index 556cd490f96..c2f3caeb507 100644 --- a/hotspot/src/share/vm/gc_interface/collectedHeap.inline.hpp +++ b/hotspot/src/share/vm/gc_interface/collectedHeap.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -90,11 +90,12 @@ void CollectedHeap::post_allocation_setup_array(KlassHandle klass, HeapWord* obj, size_t size, int length) { + // Set array length before setting the _klass field + // in post_allocation_setup_common() because the klass field + // indicates that the object is parsable by concurrent GC. assert(length >= 0, "length should be non-negative"); - post_allocation_setup_common(klass, obj, size); - // Must set length after installing klass as set_klass zeros the length - // field in UseCompressedOops ((arrayOop)obj)->set_length(length); + post_allocation_setup_common(klass, obj, size); assert(((oop)obj)->blueprint()->oop_is_array(), "must be an array"); // notify jvmti and dtrace (must be after length is set for dtrace) post_allocation_notify(klass, (oop)obj); @@ -224,6 +225,7 @@ void CollectedHeap::init_obj(HeapWord* obj, size_t size) { assert(obj != NULL, "cannot initialize NULL object"); const size_t hs = oopDesc::header_size(); assert(size >= hs, "unexpected object size"); + ((oop)obj)->set_klass_gap(0); Copy::fill_to_aligned_words(obj + hs, size - hs); } diff --git a/hotspot/src/share/vm/includeDB_compiler1 b/hotspot/src/share/vm/includeDB_compiler1 index ae500d2f6d7..3509507f10b 100644 --- a/hotspot/src/share/vm/includeDB_compiler1 +++ b/hotspot/src/share/vm/includeDB_compiler1 @@ -1,5 +1,5 @@ // -// Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. // // This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/includeDB_compiler2 b/hotspot/src/share/vm/includeDB_compiler2 index 43233ad41dd..1d2cb6d8b15 100644 --- a/hotspot/src/share/vm/includeDB_compiler2 +++ b/hotspot/src/share/vm/includeDB_compiler2 @@ -1,5 +1,5 @@ // -// Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. // // This code is free software; you can redistribute it and/or modify it @@ -1084,6 +1084,7 @@ idealGraphPrinter.hpp dict.hpp idealGraphPrinter.hpp vectset.hpp idealGraphPrinter.hpp growableArray.hpp idealGraphPrinter.hpp ostream.hpp +idealGraphPrinter.hpp xmlstream.hpp idealGraphPrinter.cpp idealGraphPrinter.hpp idealGraphPrinter.cpp chaitin.hpp diff --git a/hotspot/src/share/vm/includeDB_core b/hotspot/src/share/vm/includeDB_core index 616a974bb20..0c53185fd0e 100644 --- a/hotspot/src/share/vm/includeDB_core +++ b/hotspot/src/share/vm/includeDB_core @@ -1,5 +1,5 @@ // -// Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. +// Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. // // This code is free software; you can redistribute it and/or modify it @@ -3492,6 +3492,7 @@ relocInfo.hpp top.hpp relocInfo_.cpp assembler.inline.hpp relocInfo_.cpp assembler_.inline.hpp relocInfo_.cpp nativeInst_.hpp +relocInfo_.cpp oop.inline.hpp relocInfo_.cpp relocInfo.hpp relocInfo_.cpp safepoint.hpp diff --git a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp index 547b440e177..b4204414a94 100644 --- a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp +++ b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1931,6 +1931,7 @@ run: } else { result->set_mark(markOopDesc::prototype()); } + result->set_klass_gap(0); result->set_klass(k_entry); SET_STACK_OBJECT(result, 0); UPDATE_PC_AND_TOS_AND_CONTINUE(3, 1); diff --git a/hotspot/src/share/vm/interpreter/bytecodeInterpreterWithChecks.xml b/hotspot/src/share/vm/interpreter/bytecodeInterpreterWithChecks.xml index 56d97c6ee29..a5696213db9 100644 --- a/hotspot/src/share/vm/interpreter/bytecodeInterpreterWithChecks.xml +++ b/hotspot/src/share/vm/interpreter/bytecodeInterpreterWithChecks.xml @@ -1,7 +1,25 @@ diff --git a/hotspot/src/share/vm/interpreter/bytecodeInterpreterWithChecks.xsl b/hotspot/src/share/vm/interpreter/bytecodeInterpreterWithChecks.xsl index 28cd8712d28..ddac81c6d41 100644 --- a/hotspot/src/share/vm/interpreter/bytecodeInterpreterWithChecks.xsl +++ b/hotspot/src/share/vm/interpreter/bytecodeInterpreterWithChecks.xsl @@ -1,10 +1,29 @@ + @@ -15,7 +34,6 @@ - diff --git a/hotspot/src/share/vm/interpreter/interpreterRuntime.hpp b/hotspot/src/share/vm/interpreter/interpreterRuntime.hpp index 82f73d8ac96..3f096580e55 100644 --- a/hotspot/src/share/vm/interpreter/interpreterRuntime.hpp +++ b/hotspot/src/share/vm/interpreter/interpreterRuntime.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/interpreter/oopMapCache.cpp b/hotspot/src/share/vm/interpreter/oopMapCache.cpp index 32d731ddd1c..3b45b5956ec 100644 --- a/hotspot/src/share/vm/interpreter/oopMapCache.cpp +++ b/hotspot/src/share/vm/interpreter/oopMapCache.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/barrierSet.hpp b/hotspot/src/share/vm/memory/barrierSet.hpp index aa56fa9e883..5d04d673c17 100644 --- a/hotspot/src/share/vm/memory/barrierSet.hpp +++ b/hotspot/src/share/vm/memory/barrierSet.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2002 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/barrierSet.inline.hpp b/hotspot/src/share/vm/memory/barrierSet.inline.hpp index ab89a4d4668..c6ddc55a5bb 100644 --- a/hotspot/src/share/vm/memory/barrierSet.inline.hpp +++ b/hotspot/src/share/vm/memory/barrierSet.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2002 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/cardTableModRefBS.cpp b/hotspot/src/share/vm/memory/cardTableModRefBS.cpp index fab92e0f698..5f32640497e 100644 --- a/hotspot/src/share/vm/memory/cardTableModRefBS.cpp +++ b/hotspot/src/share/vm/memory/cardTableModRefBS.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -196,6 +196,8 @@ void CardTableModRefBS::resize_covered_region(MemRegion new_region) { assert(_whole_heap.contains(new_region), "attempt to cover area not in reserved area"); debug_only(verify_guard();) + // collided is true if the expansion would push into another committed region + debug_only(bool collided = false;) int const ind = find_covering_region_by_base(new_region.start()); MemRegion const old_region = _covered[ind]; assert(old_region.start() == new_region.start(), "just checking"); @@ -211,12 +213,36 @@ void CardTableModRefBS::resize_covered_region(MemRegion new_region) { } // Align the end up to a page size (starts are already aligned). jbyte* const new_end = byte_after(new_region.last()); - HeapWord* const new_end_aligned = + HeapWord* new_end_aligned = (HeapWord*) align_size_up((uintptr_t)new_end, _page_size); assert(new_end_aligned >= (HeapWord*) new_end, "align up, but less"); + int ri = 0; + for (ri = 0; ri < _cur_covered_regions; ri++) { + if (ri != ind) { + if (_committed[ri].contains(new_end_aligned)) { + assert((new_end_aligned >= _committed[ri].start()) && + (_committed[ri].start() > _committed[ind].start()), + "New end of committed region is inconsistent"); + new_end_aligned = _committed[ri].start(); + assert(new_end_aligned > _committed[ind].start(), + "New end of committed region is before start"); + debug_only(collided = true;) + // Should only collide with 1 region + break; + } + } + } +#ifdef ASSERT + for (++ri; ri < _cur_covered_regions; ri++) { + assert(!_committed[ri].contains(new_end_aligned), + "New end of committed region is in a second committed region"); + } +#endif // The guard page is always committed and should not be committed over. - HeapWord* const new_end_for_commit = MIN2(new_end_aligned, _guard_region.start()); + HeapWord* const new_end_for_commit = MIN2(new_end_aligned, + _guard_region.start()); + if (new_end_for_commit > cur_committed.end()) { // Must commit new pages. MemRegion const new_committed = @@ -239,9 +265,11 @@ void CardTableModRefBS::resize_covered_region(MemRegion new_region) { if (!uncommit_region.is_empty()) { if (!os::uncommit_memory((char*)uncommit_region.start(), uncommit_region.byte_size())) { - // Do better than this for Merlin - vm_exit_out_of_memory(uncommit_region.byte_size(), - "card table contraction"); + assert(false, "Card table contraction failed"); + // The call failed so don't change the end of the + // committed region. This is better than taking the + // VM down. + new_end_aligned = _committed[ind].end(); } } } @@ -257,8 +285,25 @@ void CardTableModRefBS::resize_covered_region(MemRegion new_region) { } assert(index_for(new_region.last()) < (int) _guard_index, "The guard card will be overwritten"); - jbyte* const end = byte_after(new_region.last()); + // This line commented out cleans the newly expanded region and + // not the aligned up expanded region. + // jbyte* const end = byte_after(new_region.last()); + jbyte* const end = (jbyte*) new_end_for_commit; + assert((end >= byte_after(new_region.last())) || collided, + "Expect to be beyond new region unless impacting another region"); // do nothing if we resized downward. +#ifdef ASSERT + for (int ri = 0; ri < _cur_covered_regions; ri++) { + if (ri != ind) { + // The end of the new committed region should not + // be in any existing region unless it matches + // the start of the next region. + assert(!_committed[ri].contains(end) || + (_committed[ri].start() == (HeapWord*) end), + "Overlapping committed regions"); + } + } +#endif if (entry < end) { memset(entry, clean_card, pointer_delta(end, entry, sizeof(jbyte))); } diff --git a/hotspot/src/share/vm/memory/cardTableModRefBS.hpp b/hotspot/src/share/vm/memory/cardTableModRefBS.hpp index dcc457111df..fa1db5f74b7 100644 --- a/hotspot/src/share/vm/memory/cardTableModRefBS.hpp +++ b/hotspot/src/share/vm/memory/cardTableModRefBS.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/cardTableRS.cpp b/hotspot/src/share/vm/memory/cardTableRS.cpp index e84cc57f085..287cbd85751 100644 --- a/hotspot/src/share/vm/memory/cardTableRS.cpp +++ b/hotspot/src/share/vm/memory/cardTableRS.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/cardTableRS.hpp b/hotspot/src/share/vm/memory/cardTableRS.hpp index c2180de67d3..dab96d3991b 100644 --- a/hotspot/src/share/vm/memory/cardTableRS.hpp +++ b/hotspot/src/share/vm/memory/cardTableRS.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/collectorPolicy.cpp b/hotspot/src/share/vm/memory/collectorPolicy.cpp index b26158e247b..2d86d6466d3 100644 --- a/hotspot/src/share/vm/memory/collectorPolicy.cpp +++ b/hotspot/src/share/vm/memory/collectorPolicy.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/collectorPolicy.hpp b/hotspot/src/share/vm/memory/collectorPolicy.hpp index da98dfd0106..a1cea1544bc 100644 --- a/hotspot/src/share/vm/memory/collectorPolicy.hpp +++ b/hotspot/src/share/vm/memory/collectorPolicy.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/compactingPermGenGen.cpp b/hotspot/src/share/vm/memory/compactingPermGenGen.cpp index 78ada701405..2ba5222cde1 100644 --- a/hotspot/src/share/vm/memory/compactingPermGenGen.cpp +++ b/hotspot/src/share/vm/memory/compactingPermGenGen.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/defNewGeneration.cpp b/hotspot/src/share/vm/memory/defNewGeneration.cpp index d13c9e9adff..a18734ec673 100644 --- a/hotspot/src/share/vm/memory/defNewGeneration.cpp +++ b/hotspot/src/share/vm/memory/defNewGeneration.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/defNewGeneration.hpp b/hotspot/src/share/vm/memory/defNewGeneration.hpp index 893afc055c7..9f7d6329137 100644 --- a/hotspot/src/share/vm/memory/defNewGeneration.hpp +++ b/hotspot/src/share/vm/memory/defNewGeneration.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/defNewGeneration.inline.hpp b/hotspot/src/share/vm/memory/defNewGeneration.inline.hpp index 23a96984564..677e2862a92 100644 --- a/hotspot/src/share/vm/memory/defNewGeneration.inline.hpp +++ b/hotspot/src/share/vm/memory/defNewGeneration.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/dump.cpp b/hotspot/src/share/vm/memory/dump.cpp index 9499336282b..0b088528270 100644 --- a/hotspot/src/share/vm/memory/dump.cpp +++ b/hotspot/src/share/vm/memory/dump.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/gcLocker.cpp b/hotspot/src/share/vm/memory/gcLocker.cpp index 4e770e01b36..445884e4ea1 100644 --- a/hotspot/src/share/vm/memory/gcLocker.cpp +++ b/hotspot/src/share/vm/memory/gcLocker.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/gcLocker.hpp b/hotspot/src/share/vm/memory/gcLocker.hpp index b14b75797f1..109f4619772 100644 --- a/hotspot/src/share/vm/memory/gcLocker.hpp +++ b/hotspot/src/share/vm/memory/gcLocker.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/genCollectedHeap.cpp b/hotspot/src/share/vm/memory/genCollectedHeap.cpp index dc3ba9b3cf3..e77e86a0096 100644 --- a/hotspot/src/share/vm/memory/genCollectedHeap.cpp +++ b/hotspot/src/share/vm/memory/genCollectedHeap.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -222,8 +222,8 @@ char* GenCollectedHeap::allocate(size_t alignment, *_total_reserved = total_reserved; *_n_covered_regions = n_covered_regions; - *heap_rs = ReservedSpace(total_reserved, alignment, - UseLargePages, heap_address); + *heap_rs = ReservedHeapSpace(total_reserved, alignment, + UseLargePages, heap_address); return heap_address; } diff --git a/hotspot/src/share/vm/memory/genCollectedHeap.hpp b/hotspot/src/share/vm/memory/genCollectedHeap.hpp index 54dce33bb80..c85a2a307a1 100644 --- a/hotspot/src/share/vm/memory/genCollectedHeap.hpp +++ b/hotspot/src/share/vm/memory/genCollectedHeap.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/genMarkSweep.cpp b/hotspot/src/share/vm/memory/genMarkSweep.cpp index e98f6793001..6885a73c773 100644 --- a/hotspot/src/share/vm/memory/genMarkSweep.cpp +++ b/hotspot/src/share/vm/memory/genMarkSweep.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/genOopClosures.hpp b/hotspot/src/share/vm/memory/genOopClosures.hpp index d0f142f65a3..85121ee0b63 100644 --- a/hotspot/src/share/vm/memory/genOopClosures.hpp +++ b/hotspot/src/share/vm/memory/genOopClosures.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/genOopClosures.inline.hpp b/hotspot/src/share/vm/memory/genOopClosures.inline.hpp index a6699d74b18..6746c8804f0 100644 --- a/hotspot/src/share/vm/memory/genOopClosures.inline.hpp +++ b/hotspot/src/share/vm/memory/genOopClosures.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/genRemSet.hpp b/hotspot/src/share/vm/memory/genRemSet.hpp index c2ef23061af..bf06e3647dc 100644 --- a/hotspot/src/share/vm/memory/genRemSet.hpp +++ b/hotspot/src/share/vm/memory/genRemSet.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/genRemSet.inline.hpp b/hotspot/src/share/vm/memory/genRemSet.inline.hpp index 3ae0e7f6820..381ee950e16 100644 --- a/hotspot/src/share/vm/memory/genRemSet.inline.hpp +++ b/hotspot/src/share/vm/memory/genRemSet.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/generation.cpp b/hotspot/src/share/vm/memory/generation.cpp index 5ed3ec09b7b..04cce2e59fe 100644 --- a/hotspot/src/share/vm/memory/generation.cpp +++ b/hotspot/src/share/vm/memory/generation.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/generation.hpp b/hotspot/src/share/vm/memory/generation.hpp index 2e146d53844..4a4cecd3f41 100644 --- a/hotspot/src/share/vm/memory/generation.hpp +++ b/hotspot/src/share/vm/memory/generation.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/heap.cpp b/hotspot/src/share/vm/memory/heap.cpp index c1d43d7ea36..b0986d1e3ff 100644 --- a/hotspot/src/share/vm/memory/heap.cpp +++ b/hotspot/src/share/vm/memory/heap.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/heapInspection.cpp b/hotspot/src/share/vm/memory/heapInspection.cpp index 9fc47755608..28e68260831 100644 --- a/hotspot/src/share/vm/memory/heapInspection.cpp +++ b/hotspot/src/share/vm/memory/heapInspection.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/heapInspection.hpp b/hotspot/src/share/vm/memory/heapInspection.hpp index f235d510b06..ac2c708a532 100644 --- a/hotspot/src/share/vm/memory/heapInspection.hpp +++ b/hotspot/src/share/vm/memory/heapInspection.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/iterator.hpp b/hotspot/src/share/vm/memory/iterator.hpp index 1b92ddd4bc5..47b9b28d2b7 100644 --- a/hotspot/src/share/vm/memory/iterator.hpp +++ b/hotspot/src/share/vm/memory/iterator.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/modRefBarrierSet.hpp b/hotspot/src/share/vm/memory/modRefBarrierSet.hpp index c85a18e7ac5..62255e11680 100644 --- a/hotspot/src/share/vm/memory/modRefBarrierSet.hpp +++ b/hotspot/src/share/vm/memory/modRefBarrierSet.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2002 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/permGen.cpp b/hotspot/src/share/vm/memory/permGen.cpp index 1c8fa9681ec..e31c19c80ed 100644 --- a/hotspot/src/share/vm/memory/permGen.cpp +++ b/hotspot/src/share/vm/memory/permGen.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/permGen.hpp b/hotspot/src/share/vm/memory/permGen.hpp index 263a589b272..454b10f7986 100644 --- a/hotspot/src/share/vm/memory/permGen.hpp +++ b/hotspot/src/share/vm/memory/permGen.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/referenceProcessor.cpp b/hotspot/src/share/vm/memory/referenceProcessor.cpp index c9ba9b81c43..11edba7f7f4 100644 --- a/hotspot/src/share/vm/memory/referenceProcessor.cpp +++ b/hotspot/src/share/vm/memory/referenceProcessor.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/referenceProcessor.hpp b/hotspot/src/share/vm/memory/referenceProcessor.hpp index e11f9564509..7ef57bdee00 100644 --- a/hotspot/src/share/vm/memory/referenceProcessor.hpp +++ b/hotspot/src/share/vm/memory/referenceProcessor.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/restore.cpp b/hotspot/src/share/vm/memory/restore.cpp index 0a84749bcfa..cd32a1adbca 100644 --- a/hotspot/src/share/vm/memory/restore.cpp +++ b/hotspot/src/share/vm/memory/restore.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/serialize.cpp b/hotspot/src/share/vm/memory/serialize.cpp index 6f9ba38b1d6..d09055c2507 100644 --- a/hotspot/src/share/vm/memory/serialize.cpp +++ b/hotspot/src/share/vm/memory/serialize.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/sharedHeap.cpp b/hotspot/src/share/vm/memory/sharedHeap.cpp index 015f9807a06..14bd6d47ba3 100644 --- a/hotspot/src/share/vm/memory/sharedHeap.cpp +++ b/hotspot/src/share/vm/memory/sharedHeap.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/space.cpp b/hotspot/src/share/vm/memory/space.cpp index eeab52e60a0..894bd57279f 100644 --- a/hotspot/src/share/vm/memory/space.cpp +++ b/hotspot/src/share/vm/memory/space.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -815,6 +815,7 @@ void ContiguousSpace::allocate_temporary_filler(int factor) { "size for smallest fake object doesn't match"); instanceOop obj = (instanceOop) allocate(size); obj->set_mark(markOopDesc::prototype()); + obj->set_klass_gap(0); obj->set_klass(SystemDictionary::object_klass()); } } diff --git a/hotspot/src/share/vm/memory/space.hpp b/hotspot/src/share/vm/memory/space.hpp index 37f726e5b3f..b8af6e695c7 100644 --- a/hotspot/src/share/vm/memory/space.hpp +++ b/hotspot/src/share/vm/memory/space.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/tenuredGeneration.cpp b/hotspot/src/share/vm/memory/tenuredGeneration.cpp index 8e04fd38814..dcd6626e80d 100644 --- a/hotspot/src/share/vm/memory/tenuredGeneration.cpp +++ b/hotspot/src/share/vm/memory/tenuredGeneration.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/universe.cpp b/hotspot/src/share/vm/memory/universe.cpp index d69016370ad..bfa85393d49 100644 --- a/hotspot/src/share/vm/memory/universe.cpp +++ b/hotspot/src/share/vm/memory/universe.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/memory/universe.hpp b/hotspot/src/share/vm/memory/universe.hpp index 7cf8da13b72..118800f780b 100644 --- a/hotspot/src/share/vm/memory/universe.hpp +++ b/hotspot/src/share/vm/memory/universe.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/oops/arrayOop.hpp b/hotspot/src/share/vm/oops/arrayOop.hpp index 5e54a86ee93..8ede056496a 100644 --- a/hotspot/src/share/vm/oops/arrayOop.hpp +++ b/hotspot/src/share/vm/oops/arrayOop.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,11 +41,10 @@ class arrayOopDesc : public oopDesc { // Header size computation. // The header is considered the oop part of this type plus the length. // Returns the aligned header_size_in_bytes. This is not equivalent to - // sizeof(arrayOopDesc) which should not appear in the code, except here. + // sizeof(arrayOopDesc) which should not appear in the code. static int header_size_in_bytes() { - size_t hs = UseCompressedOops ? - sizeof(arrayOopDesc) : - align_size_up(sizeof(arrayOopDesc) + sizeof(int), HeapWordSize); + size_t hs = align_size_up(length_offset_in_bytes() + sizeof(int), + HeapWordSize); #ifdef ASSERT // make sure it isn't called before UseCompressedOops is initialized. static size_t arrayoopdesc_hs = 0; diff --git a/hotspot/src/share/vm/oops/constantPoolKlass.cpp b/hotspot/src/share/vm/oops/constantPoolKlass.cpp index 229007f6208..c112597ab11 100644 --- a/hotspot/src/share/vm/oops/constantPoolKlass.cpp +++ b/hotspot/src/share/vm/oops/constantPoolKlass.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/oops/constantPoolKlass.hpp b/hotspot/src/share/vm/oops/constantPoolKlass.hpp index b563f7ddd4a..324efbec023 100644 --- a/hotspot/src/share/vm/oops/constantPoolKlass.hpp +++ b/hotspot/src/share/vm/oops/constantPoolKlass.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/oops/constantPoolOop.hpp b/hotspot/src/share/vm/oops/constantPoolOop.hpp index b10db6bb068..907d71dfd64 100644 --- a/hotspot/src/share/vm/oops/constantPoolOop.hpp +++ b/hotspot/src/share/vm/oops/constantPoolOop.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/oops/cpCacheKlass.cpp b/hotspot/src/share/vm/oops/cpCacheKlass.cpp index b57ccda8cd0..241914dca65 100644 --- a/hotspot/src/share/vm/oops/cpCacheKlass.cpp +++ b/hotspot/src/share/vm/oops/cpCacheKlass.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/oops/cpCacheKlass.hpp b/hotspot/src/share/vm/oops/cpCacheKlass.hpp index 9c20eb9a94e..ea826671dbc 100644 --- a/hotspot/src/share/vm/oops/cpCacheKlass.hpp +++ b/hotspot/src/share/vm/oops/cpCacheKlass.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/oops/cpCacheOop.cpp b/hotspot/src/share/vm/oops/cpCacheOop.cpp index a8f5c051ba6..1356775a716 100644 --- a/hotspot/src/share/vm/oops/cpCacheOop.cpp +++ b/hotspot/src/share/vm/oops/cpCacheOop.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/oops/cpCacheOop.hpp b/hotspot/src/share/vm/oops/cpCacheOop.hpp index fc810361880..ccdb4472e2c 100644 --- a/hotspot/src/share/vm/oops/cpCacheOop.hpp +++ b/hotspot/src/share/vm/oops/cpCacheOop.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/oops/instanceKlass.cpp b/hotspot/src/share/vm/oops/instanceKlass.cpp index 2ce60748519..8862efd299b 100644 --- a/hotspot/src/share/vm/oops/instanceKlass.cpp +++ b/hotspot/src/share/vm/oops/instanceKlass.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/oops/instanceKlass.hpp b/hotspot/src/share/vm/oops/instanceKlass.hpp index b7b71d930ff..2dd61e56802 100644 --- a/hotspot/src/share/vm/oops/instanceKlass.hpp +++ b/hotspot/src/share/vm/oops/instanceKlass.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -180,9 +180,8 @@ class instanceKlass: public Klass { // End of the oop block. // - // number of words used by non-static fields in this klass (including - // inherited fields but after header_size()). If fields are compressed into - // header, this can be zero so it's not the same as number of static fields. + // Number of heapOopSize words used by non-static fields in this klass + // (including inherited fields but after header_size()). int _nonstatic_field_size; int _static_field_size; // number words used by static fields (oop and non-oop) in this klass int _static_oop_field_size;// number of static oop fields in this klass diff --git a/hotspot/src/share/vm/oops/instanceKlassKlass.cpp b/hotspot/src/share/vm/oops/instanceKlassKlass.cpp index f0a150408db..66e884f395a 100644 --- a/hotspot/src/share/vm/oops/instanceKlassKlass.cpp +++ b/hotspot/src/share/vm/oops/instanceKlassKlass.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -581,7 +581,7 @@ void instanceKlassKlass::oop_print_on(oop obj, outputStream* st) { OopMapBlock* map = ik->start_of_nonstatic_oop_maps(); OopMapBlock* end_map = map + ik->nonstatic_oop_map_size(); while (map < end_map) { - st->print("%d-%d ", map->offset(), map->offset() + oopSize*(map->length() - 1)); + st->print("%d-%d ", map->offset(), map->offset() + heapOopSize*(map->length() - 1)); map++; } st->cr(); diff --git a/hotspot/src/share/vm/oops/instanceOop.hpp b/hotspot/src/share/vm/oops/instanceOop.hpp index e0f0cca1ffa..0375d195ddd 100644 --- a/hotspot/src/share/vm/oops/instanceOop.hpp +++ b/hotspot/src/share/vm/oops/instanceOop.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,14 +39,7 @@ class instanceOopDesc : public oopDesc { static bool contains_field_offset(int offset, int nonstatic_field_size) { int base_in_bytes = base_offset_in_bytes(); - if (UseCompressedOops) { - return (offset >= base_in_bytes && - // field can be embedded in header, or is after header. - (offset < (int)sizeof(instanceOopDesc) || - (offset-(int)sizeof(instanceOopDesc))/wordSize < nonstatic_field_size)); - } else { - return (offset >= base_in_bytes && - (offset-base_in_bytes)/wordSize < nonstatic_field_size); - } + return (offset >= base_in_bytes && + (offset-base_in_bytes) < nonstatic_field_size * heapOopSize); } }; diff --git a/hotspot/src/share/vm/oops/instanceRefKlass.cpp b/hotspot/src/share/vm/oops/instanceRefKlass.cpp index 634a8c7fb9e..686aabf6a15 100644 --- a/hotspot/src/share/vm/oops/instanceRefKlass.cpp +++ b/hotspot/src/share/vm/oops/instanceRefKlass.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/oops/klass.cpp b/hotspot/src/share/vm/oops/klass.cpp index 04d350197bf..8d1fba0f4e7 100644 --- a/hotspot/src/share/vm/oops/klass.cpp +++ b/hotspot/src/share/vm/oops/klass.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/oops/klass.hpp b/hotspot/src/share/vm/oops/klass.hpp index d8aac3de60d..b2a3260a216 100644 --- a/hotspot/src/share/vm/oops/klass.hpp +++ b/hotspot/src/share/vm/oops/klass.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/oops/klassVtable.cpp b/hotspot/src/share/vm/oops/klassVtable.cpp index 447d6e92958..27b32d09760 100644 --- a/hotspot/src/share/vm/oops/klassVtable.cpp +++ b/hotspot/src/share/vm/oops/klassVtable.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/oops/markOop.cpp b/hotspot/src/share/vm/oops/markOop.cpp index 75a2d506b46..ac1a99c2cd7 100644 --- a/hotspot/src/share/vm/oops/markOop.cpp +++ b/hotspot/src/share/vm/oops/markOop.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-1999 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/oops/markOop.hpp b/hotspot/src/share/vm/oops/markOop.hpp index ac42fef74f2..bc5d965c60c 100644 --- a/hotspot/src/share/vm/oops/markOop.hpp +++ b/hotspot/src/share/vm/oops/markOop.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,8 +29,10 @@ // // Bit-format of an object header (most significant first): // -// -// unused:0/25 hash:25/31 age:4 biased_lock:1 lock:2 = 32/64 bits +// 32 bits: unused:0 hash:25 age:4 biased_lock:1 lock:2 +// 64 bits: unused:24 hash:31 cms:2 age:4 biased_lock:1 lock:2 +// unused:20 size:35 cms:2 age:4 biased_lock:1 lock:2 (if cms +// free chunk) // // - hash contains the identity hash value: largest value is // 31 bits, see os::random(). Also, 64-bit vm's require @@ -91,6 +93,7 @@ class markOopDesc: public oopDesc { biased_lock_bits = 1, max_hash_bits = BitsPerWord - age_bits - lock_bits - biased_lock_bits, hash_bits = max_hash_bits > 31 ? 31 : max_hash_bits, + cms_bits = LP64_ONLY(1) NOT_LP64(0), epoch_bits = 2 }; @@ -106,7 +109,8 @@ class markOopDesc: public oopDesc { enum { lock_shift = 0, biased_lock_shift = lock_bits, age_shift = lock_bits + biased_lock_bits, - hash_shift = lock_bits + biased_lock_bits + age_bits, + cms_shift = age_shift + age_bits, + hash_shift = cms_shift + cms_bits, epoch_shift = hash_shift }; @@ -118,7 +122,9 @@ class markOopDesc: public oopDesc { age_mask = right_n_bits(age_bits), age_mask_in_place = age_mask << age_shift, epoch_mask = right_n_bits(epoch_bits), - epoch_mask_in_place = epoch_mask << epoch_shift + epoch_mask_in_place = epoch_mask << epoch_shift, + cms_mask = right_n_bits(cms_bits), + cms_mask_in_place = cms_mask << cms_shift #ifndef _WIN64 ,hash_mask = right_n_bits(hash_bits), hash_mask_in_place = (address_word)hash_mask << hash_shift @@ -360,4 +366,40 @@ class markOopDesc: public oopDesc { // see the definition in markOop.cpp for the gory details bool should_not_be_cached() const; + + // These markOops indicate cms free chunk blocks and not objects. + // In 64 bit, the markOop is set to distinguish them from oops. + // These are defined in 32 bit mode for vmStructs. + const static uintptr_t cms_free_chunk_pattern = 0x1; + + // Constants for the size field. + enum { size_shift = cms_shift + cms_bits, + size_bits = 35 // need for compressed oops 32G + }; + // These values are too big for Win64 + const static uintptr_t size_mask = LP64_ONLY(right_n_bits(size_bits)) + NOT_LP64(0); + const static uintptr_t size_mask_in_place = + (address_word)size_mask << size_shift; + +#ifdef _LP64 + static markOop cms_free_prototype() { + return markOop(((intptr_t)prototype() & ~cms_mask_in_place) | + ((cms_free_chunk_pattern & cms_mask) << cms_shift)); + } + uintptr_t cms_encoding() const { + return mask_bits(value() >> cms_shift, cms_mask); + } + bool is_cms_free_chunk() const { + return is_neutral() && + (cms_encoding() & cms_free_chunk_pattern) == cms_free_chunk_pattern; + } + + size_t get_size() const { return (size_t)(value() >> size_shift); } + static markOop set_size_and_free(size_t size) { + assert((size & ~size_mask) == 0, "shouldn't overflow size field"); + return markOop(((intptr_t)cms_free_prototype() & ~size_mask_in_place) | + (((intptr_t)size & size_mask) << size_shift)); + } +#endif // _LP64 }; diff --git a/hotspot/src/share/vm/oops/methodDataKlass.cpp b/hotspot/src/share/vm/oops/methodDataKlass.cpp index feddbddb06e..56592b0ee24 100644 --- a/hotspot/src/share/vm/oops/methodDataKlass.cpp +++ b/hotspot/src/share/vm/oops/methodDataKlass.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/oops/methodDataOop.cpp b/hotspot/src/share/vm/oops/methodDataOop.cpp index 77f10e0587d..e9751e58fb4 100644 --- a/hotspot/src/share/vm/oops/methodDataOop.cpp +++ b/hotspot/src/share/vm/oops/methodDataOop.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/oops/methodDataOop.hpp b/hotspot/src/share/vm/oops/methodDataOop.hpp index 9c19f9b3a70..760d4eb7a42 100644 --- a/hotspot/src/share/vm/oops/methodDataOop.hpp +++ b/hotspot/src/share/vm/oops/methodDataOop.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -158,7 +158,6 @@ public: assert(ProfileTraps, "used only under +ProfileTraps"); uint old_flags = (_header._struct._flags & flag_mask); _header._struct._flags = (new_state << trap_shift) | old_flags; - assert(trap_state() == new_state, "sanity"); } u1 flags() { diff --git a/hotspot/src/share/vm/oops/methodOop.cpp b/hotspot/src/share/vm/oops/methodOop.cpp index cb1ad91807e..8a5507cbac8 100644 --- a/hotspot/src/share/vm/oops/methodOop.cpp +++ b/hotspot/src/share/vm/oops/methodOop.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/oops/methodOop.hpp b/hotspot/src/share/vm/oops/methodOop.hpp index 0d936e251f1..965181c664d 100644 --- a/hotspot/src/share/vm/oops/methodOop.hpp +++ b/hotspot/src/share/vm/oops/methodOop.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/oops/objArrayKlass.cpp b/hotspot/src/share/vm/oops/objArrayKlass.cpp index 193249bcf8e..8ca45f28703 100644 --- a/hotspot/src/share/vm/oops/objArrayKlass.cpp +++ b/hotspot/src/share/vm/oops/objArrayKlass.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/oops/objArrayKlass.hpp b/hotspot/src/share/vm/oops/objArrayKlass.hpp index 6fabe837bc8..963b9ac5cf8 100644 --- a/hotspot/src/share/vm/oops/objArrayKlass.hpp +++ b/hotspot/src/share/vm/oops/objArrayKlass.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/oops/objArrayOop.cpp b/hotspot/src/share/vm/oops/objArrayOop.cpp index c1ae6830a8e..f05d837b431 100644 --- a/hotspot/src/share/vm/oops/objArrayOop.cpp +++ b/hotspot/src/share/vm/oops/objArrayOop.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/oops/objArrayOop.hpp b/hotspot/src/share/vm/oops/objArrayOop.hpp index 6f12c0f1fa1..9e4b3674fbf 100644 --- a/hotspot/src/share/vm/oops/objArrayOop.hpp +++ b/hotspot/src/share/vm/oops/objArrayOop.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/oops/oop.cpp b/hotspot/src/share/vm/oops/oop.cpp index badba6d4fc5..505a81f263e 100644 --- a/hotspot/src/share/vm/oops/oop.cpp +++ b/hotspot/src/share/vm/oops/oop.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/oops/oop.hpp b/hotspot/src/share/vm/oops/oop.hpp index eb7959096d0..4b84a802e14 100644 --- a/hotspot/src/share/vm/oops/oop.hpp +++ b/hotspot/src/share/vm/oops/oop.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -77,10 +77,15 @@ class oopDesc { void init_mark(); klassOop klass() const; + klassOop klass_or_null() const volatile; oop* klass_addr(); narrowOop* compressed_klass_addr(); void set_klass(klassOop k); + + // For klass field compression + int klass_gap() const; + void set_klass_gap(int z); // For when the klass pointer is being used as a linked list "next" field. void set_klass_to_list_ptr(oop k); diff --git a/hotspot/src/share/vm/oops/oop.inline.hpp b/hotspot/src/share/vm/oops/oop.inline.hpp index 222c0d4c262..454a4f609aa 100644 --- a/hotspot/src/share/vm/oops/oop.inline.hpp +++ b/hotspot/src/share/vm/oops/oop.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,7 +36,15 @@ inline markOop oopDesc::cas_set_mark(markOop new_mark, markOop old_mark) { inline klassOop oopDesc::klass() const { if (UseCompressedOops) { return (klassOop)decode_heap_oop_not_null(_metadata._compressed_klass); - // can be NULL in CMS, but isn't supported on CMS yet. + } else { + return _metadata._klass; + } +} + +inline klassOop oopDesc::klass_or_null() const volatile { + // can be NULL in CMS + if (UseCompressedOops) { + return (klassOop)decode_heap_oop(_metadata._compressed_klass); } else { return _metadata._klass; } @@ -64,15 +72,22 @@ inline void oopDesc::set_klass(klassOop k) { assert(Universe::is_bootstrapping() || k != NULL, "must be a real klassOop"); assert(Universe::is_bootstrapping() || k->is_klass(), "not a klassOop"); if (UseCompressedOops) { - // zero the gap when the klass is set, by zeroing the pointer sized - // part of the union. - _metadata._klass = NULL; oop_store_without_check(compressed_klass_addr(), (oop)k); } else { oop_store_without_check(klass_addr(), (oop) k); } } +inline int oopDesc::klass_gap() const { + return *(int*)(((intptr_t)this) + klass_gap_offset_in_bytes()); +} + +inline void oopDesc::set_klass_gap(int v) { + if (UseCompressedOops) { + *(int*)(((intptr_t)this) + klass_gap_offset_in_bytes()) = v; + } +} + inline void oopDesc::set_klass_to_list_ptr(oop k) { // This is only to be used during GC, for from-space objects, so no // barrier is needed. @@ -505,7 +520,7 @@ inline bool oopDesc::is_oop(bool ignore_mark_word) const { // try to find metaclass cycle safely without seg faulting on bad input // we should reach klassKlassObj by following klass link at most 3 times for (int i = 0; i < 3; i++) { - obj = obj->klass(); + obj = obj->klass_or_null(); // klass should be aligned and in permspace if (!check_obj_alignment(obj)) return false; if (!Universe::heap()->is_in_permanent(obj)) return false; diff --git a/hotspot/src/share/vm/oops/oop.pcgc.inline.hpp b/hotspot/src/share/vm/oops/oop.pcgc.inline.hpp index 1db005569f8..e513efdfa3d 100644 --- a/hotspot/src/share/vm/oops/oop.pcgc.inline.hpp +++ b/hotspot/src/share/vm/oops/oop.pcgc.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/oops/oopsHierarchy.hpp b/hotspot/src/share/vm/oops/oopsHierarchy.hpp index 32c9823272e..597dafe3de8 100644 --- a/hotspot/src/share/vm/oops/oopsHierarchy.hpp +++ b/hotspot/src/share/vm/oops/oopsHierarchy.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/oops/symbolKlass.cpp b/hotspot/src/share/vm/oops/symbolKlass.cpp index 68732510c1b..d0b6e2f33b5 100644 --- a/hotspot/src/share/vm/oops/symbolKlass.cpp +++ b/hotspot/src/share/vm/oops/symbolKlass.cpp @@ -209,10 +209,7 @@ int symbolKlass::oop_update_pointers(ParCompactionManager* cm, oop obj, void symbolKlass::oop_print_on(oop obj, outputStream* st) { st->print("Symbol: '"); - symbolOop sym = symbolOop(obj); - for (int i = 0; i < sym->utf8_length(); i++) { - st->print("%c", sym->byte_at(i)); - } + symbolOop(obj)->print_symbol_on(st); st->print("'"); } diff --git a/hotspot/src/share/vm/oops/symbolOop.cpp b/hotspot/src/share/vm/oops/symbolOop.cpp index 9d343257082..6308735223d 100644 --- a/hotspot/src/share/vm/oops/symbolOop.cpp +++ b/hotspot/src/share/vm/oops/symbolOop.cpp @@ -68,8 +68,17 @@ char* symbolOopDesc::as_C_string_flexible_buffer(Thread* t, void symbolOopDesc::print_symbol_on(outputStream* st) { st = st ? st : tty; - for (int index = 0; index < utf8_length(); index++) - st->put((char)byte_at(index)); + int length = UTF8::unicode_length((const char*)bytes(), utf8_length()); + const char *ptr = (const char *)bytes(); + jchar value; + for (int index = 0; index < length; index++) { + ptr = UTF8::next(ptr, &value); + if (value >= 32 && value < 127 || value == '\'' || value == '\\') { + st->put(value); + } else { + st->print("\\u%04x", value); + } + } } jchar* symbolOopDesc::as_unicode(int& length) const { diff --git a/hotspot/src/share/vm/opto/addnode.cpp b/hotspot/src/share/vm/opto/addnode.cpp index 35e3846ce16..e5cc05b6b1f 100644 --- a/hotspot/src/share/vm/opto/addnode.cpp +++ b/hotspot/src/share/vm/opto/addnode.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/opto/buildOopMap.cpp b/hotspot/src/share/vm/opto/buildOopMap.cpp index 8d3adc78d71..30a9d2684d0 100644 --- a/hotspot/src/share/vm/opto/buildOopMap.cpp +++ b/hotspot/src/share/vm/opto/buildOopMap.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/opto/bytecodeInfo.cpp b/hotspot/src/share/vm/opto/bytecodeInfo.cpp index 1b12ee877ad..5a919b916d9 100644 --- a/hotspot/src/share/vm/opto/bytecodeInfo.cpp +++ b/hotspot/src/share/vm/opto/bytecodeInfo.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/opto/c2_globals.hpp b/hotspot/src/share/vm/opto/c2_globals.hpp index bdf07f63f48..26b288e660e 100644 --- a/hotspot/src/share/vm/opto/c2_globals.hpp +++ b/hotspot/src/share/vm/opto/c2_globals.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -390,5 +390,8 @@ \ product(intx, MaxLabelRootDepth, 1100, \ "Maximum times call Label_Root to prevent stack overflow") \ + \ + diagnostic(intx, DominatorSearchLimit, 1000, \ + "Iterations limit in Node::dominates") \ C2_FLAGS(DECLARE_DEVELOPER_FLAG, DECLARE_PD_DEVELOPER_FLAG, DECLARE_PRODUCT_FLAG, DECLARE_PD_PRODUCT_FLAG, DECLARE_DIAGNOSTIC_FLAG, DECLARE_NOTPRODUCT_FLAG) diff --git a/hotspot/src/share/vm/opto/c2compiler.cpp b/hotspot/src/share/vm/opto/c2compiler.cpp index 591b7ea05c2..6be045c8078 100644 --- a/hotspot/src/share/vm/opto/c2compiler.cpp +++ b/hotspot/src/share/vm/opto/c2compiler.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/opto/c2compiler.hpp b/hotspot/src/share/vm/opto/c2compiler.hpp index a1d578797af..9e5d3796332 100644 --- a/hotspot/src/share/vm/opto/c2compiler.hpp +++ b/hotspot/src/share/vm/opto/c2compiler.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/opto/callnode.cpp b/hotspot/src/share/vm/opto/callnode.cpp index 2699072efda..84015b5335c 100644 --- a/hotspot/src/share/vm/opto/callnode.cpp +++ b/hotspot/src/share/vm/opto/callnode.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -632,12 +632,12 @@ bool CallNode::may_modify(const TypePtr *addr_t, PhaseTransform *phase) { const TypeOopPtr *adrInst_t = addr_t->isa_oopptr(); // if not an InstPtr or not an instance type, assume the worst - if (adrInst_t == NULL || !adrInst_t->is_instance_field()) { + if (adrInst_t == NULL || !adrInst_t->is_known_instance_field()) { return true; } Compile *C = phase->C; int offset = adrInst_t->offset(); - assert(offset >= 0, "should be valid offset"); + assert(adrInst_t->klass_is_exact() && offset >= 0, "should be valid offset"); ciKlass* adr_k = adrInst_t->klass(); assert(adr_k->is_loaded() && adr_k->is_java_klass() && @@ -674,12 +674,11 @@ bool CallNode::may_modify(const TypePtr *addr_t, PhaseTransform *phase) { ciKlass* at_k = at_ptr->klass(); if ((adrInst_t->base() == at_ptr->base()) && at_k->is_loaded() && - at_k->is_java_klass() && - !at_k->is_interface()) { + at_k->is_java_klass()) { // If we have found an argument matching addr_t, check if the field // at the specified offset is modified. - int at_idx = C->get_alias_index(at_ptr->add_offset(offset)->isa_oopptr()); - if (base_idx == at_idx && + if ((at_k->is_interface() || adr_k == at_k || + adr_k->is_subclass_of(at_k) && !at_ptr->klass_is_exact()) && (bcea == NULL || bcea->is_arg_modified(i - TypeFunc::Parms, offset, size))) { return true; diff --git a/hotspot/src/share/vm/opto/callnode.hpp b/hotspot/src/share/vm/opto/callnode.hpp index daa572e78a8..0f9b26e154c 100644 --- a/hotspot/src/share/vm/opto/callnode.hpp +++ b/hotspot/src/share/vm/opto/callnode.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -388,9 +388,6 @@ public: void set_next_exception(SafePointNode* n); bool has_exceptions() const { return next_exception() != NULL; } - // Does this node have a use of n other than in debug information? - virtual bool has_non_debug_use(Node *n) {return false; } - // Standard Node stuff virtual int Opcode() const; virtual bool pinned() const { return true; } @@ -497,7 +494,7 @@ public: // Returns true if the call may modify n virtual bool may_modify(const TypePtr *addr_t, PhaseTransform *phase); // Does this node have a use of n other than in debug information? - virtual bool has_non_debug_use(Node *n); + bool has_non_debug_use(Node *n); // Returns the unique CheckCastPP of a call // or result projection is there are several CheckCastPP // or returns NULL if there is no one. diff --git a/hotspot/src/share/vm/opto/cfgnode.cpp b/hotspot/src/share/vm/opto/cfgnode.cpp index 30ab6a59eed..6087c17e0dd 100644 --- a/hotspot/src/share/vm/opto/cfgnode.cpp +++ b/hotspot/src/share/vm/opto/cfgnode.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -707,8 +707,14 @@ PhiNode* PhiNode::slice_memory(const TypePtr* adr_type) const { //------------------------split_out_instance----------------------------------- // Split out an instance type from a bottom phi. PhiNode* PhiNode::split_out_instance(const TypePtr* at, PhaseIterGVN *igvn) const { - assert(type() == Type::MEMORY && (adr_type() == TypePtr::BOTTOM || - adr_type() == TypeRawPtr::BOTTOM) , "bottom or raw memory required"); + const TypeOopPtr *t_oop = at->isa_oopptr(); + assert(t_oop != NULL && t_oop->is_known_instance(), "expecting instance oopptr"); + const TypePtr *t = adr_type(); + assert(type() == Type::MEMORY && + (t == TypePtr::BOTTOM || t == TypeRawPtr::BOTTOM || + t->isa_oopptr() && !t->is_oopptr()->is_known_instance() && + t->is_oopptr()->cast_to_instance_id(t_oop->instance_id()) == t_oop), + "bottom or raw memory required"); // Check if an appropriate node already exists. Node *region = in(0); @@ -848,7 +854,8 @@ const Type *PhiNode::Value( PhaseTransform *phase ) const { // Until we have harmony between classes and interfaces in the type // lattice, we must tread carefully around phis which implicitly // convert the one to the other. - const TypeInstPtr* ttip = _type->isa_narrowoop() ? _type->isa_narrowoop()->make_oopptr()->isa_instptr() :_type->isa_instptr(); + const TypePtr* ttp = _type->make_ptr(); + const TypeInstPtr* ttip = (ttp != NULL) ? ttp->isa_instptr() : NULL; bool is_intf = false; if (ttip != NULL) { ciKlass* k = ttip->klass(); @@ -867,7 +874,8 @@ const Type *PhiNode::Value( PhaseTransform *phase ) const { // of all the input types. The lattice is not distributive in // such cases. Ward off asserts in type.cpp by refusing to do // meets between interfaces and proper classes. - const TypeInstPtr* tiip = ti->isa_narrowoop() ? ti->is_narrowoop()->make_oopptr()->isa_instptr() : ti->isa_instptr(); + const TypePtr* tip = ti->make_ptr(); + const TypeInstPtr* tiip = (tip != NULL) ? tip->isa_instptr() : NULL; if (tiip) { bool ti_is_intf = false; ciKlass* k = tiip->klass(); @@ -924,13 +932,14 @@ const Type *PhiNode::Value( PhaseTransform *phase ) const { // class-typed Phi and an interface flows in, it's possible that the meet & // join report an interface back out. This isn't possible but happens // because the type system doesn't interact well with interfaces. - const TypeInstPtr *jtip = jt->isa_narrowoop() ? jt->isa_narrowoop()->make_oopptr()->isa_instptr() : jt->isa_instptr(); + const TypePtr *jtp = jt->make_ptr(); + const TypeInstPtr *jtip = (jtp != NULL) ? jtp->isa_instptr() : NULL; if( jtip && ttip ) { if( jtip->is_loaded() && jtip->klass()->is_interface() && ttip->is_loaded() && !ttip->klass()->is_interface() ) { // Happens in a CTW of rt.jar, 320-341, no extra flags assert(ft == ttip->cast_to_ptr_type(jtip->ptr()) || - ft->isa_narrowoop() && ft->isa_narrowoop()->make_oopptr() == ttip->cast_to_ptr_type(jtip->ptr()), ""); + ft->isa_narrowoop() && ft->make_ptr() == ttip->cast_to_ptr_type(jtip->ptr()), ""); jt = ft; } } @@ -1342,7 +1351,7 @@ static Node* split_flow_path(PhaseGVN *phase, PhiNode *phi) { Node *n = phi->in(i); if( !n ) return NULL; if( phase->type(n) == Type::TOP ) return NULL; - if( n->Opcode() == Op_ConP ) + if( n->Opcode() == Op_ConP || n->Opcode() == Op_ConN ) break; } if( i >= phi->req() ) // Only split for constants @@ -1615,64 +1624,6 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) { if (opt != NULL) return opt; } - if (in(1) != NULL && in(1)->Opcode() == Op_AddP && can_reshape) { - // Try to undo Phi of AddP: - // (Phi (AddP base base y) (AddP base2 base2 y)) - // becomes: - // newbase := (Phi base base2) - // (AddP newbase newbase y) - // - // This occurs as a result of unsuccessful split_thru_phi and - // interferes with taking advantage of addressing modes. See the - // clone_shift_expressions code in matcher.cpp - Node* addp = in(1); - const Type* type = addp->in(AddPNode::Base)->bottom_type(); - Node* y = addp->in(AddPNode::Offset); - if (y != NULL && addp->in(AddPNode::Base) == addp->in(AddPNode::Address)) { - // make sure that all the inputs are similar to the first one, - // i.e. AddP with base == address and same offset as first AddP - bool doit = true; - for (uint i = 2; i < req(); i++) { - if (in(i) == NULL || - in(i)->Opcode() != Op_AddP || - in(i)->in(AddPNode::Base) != in(i)->in(AddPNode::Address) || - in(i)->in(AddPNode::Offset) != y) { - doit = false; - break; - } - // Accumulate type for resulting Phi - type = type->meet(in(i)->in(AddPNode::Base)->bottom_type()); - } - Node* base = NULL; - if (doit) { - // Check for neighboring AddP nodes in a tree. - // If they have a base, use that it. - for (DUIterator_Fast kmax, k = this->fast_outs(kmax); k < kmax; k++) { - Node* u = this->fast_out(k); - if (u->is_AddP()) { - Node* base2 = u->in(AddPNode::Base); - if (base2 != NULL && !base2->is_top()) { - if (base == NULL) - base = base2; - else if (base != base2) - { doit = false; break; } - } - } - } - } - if (doit) { - if (base == NULL) { - base = new (phase->C, in(0)->req()) PhiNode(in(0), type, NULL); - for (uint i = 1; i < req(); i++) { - base->init_req(i, in(i)->in(AddPNode::Base)); - } - phase->is_IterGVN()->register_new_node_with_optimizer(base); - } - return new (phase->C, 4) AddPNode(base, base, y); - } - } - } - // Split phis through memory merges, so that the memory merges will go away. // Piggy-back this transformation on the search for a unique input.... // It will be as if the merged memory is the unique value of the phi. diff --git a/hotspot/src/share/vm/opto/cfgnode.hpp b/hotspot/src/share/vm/opto/cfgnode.hpp index f4c4b0e2fae..8fd493a308e 100644 --- a/hotspot/src/share/vm/opto/cfgnode.hpp +++ b/hotspot/src/share/vm/opto/cfgnode.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -129,7 +129,7 @@ public: }; PhiNode( Node *r, const Type *t, const TypePtr* at = NULL, - const int iid = TypeOopPtr::UNKNOWN_INSTANCE, + const int iid = TypeOopPtr::InstanceTop, const int iidx = Compile::AliasIdxTop, const int ioffs = Type::OffsetTop ) : TypeNode(t,r->req()), diff --git a/hotspot/src/share/vm/opto/chaitin.cpp b/hotspot/src/share/vm/opto/chaitin.cpp index bc31285bf56..5d7efdb7637 100644 --- a/hotspot/src/share/vm/opto/chaitin.cpp +++ b/hotspot/src/share/vm/opto/chaitin.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1385,7 +1385,7 @@ void PhaseChaitin::fixup_spills() { cisc->ins_req(1,src); // Requires a memory edge } b->_nodes.map(j,cisc); // Insert into basic block - n->replace_by(cisc); // Correct graph + n->subsume_by(cisc); // Correct graph // ++_used_cisc_instructions; #ifndef PRODUCT diff --git a/hotspot/src/share/vm/opto/chaitin.hpp b/hotspot/src/share/vm/opto/chaitin.hpp index fd952ab281d..273fb03206f 100644 --- a/hotspot/src/share/vm/opto/chaitin.hpp +++ b/hotspot/src/share/vm/opto/chaitin.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/opto/classes.hpp b/hotspot/src/share/vm/opto/classes.hpp index e61bdd73168..0371736cf10 100644 --- a/hotspot/src/share/vm/opto/classes.hpp +++ b/hotspot/src/share/vm/opto/classes.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,6 +37,7 @@ macro(Allocate) macro(AllocateArray) macro(AndI) macro(AndL) +macro(AryEq) macro(AtanD) macro(Binary) macro(Bool) @@ -64,6 +65,7 @@ macro(CMoveF) macro(CMoveI) macro(CMoveL) macro(CMoveP) +macro(CMoveN) macro(CmpN) macro(CmpD) macro(CmpD3) @@ -133,6 +135,7 @@ macro(LoadD_unaligned) macro(LoadF) macro(LoadI) macro(LoadKlass) +macro(LoadNKlass) macro(LoadL) macro(LoadL_unaligned) macro(LoadPLocked) diff --git a/hotspot/src/share/vm/opto/compile.cpp b/hotspot/src/share/vm/opto/compile.cpp index 6559cb4c621..3904dd5155a 100644 --- a/hotspot/src/share/vm/opto/compile.cpp +++ b/hotspot/src/share/vm/opto/compile.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -313,9 +313,6 @@ CompileWrapper::CompileWrapper(Compile* compile) : _compile(compile) { _compile->begin_method(); } CompileWrapper::~CompileWrapper() { - if (_compile->failing()) { - _compile->print_method("Failed"); - } _compile->end_method(); if (_compile->scratch_buffer_blob() != NULL) BufferBlob::free(_compile->scratch_buffer_blob()); @@ -368,7 +365,12 @@ void Compile::init_scratch_buffer_blob() { BufferBlob* blob = BufferBlob::create("Compile::scratch_buffer", size); // Record the buffer blob for next time. set_scratch_buffer_blob(blob); - guarantee(scratch_buffer_blob() != NULL, "Need BufferBlob for code generation"); + // Have we run out of code space? + if (scratch_buffer_blob() == NULL) { + // Let CompilerBroker disable further compilations. + record_failure("Not enough space for scratch buffer in CodeCache"); + return; + } // Initialize the relocation buffers relocInfo* locs_buf = (relocInfo*) blob->instructions_end() - MAX_locs_size; @@ -599,6 +601,8 @@ Compile::Compile( ciEnv* ci_env, C2Compiler* compiler, ciMethod* target, int osr if (failing()) return; NOT_PRODUCT( verify_graph_edges(); ) + print_method("Before Matching"); + #ifndef PRODUCT if (PrintIdeal) { ttyLocker ttyl; // keep the following output all in one block @@ -1065,6 +1069,8 @@ const TypePtr *Compile::flatten_alias_type( const TypePtr *tj ) const { // No constant oop pointers (such as Strings); they alias with // unknown strings. tj = to = TypeInstPtr::make(TypePtr::BotPTR,to->klass(),false,0,offset); + } else if( to->is_known_instance_field() ) { + tj = to; // Keep NotNull and klass_is_exact for instance type } else if( ptr == TypePtr::NotNull || to->klass_is_exact() ) { // During the 2nd round of IterGVN, NotNull castings are removed. // Make sure the Bottom and NotNull variants alias the same. @@ -1084,7 +1090,7 @@ const TypePtr *Compile::flatten_alias_type( const TypePtr *tj ) const { } else { ciInstanceKlass *canonical_holder = k->get_canonical_holder(offset); if (!k->equals(canonical_holder) || tj->offset() != offset) { - tj = to = TypeInstPtr::make(TypePtr::BotPTR, canonical_holder, false, NULL, offset, to->instance_id()); + tj = to = TypeInstPtr::make(to->ptr(), canonical_holder, false, NULL, offset, to->instance_id()); } } } @@ -1184,8 +1190,8 @@ void Compile::AliasType::Init(int i, const TypePtr* at) { _field = NULL; _is_rewritable = true; // default const TypeOopPtr *atoop = (at != NULL) ? at->isa_oopptr() : NULL; - if (atoop != NULL && atoop->is_instance()) { - const TypeOopPtr *gt = atoop->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE); + if (atoop != NULL && atoop->is_known_instance()) { + const TypeOopPtr *gt = atoop->cast_to_instance_id(TypeOopPtr::InstanceBot); _general_index = Compile::current()->get_alias_index(gt); } else { _general_index = 0; @@ -1474,7 +1480,7 @@ void Compile::Optimize() { NOT_PRODUCT( verify_graph_edges(); ) - print_method("Start"); + print_method("After Parsing"); { // Iterative Global Value Numbering, including ideal transforms @@ -1681,7 +1687,7 @@ void Compile::Code_Gen() { Output(); } - print_method("End"); + print_method("Final Code"); // He's dead, Jim. _cfg = (PhaseCFG*)0xdeadbeef; @@ -1835,6 +1841,7 @@ static bool oop_offset_is_sane(const TypeInstPtr* tp) { // Implement items 1-5 from final_graph_reshaping below. static void final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &fpu ) { + if ( n->outcnt() == 0 ) return; // dead node uint nop = n->Opcode(); // Check for 2-input instruction with "last use" on right input. @@ -1901,7 +1908,7 @@ static void final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &fpu ) { break; case Op_Opaque1: // Remove Opaque Nodes before matching case Op_Opaque2: // Remove Opaque Nodes before matching - n->replace_by(n->in(1)); + n->subsume_by(n->in(1)); break; case Op_CallStaticJava: case Op_CallJava: @@ -1961,6 +1968,7 @@ static void final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &fpu ) { case Op_LoadC: case Op_LoadI: case Op_LoadKlass: + case Op_LoadNKlass: case Op_LoadL: case Op_LoadL_unaligned: case Op_LoadPLocked: @@ -1983,14 +1991,94 @@ static void final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &fpu ) { } case Op_AddP: { // Assert sane base pointers - const Node *addp = n->in(AddPNode::Address); + Node *addp = n->in(AddPNode::Address); assert( !addp->is_AddP() || addp->in(AddPNode::Base)->is_top() || // Top OK for allocation addp->in(AddPNode::Base) == n->in(AddPNode::Base), "Base pointers must match" ); +#ifdef _LP64 + if (UseCompressedOops && + addp->Opcode() == Op_ConP && + addp == n->in(AddPNode::Base) && + n->in(AddPNode::Offset)->is_Con()) { + // Use addressing with narrow klass to load with offset on x86. + // On sparc loading 32-bits constant and decoding it have less + // instructions (4) then load 64-bits constant (7). + // Do this transformation here since IGVN will convert ConN back to ConP. + const Type* t = addp->bottom_type(); + if (t->isa_oopptr()) { + Node* nn = NULL; + + // Look for existing ConN node of the same exact type. + Compile* C = Compile::current(); + Node* r = C->root(); + uint cnt = r->outcnt(); + for (uint i = 0; i < cnt; i++) { + Node* m = r->raw_out(i); + if (m!= NULL && m->Opcode() == Op_ConN && + m->bottom_type()->make_ptr() == t) { + nn = m; + break; + } + } + if (nn != NULL) { + // Decode a narrow oop to match address + // [R12 + narrow_oop_reg<<3 + offset] + nn = new (C, 2) DecodeNNode(nn, t); + n->set_req(AddPNode::Base, nn); + n->set_req(AddPNode::Address, nn); + if (addp->outcnt() == 0) { + addp->disconnect_inputs(NULL); + } + } + } + } +#endif break; } +#ifdef _LP64 + case Op_CmpP: + // Do this transformation here to preserve CmpPNode::sub() and + // other TypePtr related Ideal optimizations (for example, ptr nullness). + if( n->in(1)->is_DecodeN() ) { + Compile* C = Compile::current(); + Node* in2 = NULL; + if( n->in(2)->is_DecodeN() ) { + in2 = n->in(2)->in(1); + } else if ( n->in(2)->Opcode() == Op_ConP ) { + const Type* t = n->in(2)->bottom_type(); + if (t == TypePtr::NULL_PTR) { + Node *in1 = n->in(1); + if (Matcher::clone_shift_expressions) { + // x86, ARM and friends can handle 2 adds in addressing mode. + // Decode a narrow oop and do implicit NULL check in address + // [R12 + narrow_oop_reg<<3 + offset] + in2 = ConNode::make(C, TypeNarrowOop::NULL_PTR); + } else { + // Don't replace CmpP(o ,null) if 'o' is used in AddP + // to generate implicit NULL check on Sparc where + // narrow oops can't be used in address. + uint i = 0; + for (; i < in1->outcnt(); i++) { + if (in1->raw_out(i)->is_AddP()) + break; + } + if (i >= in1->outcnt()) { + in2 = ConNode::make(C, TypeNarrowOop::NULL_PTR); + } + } + } else if (t->isa_oopptr()) { + in2 = ConNode::make(C, t->make_narrowoop()); + } + } + if( in2 != NULL ) { + Node* cmpN = new (C, 3) CmpNNode(n->in(1)->in(1), in2); + n->subsume_by( cmpN ); + } + } +#endif + case Op_ModI: if (UseDivMod) { // Check if a%b and a/b both exist @@ -2000,13 +2088,13 @@ static void final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &fpu ) { Compile* C = Compile::current(); if (Matcher::has_match_rule(Op_DivModI)) { DivModINode* divmod = DivModINode::make(C, n); - d->replace_by(divmod->div_proj()); - n->replace_by(divmod->mod_proj()); + d->subsume_by(divmod->div_proj()); + n->subsume_by(divmod->mod_proj()); } else { // replace a%b with a-((a/b)*b) Node* mult = new (C, 3) MulINode(d, d->in(2)); Node* sub = new (C, 3) SubINode(d->in(1), mult); - n->replace_by( sub ); + n->subsume_by( sub ); } } } @@ -2021,13 +2109,13 @@ static void final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &fpu ) { Compile* C = Compile::current(); if (Matcher::has_match_rule(Op_DivModL)) { DivModLNode* divmod = DivModLNode::make(C, n); - d->replace_by(divmod->div_proj()); - n->replace_by(divmod->mod_proj()); + d->subsume_by(divmod->div_proj()); + n->subsume_by(divmod->mod_proj()); } else { // replace a%b with a-((a/b)*b) Node* mult = new (C, 3) MulLNode(d, d->in(2)); Node* sub = new (C, 3) SubLNode(d->in(1), mult); - n->replace_by( sub ); + n->subsume_by( sub ); } } } @@ -2073,7 +2161,7 @@ static void final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &fpu ) { // Replace many operand PackNodes with a binary tree for matching PackNode* p = (PackNode*) n; Node* btp = p->binaryTreePack(Compile::current(), 1, n->req()); - n->replace_by(btp); + n->subsume_by(btp); } break; default: @@ -2377,6 +2465,9 @@ void Compile::record_failure(const char* reason) { // Record the first failure reason. _failure_reason = reason; } + if (!C->failure_reason_is(C2Compiler::retry_no_subsuming_loads())) { + C->print_method(_failure_reason); + } _root = NULL; // flush the graph, too } diff --git a/hotspot/src/share/vm/opto/compile.hpp b/hotspot/src/share/vm/opto/compile.hpp index 279b448516e..455df6bda30 100644 --- a/hotspot/src/share/vm/opto/compile.hpp +++ b/hotspot/src/share/vm/opto/compile.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/opto/connode.cpp b/hotspot/src/share/vm/opto/connode.cpp index c542ce397e4..8b441c99439 100644 --- a/hotspot/src/share/vm/opto/connode.cpp +++ b/hotspot/src/share/vm/opto/connode.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,16 +35,16 @@ uint ConNode::hash() const { //------------------------------make------------------------------------------- ConNode *ConNode::make( Compile* C, const Type *t ) { - if (t->isa_narrowoop()) return new (C, 1) ConNNode( t->is_narrowoop() ); switch( t->basic_type() ) { case T_INT: return new (C, 1) ConINode( t->is_int() ); - case T_ARRAY: return new (C, 1) ConPNode( t->is_aryptr() ); case T_LONG: return new (C, 1) ConLNode( t->is_long() ); case T_FLOAT: return new (C, 1) ConFNode( t->is_float_constant() ); case T_DOUBLE: return new (C, 1) ConDNode( t->is_double_constant() ); case T_VOID: return new (C, 1) ConNode ( Type::TOP ); case T_OBJECT: return new (C, 1) ConPNode( t->is_oopptr() ); + case T_ARRAY: return new (C, 1) ConPNode( t->is_aryptr() ); case T_ADDRESS: return new (C, 1) ConPNode( t->is_ptr() ); + case T_NARROWOOP: return new (C, 1) ConNNode( t->is_narrowoop() ); // Expected cases: TypePtr::NULL_PTR, any is_rawptr() // Also seen: AnyPtr(TopPTR *+top); from command line: // r -XX:+PrintOpto -XX:CIStart=285 -XX:+CompileTheWorld -XX:CompileTheWorldStartAt=660 @@ -185,6 +185,7 @@ CMoveNode *CMoveNode::make( Compile *C, Node *c, Node *bol, Node *left, Node *ri case T_LONG: return new (C, 4) CMoveLNode( bol, left, right, t->is_long() ); case T_OBJECT: return new (C, 4) CMovePNode( c, bol, left, right, t->is_oopptr() ); case T_ADDRESS: return new (C, 4) CMovePNode( c, bol, left, right, t->is_ptr() ); + case T_NARROWOOP: return new (C, 4) CMoveNNode( c, bol, left, right, t ); default: ShouldNotReachHere(); return NULL; @@ -556,7 +557,7 @@ Node* DecodeNNode::Identity(PhaseTransform* phase) { const Type *t = phase->type( in(1) ); if( t == Type::TOP ) return in(1); - if (in(1)->Opcode() == Op_EncodeP) { + if (in(1)->is_EncodeP()) { // (DecodeN (EncodeP p)) -> p return in(1)->in(1); } @@ -564,30 +565,19 @@ Node* DecodeNNode::Identity(PhaseTransform* phase) { } const Type *DecodeNNode::Value( PhaseTransform *phase ) const { - if (phase->type( in(1) ) == TypeNarrowOop::NULL_PTR) { - return TypePtr::NULL_PTR; - } - return bottom_type(); -} + const Type *t = phase->type( in(1) ); + if (t == Type::TOP) return Type::TOP; + if (t == TypeNarrowOop::NULL_PTR) return TypePtr::NULL_PTR; -Node* DecodeNNode::decode(PhaseGVN* phase, Node* value) { - if (value->Opcode() == Op_EncodeP) { - // (DecodeN (EncodeP p)) -> p - return value->in(1); - } - const Type* newtype = value->bottom_type(); - if (newtype == TypeNarrowOop::NULL_PTR) { - return phase->transform(new (phase->C, 1) ConPNode(TypePtr::NULL_PTR)); - } else { - return phase->transform(new (phase->C, 2) DecodeNNode(value, newtype->is_narrowoop()->make_oopptr())); - } + assert(t->isa_narrowoop(), "only narrowoop here"); + return t->make_ptr(); } Node* EncodePNode::Identity(PhaseTransform* phase) { const Type *t = phase->type( in(1) ); if( t == Type::TOP ) return in(1); - if (in(1)->Opcode() == Op_DecodeN) { + if (in(1)->is_DecodeN()) { // (EncodeP (DecodeN p)) -> p return in(1)->in(1); } @@ -595,28 +585,18 @@ Node* EncodePNode::Identity(PhaseTransform* phase) { } const Type *EncodePNode::Value( PhaseTransform *phase ) const { - if (phase->type( in(1) ) == TypePtr::NULL_PTR) { - return TypeNarrowOop::NULL_PTR; - } - return bottom_type(); + const Type *t = phase->type( in(1) ); + if (t == Type::TOP) return Type::TOP; + if (t == TypePtr::NULL_PTR) return TypeNarrowOop::NULL_PTR; + + assert(t->isa_oopptr(), "only oopptr here"); + return t->make_narrowoop(); } -Node* EncodePNode::encode(PhaseGVN* phase, Node* value) { - if (value->Opcode() == Op_DecodeN) { - // (EncodeP (DecodeN p)) -> p - return value->in(1); - } - const Type* newtype = value->bottom_type(); - if (newtype == TypePtr::NULL_PTR) { - return phase->transform(new (phase->C, 1) ConNNode(TypeNarrowOop::NULL_PTR)); - } else if (newtype->isa_oopptr()) { - return phase->transform(new (phase->C, 2) EncodePNode(value, newtype->is_oopptr()->make_narrowoop())); - } else { - ShouldNotReachHere(); - return NULL; // to make C++ compiler happy. - } -} +Node *EncodePNode::Ideal_DU_postCCP( PhaseCCP *ccp ) { + return MemNode::Ideal_common_DU_postCCP(ccp, this, in(1)); +} //============================================================================= //------------------------------Identity--------------------------------------- diff --git a/hotspot/src/share/vm/opto/connode.hpp b/hotspot/src/share/vm/opto/connode.hpp index 247a364c845..a16d7f2ee84 100644 --- a/hotspot/src/share/vm/opto/connode.hpp +++ b/hotspot/src/share/vm/opto/connode.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -70,11 +70,6 @@ public: else return new (C, 1) ConPNode( TypeRawPtr::make(con) ); } - - static ConPNode* make( Compile *C, ciObject* con ) { - return new (C, 1) ConPNode( TypeOopPtr::make_from_constant(con) ); - } - }; @@ -84,11 +79,6 @@ class ConNNode : public ConNode { public: ConNNode( const TypeNarrowOop *t ) : ConNode(t) {} virtual int Opcode() const; - - static ConNNode* make( Compile *C, ciObject* con ) { - return new (C, 1) ConNNode( TypeNarrowOop::make_from_constant(con) ); - } - }; @@ -210,7 +200,14 @@ public: virtual int Opcode() const; }; -//------------------------------ConstraintCastNode------------------------------------- +//------------------------------CMoveNNode------------------------------------- +class CMoveNNode : public CMoveNode { +public: + CMoveNNode( Node *c, Node *bol, Node *left, Node *right, const Type* t ) : CMoveNode(bol,left,right,t) { init_req(Control,c); } + virtual int Opcode() const; +}; + +//------------------------------ConstraintCastNode----------------------------- // cast to a different range class ConstraintCastNode: public TypeNode { public: @@ -274,6 +271,7 @@ class EncodePNode : public TypeNode { public: EncodePNode(Node* value, const Type* type): TypeNode(type, 2) { + init_class_id(Class_EncodeP); init_req(0, NULL); init_req(1, value); } @@ -282,7 +280,7 @@ class EncodePNode : public TypeNode { virtual const Type *Value( PhaseTransform *phase ) const; virtual uint ideal_reg() const { return Op_RegN; } - static Node* encode(PhaseGVN* phase, Node* value); + virtual Node *Ideal_DU_postCCP( PhaseCCP *ccp ); }; //------------------------------DecodeN-------------------------------- @@ -293,6 +291,7 @@ class DecodeNNode : public TypeNode { public: DecodeNNode(Node* value, const Type* type): TypeNode(type, 2) { + init_class_id(Class_DecodeN); init_req(0, NULL); init_req(1, value); } @@ -300,8 +299,6 @@ class DecodeNNode : public TypeNode { virtual Node *Identity( PhaseTransform *phase ); virtual const Type *Value( PhaseTransform *phase ) const; virtual uint ideal_reg() const { return Op_RegP; } - - static Node* decode(PhaseGVN* phase, Node* value); }; //------------------------------Conv2BNode------------------------------------- @@ -549,10 +546,18 @@ class Opaque1Node : public Node { virtual uint hash() const ; // { return NO_HASH; } virtual uint cmp( const Node &n ) const; public: - Opaque1Node( Node *n ) : Node(0,n) {} + Opaque1Node( Compile* C, Node *n ) : Node(0,n) { + // Put it on the Macro nodes list to removed during macro nodes expansion. + init_flags(Flag_is_macro); + C->add_macro_node(this); + } // Special version for the pre-loop to hold the original loop limit // which is consumed by range check elimination. - Opaque1Node( Node *n, Node* orig_limit ) : Node(0,n,orig_limit) {} + Opaque1Node( Compile* C, Node *n, Node* orig_limit ) : Node(0,n,orig_limit) { + // Put it on the Macro nodes list to removed during macro nodes expansion. + init_flags(Flag_is_macro); + C->add_macro_node(this); + } Node* original_loop_limit() { return req()==3 ? in(2) : NULL; } virtual int Opcode() const; virtual const Type *bottom_type() const { return TypeInt::INT; } @@ -572,7 +577,11 @@ class Opaque2Node : public Node { virtual uint hash() const ; // { return NO_HASH; } virtual uint cmp( const Node &n ) const; public: - Opaque2Node( Node *n ) : Node(0,n) {} + Opaque2Node( Compile* C, Node *n ) : Node(0,n) { + // Put it on the Macro nodes list to removed during macro nodes expansion. + init_flags(Flag_is_macro); + C->add_macro_node(this); + } virtual int Opcode() const; virtual const Type *bottom_type() const { return TypeInt::INT; } }; diff --git a/hotspot/src/share/vm/opto/divnode.cpp b/hotspot/src/share/vm/opto/divnode.cpp index d05ef9fd316..90e198d0763 100644 --- a/hotspot/src/share/vm/opto/divnode.cpp +++ b/hotspot/src/share/vm/opto/divnode.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/opto/doCall.cpp b/hotspot/src/share/vm/opto/doCall.cpp index edf71c0caf0..99772d4450c 100644 --- a/hotspot/src/share/vm/opto/doCall.cpp +++ b/hotspot/src/share/vm/opto/doCall.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -580,7 +580,7 @@ void Parse::catch_inline_exceptions(SafePointNode* ex_map) { Node* ex_klass_node = NULL; if (has_ex_handler() && !ex_type->klass_is_exact()) { Node* p = basic_plus_adr( ex_node, ex_node, oopDesc::klass_offset_in_bytes()); - ex_klass_node = _gvn.transform(new (C, 3) LoadKlassNode(NULL, immutable_memory(), p, TypeInstPtr::KLASS, TypeKlassPtr::OBJECT)); + ex_klass_node = _gvn.transform( LoadKlassNode::make(_gvn, immutable_memory(), p, TypeInstPtr::KLASS, TypeKlassPtr::OBJECT) ); // Compute the exception klass a little more cleverly. // Obvious solution is to simple do a LoadKlass from the 'ex_node'. @@ -592,7 +592,7 @@ void Parse::catch_inline_exceptions(SafePointNode* ex_map) { ex_klass_node = new (C, ex_node->req()) PhiNode( ex_node->in(0), TypeKlassPtr::OBJECT ); for( uint i = 1; i < ex_node->req(); i++ ) { Node* p = basic_plus_adr( ex_node->in(i), ex_node->in(i), oopDesc::klass_offset_in_bytes() ); - Node* k = _gvn.transform(new (C, 3) LoadKlassNode(0, immutable_memory(), p, TypeInstPtr::KLASS, TypeKlassPtr::OBJECT)); + Node* k = _gvn.transform( LoadKlassNode::make(_gvn, immutable_memory(), p, TypeInstPtr::KLASS, TypeKlassPtr::OBJECT) ); ex_klass_node->init_req( i, k ); } _gvn.set_type(ex_klass_node, TypeKlassPtr::OBJECT); diff --git a/hotspot/src/share/vm/opto/escape.cpp b/hotspot/src/share/vm/opto/escape.cpp index 93a49b94127..5aa90ea1f3d 100644 --- a/hotspot/src/share/vm/opto/escape.cpp +++ b/hotspot/src/share/vm/opto/escape.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -417,11 +417,18 @@ static Node* get_addp_base(Node *addp) { // | | // AddP ( base == address ) // + // case #8. narrow Klass's field reference. + // LoadNKlass + // | + // DecodeN + // | | + // AddP ( base == address ) + // Node *base = addp->in(AddPNode::Base)->uncast(); if (base->is_top()) { // The AddP case #3 and #6. base = addp->in(AddPNode::Address)->uncast(); assert(base->Opcode() == Op_ConP || base->Opcode() == Op_ThreadLocal || - base->Opcode() == Op_CastX2P || + base->Opcode() == Op_CastX2P || base->is_DecodeN() || (base->is_Mem() && base->bottom_type() == TypeRawPtr::NOTNULL) || (base->is_Proj() && base->in(0)->is_Allocate()), "sanity"); } @@ -476,7 +483,7 @@ static Node* find_second_addp(Node* addp, Node* n) { // void ConnectionGraph::split_AddP(Node *addp, Node *base, PhaseGVN *igvn) { const TypeOopPtr *base_t = igvn->type(base)->isa_oopptr(); - assert(base_t != NULL && base_t->is_instance(), "expecting instance oopptr"); + assert(base_t != NULL && base_t->is_known_instance(), "expecting instance oopptr"); const TypeOopPtr *t = igvn->type(addp)->isa_oopptr(); if (t == NULL) { // We are computing a raw address for a store captured by an Initialize @@ -487,8 +494,8 @@ void ConnectionGraph::split_AddP(Node *addp, Node *base, PhaseGVN *igvn) { assert(offs != Type::OffsetBot, "offset must be a constant"); t = base_t->add_offset(offs)->is_oopptr(); } - uint inst_id = base_t->instance_id(); - assert(!t->is_instance() || t->instance_id() == inst_id, + int inst_id = base_t->instance_id(); + assert(!t->is_known_instance() || t->instance_id() == inst_id, "old type must be non-instance or match new type"); const TypeOopPtr *tinst = base_t->add_offset(t->offset())->is_oopptr(); // Do NOT remove the next call: ensure an new alias index is allocated @@ -502,7 +509,7 @@ void ConnectionGraph::split_AddP(Node *addp, Node *base, PhaseGVN *igvn) { Node *adr = addp->in(AddPNode::Address); const TypeOopPtr *atype = igvn->type(adr)->isa_oopptr(); if (atype != NULL && atype->instance_id() != inst_id) { - assert(!atype->is_instance(), "no conflicting instances"); + assert(!atype->is_known_instance(), "no conflicting instances"); const TypeOopPtr *new_atype = base_t->add_offset(atype->offset())->isa_oopptr(); Node *acast = new (_compile, 2) CastPPNode(adr, new_atype); acast->set_req(0, adr->in(0)); @@ -656,7 +663,7 @@ Node* ConnectionGraph::find_inst_mem(Node *orig_mem, int alias_idx, GrowableArra return orig_mem; Compile* C = phase->C; const TypeOopPtr *tinst = C->get_adr_type(alias_idx)->isa_oopptr(); - bool is_instance = (tinst != NULL) && tinst->is_instance(); + bool is_instance = (tinst != NULL) && tinst->is_known_instance(); Node *prev = NULL; Node *result = orig_mem; while (prev != result) { @@ -686,7 +693,7 @@ Node* ConnectionGraph::find_inst_mem(Node *orig_mem, int alias_idx, GrowableArra AllocateNode* alloc = proj_in->as_Initialize()->allocation(); // Stop if this is the initialization for the object instance which // which contains this memory slice, otherwise skip over it. - if (alloc == NULL || alloc->_idx != tinst->instance_id()) { + if (alloc == NULL || alloc->_idx != (uint)tinst->instance_id()) { result = proj_in->in(TypeFunc::Memory); } } else if (proj_in->is_MemBar()) { @@ -880,7 +887,7 @@ void ConnectionGraph::split_unique_types(GrowableArray &alloc_worklist) const TypeOopPtr *t = igvn->type(n)->isa_oopptr(); if (t == NULL) continue; // not a TypeInstPtr - tinst = t->cast_to_instance(ni); + tinst = t->cast_to_instance_id(ni); igvn->hash_delete(n); igvn->set_type(n, tinst); n->raise_bottom_type(tinst); @@ -888,6 +895,23 @@ void ConnectionGraph::split_unique_types(GrowableArray &alloc_worklist) record_for_optimizer(n); if (alloc->is_Allocate() && ptn->_scalar_replaceable && (t->isa_instptr() || t->isa_aryptr())) { + + // First, put on the worklist all Field edges from Connection Graph + // which is more accurate then putting immediate users from Ideal Graph. + for (uint e = 0; e < ptn->edge_count(); e++) { + Node *use = _nodes->adr_at(ptn->edge_target(e))->_node; + assert(ptn->edge_type(e) == PointsToNode::FieldEdge && use->is_AddP(), + "only AddP nodes are Field edges in CG"); + if (use->outcnt() > 0) { // Don't process dead nodes + Node* addp2 = find_second_addp(use, use->in(AddPNode::Base)); + if (addp2 != NULL) { + assert(alloc->is_AllocateArray(),"array allocation was expected"); + alloc_worklist.append_if_missing(addp2); + } + alloc_worklist.append_if_missing(use); + } + } + // An allocation may have an Initialize which has raw stores. Scan // the users of the raw allocation result and push AddP users // on alloc_worklist. @@ -919,6 +943,8 @@ void ConnectionGraph::split_unique_types(GrowableArray &alloc_worklist) tinst = igvn->type(base)->isa_oopptr(); } else if (n->is_Phi() || n->is_CheckCastPP() || + n->is_EncodeP() || + n->is_DecodeN() || (n->is_ConstraintCast() && n->Opcode() == Op_CastPP)) { if (visited.test_set(n->_idx)) { assert(n->is_Phi(), "loops only through Phi's"); @@ -933,15 +959,27 @@ void ConnectionGraph::split_unique_types(GrowableArray &alloc_worklist) Node *val = get_map(elem); // CheckCastPP node TypeNode *tn = n->as_Type(); tinst = igvn->type(val)->isa_oopptr(); - assert(tinst != NULL && tinst->is_instance() && - tinst->instance_id() == elem , "instance type expected."); - const TypeOopPtr *tn_t = igvn->type(tn)->isa_oopptr(); + assert(tinst != NULL && tinst->is_known_instance() && + (uint)tinst->instance_id() == elem , "instance type expected."); + + const Type *tn_type = igvn->type(tn); + const TypeOopPtr *tn_t; + if (tn_type->isa_narrowoop()) { + tn_t = tn_type->make_ptr()->isa_oopptr(); + } else { + tn_t = tn_type->isa_oopptr(); + } if (tn_t != NULL && - tinst->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE)->higher_equal(tn_t)) { + tinst->cast_to_instance_id(TypeOopPtr::InstanceBot)->higher_equal(tn_t)) { + if (tn_type->isa_narrowoop()) { + tn_type = tinst->make_narrowoop(); + } else { + tn_type = tinst; + } igvn->hash_delete(tn); - igvn->set_type(tn, tinst); - tn->set_type(tinst); + igvn->set_type(tn, tn_type); + tn->set_type(tn_type); igvn->hash_insert(tn); record_for_optimizer(n); } @@ -978,6 +1016,8 @@ void ConnectionGraph::split_unique_types(GrowableArray &alloc_worklist) alloc_worklist.append_if_missing(use); } else if (use->is_Phi() || use->is_CheckCastPP() || + use->is_EncodeP() || + use->is_DecodeN() || (use->is_ConstraintCast() && use->Opcode() == Op_CastPP)) { alloc_worklist.append_if_missing(use); } @@ -1199,7 +1239,7 @@ void ConnectionGraph::split_unique_types(GrowableArray &alloc_worklist) void ConnectionGraph::compute_escape() { - // 1. Populate Connection Graph with Ideal nodes. + // 1. Populate Connection Graph (CG) with Ideal nodes. Unique_Node_List worklist_init; worklist_init.map(_compile->unique(), NULL); // preallocate space @@ -1281,11 +1321,13 @@ void ConnectionGraph::compute_escape() { remove_deferred(ni, &deferred_edges, &visited); if (n->is_AddP()) { // If this AddP computes an address which may point to more that one - // object, nothing the address points to can be scalar replaceable. + // object or more then one field (array's element), nothing the address + // points to can be scalar replaceable. Node *base = get_addp_base(n); ptset.Clear(); PointsTo(ptset, base, igvn); - if (ptset.Size() > 1) { + if (ptset.Size() > 1 || + (ptset.Size() != 0 && ptn->offset() == Type::OffsetBot)) { for( VectorSetI j(&ptset); j.test(); ++j ) { uint pt = j.elem; ptnode_adr(pt)->_scalar_replaceable = false; @@ -1538,6 +1580,7 @@ void ConnectionGraph::process_call_result(ProjNode *resproj, PhaseTransform *pha if (k->Opcode() == Op_LoadKlass) { kt = k->as_Load()->type()->isa_klassptr(); } else { + // Also works for DecodeN(LoadNKlass). kt = k->as_Type()->type()->isa_klassptr(); } assert(kt != NULL, "TypeKlassPtr required."); @@ -1776,6 +1819,7 @@ void ConnectionGraph::record_for_escape_analysis(Node *n, PhaseTransform *phase) break; } case Op_LoadKlass: + case Op_LoadNKlass: { add_node(n, PointsToNode::JavaObject, PointsToNode::GlobalEscape, true); break; @@ -1877,9 +1921,7 @@ void ConnectionGraph::record_for_escape_analysis(Node *n, PhaseTransform *phase) case Op_StoreN: { const Type *adr_type = phase->type(n->in(MemNode::Address)); - if (adr_type->isa_narrowoop()) { - adr_type = adr_type->is_narrowoop()->make_oopptr(); - } + adr_type = adr_type->make_ptr(); if (adr_type->isa_oopptr()) { add_node(n, PointsToNode::UnknownType, PointsToNode::UnknownEscape, false); } else { @@ -1904,9 +1946,7 @@ void ConnectionGraph::record_for_escape_analysis(Node *n, PhaseTransform *phase) case Op_CompareAndSwapN: { const Type *adr_type = phase->type(n->in(MemNode::Address)); - if (adr_type->isa_narrowoop()) { - adr_type = adr_type->is_narrowoop()->make_oopptr(); - } + adr_type = adr_type->make_ptr(); if (adr_type->isa_oopptr()) { add_node(n, PointsToNode::UnknownType, PointsToNode::UnknownEscape, false); } else { @@ -1979,12 +2019,18 @@ void ConnectionGraph::build_connection_graph(Node *n, PhaseTransform *phase) { assert(false, "Op_ConP"); break; } + case Op_ConN: + { + assert(false, "Op_ConN"); + break; + } case Op_CreateEx: { assert(false, "Op_CreateEx"); break; } case Op_LoadKlass: + case Op_LoadNKlass: { assert(false, "Op_LoadKlass"); break; @@ -2081,10 +2127,7 @@ void ConnectionGraph::build_connection_graph(Node *n, PhaseTransform *phase) { case Op_CompareAndSwapN: { Node *adr = n->in(MemNode::Address); - const Type *adr_type = phase->type(adr); - if (adr_type->isa_narrowoop()) { - adr_type = adr_type->is_narrowoop()->make_oopptr(); - } + const Type *adr_type = phase->type(adr)->make_ptr(); #ifdef ASSERT if (!adr_type->isa_oopptr()) assert(phase->type(adr) == TypeRawPtr::NOTNULL, "Op_StoreP"); diff --git a/hotspot/src/share/vm/opto/escape.hpp b/hotspot/src/share/vm/opto/escape.hpp index 1d2c83511e7..c969f0dcd6c 100644 --- a/hotspot/src/share/vm/opto/escape.hpp +++ b/hotspot/src/share/vm/opto/escape.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/opto/gcm.cpp b/hotspot/src/share/vm/opto/gcm.cpp index c02989e04d0..0627e50505b 100644 --- a/hotspot/src/share/vm/opto/gcm.cpp +++ b/hotspot/src/share/vm/opto/gcm.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -307,7 +307,6 @@ static Block* raise_LCA_above_marks(Block* LCA, node_idx_t mark, // Test and set the visited bit. if (mid->raise_LCA_visited() == mark) continue; // already visited - mid->set_raise_LCA_visited(mark); // Don't process the current LCA, otherwise the search may terminate early if (mid != LCA && mid->raise_LCA_mark() == mark) { @@ -317,6 +316,8 @@ static Block* raise_LCA_above_marks(Block* LCA, node_idx_t mark, assert(early->dominates(LCA), "early is high enough"); // Resume searching at that point, skipping intermediate levels. worklist.push(LCA); + if (LCA == mid) + continue; // Don't mark as visited to avoid early termination. } else { // Keep searching through this block's predecessors. for (uint j = 1, jmax = mid->num_preds(); j < jmax; j++) { @@ -324,6 +325,7 @@ static Block* raise_LCA_above_marks(Block* LCA, node_idx_t mark, worklist.push(mid_parent); } } + mid->set_raise_LCA_visited(mark); } return LCA; } diff --git a/hotspot/src/share/vm/opto/graphKit.cpp b/hotspot/src/share/vm/opto/graphKit.cpp index 49e05b8425e..ebd0d051cb8 100644 --- a/hotspot/src/share/vm/opto/graphKit.cpp +++ b/hotspot/src/share/vm/opto/graphKit.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -532,7 +532,7 @@ void GraphKit::builtin_throw(Deoptimization::DeoptReason reason, Node* arg) { C->log()->elem("hot_throw preallocated='1' reason='%s'", Deoptimization::trap_reason_name(reason)); const TypeInstPtr* ex_con = TypeInstPtr::make(ex_obj); - Node* ex_node = _gvn.transform(new (C, 1) ConPNode(ex_con)); + Node* ex_node = _gvn.transform( ConNode::make(C, ex_con) ); // Clear the detail message of the preallocated exception object. // Weblogic sometimes mutates the detail message of exceptions @@ -1043,7 +1043,7 @@ Node* GraphKit::load_object_klass(Node* obj) { Node* akls = AllocateNode::Ideal_klass(obj, &_gvn); if (akls != NULL) return akls; Node* k_adr = basic_plus_adr(obj, oopDesc::klass_offset_in_bytes()); - return _gvn.transform( new (C, 3) LoadKlassNode(0, immutable_memory(), k_adr, TypeInstPtr::KLASS) ); + return _gvn.transform( LoadKlassNode::make(_gvn, immutable_memory(), k_adr, TypeInstPtr::KLASS) ); } //-------------------------load_array_length----------------------------------- @@ -2210,7 +2210,7 @@ Node* GraphKit::gen_subtype_check(Node* subklass, Node* superklass) { // cache which is mutable so can't use immutable memory. Other // types load from the super-class display table which is immutable. Node *kmem = might_be_cache ? memory(p2) : immutable_memory(); - Node *nkls = _gvn.transform( new (C, 3) LoadKlassNode( NULL, kmem, p2, _gvn.type(p2)->is_ptr(), TypeKlassPtr::OBJECT_OR_NULL ) ); + Node *nkls = _gvn.transform( LoadKlassNode::make( _gvn, kmem, p2, _gvn.type(p2)->is_ptr(), TypeKlassPtr::OBJECT_OR_NULL ) ); // Compile speed common case: ARE a subtype and we canNOT fail if( superklass == nkls ) @@ -2801,7 +2801,6 @@ Node* GraphKit::set_output_for_allocation(AllocateNode* alloc, // initialization, and source them from the new InitializeNode. // This will allow us to observe initializations when they occur, // and link them properly (as a group) to the InitializeNode. - Node* klass_node = alloc->in(AllocateNode::KlassNode); assert(init->in(InitializeNode::Memory) == malloc, ""); MergeMemNode* minit_in = MergeMemNode::make(C, malloc); init->set_req(InitializeNode::Memory, minit_in); diff --git a/hotspot/src/share/vm/opto/idealGraphPrinter.cpp b/hotspot/src/share/vm/opto/idealGraphPrinter.cpp index e65cc72b43f..114a7ea17c7 100644 --- a/hotspot/src/share/vm/opto/idealGraphPrinter.cpp +++ b/hotspot/src/share/vm/opto/idealGraphPrinter.cpp @@ -100,16 +100,18 @@ void IdealGraphPrinter::clean_up() { // Constructor, either file or network output IdealGraphPrinter::IdealGraphPrinter() { - _traverse_outs = false; + // By default dump both ins and outs since dead or unreachable code + // needs to appear in the graph. There are also some special cases + // in the mach where kill projections have no users but should + // appear in the dump. + _traverse_outs = true; _should_send_method = true; _output = NULL; buffer[0] = 0; _depth = 0; _current_method = NULL; assert(!_current_method, "current method must be initialized to NULL"); - _arena = new Arena(); - - _stream = new (ResourceObj::C_HEAP) networkStream(); + _stream = NULL; if (PrintIdealGraphFile != NULL) { ThreadCritical tc; @@ -124,12 +126,16 @@ IdealGraphPrinter::IdealGraphPrinter() { } else { st.print("%s%d", PrintIdealGraphFile, _file_count); } - _output = new (ResourceObj::C_HEAP) fileStream(st.as_string()); + fileStream *stream = new (ResourceObj::C_HEAP) fileStream(st.as_string()); + _output = stream; } else { - _output = new (ResourceObj::C_HEAP) fileStream(PrintIdealGraphFile); + fileStream *stream = new (ResourceObj::C_HEAP) fileStream(PrintIdealGraphFile); + _output = stream; } _file_count++; } else { + _stream = new (ResourceObj::C_HEAP) networkStream(); + // Try to connect to visualizer if (_stream->connect(PrintIdealGraphAddress, PrintIdealGraphPort)) { char c = 0; @@ -149,13 +155,24 @@ IdealGraphPrinter::IdealGraphPrinter() { } } - start_element(TOP_ELEMENT); + _xml = new (ResourceObj::C_HEAP) xmlStream(_output); + + head(TOP_ELEMENT); } // Destructor, close file or network stream IdealGraphPrinter::~IdealGraphPrinter() { - end_element(TOP_ELEMENT); + tail(TOP_ELEMENT); + + // tty->print_cr("Walk time: %d", (int)_walk_time.milliseconds()); + // tty->print_cr("Output time: %d", (int)_output_time.milliseconds()); + // tty->print_cr("Build blocks time: %d", (int)_build_blocks_time.milliseconds()); + + if(_xml) { + delete _xml; + _xml = NULL; + } if (_stream) { delete _stream; @@ -171,94 +188,93 @@ IdealGraphPrinter::~IdealGraphPrinter() { } } -void IdealGraphPrinter::print_ifg(PhaseIFG* ifg) { - // Code to print an interference graph to tty, currently not used +void IdealGraphPrinter::begin_elem(const char *s) { + _xml->begin_elem(s); +} - /* - if (!_current_method) return; - // Remove neighbor colors +void IdealGraphPrinter::end_elem() { + _xml->end_elem(); +} - for (uint i = 0; i < ifg._maxlrg; i++) { +void IdealGraphPrinter::begin_head(const char *s) { + _xml->begin_head(s); +} - IndexSet *s = ifg.neighbors(i); - IndexSetIterator elements(s); - uint neighbor; - while ((neighbor = elements.next()) != 0) { - tty->print_cr("Edge between %d and %d\n", i, neighbor); - } - } +void IdealGraphPrinter::end_head() { + _xml->end_head(); +} +void IdealGraphPrinter::print_attr(const char *name, intptr_t val) { + stringStream stream; + stream.print(INTX_FORMAT, val); + print_attr(name, stream.as_string()); +} - for (uint i = 0; i < ifg._maxlrg; i++) { - LRG &l = ifg.lrgs(i); - if (l._def) { - OptoReg::Name name = l.reg(); - tty->print("OptoReg::dump: "); - OptoReg::dump(name); - tty->print_cr(""); - tty->print_cr("name=%d\n", name); - if (name) { - if (OptoReg::is_stack(name)) { - tty->print_cr("Stack number %d\n", OptoReg::reg2stack(name)); +void IdealGraphPrinter::print_attr(const char *name, const char *val) { + _xml->print(" %s='", name); + text(val); + _xml->print("'"); +} - } else if (!OptoReg::is_valid(name)) { - tty->print_cr("BAD!!!"); - } else { +void IdealGraphPrinter::head(const char *name) { + _xml->head(name); +} - if (OptoReg::is_reg(name)) { - tty->print_cr(OptoReg::regname(name)); - } else { - int x = 0; - } - } - int x = 0; - } +void IdealGraphPrinter::tail(const char *name) { + _xml->tail(name); +} - if (l._def == NodeSentinel) { - tty->print("multiple mapping from %d: ", i); - for (int j=0; jlength(); j++) { - tty->print("%d ", l._defs->at(j)->_idx); - } - tty->print_cr(""); - } else { - tty->print_cr("mapping between %d and %d\n", i, l._def->_idx); - } - } - }*/ +void IdealGraphPrinter::text(const char *s) { + _xml->text(s); +} + +void IdealGraphPrinter::print_prop(const char *name, int val) { + + stringStream stream; + stream.print("%d", val); + print_prop(name, stream.as_string()); +} + +void IdealGraphPrinter::print_prop(const char *name, const char *val) { + begin_head(PROPERTY_ELEMENT); + print_attr(PROPERTY_NAME_PROPERTY, name); + end_head(); + text(val); + tail(PROPERTY_ELEMENT); } void IdealGraphPrinter::print_method(ciMethod *method, int bci, InlineTree *tree) { + begin_head(METHOD_ELEMENT); - Properties properties; stringStream str; method->print_name(&str); stringStream shortStr; method->print_short_name(&shortStr); + print_attr(METHOD_NAME_PROPERTY, str.as_string()); + print_attr(METHOD_SHORT_NAME_PROPERTY, shortStr.as_string()); + print_attr(METHOD_BCI_PROPERTY, bci); - properties.add(new Property(METHOD_NAME_PROPERTY, str.as_string())); - properties.add(new Property(METHOD_SHORT_NAME_PROPERTY, shortStr.as_string())); - properties.add(new Property(METHOD_BCI_PROPERTY, bci)); - start_element(METHOD_ELEMENT, &properties); + end_head(); - start_element(BYTECODES_ELEMENT); + head(BYTECODES_ELEMENT); output()->print_cr("print_codes_on(output()); output()->print_cr("]]>"); - end_element(BYTECODES_ELEMENT); + tail(BYTECODES_ELEMENT); - start_element(INLINE_ELEMENT); + head(INLINE_ELEMENT); if (tree != NULL) { GrowableArray subtrees = tree->subtrees(); for (int i = 0; i < subtrees.length(); i++) { print_inline_tree(subtrees.at(i)); } } - end_element(INLINE_ELEMENT); + tail(INLINE_ELEMENT); - end_element(METHOD_ELEMENT); + tail(METHOD_ELEMENT); output()->flush(); } @@ -271,12 +287,6 @@ void IdealGraphPrinter::print_inline_tree(InlineTree *tree) { } -void IdealGraphPrinter::clear_nodes() { - // for (int i = 0; i < _nodes.length(); i++) { - // _nodes.at(i)->clear_node(); - // } -} - void IdealGraphPrinter::print_inlining(Compile* compile) { // Print inline tree @@ -298,143 +308,56 @@ void IdealGraphPrinter::begin_method(Compile* compile) { assert(method, "null methods are not allowed!"); assert(!_current_method, "current method must be null!"); - _arena->destruct_contents(); + head(GROUP_ELEMENT); - start_element(GROUP_ELEMENT); + head(PROPERTIES_ELEMENT); // Print properties - Properties properties; - // Add method name stringStream strStream; method->print_name(&strStream); - properties.add(new Property(METHOD_NAME_PROPERTY, strStream.as_string())); + print_prop(METHOD_NAME_PROPERTY, strStream.as_string()); if (method->flags().is_public()) { - properties.add(new Property(METHOD_IS_PUBLIC_PROPERTY, TRUE_VALUE)); + print_prop(METHOD_IS_PUBLIC_PROPERTY, TRUE_VALUE); } if (method->flags().is_static()) { - properties.add(new Property(METHOD_IS_STATIC_PROPERTY, TRUE_VALUE)); + print_prop(METHOD_IS_STATIC_PROPERTY, TRUE_VALUE); } - properties.print(this); + tail(PROPERTIES_ELEMENT); if (_stream) { char answer = 0; - _stream->flush(); + _xml->flush(); int result = _stream->read(&answer, 1); _should_send_method = (answer == 'y'); } - this->_nodes = GrowableArray(_arena, 2, 0, NULL); - this->_edges = GrowableArray< EdgeDescription * >(_arena, 2, 0, NULL); - - this->_current_method = method; - - - _output->flush(); + _xml->flush(); } // Has to be called whenever a method has finished compilation void IdealGraphPrinter::end_method() { -// if (finish && !in_method) return; - nmethod* method = (nmethod*)this->_current_method->code(); - start_element(ASSEMBLY_ELEMENT); - // Disassembler::decode(method, _output); - end_element(ASSEMBLY_ELEMENT); - - - end_element(GROUP_ELEMENT); + tail(GROUP_ELEMENT); _current_method = NULL; - _output->flush(); - for (int i = 0; i < _nodes.length(); i++) { - NodeDescription *desc = _nodes.at(i); - if (desc) { - delete desc; - _nodes.at_put(i, NULL); - } - } - this->_nodes.clear(); - - - for (int i = 0; i < _edges.length(); i++) { - // for (int j=0; j<_edges.at(i)->length(); j++) { - EdgeDescription *conn = _edges.at(i); - conn->print(this); - if (conn) { - delete conn; - _edges.at_put(i, NULL); - } - //} - //_edges.at(i)->clear(); - //delete _edges.at(i); - //_edges.at_put(i, NULL); - } - this->_edges.clear(); - -// in_method = false; -} - -// Outputs an XML start element -void IdealGraphPrinter::start_element(const char *s, Properties *properties /* = NULL */, bool print_indent /* = false */, bool print_return /* = true */) { - - start_element_helper(s, properties, false, print_indent, print_return); - _depth++; - -} - -// Outputs an XML start element without body -void IdealGraphPrinter::simple_element(const char *s, Properties *properties /* = NULL */, bool print_indent /* = false */) { - start_element_helper(s, properties, true, print_indent, true); -} - -// Outputs an XML start element. If outputEnd is true, the element has no body. -void IdealGraphPrinter::start_element_helper(const char *s, Properties *properties, bool outputEnd, bool print_indent /* = false */, bool print_return /* = true */) { - - assert(_output, "output stream must exist!"); - - if (print_indent) this->print_indent(); - _output->print("<"); - _output->print(s); - if (properties) properties->print_as_attributes(this); - - if (outputEnd) { - _output->print("/"); - } - - _output->print(">"); - if (print_return) _output->print_cr(""); - + _xml->flush(); } // Print indent void IdealGraphPrinter::print_indent() { + tty->print_cr("printing ident %d", _depth); for (int i = 0; i < _depth; i++) { - _output->print(INDENT); + _xml->print(INDENT); } } -// Outputs an XML end element -void IdealGraphPrinter::end_element(const char *s, bool print_indent /* = true */, bool print_return /* = true */) { - - assert(_output, "output stream must exist!"); - - _depth--; - - if (print_indent) this->print_indent(); - _output->print("print(s); - _output->print(">"); - if (print_return) _output->print_cr(""); - -} - bool IdealGraphPrinter::traverse_outs() { return _traverse_outs; } @@ -443,7 +366,255 @@ void IdealGraphPrinter::set_traverse_outs(bool b) { _traverse_outs = b; } -void IdealGraphPrinter::walk(Node *start) { +intptr_t IdealGraphPrinter::get_node_id(Node *n) { + return (intptr_t)(n); +} + +void IdealGraphPrinter::visit_node(Node *n, void *param) { + + if(param) { + + // Output edge + intptr_t dest_id = get_node_id(n); + for ( uint i = 0; i < n->len(); i++ ) { + if ( n->in(i) ) { + Node *source = n->in(i); + begin_elem(EDGE_ELEMENT); + intptr_t source_id = get_node_id(source); + print_attr(FROM_PROPERTY, source_id); + print_attr(TO_PROPERTY, dest_id); + print_attr(INDEX_PROPERTY, i); + end_elem(); + } + } + + } else { + + // Output node + begin_head(NODE_ELEMENT); + print_attr(NODE_ID_PROPERTY, get_node_id(n)); + end_head(); + + head(PROPERTIES_ELEMENT); + + Node *node = n; +#ifndef PRODUCT + node->_in_dump_cnt++; + print_prop(NODE_NAME_PROPERTY, (const char *)node->Name()); + const Type *t = node->bottom_type(); + print_prop("type", (const char *)Type::msg[t->base()]); + print_prop("idx", node->_idx); +#ifdef ASSERT + print_prop("debug_idx", node->_debug_idx); +#endif + + if(C->cfg() != NULL) { + Block *block = C->cfg()->_bbs[node->_idx]; + if(block == NULL) { + print_prop("block", C->cfg()->_blocks[0]->_pre_order); + } else { + print_prop("block", block->_pre_order); + } + } + + const jushort flags = node->flags(); + if (flags & Node::Flag_is_Copy) { + print_prop("is_copy", "true"); + } + if (flags & Node::Flag_is_Call) { + print_prop("is_call", "true"); + } + if (flags & Node::Flag_rematerialize) { + print_prop("rematerialize", "true"); + } + if (flags & Node::Flag_needs_anti_dependence_check) { + print_prop("needs_anti_dependence_check", "true"); + } + if (flags & Node::Flag_is_macro) { + print_prop("is_macro", "true"); + } + if (flags & Node::Flag_is_Con) { + print_prop("is_con", "true"); + } + if (flags & Node::Flag_is_cisc_alternate) { + print_prop("is_cisc_alternate", "true"); + } + if (flags & Node::Flag_is_Branch) { + print_prop("is_branch", "true"); + } + if (flags & Node::Flag_is_block_start) { + print_prop("is_block_start", "true"); + } + if (flags & Node::Flag_is_Goto) { + print_prop("is_goto", "true"); + } + if (flags & Node::Flag_is_dead_loop_safe) { + print_prop("is_dead_loop_safe", "true"); + } + if (flags & Node::Flag_may_be_short_branch) { + print_prop("may_be_short_branch", "true"); + } + if (flags & Node::Flag_is_safepoint_node) { + print_prop("is_safepoint_node", "true"); + } + if (flags & Node::Flag_is_pc_relative) { + print_prop("is_pc_relative", "true"); + } + + if (C->matcher() != NULL) { + if (C->matcher()->is_shared(node)) { + print_prop("is_shared", "true"); + } else { + print_prop("is_shared", "false"); + } + if (C->matcher()->is_dontcare(node)) { + print_prop("is_dontcare", "true"); + } else { + print_prop("is_dontcare", "false"); + } + + Node* old = C->matcher()->find_old_node(node); + if (old != NULL) { + print_prop("old_node_idx", old->_idx); + } + } + + if (node->is_Proj()) { + print_prop("con", (int)node->as_Proj()->_con); + } + + if (node->is_Mach()) { + print_prop("idealOpcode", (const char *)NodeClassNames[node->as_Mach()->ideal_Opcode()]); + } + + buffer[0] = 0; + stringStream s2(buffer, sizeof(buffer) - 1); + + node->dump_spec(&s2); + if (t != NULL && (t->isa_instptr() || t->isa_klassptr())) { + const TypeInstPtr *toop = t->isa_instptr(); + const TypeKlassPtr *tkls = t->isa_klassptr(); + ciKlass* klass = toop ? toop->klass() : (tkls ? tkls->klass() : NULL ); + if( klass && klass->is_loaded() && klass->is_interface() ) { + s2.print(" Interface:"); + } else if( toop ) { + s2.print(" Oop:"); + } else if( tkls ) { + s2.print(" Klass:"); + } + t->dump_on(&s2); + } else if( t == Type::MEMORY ) { + s2.print(" Memory:"); + MemNode::dump_adr_type(node, node->adr_type(), &s2); + } + + assert(s2.size() < sizeof(buffer), "size in range"); + print_prop("dump_spec", buffer); + + if (node->is_block_proj()) { + print_prop("is_block_proj", "true"); + } + + if (node->is_block_start()) { + print_prop("is_block_start", "true"); + } + + const char *short_name = "short_name"; + if (strcmp(node->Name(), "Parm") == 0 && node->as_Proj()->_con >= TypeFunc::Parms) { + int index = node->as_Proj()->_con - TypeFunc::Parms; + if (index >= 10) { + print_prop(short_name, "PA"); + } else { + sprintf(buffer, "P%d", index); + print_prop(short_name, buffer); + } + } else if (strcmp(node->Name(), "IfTrue") == 0) { + print_prop(short_name, "T"); + } else if (strcmp(node->Name(), "IfFalse") == 0) { + print_prop(short_name, "F"); + } else if ((node->is_Con() && node->is_Type()) || node->is_Proj()) { + + if (t->base() == Type::Int && t->is_int()->is_con()) { + const TypeInt *typeInt = t->is_int(); + assert(typeInt->is_con(), "must be constant"); + jint value = typeInt->get_con(); + + // max. 2 chars allowed + if (value >= -9 && value <= 99) { + sprintf(buffer, "%d", value); + print_prop(short_name, buffer); + } else { + print_prop(short_name, "I"); + } + } else if (t == Type::TOP) { + print_prop(short_name, "^"); + } else if (t->base() == Type::Long && t->is_long()->is_con()) { + const TypeLong *typeLong = t->is_long(); + assert(typeLong->is_con(), "must be constant"); + jlong value = typeLong->get_con(); + + // max. 2 chars allowed + if (value >= -9 && value <= 99) { + sprintf(buffer, "%d", value); + print_prop(short_name, buffer); + } else { + print_prop(short_name, "L"); + } + } else if (t->base() == Type::KlassPtr) { + const TypeKlassPtr *typeKlass = t->is_klassptr(); + print_prop(short_name, "CP"); + } else if (t->base() == Type::Control) { + print_prop(short_name, "C"); + } else if (t->base() == Type::Memory) { + print_prop(short_name, "M"); + } else if (t->base() == Type::Abio) { + print_prop(short_name, "IO"); + } else if (t->base() == Type::Return_Address) { + print_prop(short_name, "RA"); + } else if (t->base() == Type::AnyPtr) { + print_prop(short_name, "P"); + } else if (t->base() == Type::RawPtr) { + print_prop(short_name, "RP"); + } else if (t->base() == Type::AryPtr) { + print_prop(short_name, "AP"); + } + } + + JVMState* caller = NULL; + if (node->is_SafePoint()) { + caller = node->as_SafePoint()->jvms(); + } else { + Node_Notes* notes = C->node_notes_at(node->_idx); + if (notes != NULL) { + caller = notes->jvms(); + } + } + + if (caller != NULL) { + stringStream bciStream; + while(caller) { + bciStream.print("%d ", caller->bci()); + caller = caller->caller(); + } + print_prop("bci", bciStream.as_string()); + } + + if (_chaitin && _chaitin != (PhaseChaitin *)0xdeadbeef) { + buffer[0] = 0; + _chaitin->dump_register(node, buffer); + print_prop("reg", buffer); + print_prop("lrg", _chaitin->n2lidx(node)); + } + + node->_in_dump_cnt--; +#endif + + tail(PROPERTIES_ELEMENT); + tail(NODE_ELEMENT); + } +} + +void IdealGraphPrinter::walk_nodes(Node *start, void *param) { VectorSet visited(Thread::current()->resource_area()); @@ -453,7 +624,7 @@ void IdealGraphPrinter::walk(Node *start) { while(nodeStack.length() > 0) { Node *n = nodeStack.pop(); - IdealGraphPrinter::pre_node(n, this); + visit_node(n, param); if (_traverse_outs) { for (DUIterator i = n->outs(); n->has_out(i); i++) { @@ -474,573 +645,6 @@ void IdealGraphPrinter::walk(Node *start) { } } -void IdealGraphPrinter::compress(int index, GrowableArray* blocks) { - Block *block = blocks->adr_at(index); - - int ancestor = block->ancestor(); - assert(ancestor != -1, ""); - - Block *ancestor_block = blocks->adr_at(ancestor); - if (ancestor_block->ancestor() != -1) { - compress(ancestor, blocks); - - int label = block->label(); - Block *label_block = blocks->adr_at(label); - - int ancestor_label = ancestor_block->label(); - Block *ancestor_label_block = blocks->adr_at(label); - if (ancestor_label_block->semi() < label_block->semi()) { - block->set_label(ancestor_label); - } - - block->set_ancestor(ancestor_block->ancestor()); - } -} - -int IdealGraphPrinter::eval(int index, GrowableArray* blocks) { - Block *block = blocks->adr_at(index); - if (block->ancestor() == -1) { - return index; - } else { - compress(index, blocks); - return block->label(); - } -} - -void IdealGraphPrinter::link(int index1, int index2, GrowableArray* blocks) { - Block *block2 = blocks->adr_at(index2); - block2->set_ancestor(index1); -} - -void IdealGraphPrinter::build_dominators(GrowableArray* blocks) { - - if (blocks->length() == 0) return; - - GrowableArray stack; - stack.append(0); - - GrowableArray array; - - assert(blocks->length() > 0, ""); - blocks->adr_at(0)->set_dominator(0); - - int n = 0; - while(!stack.is_empty()) { - int index = stack.pop(); - Block *block = blocks->adr_at(index); - block->set_semi(n); - array.append(block); - n = n + 1; - for (int i = 0; i < block->succs()->length(); i++) { - int succ_index = block->succs()->at(i); - Block *succ = blocks->adr_at(succ_index); - if (succ->semi() == -1) { - succ->set_parent(index); - stack.push(succ_index); - } - succ->add_pred(index); - } - } - - for (int i=n-1; i>0; i--) { - Block *block = array.at(i); - int block_index = block->index(); - for (int j=0; jpred()->length(); j++) { - int pred_index = block->pred()->at(j); - int cur_index = eval(pred_index, blocks); - - Block *cur_block = blocks->adr_at(cur_index); - if (cur_block->semi() < block->semi()) { - block->set_semi(cur_block->semi()); - } - } - - int semi_index = block->semi(); - Block *semi_block = array.at(semi_index); - semi_block->add_to_bucket(block_index); - - link(block->parent(), block_index, blocks); - Block *parent_block = blocks->adr_at(block->parent()); - - for (int j=0; jbucket()->length(); j++) { - int cur_index = parent_block->bucket()->at(j); - int new_index = eval(cur_index, blocks); - Block *cur_block = blocks->adr_at(cur_index); - Block *new_block = blocks->adr_at(new_index); - int dom = block->parent(); - - if (new_block->semi() < cur_block->semi()) { - dom = new_index; - } - - cur_block->set_dominator(dom); - } - - parent_block->clear_bucket(); - } - - for (int i=1; i < n; i++) { - - Block *block = array.at(i); - int block_index = block->index(); - - int semi_index = block->semi(); - Block *semi_block = array.at(semi_index); - - if (block->dominator() != semi_block->index()) { - int new_dom = blocks->adr_at(block->dominator())->dominator(); - block->set_dominator(new_dom); - } - } - - for (int i = 0; i < blocks->length(); i++) { - if (blocks->adr_at(i)->dominator() == -1) { - blocks->adr_at(i)->set_dominator(0); - } - } - - // Build dominates array - for (int i=1; i < blocks->length(); i++) { - Block *block = blocks->adr_at(i); - int dominator = block->dominator(); - Block *dom_block = blocks->adr_at(dominator); - dom_block->add_dominates(i); - dom_block->add_child(i); - - while(dominator != 0) { - dominator = dom_block->dominator(); - dom_block = blocks->adr_at(dominator); - dom_block->add_child(i); - } - } -} - -void IdealGraphPrinter::build_common_dominator(int **common_dominator, int index, GrowableArray* blocks) { - - common_dominator[index][index] = index; - Block *block = blocks->adr_at(index); - for (int i = 0; i < block->dominates()->length(); i++) { - Block *dominated = blocks->adr_at(block->dominates()->at(i)); - - for (int j=0; jchildren()->length(); j++) { - Block *child = blocks->adr_at(dominated->children()->at(j)); - common_dominator[index][child->index()] = common_dominator[child->index()][index] = index; - - for (int k=0; kadr_at(block->dominates()->at(k)); - common_dominator[child->index()][other_dominated->index()] = common_dominator[other_dominated->index()][child->index()] = index; - - for (int l=0 ; lchildren()->length(); l++) { - Block *other_child = blocks->adr_at(other_dominated->children()->at(l)); - common_dominator[child->index()][other_child->index()] = common_dominator[other_child->index()][child->index()] = index; - } - } - } - - build_common_dominator(common_dominator, dominated->index(), blocks); - } -} - -void IdealGraphPrinter::schedule_latest(int **common_dominator, GrowableArray* blocks) { - - int queue_size = _nodes.length() + 1; - NodeDescription **queue = NEW_RESOURCE_ARRAY(NodeDescription *, queue_size); - int queue_start = 0; - int queue_end = 0; - Arena *a = new Arena(); - VectorSet on_queue(a); - - for (int i = 0; i < _nodes.length(); i++) { - NodeDescription *desc = _nodes.at(i); - if (desc) { - desc->init_succs(); - } - } - - for (int i = 0; i < _nodes.length(); i++) { - NodeDescription *desc = _nodes.at(i); - if (desc) { - for (uint j=0; jnode()->len(); j++) { - Node *n = desc->node()->in(j); - if (n) { - NodeDescription *other_desc = _nodes.at(n->_idx); - other_desc->add_succ(desc); - } - } - } - } - - for (int i = 0; i < _nodes.length(); i++) { - NodeDescription *desc = _nodes.at(i); - if (desc && desc->block_index() == -1) { - - // Put Phi into same block as region - if (desc->node()->is_Phi() && desc->node()->in(0) && _nodes.at(desc->node()->in(0)->_idx)->block_index() != -1) { - int index = _nodes.at(desc->node()->in(0)->_idx)->block_index(); - desc->set_block_index(index); - blocks->adr_at(index)->add_node(desc); - - // Put Projections to same block as parent - } else if (desc->node()->is_block_proj() && _nodes.at(desc->node()->is_block_proj()->_idx)->block_index() != -1) { - int index = _nodes.at(desc->node()->is_block_proj()->_idx)->block_index(); - desc->set_block_index(index); - blocks->adr_at(index)->add_node(desc); - } else { - queue[queue_end] = desc; - queue_end++; - on_queue.set(desc->node()->_idx); - } - } - } - - - int z = 0; - while(queue_start != queue_end && z < 10000) { - - NodeDescription *desc = queue[queue_start]; - queue_start = (queue_start + 1) % queue_size; - on_queue >>= desc->node()->_idx; - - Node* node = desc->node(); - - if (desc->succs()->length() == 0) { - int x = 0; - } - - int block_index = -1; - if (desc->succs()->length() != 0) { - for (int i = 0; i < desc->succs()->length(); i++) { - NodeDescription *cur_desc = desc->succs()->at(i); - if (cur_desc != desc) { - if (cur_desc->succs()->length() == 0) { - - // Ignore nodes with 0 successors - - } else if (cur_desc->block_index() == -1) { - - // Let this node schedule first - block_index = -1; - break; - - } else if (cur_desc->node()->is_Phi()){ - - // Special treatment for Phi functions - PhiNode *phi = cur_desc->node()->as_Phi(); - assert(phi->in(0) && phi->in(0)->is_Region(), "Must have region node in first input"); - RegionNode *region = phi->in(0)->as_Region(); - - for (uint j=1; jlen(); j++) { - Node *cur_phi_input = phi->in(j); - if (cur_phi_input == desc->node() && region->in(j)) { - NodeDescription *cur_region_input = _nodes.at(region->in(j)->_idx); - if (cur_region_input->block_index() == -1) { - - // Let this node schedule first - block_index = -1; - break; - } else { - if (block_index == -1) { - block_index = cur_region_input->block_index(); - } else { - block_index = common_dominator[block_index][cur_region_input->block_index()]; - } - } - } - } - - } else { - if (block_index == -1) { - block_index = cur_desc->block_index(); - } else { - block_index = common_dominator[block_index][cur_desc->block_index()]; - } - } - } - } - } - - if (block_index == -1) { - queue[queue_end] = desc; - queue_end = (queue_end + 1) % queue_size; - on_queue.set(desc->node()->_idx); - z++; - } else { - assert(desc->block_index() == -1, ""); - desc->set_block_index(block_index); - blocks->adr_at(block_index)->add_node(desc); - z = 0; - } - } - - for (int i = 0; i < _nodes.length(); i++) { - NodeDescription *desc = _nodes.at(i); - if (desc && desc->block_index() == -1) { - - //if (desc->node()->is_Proj() || desc->node()->is_Con()) { - Node *parent = desc->node()->in(0); - uint cur = 1; - while(!parent && cur < desc->node()->len()) { - parent = desc->node()->in(cur); - cur++; - } - - if (parent && _nodes.at(parent->_idx)->block_index() != -1) { - int index = _nodes.at(parent->_idx)->block_index(); - desc->set_block_index(index); - blocks->adr_at(index)->add_node(desc); - } else { - desc->set_block_index(0); - blocks->adr_at(0)->add_node(desc); - //ShouldNotReachHere(); - } - //} - /* - if (desc->node()->is_block_proj() && _nodes.at(desc->node()->is_block_proj()->_idx)->block_index() != -1) { - int index = _nodes.at(desc->node()->is_block_proj()->_idx)->block_index(); - desc->set_block_index(index); - blocks->adr_at(index)->add_node(desc); - } */ - } - } - - for (int i = 0; i < _nodes.length(); i++) { - NodeDescription *desc = _nodes.at(i); - if (desc) { - desc->clear_succs(); - } - } - - for (int i = 0; i < _nodes.length(); i++) { - NodeDescription *desc = _nodes.at(i); - if (desc) { - int block_index = desc->block_index(); - - assert(block_index >= 0 && block_index < blocks->length(), "Block index must be in range"); - assert(blocks->adr_at(block_index)->nodes()->contains(desc), "Node must be child of block"); - } - } - a->destruct_contents(); -} - -void IdealGraphPrinter::build_blocks(Node *root) { - - Arena *a = new Arena(); - Node_Stack stack(a, 100); - - VectorSet visited(a); - stack.push(root, 0); - GrowableArray blocks(a, 2, 0, Block(0)); - - for (int i = 0; i < _nodes.length(); i++) { - if (_nodes.at(i)) _nodes.at(i)->set_block_index(-1); - } - - - // Order nodes such that node index is equal to idx - for (int i = 0; i < _nodes.length(); i++) { - - if (_nodes.at(i)) { - NodeDescription *node = _nodes.at(i); - int index = node->node()->_idx; - if (index != i) { - _nodes.at_grow(index); - NodeDescription *tmp = _nodes.at(index); - *(_nodes.adr_at(index)) = node; - *(_nodes.adr_at(i)) = tmp; - i--; - } - } - } - - for (int i = 0; i < _nodes.length(); i++) { - NodeDescription *node = _nodes.at(i); - if (node) { - assert(node->node()->_idx == (uint)i, ""); - } - } - - while(stack.is_nonempty()) { - - //Node *n = stack.node(); - //int index = stack.index(); - Node *proj = stack.node();//n->in(index); - const Node *parent = proj->is_block_proj(); - if (parent == NULL) { - parent = proj; - } - - if (!visited.test_set(parent->_idx)) { - - NodeDescription *end_desc = _nodes.at(parent->_idx); - int block_index = blocks.length(); - Block block(block_index); - blocks.append(block); - Block *b = blocks.adr_at(block_index); - b->set_start(end_desc); - // assert(end_desc->block_index() == -1, ""); - end_desc->set_block_index(block_index); - b->add_node(end_desc); - - // Skip any control-pinned middle'in stuff - Node *p = proj; - NodeDescription *start_desc = NULL; - do { - proj = p; // Update pointer to last Control - if (p->in(0) == NULL) { - start_desc = end_desc; - break; - } - p = p->in(0); // Move control forward - start_desc = _nodes.at(p->_idx); - assert(start_desc, ""); - - if (start_desc != end_desc && start_desc->block_index() == -1) { - assert(start_desc->block_index() == -1, ""); - assert(block_index < blocks.length(), ""); - start_desc->set_block_index(block_index); - b->add_node(start_desc); - } - } while( !p->is_block_proj() && - !p->is_block_start() ); - - for (uint i = 0; i < start_desc->node()->len(); i++) { - - Node *pred_node = start_desc->node()->in(i); - - - if (pred_node && pred_node != start_desc->node()) { - const Node *cur_parent = pred_node->is_block_proj(); - if (cur_parent != NULL) { - pred_node = (Node *)cur_parent; - } - - NodeDescription *pred_node_desc = _nodes.at(pred_node->_idx); - if (pred_node_desc->block_index() != -1) { - blocks.adr_at(pred_node_desc->block_index())->add_succ(block_index); - } - } - } - - for (DUIterator_Fast dmax, i = end_desc->node()->fast_outs(dmax); i < dmax; i++) { - Node* cur_succ = end_desc->node()->fast_out(i); - NodeDescription *cur_succ_desc = _nodes.at(cur_succ->_idx); - - DUIterator_Fast dmax2, i2 = cur_succ->fast_outs(dmax2); - if (cur_succ->is_block_proj() && i2 < dmax2 && !cur_succ->is_Root()) { - - for (; i2fast_out(i2); - if (cur_succ2) { - cur_succ_desc = _nodes.at(cur_succ2->_idx); - if (cur_succ_desc == NULL) { - // dead node so skip it - continue; - } - if (cur_succ2 != end_desc->node() && cur_succ_desc->block_index() != -1) { - b->add_succ(cur_succ_desc->block_index()); - } - } - } - - } else { - - if (cur_succ != end_desc->node() && cur_succ_desc && cur_succ_desc->block_index() != -1) { - b->add_succ(cur_succ_desc->block_index()); - } - } - } - - - int num_preds = p->len(); - int bottom = -1; - if (p->is_Region() || p->is_Phi()) { - bottom = 0; - } - - int pushed = 0; - for (int i=num_preds - 1; i > bottom; i--) { - if (p->in(i) != NULL && p->in(i) != p) { - stack.push(p->in(i), 0); - pushed++; - } - } - - if (pushed == 0 && p->is_Root() && !_matcher) { - // Special case when backedges to root are not yet built - for (int i = 0; i < _nodes.length(); i++) { - if (_nodes.at(i) && _nodes.at(i)->node()->is_SafePoint() && _nodes.at(i)->node()->outcnt() == 0) { - stack.push(_nodes.at(i)->node(), 0); - } - } - } - - } else { - stack.pop(); - } - } - - build_dominators(&blocks); - - int **common_dominator = NEW_RESOURCE_ARRAY(int *, blocks.length()); - for (int i = 0; i < blocks.length(); i++) { - int *cur = NEW_RESOURCE_ARRAY(int, blocks.length()); - common_dominator[i] = cur; - - for (int j=0; jadd_child(blocks.adr_at(i)->index()); - } - build_common_dominator(common_dominator, 0, &blocks); - - schedule_latest(common_dominator, &blocks); - - start_element(CONTROL_FLOW_ELEMENT); - - for (int i = 0; i < blocks.length(); i++) { - Block *block = blocks.adr_at(i); - - Properties props; - props.add(new Property(BLOCK_NAME_PROPERTY, i)); - props.add(new Property(BLOCK_DOMINATOR_PROPERTY, block->dominator())); - start_element(BLOCK_ELEMENT, &props); - - if (block->succs()->length() > 0) { - start_element(SUCCESSORS_ELEMENT); - for (int j=0; jsuccs()->length(); j++) { - int cur_index = block->succs()->at(j); - if (cur_index != 0 /* start_block has must not have inputs */) { - Properties properties; - properties.add(new Property(BLOCK_NAME_PROPERTY, cur_index)); - simple_element(SUCCESSOR_ELEMENT, &properties); - } - } - end_element(SUCCESSORS_ELEMENT); - } - - start_element(NODES_ELEMENT); - - for (int j=0; jnodes()->length(); j++) { - NodeDescription *n = block->nodes()->at(j); - Properties properties; - properties.add(new Property(NODE_ID_PROPERTY, n->id())); - simple_element(NODE_ELEMENT, &properties); - } - - end_element(NODES_ELEMENT); - - end_element(BLOCK_ELEMENT); - } - - - end_element(CONTROL_FLOW_ELEMENT); - - a->destruct_contents(); -} - void IdealGraphPrinter::print_method(Compile* compile, const char *name, int level, bool clear_nodes) { print(compile, name, (Node *)compile->root(), level, clear_nodes); } @@ -1048,872 +652,53 @@ void IdealGraphPrinter::print_method(Compile* compile, const char *name, int lev // Print current ideal graph void IdealGraphPrinter::print(Compile* compile, const char *name, Node *node, int level, bool clear_nodes) { -// if (finish && !in_method) return; if (!_current_method || !_should_send_method || level > PrintIdealGraphLevel) return; - assert(_current_method, "newMethod has to be called first!"); - - if (clear_nodes) { - int x = 0; - } - - _clear_nodes = clear_nodes; + this->C = compile; // Warning, unsafe cast? - _chaitin = (PhaseChaitin *)compile->regalloc(); - _matcher = compile->matcher(); + _chaitin = (PhaseChaitin *)C->regalloc(); + begin_head(GRAPH_ELEMENT); + print_attr(GRAPH_NAME_PROPERTY, (const char *)name); + end_head(); - // Update nodes - for (int i = 0; i < _nodes.length(); i++) { - NodeDescription *desc = _nodes.at(i); - if (desc) { - desc->set_state(Invalid); - } - } - Node *n = node; - walk(n); + head(NODES_ELEMENT); + walk_nodes(node, NULL); + tail(NODES_ELEMENT); - // Update edges - for (int i = 0; i < _edges.length(); i++) { - _edges.at(i)->set_state(Invalid); - } + head(EDGES_ELEMENT); + walk_nodes(node, (void *)1); + tail(EDGES_ELEMENT); + if (C->cfg() != NULL) { + head(CONTROL_FLOW_ELEMENT); + for (uint i = 0; i < C->cfg()->_blocks.size(); i++) { + Block *b = C->cfg()->_blocks[i]; + begin_head(BLOCK_ELEMENT); + print_attr(BLOCK_NAME_PROPERTY, b->_pre_order); + end_head(); - for (int i = 0; i < _nodes.length(); i++) { - NodeDescription *desc = _nodes.at(i); - if (desc && desc->state() != Invalid) { - - int to = desc->id(); - uint len = desc->node()->len(); - for (uint j=0; jnode()->in(j); - - if (n) { - - - intptr_t from = (intptr_t)n; - - // Assert from node is valid - /* - bool ok = false; - for (int k=0; k<_nodes.length(); k++) { - NodeDescription *desc = _nodes.at(k); - if (desc && desc->id() == from) { - assert(desc->state() != Invalid, ""); - ok = true; - } - } - assert(ok, "");*/ - - uint index = j; - if (index >= desc->node()->req()) { - index = desc->node()->req(); - } - - print_edge(from, to, index); - } + head(SUCCESSORS_ELEMENT); + for (uint s = 0; s < C->cfg()->_blocks[i]->_num_succs; s++) { + begin_elem(SUCCESSOR_ELEMENT); + print_attr(BLOCK_NAME_PROPERTY, b->_succs[s]->_pre_order); + end_elem(); } + tail(SUCCESSORS_ELEMENT); + + tail(BLOCK_ELEMENT); } + + tail(CONTROL_FLOW_ELEMENT); } - - bool is_different = false; - - for (int i = 0; i < _nodes.length(); i++) { - NodeDescription *desc = _nodes.at(i); - if (desc && desc->state() != Valid) { - is_different = true; - break; - } - } - - if (!is_different) { - for (int i = 0; i < _edges.length(); i++) { - EdgeDescription *conn = _edges.at(i); - if (conn && conn->state() != Valid) { - is_different = true; - break; - } - } - } - - // No changes -> do not print graph - if (!is_different) return; - - Properties properties; - properties.add(new Property(GRAPH_NAME_PROPERTY, (const char *)name)); - start_element(GRAPH_ELEMENT, &properties); - - start_element(NODES_ELEMENT); - for (int i = 0; i < _nodes.length(); i++) { - NodeDescription *desc = _nodes.at(i); - if (desc) { - desc->print(this); - if (desc->state() == Invalid) { - delete desc; - _nodes.at_put(i, NULL); - } else { - desc->set_state(Valid); - } - } - } - end_element(NODES_ELEMENT); - - build_blocks(node); - - start_element(EDGES_ELEMENT); - for (int i = 0; i < _edges.length(); i++) { - EdgeDescription *conn = _edges.at(i); - - // Assert from and to nodes are valid - /* - if (!conn->state() == Invalid) { - bool ok1 = false; - bool ok2 = false; - for (int j=0; j<_nodes.length(); j++) { - NodeDescription *desc = _nodes.at(j); - if (desc && desc->id() == conn->from()) { - ok1 = true; - } - - if (desc && desc->id() == conn->to()) { - ok2 = true; - } - } - - assert(ok1, "from node not found!"); - assert(ok2, "to node not found!"); - }*/ - - conn->print(this); - if (conn->state() == Invalid) { - _edges.remove_at(i); - delete conn; - i--; - } - } - - end_element(EDGES_ELEMENT); - - end_element(GRAPH_ELEMENT); - - _output->flush(); -} - -// Print edge -void IdealGraphPrinter::print_edge(int from, int to, int index) { - - EdgeDescription *conn = new EdgeDescription(from, to, index); - for (int i = 0; i < _edges.length(); i++) { - if (_edges.at(i)->equals(conn)) { - conn->set_state(Valid); - delete _edges.at(i); - _edges.at_put(i, conn); - return; - } - } - - _edges.append(conn); + tail(GRAPH_ELEMENT); + output()->flush(); } extern const char *NodeClassNames[]; -// Create node description -IdealGraphPrinter::NodeDescription *IdealGraphPrinter::create_node_description(Node* node) { - -#ifndef PRODUCT - node->_in_dump_cnt++; - NodeDescription *desc = new NodeDescription(node); - desc->properties()->add(new Property(NODE_NAME_PROPERTY, (const char *)node->Name())); - - const Type *t = node->bottom_type(); - desc->properties()->add(new Property("type", (const char *)Type::msg[t->base()])); - - desc->properties()->add(new Property("idx", node->_idx)); -#ifdef ASSERT - desc->properties()->add(new Property("debug_idx", node->_debug_idx)); -#endif - - - const jushort flags = node->flags(); - if (flags & Node::Flag_is_Copy) { - desc->properties()->add(new Property("is_copy", "true")); - } - if (flags & Node::Flag_is_Call) { - desc->properties()->add(new Property("is_call", "true")); - } - if (flags & Node::Flag_rematerialize) { - desc->properties()->add(new Property("rematerialize", "true")); - } - if (flags & Node::Flag_needs_anti_dependence_check) { - desc->properties()->add(new Property("needs_anti_dependence_check", "true")); - } - if (flags & Node::Flag_is_macro) { - desc->properties()->add(new Property("is_macro", "true")); - } - if (flags & Node::Flag_is_Con) { - desc->properties()->add(new Property("is_con", "true")); - } - if (flags & Node::Flag_is_cisc_alternate) { - desc->properties()->add(new Property("is_cisc_alternate", "true")); - } - if (flags & Node::Flag_is_Branch) { - desc->properties()->add(new Property("is_branch", "true")); - } - if (flags & Node::Flag_is_block_start) { - desc->properties()->add(new Property("is_block_start", "true")); - } - if (flags & Node::Flag_is_Goto) { - desc->properties()->add(new Property("is_goto", "true")); - } - if (flags & Node::Flag_is_dead_loop_safe) { - desc->properties()->add(new Property("is_dead_loop_safe", "true")); - } - if (flags & Node::Flag_may_be_short_branch) { - desc->properties()->add(new Property("may_be_short_branch", "true")); - } - if (flags & Node::Flag_is_safepoint_node) { - desc->properties()->add(new Property("is_safepoint_node", "true")); - } - if (flags & Node::Flag_is_pc_relative) { - desc->properties()->add(new Property("is_pc_relative", "true")); - } - - if (_matcher) { - if (_matcher->is_shared(desc->node())) { - desc->properties()->add(new Property("is_shared", "true")); - } else { - desc->properties()->add(new Property("is_shared", "false")); - } - - if (_matcher->is_dontcare(desc->node())) { - desc->properties()->add(new Property("is_dontcare", "true")); - } else { - desc->properties()->add(new Property("is_dontcare", "false")); - } - } - - if (node->is_Proj()) { - desc->properties()->add(new Property("con", (int)node->as_Proj()->_con)); - } - - if (node->is_Mach()) { - desc->properties()->add(new Property("idealOpcode", (const char *)NodeClassNames[node->as_Mach()->ideal_Opcode()])); - } - - - - - - outputStream *oldTty = tty; - buffer[0] = 0; - stringStream s2(buffer, sizeof(buffer) - 1); - - node->dump_spec(&s2); - assert(s2.size() < sizeof(buffer), "size in range"); - desc->properties()->add(new Property("dump_spec", buffer)); - - if (node->is_block_proj()) { - desc->properties()->add(new Property("is_block_proj", "true")); - } - - if (node->is_block_start()) { - desc->properties()->add(new Property("is_block_start", "true")); - } - - const char *short_name = "short_name"; - if (strcmp(node->Name(), "Parm") == 0 && node->as_Proj()->_con >= TypeFunc::Parms) { - int index = node->as_Proj()->_con - TypeFunc::Parms; - if (index >= 10) { - desc->properties()->add(new Property(short_name, "PA")); - } else { - sprintf(buffer, "P%d", index); - desc->properties()->add(new Property(short_name, buffer)); - } - } else if (strcmp(node->Name(), "IfTrue") == 0) { - desc->properties()->add(new Property(short_name, "T")); - } else if (strcmp(node->Name(), "IfFalse") == 0) { - desc->properties()->add(new Property(short_name, "F")); - } else if ((node->is_Con() && node->is_Type()) || node->is_Proj()) { - - if (t->base() == Type::Int && t->is_int()->is_con()) { - const TypeInt *typeInt = t->is_int(); - assert(typeInt->is_con(), "must be constant"); - jint value = typeInt->get_con(); - - // max. 2 chars allowed - if (value >= -9 && value <= 99) { - sprintf(buffer, "%d", value); - desc->properties()->add(new Property(short_name, buffer)); - } - else - { - desc->properties()->add(new Property(short_name, "I")); - } - } else if (t == Type::TOP) { - desc->properties()->add(new Property(short_name, "^")); - } else if (t->base() == Type::Long && t->is_long()->is_con()) { - const TypeLong *typeLong = t->is_long(); - assert(typeLong->is_con(), "must be constant"); - jlong value = typeLong->get_con(); - - // max. 2 chars allowed - if (value >= -9 && value <= 99) { - sprintf(buffer, "%d", value); - desc->properties()->add(new Property(short_name, buffer)); - } - else - { - desc->properties()->add(new Property(short_name, "L")); - } - } else if (t->base() == Type::KlassPtr) { - const TypeKlassPtr *typeKlass = t->is_klassptr(); - desc->properties()->add(new Property(short_name, "CP")); - } else if (t->base() == Type::Control) { - desc->properties()->add(new Property(short_name, "C")); - } else if (t->base() == Type::Memory) { - desc->properties()->add(new Property(short_name, "M")); - } else if (t->base() == Type::Abio) { - desc->properties()->add(new Property(short_name, "IO")); - } else if (t->base() == Type::Return_Address) { - desc->properties()->add(new Property(short_name, "RA")); - } else if (t->base() == Type::AnyPtr) { - desc->properties()->add(new Property(short_name, "P")); - } else if (t->base() == Type::RawPtr) { - desc->properties()->add(new Property(short_name, "RP")); - } else if (t->base() == Type::AryPtr) { - desc->properties()->add(new Property(short_name, "AP")); - } - } - - if (node->is_SafePoint()) { - SafePointNode *safePointNode = node->as_SafePoint(); - if (safePointNode->jvms()) { - stringStream bciStream; - bciStream.print("%d ", safePointNode->jvms()->bci()); - JVMState *caller = safePointNode->jvms()->caller(); - while(caller) { - bciStream.print("%d ", caller->bci()); - - caller = caller->caller(); - } - desc->properties()->add(new Property("bci", bciStream.as_string())); - } - } - - if (_chaitin && _chaitin != (PhaseChaitin *)0xdeadbeef) { - buffer[0] = 0; - _chaitin->dump_register(node, buffer); - desc->properties()->add(new Property("reg", buffer)); - desc->properties()->add(new Property("lrg", _chaitin->n2lidx(node))); - } - - - node->_in_dump_cnt--; - return desc; -#else - return NULL; -#endif -} - -void IdealGraphPrinter::pre_node(Node* node, void *env) { - - IdealGraphPrinter *printer = (IdealGraphPrinter *)env; - - NodeDescription *newDesc = printer->create_node_description(node); - - if (printer->_clear_nodes) { - - printer->_nodes.append(newDesc); - } else { - - NodeDescription *desc = printer->_nodes.at_grow(node->_idx, NULL); - - if (desc && desc->equals(newDesc)) { - //desc->set_state(Valid); - //desc->set_node(node); - delete desc; - printer->_nodes.at_put(node->_idx, NULL); - newDesc->set_state(Valid); - //printer->_nodes.at_put(node->_idx, newDesc); - } else { - - if (desc && desc->id() == newDesc->id()) { - delete desc; - printer->_nodes.at_put(node->_idx, NULL); - newDesc->set_state(New); - - } - - //if (desc) { - // delete desc; - //} - - //printer->_nodes.at_put(node->_idx, newDesc); - } - - printer->_nodes.append(newDesc); - } -} - -void IdealGraphPrinter::post_node(Node* node, void *env) { -} - outputStream *IdealGraphPrinter::output() { - return _output; -} - -IdealGraphPrinter::Description::Description() { - _state = New; -} - -void IdealGraphPrinter::Description::print(IdealGraphPrinter *printer) { - if (_state == Invalid) { - print_removed(printer); - } else if (_state == New) { - print_changed(printer); - } -} - -void IdealGraphPrinter::Description::set_state(State s) { - _state = s; -} - -IdealGraphPrinter::State IdealGraphPrinter::Description::state() { - return _state; -} - -void IdealGraphPrinter::Block::set_proj(NodeDescription *n) { - _proj = n; -} - -void IdealGraphPrinter::Block::set_start(NodeDescription *n) { - _start = n; -} - -int IdealGraphPrinter::Block::semi() { - return _semi; -} - -int IdealGraphPrinter::Block::parent() { - return _parent; -} - -GrowableArray* IdealGraphPrinter::Block::bucket() { - return &_bucket; -} - -GrowableArray* IdealGraphPrinter::Block::children() { - return &_children; -} - -void IdealGraphPrinter::Block::add_child(int i) { - _children.append(i); -} - -GrowableArray* IdealGraphPrinter::Block::dominates() { - return &_dominates; -} - -void IdealGraphPrinter::Block::add_dominates(int i) { - _dominates.append(i); -} - -void IdealGraphPrinter::Block::add_to_bucket(int i) { - _bucket.append(i); -} - -void IdealGraphPrinter::Block::clear_bucket() { - _bucket.clear(); -} - -void IdealGraphPrinter::Block::set_dominator(int i) { - _dominator = i; -} - -void IdealGraphPrinter::Block::set_label(int i) { - _label = i; -} - -int IdealGraphPrinter::Block::label() { - return _label; -} - -int IdealGraphPrinter::Block::ancestor() { - return _ancestor; -} - -void IdealGraphPrinter::Block::set_ancestor(int i) { - _ancestor = i; -} - -int IdealGraphPrinter::Block::dominator() { - return _dominator; -} - -int IdealGraphPrinter::Block::index() { - return _index; -} - -void IdealGraphPrinter::Block::set_parent(int i) { - _parent = i; -} - -GrowableArray* IdealGraphPrinter::Block::pred() { - return &_pred; -} - -void IdealGraphPrinter::Block::set_semi(int i) { - _semi = i; -} - -IdealGraphPrinter::Block::Block() { -} - -IdealGraphPrinter::Block::Block(int index) { - _index = index; - _label = index; - _semi = -1; - _ancestor = -1; - _dominator = -1; -} - -void IdealGraphPrinter::Block::add_pred(int i) { - _pred.append(i); -} - -IdealGraphPrinter::NodeDescription *IdealGraphPrinter::Block::proj() { - return _proj; -} - -IdealGraphPrinter::NodeDescription *IdealGraphPrinter::Block::start() { - return _start; -} - -GrowableArray* IdealGraphPrinter::Block::succs() { - return &_succs; -} - -void IdealGraphPrinter::Block::add_succ(int index) { - - if (this->_index == 16 && index == 15) { - int x = 0; - } - - if (!_succs.contains(index)) { - _succs.append(index); - } -} - - -void IdealGraphPrinter::Block::add_node(NodeDescription *n) { - if (!_nodes.contains(n)) { - _nodes.append(n); - } -} - -GrowableArray* IdealGraphPrinter::Block::nodes() { - return &_nodes; -} - -int IdealGraphPrinter::NodeDescription::count = 0; - -IdealGraphPrinter::NodeDescription::NodeDescription(Node* node) : _node(node) { - _id = (intptr_t)(node); - _block_index = -1; -} - -IdealGraphPrinter::NodeDescription::~NodeDescription() { - _properties.clean(); -} - -// void IdealGraphPrinter::NodeDescription::set_node(Node* node) { -// //this->_node = node; -// } - -int IdealGraphPrinter::NodeDescription::block_index() { - return _block_index; -} - - -GrowableArray* IdealGraphPrinter::NodeDescription::succs() { - return &_succs; -} - -void IdealGraphPrinter::NodeDescription::clear_succs() { - _succs.clear(); -} - -void IdealGraphPrinter::NodeDescription::init_succs() { - _succs = GrowableArray(); -} - -void IdealGraphPrinter::NodeDescription::add_succ(NodeDescription *desc) { - _succs.append(desc); -} - -void IdealGraphPrinter::NodeDescription::set_block_index(int i) { - _block_index = i; -} - -bool IdealGraphPrinter::NodeDescription::equals(NodeDescription *desc) { - if (desc == NULL) return false; - if (desc->id() != id()) return false; - return properties()->equals(desc->properties()); -} - -Node* IdealGraphPrinter::NodeDescription::node() { - return _node; -} - -IdealGraphPrinter::Properties* IdealGraphPrinter::NodeDescription::properties() { - return &_properties; -} - -uint IdealGraphPrinter::NodeDescription::id() { - return _id; -} - -void IdealGraphPrinter::NodeDescription::print_changed(IdealGraphPrinter *printer) { - - - Properties properties; - properties.add(new Property(NODE_ID_PROPERTY, id())); - printer->start_element(NODE_ELEMENT, &properties); - - this->properties()->print(printer); - - - printer->end_element(NODE_ELEMENT); -} - -void IdealGraphPrinter::NodeDescription::print_removed(IdealGraphPrinter *printer) { - - Properties properties; - properties.add(new Property(NODE_ID_PROPERTY, id())); - printer->simple_element(REMOVE_NODE_ELEMENT, &properties); -} - -IdealGraphPrinter::EdgeDescription::EdgeDescription(int from, int to, int index) { - this->_from = from; - this->_to = to; - this->_index = index; -} - -IdealGraphPrinter::EdgeDescription::~EdgeDescription() { -} - -int IdealGraphPrinter::EdgeDescription::from() { - return _from; -} - -int IdealGraphPrinter::EdgeDescription::to() { - return _to; -} - -void IdealGraphPrinter::EdgeDescription::print_changed(IdealGraphPrinter *printer) { - - Properties properties; - properties.add(new Property(INDEX_PROPERTY, _index)); - properties.add(new Property(FROM_PROPERTY, _from)); - properties.add(new Property(TO_PROPERTY, _to)); - printer->simple_element(EDGE_ELEMENT, &properties); -} - -void IdealGraphPrinter::EdgeDescription::print_removed(IdealGraphPrinter *printer) { - - Properties properties; - properties.add(new Property(INDEX_PROPERTY, _index)); - properties.add(new Property(FROM_PROPERTY, _from)); - properties.add(new Property(TO_PROPERTY, _to)); - printer->simple_element(REMOVE_EDGE_ELEMENT, &properties); -} - -bool IdealGraphPrinter::EdgeDescription::equals(IdealGraphPrinter::EdgeDescription *desc) { - if (desc == NULL) return false; - return (_from == desc->_from && _to == desc->_to && _index == desc->_index); -} - -IdealGraphPrinter::Properties::Properties() : list(new (ResourceObj::C_HEAP) GrowableArray(2, 0, NULL, true)) { -} - -IdealGraphPrinter::Properties::~Properties() { - clean(); - delete list; -} - -void IdealGraphPrinter::Properties::add(Property *p) { - assert(p != NULL, "Property not NULL"); - list->append(p); -} - -void IdealGraphPrinter::Properties::print(IdealGraphPrinter *printer) { - printer->start_element(PROPERTIES_ELEMENT); - - for (int i = 0; i < list->length(); i++) { - list->at(i)->print(printer); - } - - printer->end_element(PROPERTIES_ELEMENT); -} - -void IdealGraphPrinter::Properties::clean() { - for (int i = 0; i < list->length(); i++) { - delete list->at(i); - list->at_put(i, NULL); - } - list->clear(); - assert(list->length() == 0, "List cleared"); -} - -void IdealGraphPrinter::Properties::remove(const char *name) { - for (int i = 0; i < list->length(); i++) { - if (strcmp(list->at(i)->name(), name) == 0) { - delete list->at(i); - list->remove_at(i); - i--; - } - } -} - -void IdealGraphPrinter::Properties::print_as_attributes(IdealGraphPrinter *printer) { - - for (int i = 0; i < list->length(); i++) { - assert(list->at(i) != NULL, "Property not null!"); - printer->output()->print(" "); - list->at(i)->print_as_attribute(printer); - } -} - -bool IdealGraphPrinter::Properties::equals(Properties* p) { - if (p->list->length() != this->list->length()) return false; - - for (int i = 0; i < list->length(); i++) { - assert(list->at(i) != NULL, "Property not null!"); - if (!list->at(i)->equals(p->list->at(i))) return false; - } - - return true; -} - -IdealGraphPrinter::Property::Property() { - _name = NULL; - _value = NULL; -} - -const char *IdealGraphPrinter::Property::name() { - return _name; -} - -IdealGraphPrinter::Property::Property(const Property* p) { - - this->_name = NULL; - this->_value = NULL; - - if (p->_name != NULL) { - _name = dup(p->_name); - } - - if (p->_value) { - _value = dup(p->_value); - } -} - -IdealGraphPrinter::Property::~Property() { - - clean(); -} - -IdealGraphPrinter::Property::Property(const char *name, const char *value) { - - assert(name, "Name must not be null!"); - assert(value, "Value must not be null!"); - - _name = dup(name); - _value = dup(value); -} - -IdealGraphPrinter::Property::Property(const char *name, int intValue) { - _name = dup(name); - - stringStream stream; - stream.print("%d", intValue); - _value = dup(stream.as_string()); -} - -void IdealGraphPrinter::Property::clean() { - if (_name) { - delete _name; - _name = NULL; - } - - if (_value) { - delete _value; - _value = NULL; - } -} - - -bool IdealGraphPrinter::Property::is_null() { - return _name == NULL; -} - -void IdealGraphPrinter::Property::print(IdealGraphPrinter *printer) { - - assert(!is_null(), "null properties cannot be printed!"); - Properties properties; - properties.add(new Property(PROPERTY_NAME_PROPERTY, _name)); - printer->start_element(PROPERTY_ELEMENT, &properties, false, false); - printer->print_xml(_value); - printer->end_element(PROPERTY_ELEMENT, false, true); -} - -void IdealGraphPrinter::Property::print_as_attribute(IdealGraphPrinter *printer) { - - printer->output()->print(_name); - printer->output()->print("=\""); - printer->print_xml(_value); - printer->output()->print("\""); -} - - -bool IdealGraphPrinter::Property::equals(Property* p) { - - if (is_null() && p->is_null()) return true; - if (is_null()) return false; - if (p->is_null()) return false; - - int cmp1 = strcmp(p->_name, _name); - if (cmp1 != 0) return false; - - int cmp2 = strcmp(p->_value, _value); - if (cmp2 != 0) return false; - - return true; -} - -void IdealGraphPrinter::print_xml(const char *value) { - size_t len = strlen(value); - - char buf[2]; - buf[1] = 0; - for (size_t i = 0; i < len; i++) { - char c = value[i]; - - switch(c) { - case '<': - output()->print("<"); - break; - - case '>': - output()->print(">"); - break; - - default: - buf[0] = c; - output()->print(buf); - break; - } - } + return _xml; } #endif diff --git a/hotspot/src/share/vm/opto/idealGraphPrinter.hpp b/hotspot/src/share/vm/opto/idealGraphPrinter.hpp index b73493e195e..c4914f53a8b 100644 --- a/hotspot/src/share/vm/opto/idealGraphPrinter.hpp +++ b/hotspot/src/share/vm/opto/idealGraphPrinter.hpp @@ -82,222 +82,42 @@ private: static const char *METHOD_SHORT_NAME_PROPERTY; static const char *ASSEMBLY_ELEMENT; - class Property { - - private: - - const char *_name; - const char *_value; - - public: - - Property(); - Property(const Property* p); - ~Property(); - Property(const char *name, const char *value); - Property(const char *name, int value); - bool equals(Property* p); - void print(IdealGraphPrinter *printer); - void print_as_attribute(IdealGraphPrinter *printer); - bool is_null(); - void clean(); - const char *name(); - - static const char* dup(const char *str) { - char * copy = new char[strlen(str)+1]; - strcpy(copy, str); - return copy; - } - - }; - - class Properties { - - private: - - GrowableArray *list; - - public: - - Properties(); - ~Properties(); - void add(Property *p); - void remove(const char *name); - bool equals(Properties* p); - void print(IdealGraphPrinter *printer); - void print_as_attributes(IdealGraphPrinter *printer); - void clean(); - - }; - - - class Description { - - private: - - State _state; - - public: - - Description(); - - State state(); - void set_state(State s); - void print(IdealGraphPrinter *printer); - virtual void print_changed(IdealGraphPrinter *printer) = 0; - virtual void print_removed(IdealGraphPrinter *printer) = 0; - - }; - - class NodeDescription : public Description{ - - public: - - static int count; - - private: - - GrowableArray _succs; - int _block_index; - uintptr_t _id; - Properties _properties; - Node* _node; - - public: - - NodeDescription(Node* node); - ~NodeDescription(); - Node* node(); - - // void set_node(Node* node); - GrowableArray* succs(); - void init_succs(); - void clear_succs(); - void add_succ(NodeDescription *desc); - int block_index(); - void set_block_index(int i); - Properties* properties(); - virtual void print_changed(IdealGraphPrinter *printer); - virtual void print_removed(IdealGraphPrinter *printer); - bool equals(NodeDescription *desc); - uint id(); - - }; - - class Block { - - private: - - NodeDescription *_start; - NodeDescription *_proj; - GrowableArray _succs; - GrowableArray _nodes; - GrowableArray _dominates; - GrowableArray _children; - int _semi; - int _parent; - GrowableArray _pred; - GrowableArray _bucket; - int _index; - int _dominator; - int _ancestor; - int _label; - - public: - - Block(); - Block(int index); - - void add_node(NodeDescription *n); - GrowableArray* nodes(); - GrowableArray* children(); - void add_child(int i); - void add_succ(int index); - GrowableArray* succs(); - GrowableArray* dominates(); - void add_dominates(int i); - NodeDescription *start(); - NodeDescription *proj(); - void set_start(NodeDescription *n); - void set_proj(NodeDescription *n); - - int label(); - void set_label(int i); - int ancestor(); - void set_ancestor(int i); - int index(); - int dominator(); - void set_dominator(int i); - int parent(); - void set_parent(int i); - int semi(); - GrowableArray* bucket(); - void add_to_bucket(int i); - void clear_bucket(); - GrowableArray* pred(); - void set_semi(int i); - void add_pred(int i); - - }; - - class EdgeDescription : public Description { - - private: - - int _from; - int _to; - int _index; - public: - - EdgeDescription(int from, int to, int index); - ~EdgeDescription(); - - virtual void print_changed(IdealGraphPrinter *printer); - virtual void print_removed(IdealGraphPrinter *printer); - bool equals(EdgeDescription *desc); - int from(); - int to(); - }; - + elapsedTimer _walk_time; + elapsedTimer _output_time; + elapsedTimer _build_blocks_time; static int _file_count; networkStream *_stream; + xmlStream *_xml; outputStream *_output; ciMethod *_current_method; - GrowableArray _nodes; - GrowableArray _edges; int _depth; - Arena *_arena; char buffer[128]; bool _should_send_method; PhaseChaitin* _chaitin; - bool _clear_nodes; - Matcher* _matcher; bool _traverse_outs; - - void start_element_helper(const char *name, Properties *properties, bool endElement, bool print_indent = false, bool print_return = true); - NodeDescription *create_node_description(Node* node); + Compile *C; static void pre_node(Node* node, void *env); static void post_node(Node* node, void *env); - void schedule_latest(int **common_dominator, GrowableArray* blocks); - void build_common_dominator(int **common_dominator, int index, GrowableArray* blocks); - void compress(int index, GrowableArray* blocks); - int eval(int index, GrowableArray* blocks); - void link(int index1, int index2, GrowableArray* blocks); - void build_dominators(GrowableArray* blocks); - void build_blocks(Node *node); - void walk(Node *n); - void start_element(const char *name, Properties *properties = NULL, bool print_indent = false, bool print_return = true); - void simple_element(const char *name, Properties *properties = NULL, bool print_indent = false); - void end_element(const char *name, bool print_indent = false, bool print_return = true); - void print_edge(int from, int to, int index); void print_indent(); void print_method(ciMethod *method, int bci, InlineTree *tree); void print_inline_tree(InlineTree *tree); - void clear_nodes(); - + void visit_node(Node *n, void *param); + void walk_nodes(Node *start, void *param); + void begin_elem(const char *s); + void end_elem(); + void begin_head(const char *s); + void end_head(); + void print_attr(const char *name, const char *val); + void print_attr(const char *name, intptr_t val); + void print_prop(const char *name, const char *val); + void print_prop(const char *name, int val); + void tail(const char *name); + void head(const char *name); + void text(const char *s); + intptr_t get_node_id(Node *n); IdealGraphPrinter(); ~IdealGraphPrinter(); @@ -308,7 +128,6 @@ public: bool traverse_outs(); void set_traverse_outs(bool b); - void print_ifg(PhaseIFG* ifg); outputStream *output(); void print_inlining(Compile* compile); void begin_method(Compile* compile); diff --git a/hotspot/src/share/vm/opto/idealKit.cpp b/hotspot/src/share/vm/opto/idealKit.cpp index 437fc105a37..026a22f0c7a 100644 --- a/hotspot/src/share/vm/opto/idealKit.cpp +++ b/hotspot/src/share/vm/opto/idealKit.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/opto/lcm.cpp b/hotspot/src/share/vm/opto/lcm.cpp index 13c3d774cff..9be6e270faa 100644 --- a/hotspot/src/share/vm/opto/lcm.cpp +++ b/hotspot/src/share/vm/opto/lcm.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -113,6 +113,7 @@ void Block::implicit_null_check(PhaseCFG *cfg, Node *proj, Node *val, int allowe case Op_LoadN: case Op_LoadS: case Op_LoadKlass: + case Op_LoadNKlass: case Op_LoadRange: case Op_LoadD_unaligned: case Op_LoadL_unaligned: @@ -133,6 +134,7 @@ void Block::implicit_null_check(PhaseCFG *cfg, Node *proj, Node *val, int allowe if( mach->in(2) != val ) continue; break; // Found a memory op? case Op_StrComp: + case Op_AryEq: // Not a legit memory op for implicit null check regardless of // embedded loads continue; diff --git a/hotspot/src/share/vm/opto/library_call.cpp b/hotspot/src/share/vm/opto/library_call.cpp index 2e7688ed939..52707d038b0 100644 --- a/hotspot/src/share/vm/opto/library_call.cpp +++ b/hotspot/src/share/vm/opto/library_call.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -163,6 +163,7 @@ class LibraryCallKit : public GraphKit { bool inline_native_newArray(); bool inline_native_getLength(); bool inline_array_copyOf(bool is_copyOfRange); + bool inline_array_equals(); bool inline_native_clone(bool is_virtual); bool inline_native_Reflection_getCallerClass(); bool inline_native_AtomicLong_get(); @@ -259,6 +260,7 @@ CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) { switch (id) { case vmIntrinsics::_indexOf: case vmIntrinsics::_compareTo: + case vmIntrinsics::_equalsC: break; // InlineNatives does not control String.compareTo default: return NULL; @@ -272,6 +274,9 @@ CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) { case vmIntrinsics::_indexOf: if (!SpecialStringIndexOf) return NULL; break; + case vmIntrinsics::_equalsC: + if (!SpecialArraysEquals) return NULL; + break; case vmIntrinsics::_arraycopy: if (!InlineArrayCopy) return NULL; break; @@ -586,6 +591,8 @@ bool LibraryCallKit::try_to_inline() { return inline_array_copyOf(false); case vmIntrinsics::_copyOfRange: return inline_array_copyOf(true); + case vmIntrinsics::_equalsC: + return inline_array_equals(); case vmIntrinsics::_clone: return inline_native_clone(intrinsic()->is_virtual()); @@ -813,6 +820,24 @@ bool LibraryCallKit::inline_string_compareTo() { return true; } +//------------------------------inline_array_equals---------------------------- +bool LibraryCallKit::inline_array_equals() { + + if (!Matcher::has_match_rule(Op_AryEq)) return false; + + _sp += 2; + Node *argument2 = pop(); + Node *argument1 = pop(); + + Node* equals = + _gvn.transform(new (C, 3) AryEqNode(control(), + argument1, + argument2) + ); + push(equals); + return true; +} + // Java version of String.indexOf(constant string) // class StringDecl { // StringDecl(char[] ca) { @@ -896,7 +921,7 @@ Node* LibraryCallKit::string_indexOf(Node* string_object, ciTypeArray* target_ar Node* sourcea = basic_plus_adr(string_object, string_object, value_offset); Node* source = make_load(no_ctrl, sourcea, source_type, T_OBJECT, string_type->add_offset(value_offset)); - Node* target = _gvn.transform(ConPNode::make(C, target_array)); + Node* target = _gvn.transform( makecon(TypeOopPtr::make_from_constant(target_array)) ); jint target_length = target_array->length(); const TypeAry* target_array_type = TypeAry::make(TypeInt::CHAR, TypeInt::make(0, target_length, Type::WidenMin)); const TypeAryPtr* target_type = TypeAryPtr::make(TypePtr::BotPTR, target_array_type, target_array->klass(), true, Type::OffsetBot); @@ -2168,15 +2193,16 @@ bool LibraryCallKit::inline_unsafe_CAS(BasicType type) { // (They don't if CAS fails, but it isn't worth checking.) pre_barrier(control(), base, adr, alias_idx, newval, value_type, T_OBJECT); #ifdef _LP64 - if (adr->bottom_type()->is_narrow()) { + if (adr->bottom_type()->is_ptr_to_narrowoop()) { + Node *newval_enc = _gvn.transform(new (C, 2) EncodePNode(newval, newval->bottom_type()->make_narrowoop())); + Node *oldval_enc = _gvn.transform(new (C, 2) EncodePNode(oldval, oldval->bottom_type()->make_narrowoop())); cas = _gvn.transform(new (C, 5) CompareAndSwapNNode(control(), mem, adr, - EncodePNode::encode(&_gvn, newval), - EncodePNode::encode(&_gvn, oldval))); + newval_enc, oldval_enc)); } else #endif - { - cas = _gvn.transform(new (C, 5) CompareAndSwapPNode(control(), mem, adr, newval, oldval)); - } + { + cas = _gvn.transform(new (C, 5) CompareAndSwapPNode(control(), mem, adr, newval, oldval)); + } post_barrier(control(), cas, base, adr, alias_idx, newval, T_OBJECT, true); break; default: @@ -2454,7 +2480,7 @@ Node* LibraryCallKit::load_klass_from_mirror_common(Node* mirror, if (region == NULL) never_see_null = true; Node* p = basic_plus_adr(mirror, offset); const TypeKlassPtr* kls_type = TypeKlassPtr::OBJECT_OR_NULL; - Node* kls = _gvn.transform(new (C, 3) LoadKlassNode(0, immutable_memory(), p, TypeRawPtr::BOTTOM, kls_type)); + Node* kls = _gvn.transform( LoadKlassNode::make(_gvn, immutable_memory(), p, TypeRawPtr::BOTTOM, kls_type) ); _sp += nargs; // any deopt will start just before call to enclosing method Node* null_ctl = top(); kls = null_check_oop(kls, &null_ctl, never_see_null); @@ -2634,7 +2660,7 @@ bool LibraryCallKit::inline_native_Class_query(vmIntrinsics::ID id) { phi->add_req(makecon(TypeInstPtr::make(env()->Object_klass()->java_mirror()))); // If we fall through, it's a plain class. Get its _super. p = basic_plus_adr(kls, Klass::super_offset_in_bytes() + sizeof(oopDesc)); - kls = _gvn.transform(new (C, 3) LoadKlassNode(0, immutable_memory(), p, TypeRawPtr::BOTTOM, TypeKlassPtr::OBJECT_OR_NULL)); + kls = _gvn.transform( LoadKlassNode::make(_gvn, immutable_memory(), p, TypeRawPtr::BOTTOM, TypeKlassPtr::OBJECT_OR_NULL) ); null_ctl = top(); kls = null_check_oop(kls, &null_ctl); if (null_ctl != top()) { @@ -2720,7 +2746,7 @@ bool LibraryCallKit::inline_native_subtype_check() { args[which_arg] = _gvn.transform(arg); Node* p = basic_plus_adr(arg, class_klass_offset); - Node* kls = new (C, 3) LoadKlassNode(0, immutable_memory(), p, adr_type, kls_type); + Node* kls = LoadKlassNode::make(_gvn, immutable_memory(), p, adr_type, kls_type); klasses[which_arg] = _gvn.transform(kls); } @@ -2838,6 +2864,8 @@ bool LibraryCallKit::inline_native_newArray() { _sp += nargs; // set original stack for use by uncommon_trap mirror = do_null_check(mirror, T_OBJECT); _sp -= nargs; + // If mirror or obj is dead, only null-path is taken. + if (stopped()) return true; enum { _normal_path = 1, _slow_path = 2, PATH_LIMIT }; RegionNode* result_reg = new(C, PATH_LIMIT) RegionNode(PATH_LIMIT); @@ -3827,24 +3855,22 @@ bool LibraryCallKit::inline_native_clone(bool is_virtual) { if (!stopped()) { // Copy the fastest available way. // (No need for PreserveJVMState, since we're using it all up now.) + // TODO: generate fields/elements copies for small objects instead. Node* src = obj; Node* dest = raw_obj; - Node* end = dest; Node* size = _gvn.transform(alloc_siz); // Exclude the header. int base_off = instanceOopDesc::base_offset_in_bytes(); if (UseCompressedOops) { - // copy the header gap though. - Node* sptr = basic_plus_adr(src, base_off); - Node* dptr = basic_plus_adr(dest, base_off); - Node* sval = make_load(control(), sptr, TypeInt::INT, T_INT, raw_adr_type); - store_to_memory(control(), dptr, sval, T_INT, raw_adr_type); - base_off += sizeof(int); + assert(base_off % BytesPerLong != 0, "base with compressed oops"); + // With compressed oops base_offset_in_bytes is 12 which creates + // the gap since countx is rounded by 8 bytes below. + // Copy klass and the gap. + base_off = instanceOopDesc::klass_offset_in_bytes(); } src = basic_plus_adr(src, base_off); dest = basic_plus_adr(dest, base_off); - end = basic_plus_adr(end, size); // Compute the length also, if needed: Node* countx = size; @@ -4388,7 +4414,7 @@ LibraryCallKit::generate_arraycopy(const TypePtr* adr_type, // (At this point we can assume disjoint_bases, since types differ.) int ek_offset = objArrayKlass::element_klass_offset_in_bytes() + sizeof(oopDesc); Node* p1 = basic_plus_adr(dest_klass, ek_offset); - Node* n1 = new (C, 3) LoadKlassNode(0, immutable_memory(), p1, TypeRawPtr::BOTTOM); + Node* n1 = LoadKlassNode::make(_gvn, immutable_memory(), p1, TypeRawPtr::BOTTOM); Node* dest_elem_klass = _gvn.transform(n1); Node* cv = generate_checkcast_arraycopy(adr_type, dest_elem_klass, diff --git a/hotspot/src/share/vm/opto/locknode.cpp b/hotspot/src/share/vm/opto/locknode.cpp index 48bf9ebfefc..5a74fd09001 100644 --- a/hotspot/src/share/vm/opto/locknode.cpp +++ b/hotspot/src/share/vm/opto/locknode.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/opto/locknode.hpp b/hotspot/src/share/vm/opto/locknode.hpp index e765a6c5d69..113de601538 100644 --- a/hotspot/src/share/vm/opto/locknode.hpp +++ b/hotspot/src/share/vm/opto/locknode.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/opto/loopTransform.cpp b/hotspot/src/share/vm/opto/loopTransform.cpp index 780766fb854..dbce2580158 100644 --- a/hotspot/src/share/vm/opto/loopTransform.cpp +++ b/hotspot/src/share/vm/opto/loopTransform.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -690,7 +690,7 @@ void PhaseIdealLoop::insert_pre_post_loops( IdealLoopTree *loop, Node_List &old_ // (the main-loop trip-counter exit value) because we will be changing // the exit value (via unrolling) so we cannot constant-fold away the zero // trip guard until all unrolling is done. - Node *zer_opaq = new (C, 2) Opaque1Node(incr); + Node *zer_opaq = new (C, 2) Opaque1Node(C, incr); Node *zer_cmp = new (C, 3) CmpINode( zer_opaq, limit ); Node *zer_bol = new (C, 2) BoolNode( zer_cmp, b_test ); register_new_node( zer_opaq, new_main_exit ); @@ -760,7 +760,7 @@ void PhaseIdealLoop::insert_pre_post_loops( IdealLoopTree *loop, Node_List &old_ // pre-loop, the main-loop may not execute at all. Later in life this // zero-trip guard will become the minimum-trip guard when we unroll // the main-loop. - Node *min_opaq = new (C, 2) Opaque1Node(limit); + Node *min_opaq = new (C, 2) Opaque1Node(C, limit); Node *min_cmp = new (C, 3) CmpINode( pre_incr, min_opaq ); Node *min_bol = new (C, 2) BoolNode( min_cmp, b_test ); register_new_node( min_opaq, new_pre_exit ); @@ -810,7 +810,7 @@ void PhaseIdealLoop::insert_pre_post_loops( IdealLoopTree *loop, Node_List &old_ // Save the original loop limit in this Opaque1 node for // use by range check elimination. - Node *pre_opaq = new (C, 3) Opaque1Node(pre_limit, limit); + Node *pre_opaq = new (C, 3) Opaque1Node(C, pre_limit, limit); register_new_node( pre_limit, pre_head->in(0) ); register_new_node( pre_opaq , pre_head->in(0) ); diff --git a/hotspot/src/share/vm/opto/loopUnswitch.cpp b/hotspot/src/share/vm/opto/loopUnswitch.cpp index 5f384b60b43..2a385e76846 100644 --- a/hotspot/src/share/vm/opto/loopUnswitch.cpp +++ b/hotspot/src/share/vm/opto/loopUnswitch.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -205,7 +205,7 @@ ProjNode* PhaseIdealLoop::create_slow_version_of_loop(IdealLoopTree *loop, Node *cont = _igvn.intcon(1); set_ctrl(cont, C->root()); - Node* opq = new (C, 2) Opaque1Node(cont); + Node* opq = new (C, 2) Opaque1Node(C, cont); register_node(opq, outer_loop, entry, dom_depth(entry)); Node *bol = new (C, 2) Conv2BNode(opq); register_node(bol, outer_loop, entry, dom_depth(entry)); diff --git a/hotspot/src/share/vm/opto/loopnode.cpp b/hotspot/src/share/vm/opto/loopnode.cpp index 3ae7a41143e..c411cdc3451 100644 --- a/hotspot/src/share/vm/opto/loopnode.cpp +++ b/hotspot/src/share/vm/opto/loopnode.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1072,8 +1072,6 @@ bool IdealLoopTree::beautify_loops( PhaseIdealLoop *phase ) { phase->_igvn.add_users_to_worklist(l->fast_out(i)); } - phase->C->print_method("After beautify loops", 3); - // Now recursively beautify nested loops if( _child ) result |= _child->beautify_loops( phase ); if( _next ) result |= _next ->beautify_loops( phase ); @@ -1470,6 +1468,8 @@ PhaseIdealLoop::PhaseIdealLoop( PhaseIterGVN &igvn, const PhaseIdealLoop *verify } // Reset loop nesting depth _ltree_root->set_nest( 0 ); + + C->print_method("After beautify loops", 3); } } @@ -2632,6 +2632,7 @@ void PhaseIdealLoop::build_loop_late_post( Node *n, const PhaseIdealLoop *verify case Op_LoadD_unaligned: case Op_LoadL_unaligned: case Op_StrComp: // Does a bunch of load-like effects + case Op_AryEq: pinned = false; } if( pinned ) { diff --git a/hotspot/src/share/vm/opto/loopnode.hpp b/hotspot/src/share/vm/opto/loopnode.hpp index 4bee9655d9f..629b4b2e5d1 100644 --- a/hotspot/src/share/vm/opto/loopnode.hpp +++ b/hotspot/src/share/vm/opto/loopnode.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/opto/loopopts.cpp b/hotspot/src/share/vm/opto/loopopts.cpp index 52dc89266ff..f7fa3f21b2c 100644 --- a/hotspot/src/share/vm/opto/loopopts.cpp +++ b/hotspot/src/share/vm/opto/loopopts.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,7 +41,7 @@ Node *PhaseIdealLoop::split_thru_phi( Node *n, Node *region, int policy ) { const Type* type = n->bottom_type(); const TypeOopPtr *t_oop = _igvn.type(n)->isa_oopptr(); Node *phi; - if( t_oop != NULL && t_oop->is_instance_field() ) { + if( t_oop != NULL && t_oop->is_known_instance_field() ) { int iid = t_oop->instance_id(); int index = C->get_alias_index(t_oop); int offset = t_oop->offset(); @@ -464,6 +464,7 @@ Node *PhaseIdealLoop::conditional_move( Node *region ) { case T_FLOAT: case T_DOUBLE: case T_ADDRESS: // (RawPtr) + case T_NARROWOOP: cost++; break; case T_OBJECT: { // Base oops are OK, but not derived oops @@ -2684,7 +2685,7 @@ void PhaseIdealLoop::reorg_offsets( IdealLoopTree *loop ) { if( !cle->stride_is_con() ) continue; // Hit! Refactor use to use the post-incremented tripcounter. // Compute a post-increment tripcounter. - Node *opaq = new (C, 2) Opaque2Node( cle->incr() ); + Node *opaq = new (C, 2) Opaque2Node( C, cle->incr() ); register_new_node( opaq, u_ctrl ); Node *neg_stride = _igvn.intcon(-cle->stride_con()); set_ctrl(neg_stride, C->root()); diff --git a/hotspot/src/share/vm/opto/machnode.cpp b/hotspot/src/share/vm/opto/machnode.cpp index 70815a2804a..eadd0da5fff 100644 --- a/hotspot/src/share/vm/opto/machnode.cpp +++ b/hotspot/src/share/vm/opto/machnode.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -262,17 +262,19 @@ const Node* MachNode::get_base_and_disp(intptr_t &offset, const TypePtr* &adr_ty // Now we have collected every part of the ADLC MEMORY_INTER. // See if it adds up to a base + offset. if (index != NULL) { - if (!index->is_Con()) { - const TypeNarrowOop* narrowoop = index->bottom_type()->isa_narrowoop(); - if (narrowoop != NULL) { - // Memory references through narrow oops have a - // funny base so grab the type from the index. - adr_type = narrowoop->make_oopptr(); - return NULL; - } + const Type* t_index = index->bottom_type(); + if (t_index->isa_narrowoop()) { // EncodeN, LoadN, LoadConN, LoadNKlass. + // Memory references through narrow oops have a + // funny base so grab the type from the index: + // [R12 + narrow_oop_reg<<3 + offset] + assert(base == NULL, "Memory references through narrow oops have no base"); + offset = disp; + adr_type = t_index->make_ptr()->add_offset(offset); + return NULL; + } else if (!index->is_Con()) { disp = Type::OffsetBot; } else if (disp != Type::OffsetBot) { - const TypeX* ti = index->bottom_type()->isa_intptr_t(); + const TypeX* ti = t_index->isa_intptr_t(); if (ti == NULL) { disp = Type::OffsetBot; // a random constant?? } else { diff --git a/hotspot/src/share/vm/opto/macro.cpp b/hotspot/src/share/vm/opto/macro.cpp index d537c1d6c6e..cd38a4be324 100644 --- a/hotspot/src/share/vm/opto/macro.cpp +++ b/hotspot/src/share/vm/opto/macro.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -320,9 +320,9 @@ Node *PhaseMacroExpand::value_from_mem_phi(Node *mem, BasicType ft, const Type * // Search the last value stored into the object's field. Node *PhaseMacroExpand::value_from_mem(Node *sfpt_mem, BasicType ft, const Type *ftype, const TypeOopPtr *adr_t, Node *alloc) { - assert(adr_t->is_instance_field(), "instance required"); - uint instance_id = adr_t->instance_id(); - assert(instance_id == alloc->_idx, "wrong allocation"); + assert(adr_t->is_known_instance_field(), "instance required"); + int instance_id = adr_t->instance_id(); + assert((uint)instance_id == alloc->_idx, "wrong allocation"); int alias_idx = C->get_alias_index(adr_t); int offset = adr_t->offset(); @@ -354,7 +354,7 @@ Node *PhaseMacroExpand::value_from_mem(Node *sfpt_mem, BasicType ft, const Type const TypeOopPtr* atype = mem->as_Store()->adr_type()->isa_oopptr(); assert(atype != NULL, "address type must be oopptr"); assert(C->get_alias_index(atype) == alias_idx && - atype->is_instance_field() && atype->offset() == offset && + atype->is_known_instance_field() && atype->offset() == offset && atype->instance_id() == instance_id, "store is correct memory slice"); done = true; } else if (mem->is_Phi()) { @@ -458,7 +458,7 @@ bool PhaseMacroExpand::can_eliminate_allocation(AllocateNode *alloc, GrowableArr } } else if (use->is_SafePoint()) { SafePointNode* sfpt = use->as_SafePoint(); - if (sfpt->has_non_debug_use(res)) { + if (sfpt->is_Call() && sfpt->as_Call()->has_non_debug_use(res)) { // Object is passed as argument. DEBUG_ONLY(disq_node = use;) NOT_PRODUCT(fail_eliminate = "Object is passed as argument";) @@ -598,7 +598,7 @@ bool PhaseMacroExpand::scalar_replacement(AllocateNode *alloc, GrowableArray as_klass()); } if (UseCompressedOops) { - field_type = field_type->is_oopptr()->make_narrowoop(); + field_type = field_type->make_narrowoop(); basic_elem_type = T_NARROWOOP; } } else { @@ -666,9 +666,11 @@ bool PhaseMacroExpand::scalar_replacement(AllocateNode *alloc, GrowableArray isa_narrowoop()) { // Enable "DecodeN(EncodeP(Allocate)) --> Allocate" transformation // to be able scalar replace the allocation. - _igvn.set_delay_transform(false); - field_val = DecodeNNode::decode(&_igvn, field_val); - _igvn.set_delay_transform(true); + if (field_val->is_EncodeP()) { + field_val = field_val->in(1); + } else { + field_val = transform_later(new (C, 2) DecodeNNode(field_val, field_val->bottom_type()->make_ptr())); + } } sfpt->add_req(field_val); } @@ -1282,12 +1284,6 @@ PhaseMacroExpand::initialize_object(AllocateNode* alloc, } rawmem = make_store(control, rawmem, object, oopDesc::mark_offset_in_bytes(), mark_node, T_ADDRESS); - if (UseCompressedOops) { - Node *zeronode = makecon(TypeInt::ZERO); - // store uncompressed 0 into klass ptr to zero out gap. The gap is - // used for primitive fields and has to be zeroed. - rawmem = make_store(control, rawmem, object, oopDesc::klass_gap_offset_in_bytes(), zeronode, T_INT); - } rawmem = make_store(control, rawmem, object, oopDesc::klass_offset_in_bytes(), klass_node, T_OBJECT); int header_size = alloc->minimum_header_size(); // conservatively small @@ -1680,7 +1676,14 @@ bool PhaseMacroExpand::expand_macro_nodes() { success = eliminate_locking_node(n->as_AbstractLock()); break; default: - assert(false, "unknown node type in macro list"); + if (n->Opcode() == Op_Opaque1 || n->Opcode() == Op_Opaque2) { + _igvn.add_users_to_worklist(n); + _igvn.hash_delete(n); + _igvn.subsume_node(n, n->in(1)); + success = true; + } else { + assert(false, "unknown node type in macro list"); + } } assert(success == (C->macro_count() < old_macro_count), "elimination reduces macro count"); progress = progress || success; diff --git a/hotspot/src/share/vm/opto/macro.hpp b/hotspot/src/share/vm/opto/macro.hpp index 06e28119d5b..0f784aafc02 100644 --- a/hotspot/src/share/vm/opto/macro.hpp +++ b/hotspot/src/share/vm/opto/macro.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/opto/matcher.cpp b/hotspot/src/share/vm/opto/matcher.cpp index 0374d7c7a0d..1640b28e3cc 100644 --- a/hotspot/src/share/vm/opto/matcher.cpp +++ b/hotspot/src/share/vm/opto/matcher.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -51,8 +51,9 @@ Matcher::Matcher( Node_List &proj_list ) : PhaseTransform( Phase::Ins_Select ), #ifdef ASSERT _old2new_map(C->comp_arena()), + _new2old_map(C->comp_arena()), #endif - _shared_constants(C->comp_arena()), + _shared_nodes(C->comp_arena()), _reduceOp(reduceOp), _leftOp(leftOp), _rightOp(rightOp), _swallowed(swallowed), _begin_inst_chain_rule(_BEGIN_INST_CHAIN_RULE), @@ -82,6 +83,7 @@ Matcher::Matcher( Node_List &proj_list ) : idealreg2debugmask[Op_RegF] = NULL; idealreg2debugmask[Op_RegD] = NULL; idealreg2debugmask[Op_RegP] = NULL; + debug_only(_mem_node = NULL;) // Ideal memory node consumed by mach node } //------------------------------warp_incoming_stk_arg------------------------ @@ -744,6 +746,7 @@ static void match_alias_type(Compile* C, Node* n, Node* m) { if (nidx == Compile::AliasIdxBot && midx == Compile::AliasIdxTop) { switch (n->Opcode()) { case Op_StrComp: + case Op_AryEq: case Op_MemBarVolatile: case Op_MemBarCPUOrder: // %%% these ideals should have narrower adr_type? nidx = Compile::AliasIdxTop; @@ -833,10 +836,16 @@ Node *Matcher::xform( Node *n, int max_stack ) { if( n->is_Proj() && n->in(0)->is_Multi()) { // Projections? // Convert to machine-dependent projection m = n->in(0)->as_Multi()->match( n->as_Proj(), this ); +#ifdef ASSERT + _new2old_map.map(m->_idx, n); +#endif if (m->in(0) != NULL) // m might be top collect_null_checks(m); } else { // Else just a regular 'ol guy m = n->clone(); // So just clone into new-space +#ifdef ASSERT + _new2old_map.map(m->_idx, n); +#endif // Def-Use edges will be added incrementally as Uses // of this node are matched. assert(m->outcnt() == 0, "no Uses of this clone yet"); @@ -880,11 +889,14 @@ Node *Matcher::xform( Node *n, int max_stack ) { Node *m = n->in(i); // Get input int op = m->Opcode(); assert((op == Op_BoxLock) == jvms->is_monitor_use(i), "boxes only at monitor sites"); - if( op == Op_ConI || op == Op_ConP || + if( op == Op_ConI || op == Op_ConP || op == Op_ConN || op == Op_ConF || op == Op_ConD || op == Op_ConL // || op == Op_BoxLock // %%%% enable this and remove (+++) in chaitin.cpp ) { m = m->clone(); +#ifdef ASSERT + _new2old_map.map(m->_idx, n); +#endif mstack.push(m, Post_Visit, n, i); // Don't neet to visit mstack.push(m->in(0), Visit, m, 0); } else { @@ -1152,7 +1164,10 @@ MachNode *Matcher::match_tree( const Node *n ) { // StoreNodes require their Memory input to match any LoadNodes Node *mem = n->is_Store() ? n->in(MemNode::Memory) : (Node*)1 ; - +#ifdef ASSERT + Node* save_mem_node = _mem_node; + _mem_node = n->is_Store() ? (Node*)n : NULL; +#endif // State object for root node of match tree // Allocate it on _states_arena - stack allocation can cause stack overflow. State *s = new (&_states_arena) State; @@ -1185,13 +1200,14 @@ MachNode *Matcher::match_tree( const Node *n ) { MachNode *m = ReduceInst( s, s->_rule[mincost], mem ); #ifdef ASSERT _old2new_map.map(n->_idx, m); + _new2old_map.map(m->_idx, (Node*)n); #endif // Add any Matcher-ignored edges uint cnt = n->req(); uint start = 1; if( mem != (Node*)1 ) start = MemNode::Memory+1; - if( n->Opcode() == Op_AddP ) { + if( n->is_AddP() ) { assert( mem == (Node*)1, "" ); start = AddPNode::Base+1; } @@ -1204,6 +1220,7 @@ MachNode *Matcher::match_tree( const Node *n ) { } } + debug_only( _mem_node = save_mem_node; ) return m; } @@ -1219,7 +1236,7 @@ static bool match_into_reg( const Node *n, Node *m, Node *control, int i, bool s if( t->singleton() ) { // Never force constants into registers. Allow them to match as // constants or registers. Copies of the same value will share - // the same register. See find_shared_constant. + // the same register. See find_shared_node. return false; } else { // Not a constant // Stop recursion if they have different Controls. @@ -1243,12 +1260,10 @@ static bool match_into_reg( const Node *n, Node *m, Node *control, int i, bool s if( j == max_scan ) // No post-domination before scan end? return true; // Then break the match tree up } - - if (m->Opcode() == Op_DecodeN && m->outcnt() == 2) { + if (m->is_DecodeN() && Matcher::clone_shift_expressions) { // These are commonly used in address expressions and can - // efficiently fold into them in some cases but because they are - // consumed by AddP they commonly have two users. - if (m->raw_out(0) == m->raw_out(1) && m->raw_out(0)->Opcode() == Op_AddP) return false; + // efficiently fold into them on X64 in some cases. + return false; } } @@ -1368,13 +1383,16 @@ Node *Matcher::Label_Root( const Node *n, State *svec, Node *control, const Node // which reduces the number of copies of a constant in the final // program. The register allocator is free to split uses later to // split live ranges. -MachNode* Matcher::find_shared_constant(Node* leaf, uint rule) { - if (!leaf->is_Con()) return NULL; +MachNode* Matcher::find_shared_node(Node* leaf, uint rule) { + if (!leaf->is_Con() && !leaf->is_DecodeN()) return NULL; // See if this Con has already been reduced using this rule. - if (_shared_constants.Size() <= leaf->_idx) return NULL; - MachNode* last = (MachNode*)_shared_constants.at(leaf->_idx); + if (_shared_nodes.Size() <= leaf->_idx) return NULL; + MachNode* last = (MachNode*)_shared_nodes.at(leaf->_idx); if (last != NULL && rule == last->rule()) { + // Don't expect control change for DecodeN + if (leaf->is_DecodeN()) + return last; // Get the new space root. Node* xroot = new_node(C->root()); if (xroot == NULL) { @@ -1420,9 +1438,9 @@ MachNode* Matcher::find_shared_constant(Node* leaf, uint rule) { MachNode *Matcher::ReduceInst( State *s, int rule, Node *&mem ) { assert( rule >= NUM_OPERANDS, "called with operand rule" ); - MachNode* shared_con = find_shared_constant(s->_leaf, rule); - if (shared_con != NULL) { - return shared_con; + MachNode* shared_node = find_shared_node(s->_leaf, rule); + if (shared_node != NULL) { + return shared_node; } // Build the object to represent this state & prepare for recursive calls @@ -1443,11 +1461,33 @@ MachNode *Matcher::ReduceInst( State *s, int rule, Node *&mem ) { } // If a Memory was used, insert a Memory edge - if( mem != (Node*)1 ) + if( mem != (Node*)1 ) { mach->ins_req(MemNode::Memory,mem); +#ifdef ASSERT + // Verify adr type after matching memory operation + const MachOper* oper = mach->memory_operand(); + if (oper != NULL && oper != (MachOper*)-1 && + mach->adr_type() != TypeRawPtr::BOTTOM) { // non-direct addressing mode + // It has a unique memory operand. Find corresponding ideal mem node. + Node* m = NULL; + if (leaf->is_Mem()) { + m = leaf; + } else { + m = _mem_node; + assert(m != NULL && m->is_Mem(), "expecting memory node"); + } + if (m->adr_type() != mach->adr_type()) { + m->dump(); + tty->print_cr("mach:"); + mach->dump(1); + } + assert(m->adr_type() == mach->adr_type(), "matcher should not change adr type"); + } +#endif + } // If the _leaf is an AddP, insert the base edge - if( leaf->Opcode() == Op_AddP ) + if( leaf->is_AddP() ) mach->ins_req(AddPNode::Base,leaf->in(AddPNode::Base)); uint num_proj = _proj_list.size(); @@ -1462,6 +1502,9 @@ MachNode *Matcher::ReduceInst( State *s, int rule, Node *&mem ) { for( uint i=0; ireq(); i++ ) { mach->set_req(i,NULL); } +#ifdef ASSERT + _new2old_map.map(ex->_idx, s->_leaf); +#endif } // PhaseChaitin::fixup_spills will sometimes generate spill code @@ -1475,9 +1518,9 @@ MachNode *Matcher::ReduceInst( State *s, int rule, Node *&mem ) { guarantee(_proj_list.size() == num_proj, "no allocation during spill generation"); } - if (leaf->is_Con()) { + if (leaf->is_Con() || leaf->is_DecodeN()) { // Record the con for sharing - _shared_constants.map(leaf->_idx, ex); + _shared_nodes.map(leaf->_idx, ex); } return ex; @@ -1508,7 +1551,9 @@ void Matcher::ReduceInst_Chain_Rule( State *s, int rule, Node *&mem, MachNode *m assert( newrule >= _LAST_MACH_OPER, "Do NOT chain from internal operand"); mach->_opnds[1] = s->MachOperGenerator( _reduceOp[catch_op], C ); Node *mem1 = (Node*)1; + debug_only(Node *save_mem_node = _mem_node;) mach->add_req( ReduceInst(s, newrule, mem1) ); + debug_only(_mem_node = save_mem_node;) } return; } @@ -1518,6 +1563,7 @@ uint Matcher::ReduceInst_Interior( State *s, int rule, Node *&mem, MachNode *mac if( s->_leaf->is_Load() ) { Node *mem2 = s->_leaf->in(MemNode::Memory); assert( mem == (Node*)1 || mem == mem2, "multiple Memories being matched at once?" ); + debug_only( if( mem == (Node*)1 ) _mem_node = s->_leaf;) mem = mem2; } if( s->_leaf->in(0) != NULL && s->_leaf->req() > 1) { @@ -1561,7 +1607,9 @@ uint Matcher::ReduceInst_Interior( State *s, int rule, Node *&mem, MachNode *mac // --> ReduceInst( newrule ) mach->_opnds[num_opnds++] = s->MachOperGenerator( _reduceOp[catch_op], C ); Node *mem1 = (Node*)1; + debug_only(Node *save_mem_node = _mem_node;) mach->add_req( ReduceInst( newstate, newrule, mem1 ) ); + debug_only(_mem_node = save_mem_node;) } } assert( mach->_opnds[num_opnds-1], "" ); @@ -1592,6 +1640,7 @@ void Matcher::ReduceOper( State *s, int rule, Node *&mem, MachNode *mach ) { if( s->_leaf->is_Load() ) { assert( mem == (Node*)1, "multiple Memories being matched at once?" ); mem = s->_leaf->in(MemNode::Memory); + debug_only(_mem_node = s->_leaf;) } if( s->_leaf->in(0) && s->_leaf->req() > 1) { if( !mach->in(0) ) @@ -1616,7 +1665,9 @@ void Matcher::ReduceOper( State *s, int rule, Node *&mem, MachNode *mach ) { // Reduce the instruction, and add a direct pointer from this // machine instruction to the newly reduced one. Node *mem1 = (Node*)1; + debug_only(Node *save_mem_node = _mem_node;) mach->add_req( ReduceInst( kid, newrule, mem1 ) ); + debug_only(_mem_node = save_mem_node;) } } } @@ -1716,6 +1767,7 @@ void Matcher::find_shared( Node *n ) { mstack.push(n->in(0), Pre_Visit); // Visit Control input continue; // while (mstack.is_nonempty()) case Op_StrComp: + case Op_AryEq: set_shared(n); // Force result into register (it will be anyways) break; case Op_ConP: { // Convert pointers above the centerline to NUL @@ -1726,6 +1778,14 @@ void Matcher::find_shared( Node *n ) { } break; } + case Op_ConN: { // Convert narrow pointers above the centerline to NUL + TypeNode *tn = n->as_Type(); // Constants derive from type nodes + const TypePtr* tp = tn->type()->make_ptr(); + if (tp && tp->_ptr == TypePtr::AnyNull) { + tn->set_type(TypeNarrowOop::NULL_PTR); + } + break; + } case Op_Binary: // These are introduced in the Post_Visit state. ShouldNotReachHere(); break; @@ -1760,6 +1820,7 @@ void Matcher::find_shared( Node *n ) { case Op_LoadF: case Op_LoadI: case Op_LoadKlass: + case Op_LoadNKlass: case Op_LoadL: case Op_LoadS: case Op_LoadP: @@ -1817,7 +1878,7 @@ void Matcher::find_shared( Node *n ) { Node *adr = m->in(AddPNode::Address); // Intel, ARM and friends can handle 2 adds in addressing mode - if( clone_shift_expressions && adr->Opcode() == Op_AddP && + if( clone_shift_expressions && adr->is_AddP() && // AtomicAdd is not an addressing expression. // Cheap to find it by looking for screwy base. !adr->in(AddPNode::Base)->is_top() ) { @@ -1891,6 +1952,7 @@ void Matcher::find_shared( Node *n ) { case Op_CMoveF: case Op_CMoveI: case Op_CMoveL: + case Op_CMoveN: case Op_CMoveP: { // Restructure into a binary tree for Matching. It's possible that // we could move this code up next to the graph reshaping for IfNodes diff --git a/hotspot/src/share/vm/opto/matcher.hpp b/hotspot/src/share/vm/opto/matcher.hpp index a33c4e92da2..20de817c8b8 100644 --- a/hotspot/src/share/vm/opto/matcher.hpp +++ b/hotspot/src/share/vm/opto/matcher.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -48,7 +48,7 @@ class Matcher : public PhaseTransform { void ReduceOper( State *s, int newrule, Node *&mem, MachNode *mach ); // If this node already matched using "rule", return the MachNode for it. - MachNode* find_shared_constant(Node* con, uint rule); + MachNode* find_shared_node(Node* n, uint rule); // Convert a dense opcode number to an expanded rule number const int *_reduceOp; @@ -81,9 +81,10 @@ class Matcher : public PhaseTransform { Node_List &_proj_list; // For Machine nodes killing many values - Node_Array _shared_constants; + Node_Array _shared_nodes; debug_only(Node_Array _old2new_map;) // Map roots of ideal-trees to machine-roots + debug_only(Node_Array _new2old_map;) // Maps machine nodes back to ideal // Accessors for the inherited field PhaseTransform::_nodes: void grow_new_node_array(uint idx_limit) { @@ -104,6 +105,8 @@ class Matcher : public PhaseTransform { #ifdef ASSERT // Make sure only new nodes are reachable from this node void verify_new_nodes_only(Node* root); + + Node* _mem_node; // Ideal memory node consumed by mach node #endif public: @@ -388,5 +391,9 @@ public: #ifdef ASSERT void dump_old2new_map(); // machine-independent to machine-dependent + + Node* find_old_node(Node* new_node) { + return _new2old_map[new_node->_idx]; + } #endif }; diff --git a/hotspot/src/share/vm/opto/memnode.cpp b/hotspot/src/share/vm/opto/memnode.cpp index b28c37b7821..5015d99c483 100644 --- a/hotspot/src/share/vm/opto/memnode.cpp +++ b/hotspot/src/share/vm/opto/memnode.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -91,7 +91,7 @@ extern void print_alias_types(); Node *MemNode::optimize_simple_memory_chain(Node *mchain, const TypePtr *t_adr, PhaseGVN *phase) { const TypeOopPtr *tinst = t_adr->isa_oopptr(); - if (tinst == NULL || !tinst->is_instance_field()) + if (tinst == NULL || !tinst->is_known_instance_field()) return mchain; // don't try to optimize non-instance types uint instance_id = tinst->instance_id(); Node *prev = NULL; @@ -125,7 +125,7 @@ Node *MemNode::optimize_simple_memory_chain(Node *mchain, const TypePtr *t_adr, Node *MemNode::optimize_memory_chain(Node *mchain, const TypePtr *t_adr, PhaseGVN *phase) { const TypeOopPtr *t_oop = t_adr->isa_oopptr(); - bool is_instance = (t_oop != NULL) && t_oop->is_instance_field(); + bool is_instance = (t_oop != NULL) && t_oop->is_known_instance_field(); PhaseIterGVN *igvn = phase->is_IterGVN(); Node *result = mchain; result = optimize_simple_memory_chain(result, t_adr, phase); @@ -133,7 +133,9 @@ Node *MemNode::optimize_memory_chain(Node *mchain, const TypePtr *t_adr, PhaseGV PhiNode *mphi = result->as_Phi(); assert(mphi->bottom_type() == Type::MEMORY, "memory phi required"); const TypePtr *t = mphi->adr_type(); - if (t == TypePtr::BOTTOM || t == TypeRawPtr::BOTTOM) { + if (t == TypePtr::BOTTOM || t == TypeRawPtr::BOTTOM || + t->isa_oopptr() && !t->is_oopptr()->is_known_instance() && + t->is_oopptr()->cast_to_instance_id(t_oop->instance_id()) == t_oop) { // clone the Phi with our address type result = mphi->split_out_instance(t_adr, igvn); } else { @@ -154,7 +156,7 @@ static Node *step_through_mergemem(PhaseGVN *phase, MergeMemNode *mmem, const T phase->C->must_alias(adr_check, alias_idx ); // Sometimes dead array references collapse to a[-1], a[-2], or a[-3] if( !consistent && adr_check != NULL && !adr_check->empty() && - tp->isa_aryptr() && tp->offset() == Type::OffsetBot && + tp->isa_aryptr() && tp->offset() == Type::OffsetBot && adr_check->isa_aryptr() && adr_check->offset() != Type::OffsetBot && ( adr_check->offset() == arrayOopDesc::length_offset_in_bytes() || adr_check->offset() == oopDesc::klass_offset_in_bytes() || @@ -251,21 +253,31 @@ bool MemNode::all_controls_dominate(Node* dom, Node* sub) { if (dom == NULL || dom->is_top() || sub == NULL || sub->is_top()) return false; // Conservative answer for dead code - // Check 'dom'. + // Check 'dom'. Skip Proj and CatchProj nodes. dom = dom->find_exact_control(dom); if (dom == NULL || dom->is_top()) return false; // Conservative answer for dead code - if (dom->is_Start() || dom->is_Root() || dom == sub) + if (dom == sub) { + // For the case when, for example, 'sub' is Initialize and the original + // 'dom' is Proj node of the 'sub'. + return false; + } + + if (dom->is_Con() || dom->is_Start() || dom->is_Root() || dom == sub) return true; // 'dom' dominates 'sub' if its control edge and control edges // of all its inputs dominate or equal to sub's control edge. // Currently 'sub' is either Allocate, Initialize or Start nodes. - assert(sub->is_Allocate() || sub->is_Initialize() || sub->is_Start(), "expecting only these nodes"); + // Or Region for the check in LoadNode::Ideal(); + // 'sub' should have sub->in(0) != NULL. + assert(sub->is_Allocate() || sub->is_Initialize() || sub->is_Start() || + sub->is_Region(), "expecting only these nodes"); // Get control edge of 'sub'. + Node* orig_sub = sub; sub = sub->find_exact_control(sub->in(0)); if (sub == NULL || sub->is_top()) return false; // Conservative answer for dead code @@ -291,14 +303,16 @@ bool MemNode::all_controls_dominate(Node* dom, Node* sub) { for (uint next = 0; next < dom_list.size(); next++) { Node* n = dom_list.at(next); + if (n == orig_sub) + return false; // One of dom's inputs dominated by sub. if (!n->is_CFG() && n->pinned()) { // Check only own control edge for pinned non-control nodes. n = n->find_exact_control(n->in(0)); if (n == NULL || n->is_top()) return false; // Conservative answer for dead code assert(n->is_CFG(), "expecting control"); - } - if (n->is_Start() || n->is_Root()) { + dom_list.push(n); + } else if (n->is_Con() || n->is_Start() || n->is_Root()) { only_dominating_controls = true; } else if (n->is_CFG()) { if (n->dominates(sub, nlist)) @@ -308,12 +322,11 @@ bool MemNode::all_controls_dominate(Node* dom, Node* sub) { } else { // First, own control edge. Node* m = n->find_exact_control(n->in(0)); - if (m == NULL) - continue; - if (m->is_top()) - return false; // Conservative answer for dead code - dom_list.push(m); - + if (m != NULL) { + if (m->is_top()) + return false; // Conservative answer for dead code + dom_list.push(m); + } // Now, the rest of edges. uint cnt = n->req(); for (uint i = 1; i < cnt; i++) { @@ -457,7 +470,7 @@ Node* MemNode::find_previous_store(PhaseTransform* phase) { return mem; // let caller handle steps (c), (d) } - } else if (addr_t != NULL && addr_t->is_instance_field()) { + } else if (addr_t != NULL && addr_t->is_known_instance_field()) { // Can't use optimize_simple_memory_chain() since it needs PhaseGVN. if (mem->is_Proj() && mem->in(0)->is_Call()) { CallNode *call = mem->in(0)->as_Call(); @@ -577,6 +590,9 @@ bool MemNode::adr_phi_is_loop_invariant(Node* adr_phi, Node* cast) { // Find any cast-away of null-ness and keep its control. Null cast-aways are // going away in this pass and we need to make this memory op depend on the // gating null check. +Node *MemNode::Ideal_DU_postCCP( PhaseCCP *ccp ) { + return Ideal_common_DU_postCCP(ccp, this, in(MemNode::Address)); +} // I tried to leave the CastPP's in. This makes the graph more accurate in // some sense; we get to keep around the knowledge that an oop is not-null @@ -586,15 +602,14 @@ bool MemNode::adr_phi_is_loop_invariant(Node* adr_phi, Node* cast) { // some of the more trivial cases in the optimizer. Removing more useless // Phi's started allowing Loads to illegally float above null checks. I gave // up on this approach. CNC 10/20/2000 -Node *MemNode::Ideal_DU_postCCP( PhaseCCP *ccp ) { - Node *ctr = in(MemNode::Control); - Node *mem = in(MemNode::Memory); - Node *adr = in(MemNode::Address); +// This static method may be called not from MemNode (EncodePNode calls it). +// Only the control edge of the node 'n' might be updated. +Node *MemNode::Ideal_common_DU_postCCP( PhaseCCP *ccp, Node* n, Node* adr ) { Node *skipped_cast = NULL; // Need a null check? Regular static accesses do not because they are // from constant addresses. Array ops are gated by the range check (which // always includes a NULL check). Just check field ops. - if( !ctr ) { + if( n->in(MemNode::Control) == NULL ) { // Scan upwards for the highest location we can place this memory op. while( true ) { switch( adr->Opcode() ) { @@ -619,10 +634,10 @@ Node *MemNode::Ideal_DU_postCCP( PhaseCCP *ccp ) { } // CastPP is going away in this pass! We need this memory op to be // control-dependent on the test that is guarding the CastPP. - ccp->hash_delete(this); - set_req(MemNode::Control, adr->in(0)); - ccp->hash_insert(this); - return this; + ccp->hash_delete(n); + n->set_req(MemNode::Control, adr->in(0)); + ccp->hash_insert(n); + return n; case Op_Phi: // Attempt to float above a Phi to some dominating point. @@ -653,10 +668,10 @@ Node *MemNode::Ideal_DU_postCCP( PhaseCCP *ccp ) { adr = adr->in(1); continue; } - ccp->hash_delete(this); - set_req(MemNode::Control, adr->in(0)); - ccp->hash_insert(this); - return this; + ccp->hash_delete(n); + n->set_req(MemNode::Control, adr->in(0)); + ccp->hash_insert(n); + return n; // List of "safe" opcodes; those that implicitly block the memory // op below any null check. @@ -665,10 +680,13 @@ Node *MemNode::Ideal_DU_postCCP( PhaseCCP *ccp ) { case Op_LoadP: // Loading from within a klass case Op_LoadN: // Loading from within a klass case Op_LoadKlass: // Loading from within a klass + case Op_LoadNKlass: // Loading from within a klass case Op_ConP: // Loading from a klass + case Op_ConN: // Loading from a klass case Op_CreateEx: // Sucking up the guts of an exception oop case Op_Con: // Reading from TLS case Op_CMoveP: // CMoveP is pinned + case Op_CMoveN: // CMoveN is pinned break; // No progress case Op_Proj: // Direct call to an allocation routine @@ -677,8 +695,8 @@ Node *MemNode::Ideal_DU_postCCP( PhaseCCP *ccp ) { { assert(adr->as_Proj()->_con == TypeFunc::Parms, "must be return value"); const Node* call = adr->in(0); - if (call->is_CallStaticJava()) { - const CallStaticJavaNode* call_java = call->as_CallStaticJava(); + if (call->is_CallJava()) { + const CallJavaNode* call_java = call->as_CallJava(); const TypeTuple *r = call_java->tf()->range(); assert(r->cnt() > TypeFunc::Parms, "must return value"); const Type* ret_type = r->field_at(TypeFunc::Parms); @@ -750,22 +768,15 @@ Node *LoadNode::make( PhaseGVN& gvn, Node *ctl, Node *mem, Node *adr, const Type case T_ADDRESS: return new (C, 3) LoadPNode(ctl, mem, adr, adr_type, rt->is_ptr() ); case T_OBJECT: #ifdef _LP64 - if (adr->bottom_type()->is_narrow()) { - const TypeNarrowOop* narrowtype; - if (rt->isa_narrowoop()) { - narrowtype = rt->is_narrowoop(); - } else { - narrowtype = rt->is_oopptr()->make_narrowoop(); - } - Node* load = gvn.transform(new (C, 3) LoadNNode(ctl, mem, adr, adr_type, narrowtype)); - - return DecodeNNode::decode(&gvn, load); + if (adr->bottom_type()->is_ptr_to_narrowoop()) { + Node* load = gvn.transform(new (C, 3) LoadNNode(ctl, mem, adr, adr_type, rt->make_narrowoop())); + return new (C, 2) DecodeNNode(load, load->bottom_type()->make_ptr()); } else #endif - { - assert(!adr->bottom_type()->is_narrow(), "should have got back a narrow oop"); - return new (C, 3) LoadPNode(ctl, mem, adr, adr_type, rt->is_oopptr()); - } + { + assert(!adr->bottom_type()->is_ptr_to_narrowoop(), "should have got back a narrow oop"); + return new (C, 3) LoadPNode(ctl, mem, adr, adr_type, rt->is_oopptr()); + } } ShouldNotReachHere(); return (LoadNode*)NULL; @@ -905,7 +916,7 @@ bool LoadNode::is_instance_field_load_with_local_phi(Node* ctrl) { in(MemNode::Address)->is_AddP() ) { const TypeOopPtr* t_oop = in(MemNode::Address)->bottom_type()->isa_oopptr(); // Only instances. - if( t_oop != NULL && t_oop->is_instance_field() && + if( t_oop != NULL && t_oop->is_known_instance_field() && t_oop->offset() != Type::OffsetBot && t_oop->offset() != Type::OffsetTop) { return true; @@ -1119,6 +1130,127 @@ Node* LoadNode::eliminate_autobox(PhaseGVN* phase) { return NULL; } +//------------------------------split_through_phi------------------------------ +// Split instance field load through Phi. +Node *LoadNode::split_through_phi(PhaseGVN *phase) { + Node* mem = in(MemNode::Memory); + Node* address = in(MemNode::Address); + const TypePtr *addr_t = phase->type(address)->isa_ptr(); + const TypeOopPtr *t_oop = addr_t->isa_oopptr(); + + assert(mem->is_Phi() && (t_oop != NULL) && + t_oop->is_known_instance_field(), "invalide conditions"); + + Node *region = mem->in(0); + if (region == NULL) { + return NULL; // Wait stable graph + } + uint cnt = mem->req(); + for( uint i = 1; i < cnt; i++ ) { + Node *in = mem->in(i); + if( in == NULL ) { + return NULL; // Wait stable graph + } + } + // Check for loop invariant. + if (cnt == 3) { + for( uint i = 1; i < cnt; i++ ) { + Node *in = mem->in(i); + Node* m = MemNode::optimize_memory_chain(in, addr_t, phase); + if (m == mem) { + set_req(MemNode::Memory, mem->in(cnt - i)); // Skip this phi. + return this; + } + } + } + // Split through Phi (see original code in loopopts.cpp). + assert(phase->C->have_alias_type(addr_t), "instance should have alias type"); + + // Do nothing here if Identity will find a value + // (to avoid infinite chain of value phis generation). + if ( !phase->eqv(this, this->Identity(phase)) ) + return NULL; + + // Skip the split if the region dominates some control edge of the address. + if (cnt == 3 && !MemNode::all_controls_dominate(address, region)) + return NULL; + + const Type* this_type = this->bottom_type(); + int this_index = phase->C->get_alias_index(addr_t); + int this_offset = addr_t->offset(); + int this_iid = addr_t->is_oopptr()->instance_id(); + int wins = 0; + PhaseIterGVN *igvn = phase->is_IterGVN(); + Node *phi = new (igvn->C, region->req()) PhiNode(region, this_type, NULL, this_iid, this_index, this_offset); + for( uint i = 1; i < region->req(); i++ ) { + Node *x; + Node* the_clone = NULL; + if( region->in(i) == phase->C->top() ) { + x = phase->C->top(); // Dead path? Use a dead data op + } else { + x = this->clone(); // Else clone up the data op + the_clone = x; // Remember for possible deletion. + // Alter data node to use pre-phi inputs + if( this->in(0) == region ) { + x->set_req( 0, region->in(i) ); + } else { + x->set_req( 0, NULL ); + } + for( uint j = 1; j < this->req(); j++ ) { + Node *in = this->in(j); + if( in->is_Phi() && in->in(0) == region ) + x->set_req( j, in->in(i) ); // Use pre-Phi input for the clone + } + } + // Check for a 'win' on some paths + const Type *t = x->Value(igvn); + + bool singleton = t->singleton(); + + // See comments in PhaseIdealLoop::split_thru_phi(). + if( singleton && t == Type::TOP ) { + singleton &= region->is_Loop() && (i != LoopNode::EntryControl); + } + + if( singleton ) { + wins++; + x = igvn->makecon(t); + } else { + // We now call Identity to try to simplify the cloned node. + // Note that some Identity methods call phase->type(this). + // Make sure that the type array is big enough for + // our new node, even though we may throw the node away. + // (This tweaking with igvn only works because x is a new node.) + igvn->set_type(x, t); + Node *y = x->Identity(igvn); + if( y != x ) { + wins++; + x = y; + } else { + y = igvn->hash_find(x); + if( y ) { + wins++; + x = y; + } else { + // Else x is a new node we are keeping + // We do not need register_new_node_with_optimizer + // because set_type has already been called. + igvn->_worklist.push(x); + } + } + } + if (x != the_clone && the_clone != NULL) + igvn->remove_dead_node(the_clone); + phi->set_req(i, x); + } + if( wins > 0 ) { + // Record Phi + igvn->register_new_node_with_optimizer(phi); + return phi; + } + igvn->remove_dead_node(phi); + return NULL; +} //------------------------------Ideal------------------------------------------ // If the load is from Field memory and the pointer is non-null, we can @@ -1175,113 +1307,10 @@ Node *LoadNode::Ideal(PhaseGVN *phase, bool can_reshape) { } const TypeOopPtr *t_oop = addr_t->isa_oopptr(); if (can_reshape && opt_mem->is_Phi() && - (t_oop != NULL) && t_oop->is_instance_field()) { - assert(t_oop->offset() != Type::OffsetBot && t_oop->offset() != Type::OffsetTop, ""); - Node *region = opt_mem->in(0); - uint cnt = opt_mem->req(); - for( uint i = 1; i < cnt; i++ ) { - Node *in = opt_mem->in(i); - if( in == NULL ) { - region = NULL; // Wait stable graph - break; - } - } - if (region != NULL) { - // Check for loop invariant. - if (cnt == 3) { - for( uint i = 1; i < cnt; i++ ) { - Node *in = opt_mem->in(i); - Node* m = MemNode::optimize_memory_chain(in, addr_t, phase); - if (m == opt_mem) { - set_req(MemNode::Memory, opt_mem->in(cnt - i)); // Skip this phi. - return this; - } - } - } - // Split through Phi (see original code in loopopts.cpp). - assert(phase->C->have_alias_type(addr_t), "instance should have alias type"); - - // Do nothing here if Identity will find a value - // (to avoid infinite chain of value phis generation). - if ( !phase->eqv(this, this->Identity(phase)) ) - return NULL; - - const Type* this_type = this->bottom_type(); - int this_index = phase->C->get_alias_index(addr_t); - int this_offset = addr_t->offset(); - int this_iid = addr_t->is_oopptr()->instance_id(); - int wins = 0; - PhaseIterGVN *igvn = phase->is_IterGVN(); - Node *phi = new (igvn->C, region->req()) PhiNode(region, this_type, NULL, this_iid, this_index, this_offset); - for( uint i = 1; i < region->req(); i++ ) { - Node *x; - Node* the_clone = NULL; - if( region->in(i) == phase->C->top() ) { - x = phase->C->top(); // Dead path? Use a dead data op - } else { - x = this->clone(); // Else clone up the data op - the_clone = x; // Remember for possible deletion. - // Alter data node to use pre-phi inputs - if( this->in(0) == region ) { - x->set_req( 0, region->in(i) ); - } else { - x->set_req( 0, NULL ); - } - for( uint j = 1; j < this->req(); j++ ) { - Node *in = this->in(j); - if( in->is_Phi() && in->in(0) == region ) - x->set_req( j, in->in(i) ); // Use pre-Phi input for the clone - } - } - // Check for a 'win' on some paths - const Type *t = x->Value(igvn); - - bool singleton = t->singleton(); - - // See comments in PhaseIdealLoop::split_thru_phi(). - if( singleton && t == Type::TOP ) { - singleton &= region->is_Loop() && (i != LoopNode::EntryControl); - } - - if( singleton ) { - wins++; - x = igvn->makecon(t); - } else { - // We now call Identity to try to simplify the cloned node. - // Note that some Identity methods call phase->type(this). - // Make sure that the type array is big enough for - // our new node, even though we may throw the node away. - // (This tweaking with igvn only works because x is a new node.) - igvn->set_type(x, t); - Node *y = x->Identity(igvn); - if( y != x ) { - wins++; - x = y; - } else { - y = igvn->hash_find(x); - if( y ) { - wins++; - x = y; - } else { - // Else x is a new node we are keeping - // We do not need register_new_node_with_optimizer - // because set_type has already been called. - igvn->_worklist.push(x); - } - } - } - if (x != the_clone && the_clone != NULL) - igvn->remove_dead_node(the_clone); - phi->set_req(i, x); - } - if( wins > 0 ) { - // Record Phi - igvn->register_new_node_with_optimizer(phi); - return phi; - } else { - igvn->remove_dead_node(phi); - } - } + (t_oop != NULL) && t_oop->is_known_instance_field()) { + // Split instance field load through Phi. + Node* result = split_through_phi(phase); + if (result != NULL) return result; } } @@ -1513,7 +1542,7 @@ const Type *LoadNode::Value( PhaseTransform *phase ) const { } const TypeOopPtr *tinst = tp->isa_oopptr(); - if (tinst != NULL && tinst->is_instance_field()) { + if (tinst != NULL && tinst->is_known_instance_field()) { // If we have an instance type and our memory input is the // programs's initial memory state, there is no matching store, // so just return a zero of the appropriate type @@ -1585,8 +1614,30 @@ Node *LoadSNode::Ideal(PhaseGVN *phase, bool can_reshape) { } //============================================================================= +//----------------------------LoadKlassNode::make------------------------------ +// Polymorphic factory method: +Node *LoadKlassNode::make( PhaseGVN& gvn, Node *mem, Node *adr, const TypePtr* at, const TypeKlassPtr *tk ) { + Compile* C = gvn.C; + Node *ctl = NULL; + // sanity check the alias category against the created node type + const TypeOopPtr *adr_type = adr->bottom_type()->isa_oopptr(); + assert(adr_type != NULL, "expecting TypeOopPtr"); +#ifdef _LP64 + if (adr_type->is_ptr_to_narrowoop()) { + Node* load_klass = gvn.transform(new (C, 3) LoadNKlassNode(ctl, mem, adr, at, tk->make_narrowoop())); + return new (C, 2) DecodeNNode(load_klass, load_klass->bottom_type()->make_ptr()); + } +#endif + assert(!adr_type->is_ptr_to_narrowoop(), "should have got back a narrow oop"); + return new (C, 3) LoadKlassNode(ctl, mem, adr, at, tk); +} + //------------------------------Value------------------------------------------ const Type *LoadKlassNode::Value( PhaseTransform *phase ) const { + return klass_value_common(phase); +} + +const Type *LoadNode::klass_value_common( PhaseTransform *phase ) const { // Either input is TOP ==> the result is TOP const Type *t1 = phase->type( in(MemNode::Memory) ); if (t1 == Type::TOP) return Type::TOP; @@ -1718,6 +1769,10 @@ const Type *LoadKlassNode::Value( PhaseTransform *phase ) const { // To clean up reflective code, simplify k.java_mirror.as_klass to plain k. // Also feed through the klass in Allocate(...klass...)._klass. Node* LoadKlassNode::Identity( PhaseTransform *phase ) { + return klass_identity_common(phase); +} + +Node* LoadNode::klass_identity_common(PhaseTransform *phase ) { Node* x = LoadNode::Identity(phase); if (x != this) return x; @@ -1776,6 +1831,29 @@ Node* LoadKlassNode::Identity( PhaseTransform *phase ) { return this; } + +//------------------------------Value------------------------------------------ +const Type *LoadNKlassNode::Value( PhaseTransform *phase ) const { + const Type *t = klass_value_common(phase); + if (t == Type::TOP) + return t; + + return t->make_narrowoop(); +} + +//------------------------------Identity--------------------------------------- +// To clean up reflective code, simplify k.java_mirror.as_klass to narrow k. +// Also feed through the klass in Allocate(...klass...)._klass. +Node* LoadNKlassNode::Identity( PhaseTransform *phase ) { + Node *x = klass_identity_common(phase); + + const Type *t = phase->type( x ); + if( t == Type::TOP ) return x; + if( t->isa_narrowoop()) return x; + + return phase->transform(new (phase->C, 2) EncodePNode(x, t->make_narrowoop())); +} + //------------------------------Value----------------------------------------- const Type *LoadRangeNode::Value( PhaseTransform *phase ) const { // Either input is TOP ==> the result is TOP @@ -1836,17 +1914,16 @@ StoreNode* StoreNode::make( PhaseGVN& gvn, Node* ctl, Node* mem, Node* adr, cons case T_ADDRESS: case T_OBJECT: #ifdef _LP64 - if (adr->bottom_type()->is_narrow() || + if (adr->bottom_type()->is_ptr_to_narrowoop() || (UseCompressedOops && val->bottom_type()->isa_klassptr() && adr->bottom_type()->isa_rawptr())) { - const TypePtr* type = val->bottom_type()->is_ptr(); - Node* cp = EncodePNode::encode(&gvn, val); - return new (C, 4) StoreNNode(ctl, mem, adr, adr_type, cp); + val = gvn.transform(new (C, 2) EncodePNode(val, val->bottom_type()->make_narrowoop())); + return new (C, 4) StoreNNode(ctl, mem, adr, adr_type, val); } else #endif - { - return new (C, 4) StorePNode(ctl, mem, adr, adr_type, val); - } + { + return new (C, 4) StorePNode(ctl, mem, adr, adr_type, val); + } } ShouldNotReachHere(); return (StoreNode*)NULL; @@ -2060,7 +2137,7 @@ bool StoreNode::value_never_loaded( PhaseTransform *phase) const { const TypeOopPtr *adr_oop = phase->type(adr)->isa_oopptr(); if (adr_oop == NULL) return false; - if (!adr_oop->is_instance_field()) + if (!adr_oop->is_known_instance_field()) return false; // if not a distinct instance, there may be aliases of the address for (DUIterator_Fast imax, i = adr->fast_outs(imax); i < imax; i++) { Node *use = adr->fast_out(i); @@ -2312,6 +2389,13 @@ Node *StrCompNode::Ideal(PhaseGVN *phase, bool can_reshape){ return remove_dead_region(phase, can_reshape) ? this : NULL; } +//------------------------------Ideal------------------------------------------ +// Return a node which is more "ideal" than the current node. Strip out +// control copies +Node *AryEqNode::Ideal(PhaseGVN *phase, bool can_reshape){ + return remove_dead_region(phase, can_reshape) ? this : NULL; +} + //============================================================================= MemBarNode::MemBarNode(Compile* C, int alias_idx, Node* precedent) diff --git a/hotspot/src/share/vm/opto/memnode.hpp b/hotspot/src/share/vm/opto/memnode.hpp index 0cc63b8efe6..891b9f64a87 100644 --- a/hotspot/src/share/vm/opto/memnode.hpp +++ b/hotspot/src/share/vm/opto/memnode.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -72,7 +72,8 @@ public: // This one should probably be a phase-specific function: static bool all_controls_dominate(Node* dom, Node* sub); - // Is this Node a MemNode or some descendent? Default is YES. + // Find any cast-away of null-ness and keep its control. + static Node *Ideal_common_DU_postCCP( PhaseCCP *ccp, Node* n, Node* adr ); virtual Node *Ideal_DU_postCCP( PhaseCCP *ccp ); virtual const class TypePtr *adr_type() const; // returns bottom_type of address @@ -150,6 +151,9 @@ public: // zero out the control input. virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); + // Split instance field load through Phi. + Node* split_through_phi(PhaseGVN *phase); + // Recover original value from boxed values Node *eliminate_autobox(PhaseGVN *phase); @@ -157,6 +161,10 @@ public: // then call the virtual add() to set the type. virtual const Type *Value( PhaseTransform *phase ) const; + // Common methods for LoadKlass and LoadNKlass nodes. + const Type *klass_value_common( PhaseTransform *phase ) const; + Node *klass_identity_common( PhaseTransform *phase ); + virtual uint ideal_reg() const; virtual const Type *bottom_type() const; // Following method is copied from TypeNode: @@ -358,14 +366,35 @@ public: // Load a Klass from an object class LoadKlassNode : public LoadPNode { public: - LoadKlassNode( Node *c, Node *mem, Node *adr, const TypePtr *at, const TypeKlassPtr *tk = TypeKlassPtr::OBJECT ) + LoadKlassNode( Node *c, Node *mem, Node *adr, const TypePtr *at, const TypeKlassPtr *tk ) : LoadPNode(c,mem,adr,at,tk) {} virtual int Opcode() const; virtual const Type *Value( PhaseTransform *phase ) const; virtual Node *Identity( PhaseTransform *phase ); virtual bool depends_only_on_test() const { return true; } + + // Polymorphic factory method: + static Node* make( PhaseGVN& gvn, Node *mem, Node *adr, const TypePtr* at, + const TypeKlassPtr *tk = TypeKlassPtr::OBJECT ); }; +//------------------------------LoadNKlassNode--------------------------------- +// Load a narrow Klass from an object. +class LoadNKlassNode : public LoadNNode { +public: + LoadNKlassNode( Node *c, Node *mem, Node *adr, const TypePtr *at, const TypeNarrowOop *tk ) + : LoadNNode(c,mem,adr,at,tk) {} + virtual int Opcode() const; + virtual uint ideal_reg() const { return Op_RegN; } + virtual int store_Opcode() const { return Op_StoreN; } + virtual BasicType memory_type() const { return T_NARROWOOP; } + + virtual const Type *Value( PhaseTransform *phase ) const; + virtual Node *Identity( PhaseTransform *phase ); + virtual bool depends_only_on_test() const { return true; } +}; + + //------------------------------LoadSNode-------------------------------------- // Load a short (16bits signed) from memory class LoadSNode : public LoadNode { @@ -696,6 +725,18 @@ public: virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); }; +//------------------------------AryEq--------------------------------------- +class AryEqNode: public Node { +public: + AryEqNode(Node *control, Node* s1, Node* s2): Node(control, s1, s2) {}; + virtual int Opcode() const; + virtual bool depends_only_on_test() const { return false; } + virtual const Type* bottom_type() const { return TypeInt::BOOL; } + virtual const TypePtr* adr_type() const { return TypeAryPtr::CHARS; } + virtual uint ideal_reg() const { return Op_RegI; } + virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); +}; + //------------------------------MemBar----------------------------------------- // There are different flavors of Memory Barriers to match the Java Memory // Model. Monitor-enter and volatile-load act as Aquires: no following ref diff --git a/hotspot/src/share/vm/opto/mulnode.cpp b/hotspot/src/share/vm/opto/mulnode.cpp index feab38ce64c..22ea890c95a 100644 --- a/hotspot/src/share/vm/opto/mulnode.cpp +++ b/hotspot/src/share/vm/opto/mulnode.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/opto/mulnode.hpp b/hotspot/src/share/vm/opto/mulnode.hpp index decaf5aa89c..f668946742f 100644 --- a/hotspot/src/share/vm/opto/mulnode.hpp +++ b/hotspot/src/share/vm/opto/mulnode.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/opto/multnode.hpp b/hotspot/src/share/vm/opto/multnode.hpp index 8c17f9d45f6..490ea03c7f0 100644 --- a/hotspot/src/share/vm/opto/multnode.hpp +++ b/hotspot/src/share/vm/opto/multnode.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/opto/node.cpp b/hotspot/src/share/vm/opto/node.cpp index d3c2c65f8f3..df3e56c2dc7 100644 --- a/hotspot/src/share/vm/opto/node.cpp +++ b/hotspot/src/share/vm/opto/node.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1039,76 +1039,125 @@ Node* Node::find_exact_control(Node* ctrl) { //--------------------------dominates------------------------------------------ // Helper function for MemNode::all_controls_dominate(). // Check if 'this' control node dominates or equal to 'sub' control node. +// We already know that if any path back to Root or Start reaches 'this', +// then all paths so, so this is a simple search for one example, +// not an exhaustive search for a counterexample. bool Node::dominates(Node* sub, Node_List &nlist) { assert(this->is_CFG(), "expecting control"); assert(sub != NULL && sub->is_CFG(), "expecting control"); + // detect dead cycle without regions + int iterations_without_region_limit = DominatorSearchLimit; + Node* orig_sub = sub; + Node* dom = this; + bool met_dom = false; nlist.clear(); - bool this_dominates = false; - uint region_input = 0; - while (sub != NULL) { // walk 'sub' up the chain to 'this' - if (sub == this) { + + // Walk 'sub' backward up the chain to 'dom', watching for regions. + // After seeing 'dom', continue up to Root or Start. + // If we hit a region (backward split point), it may be a loop head. + // Keep going through one of the region's inputs. If we reach the + // same region again, go through a different input. Eventually we + // will either exit through the loop head, or give up. + // (If we get confused, break out and return a conservative 'false'.) + while (sub != NULL) { + if (sub->is_top()) break; // Conservative answer for dead code. + if (sub == dom) { if (nlist.size() == 0) { // No Region nodes except loops were visited before and the EntryControl // path was taken for loops: it did not walk in a cycle. return true; - } else if (!this_dominates) { + } else if (met_dom) { + break; // already met before: walk in a cycle + } else { // Region nodes were visited. Continue walk up to Start or Root // to make sure that it did not walk in a cycle. - this_dominates = true; // first time meet - } else { - return false; // already met before: walk in a cycle - } + met_dom = true; // first time meet + iterations_without_region_limit = DominatorSearchLimit; // Reset + } } - if (sub->is_Start() || sub->is_Root()) - return this_dominates; - - Node* up = sub->find_exact_control(sub->in(0)); - if (up == NULL || up->is_top()) - return false; // Conservative answer for dead code - + if (sub->is_Start() || sub->is_Root()) { + // Success if we met 'dom' along a path to Start or Root. + // We assume there are no alternative paths that avoid 'dom'. + // (This assumption is up to the caller to ensure!) + return met_dom; + } + Node* up = sub->in(0); + // Normalize simple pass-through regions and projections: + up = sub->find_exact_control(up); + // If sub == up, we found a self-loop. Try to push past it. if (sub == up && sub->is_Loop()) { - up = sub->in(0); // in(LoopNode::EntryControl); + // Take loop entry path on the way up to 'dom'. + up = sub->in(1); // in(LoopNode::EntryControl); + } else if (sub == up && sub->is_Region() && sub->req() != 3) { + // Always take in(1) path on the way up to 'dom' for clone regions + // (with only one input) or regions which merge > 2 paths + // (usually used to merge fast/slow paths). + up = sub->in(1); } else if (sub == up && sub->is_Region()) { - uint i = 1; - if (nlist.size() == 0) { - // No Region nodes (except Loops) were visited before. - // Take first valid path on the way up to 'this'. - } else if (nlist.at(nlist.size() - 1) == sub) { - // This Region node was just visited. Take other path. - i = region_input + 1; - nlist.pop(); - } else { - // Was this Region node visited before? - uint size = nlist.size(); - for (uint j = 0; j < size; j++) { - if (nlist.at(j) == sub) { - return false; // The Region node was visited before. Give up. + // Try both paths for Regions with 2 input paths (it may be a loop head). + // It could give conservative 'false' answer without information + // which region's input is the entry path. + iterations_without_region_limit = DominatorSearchLimit; // Reset + + bool region_was_visited_before = false; + // Was this Region node visited before? + // If so, we have reached it because we accidentally took a + // loop-back edge from 'sub' back into the body of the loop, + // and worked our way up again to the loop header 'sub'. + // So, take the first unexplored path on the way up to 'dom'. + for (int j = nlist.size() - 1; j >= 0; j--) { + intptr_t ni = (intptr_t)nlist.at(j); + Node* visited = (Node*)(ni & ~1); + bool visited_twice_already = ((ni & 1) != 0); + if (visited == sub) { + if (visited_twice_already) { + // Visited 2 paths, but still stuck in loop body. Give up. + return false; } - } - // The Region node was not visited before. - // Take first valid path on the way up to 'this'. - } - for (; i < sub->req(); i++) { - Node* in = sub->in(i); - if (in != NULL && !in->is_top() && in != sub) { + // The Region node was visited before only once. + // (We will repush with the low bit set, below.) + nlist.remove(j); + // We will find a new edge and re-insert. + region_was_visited_before = true; break; } } - if (i < sub->req()) { - nlist.push(sub); - up = sub->in(i); - region_input = i; - } - } - if (sub == up) - return false; // some kind of tight cycle - if (orig_sub == up) - return false; // walk in a cycle + // Find an incoming edge which has not been seen yet; walk through it. + assert(up == sub, ""); + uint skip = region_was_visited_before ? 1 : 0; + for (uint i = 1; i < sub->req(); i++) { + Node* in = sub->in(i); + if (in != NULL && !in->is_top() && in != sub) { + if (skip == 0) { + up = in; + break; + } + --skip; // skip this nontrivial input + } + } + + // Set 0 bit to indicate that both paths were taken. + nlist.push((Node*)((intptr_t)sub + (region_was_visited_before ? 1 : 0))); + } + + if (up == sub) { + break; // some kind of tight cycle + } + if (up == orig_sub && met_dom) { + // returned back after visiting 'dom' + break; // some kind of cycle + } + if (--iterations_without_region_limit < 0) { + break; // dead cycle + } sub = up; } + + // Did not meet Root or Start node in pred. chain. + // Conservative answer for dead code. return false; } @@ -1338,7 +1387,7 @@ static void find_recur( Node* &result, Node *n, int idx, bool only_ctrl, } #ifdef ASSERT // Search along debug_orig edges last: - for (Node* orig = n->debug_orig(); orig != NULL; orig = orig->debug_orig()) { + for (Node* orig = n->debug_orig(); orig != NULL && n != orig; orig = orig->debug_orig()) { if (NotANode(orig)) break; find_recur( result, orig, idx, only_ctrl, old_space, new_space ); } diff --git a/hotspot/src/share/vm/opto/node.hpp b/hotspot/src/share/vm/opto/node.hpp index dc44aab22c8..7f78b426b1c 100644 --- a/hotspot/src/share/vm/opto/node.hpp +++ b/hotspot/src/share/vm/opto/node.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -53,6 +53,8 @@ class ConstraintCastNode; class ConNode; class CountedLoopNode; class CountedLoopEndNode; +class DecodeNNode; +class EncodePNode; class FastLockNode; class FastUnlockNode; class IfNode; @@ -438,6 +440,12 @@ private: public: // Globally replace this node by a given new node, updating all uses. void replace_by(Node* new_node); + // Globally replace this node by a given new node, updating all uses + // and cutting input edges of old node. + void subsume_by(Node* new_node) { + replace_by(new_node); + disconnect_inputs(NULL); + } void set_req_X( uint i, Node *n, PhaseIterGVN *igvn ); // Find the one non-null required input. RegionNode only Node *nonnull_req() const; @@ -577,6 +585,8 @@ public: DEFINE_CLASS_ID(CheckCastPP, Type, 2) DEFINE_CLASS_ID(CMove, Type, 3) DEFINE_CLASS_ID(SafePointScalarObject, Type, 4) + DEFINE_CLASS_ID(DecodeN, Type, 5) + DEFINE_CLASS_ID(EncodeP, Type, 6) DEFINE_CLASS_ID(Mem, Node, 6) DEFINE_CLASS_ID(Load, Mem, 0) @@ -685,6 +695,8 @@ public: DEFINE_CLASS_QUERY(Cmp) DEFINE_CLASS_QUERY(CountedLoop) DEFINE_CLASS_QUERY(CountedLoopEnd) + DEFINE_CLASS_QUERY(DecodeN) + DEFINE_CLASS_QUERY(EncodeP) DEFINE_CLASS_QUERY(FastLock) DEFINE_CLASS_QUERY(FastUnlock) DEFINE_CLASS_QUERY(If) diff --git a/hotspot/src/share/vm/opto/opcodes.cpp b/hotspot/src/share/vm/opto/opcodes.cpp index ddf5d40665e..129cc6e4cf6 100644 --- a/hotspot/src/share/vm/opto/opcodes.cpp +++ b/hotspot/src/share/vm/opto/opcodes.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/opto/opcodes.hpp b/hotspot/src/share/vm/opto/opcodes.hpp index 530f9e2cbd8..ee56085cf84 100644 --- a/hotspot/src/share/vm/opto/opcodes.hpp +++ b/hotspot/src/share/vm/opto/opcodes.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/opto/output.cpp b/hotspot/src/share/vm/opto/output.cpp index b1f2ca12155..64bf38f5d1a 100644 --- a/hotspot/src/share/vm/opto/output.cpp +++ b/hotspot/src/share/vm/opto/output.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -48,6 +48,7 @@ void Compile::Output() { // Initialize the space for the BufferBlob used to find and verify // instruction size in MachNode::emit_size() init_scratch_buffer_blob(); + if (failing()) return; // Out of memory // Make sure I can find the Start Node Block_Array& bbs = _cfg->_bbs; @@ -446,6 +447,7 @@ void Compile::Shorten_branches(Label *labels, int& code_size, int& reloc_size, i // We've got a winner. Replace this branch. MachNode *replacement = mach->short_branch_version(this); b->_nodes.map(j, replacement); + mach->subsume_by(replacement); // Update the jmp_end size to save time in our // next pass. diff --git a/hotspot/src/share/vm/opto/parse.hpp b/hotspot/src/share/vm/opto/parse.hpp index df2bc6cd54a..10b3fe2ca14 100644 --- a/hotspot/src/share/vm/opto/parse.hpp +++ b/hotspot/src/share/vm/opto/parse.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/opto/parse1.cpp b/hotspot/src/share/vm/opto/parse1.cpp index e3edece1a15..d26d075f627 100644 --- a/hotspot/src/share/vm/opto/parse1.cpp +++ b/hotspot/src/share/vm/opto/parse1.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1901,7 +1901,7 @@ void Parse::call_register_finalizer() { // finalization. In general this will fold up since the concrete // class is often visible so the access flags are constant. Node* klass_addr = basic_plus_adr( receiver, receiver, oopDesc::klass_offset_in_bytes() ); - Node* klass = _gvn.transform(new (C, 3) LoadKlassNode(NULL, immutable_memory(), klass_addr, TypeInstPtr::KLASS)); + Node* klass = _gvn.transform( LoadKlassNode::make(_gvn, immutable_memory(), klass_addr, TypeInstPtr::KLASS) ); Node* access_flags_addr = basic_plus_adr(klass, klass, Klass::access_flags_offset_in_bytes() + sizeof(oopDesc)); Node* access_flags = make_load(NULL, access_flags_addr, TypeInt::INT, T_INT); diff --git a/hotspot/src/share/vm/opto/parse2.cpp b/hotspot/src/share/vm/opto/parse2.cpp index c515f2e32b9..b3e0a9aff10 100644 --- a/hotspot/src/share/vm/opto/parse2.cpp +++ b/hotspot/src/share/vm/opto/parse2.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -67,12 +67,9 @@ Node* Parse::array_addressing(BasicType type, int vals, const Type* *result2) { const Type* elemtype = arytype->elem(); if (UseUniqueSubclasses && result2 != NULL) { - const Type* el = elemtype; - if (elemtype->isa_narrowoop()) { - el = elemtype->is_narrowoop()->make_oopptr(); - } - const TypeInstPtr* toop = el->isa_instptr(); - if (toop) { + const Type* el = elemtype->make_ptr(); + if (el && el->isa_instptr()) { + const TypeInstPtr* toop = el->is_instptr(); if (toop->klass()->as_instance_klass()->unique_concrete_subklass()) { // If we load from "AbstractClass[]" we must see "ConcreteSubClass". const Type* subklass = Type::get_const_type(toop->klass()); @@ -2223,7 +2220,7 @@ void Parse::do_one_bytecode() { sprintf(buffer, "Bytecode %d: %s", bci(), Bytecodes::name(bc())); bool old = printer->traverse_outs(); printer->set_traverse_outs(true); - printer->print_method(C, buffer, 3); + printer->print_method(C, buffer, 4); printer->set_traverse_outs(old); } #endif diff --git a/hotspot/src/share/vm/opto/parse3.cpp b/hotspot/src/share/vm/opto/parse3.cpp index 3c0e0ff3186..2a603de28c9 100644 --- a/hotspot/src/share/vm/opto/parse3.cpp +++ b/hotspot/src/share/vm/opto/parse3.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/opto/parseHelper.cpp b/hotspot/src/share/vm/opto/parseHelper.cpp index d34ca998c70..b5553cbe806 100644 --- a/hotspot/src/share/vm/opto/parseHelper.cpp +++ b/hotspot/src/share/vm/opto/parseHelper.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,7 +38,7 @@ void GraphKit::make_dtrace_method_entry_exit(ciMethod* method, bool is_entry) { // Get method const TypeInstPtr* method_type = TypeInstPtr::make(TypePtr::Constant, method->klass(), true, method, 0); - Node *method_node = _gvn.transform( new (C, 1) ConPNode(method_type) ); + Node *method_node = _gvn.transform( ConNode::make(C, method_type) ); kill_dead_locals(); @@ -143,7 +143,7 @@ void Parse::array_store_check() { int klass_offset = oopDesc::klass_offset_in_bytes(); Node* p = basic_plus_adr( ary, ary, klass_offset ); // p's type is array-of-OOPS plus klass_offset - Node* array_klass = _gvn.transform(new (C, 3) LoadKlassNode(0, immutable_memory(), p, TypeInstPtr::KLASS)); + Node* array_klass = _gvn.transform( LoadKlassNode::make(_gvn, immutable_memory(), p, TypeInstPtr::KLASS) ); // Get the array klass const TypeKlassPtr *tak = _gvn.type(array_klass)->is_klassptr(); @@ -189,7 +189,7 @@ void Parse::array_store_check() { // Extract the array element class int element_klass_offset = objArrayKlass::element_klass_offset_in_bytes() + sizeof(oopDesc); Node *p2 = basic_plus_adr(array_klass, array_klass, element_klass_offset); - Node *a_e_klass = _gvn.transform(new (C, 3) LoadKlassNode(0, immutable_memory(), p2, tak)); + Node *a_e_klass = _gvn.transform( LoadKlassNode::make(_gvn, immutable_memory(), p2, tak) ); // Check (the hard way) and throw if not a subklass. // Result is ignored, we just need the CFG effects. diff --git a/hotspot/src/share/vm/opto/phaseX.cpp b/hotspot/src/share/vm/opto/phaseX.cpp index e58577451b6..45690469d92 100644 --- a/hotspot/src/share/vm/opto/phaseX.cpp +++ b/hotspot/src/share/vm/opto/phaseX.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/opto/phaseX.hpp b/hotspot/src/share/vm/opto/phaseX.hpp index e040ccc8b02..79482ec289d 100644 --- a/hotspot/src/share/vm/opto/phaseX.hpp +++ b/hotspot/src/share/vm/opto/phaseX.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/opto/postaloc.cpp b/hotspot/src/share/vm/opto/postaloc.cpp index cabbefe12c7..59e6b14125d 100644 --- a/hotspot/src/share/vm/opto/postaloc.cpp +++ b/hotspot/src/share/vm/opto/postaloc.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/opto/subnode.cpp b/hotspot/src/share/vm/opto/subnode.cpp index 53413dfbfeb..90ad08700c3 100644 --- a/hotspot/src/share/vm/opto/subnode.cpp +++ b/hotspot/src/share/vm/opto/subnode.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -45,10 +45,13 @@ Node *SubNode::Identity( PhaseTransform *phase ) { return in(2)->in(2); } - // Convert "(X+Y) - Y" into X + // Convert "(X+Y) - Y" into X and "(X+Y) - X" into Y if( in(1)->Opcode() == Op_AddI ) { if( phase->eqv(in(1)->in(2),in(2)) ) return in(1)->in(1); + if (phase->eqv(in(1)->in(1),in(2))) + return in(1)->in(2); + // Also catch: "(X + Opaque2(Y)) - Y". In this case, 'Y' is a loop-varying // trip counter and X is likely to be loop-invariant (that's how O2 Nodes // are originally used, although the optimizer sometimes jiggers things). @@ -740,8 +743,8 @@ Node *CmpPNode::Ideal( PhaseGVN *phase, bool can_reshape ) { // Simplify an CmpN (compare 2 pointers) node, based on local information. // If both inputs are constants, compare them. const Type *CmpNNode::sub( const Type *t1, const Type *t2 ) const { - const TypePtr *r0 = t1->is_narrowoop()->make_oopptr(); // Handy access - const TypePtr *r1 = t2->is_narrowoop()->make_oopptr(); + const TypePtr *r0 = t1->make_ptr(); // Handy access + const TypePtr *r1 = t2->make_ptr(); // Undefined inputs makes for an undefined result if( TypePtr::above_centerline(r0->_ptr) || diff --git a/hotspot/src/share/vm/opto/subnode.hpp b/hotspot/src/share/vm/opto/subnode.hpp index 8d01e2328d2..ecdd10e1eea 100644 --- a/hotspot/src/share/vm/opto/subnode.hpp +++ b/hotspot/src/share/vm/opto/subnode.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/opto/superword.cpp b/hotspot/src/share/vm/opto/superword.cpp index 5e3a7bb70e1..593d5dd2dd0 100644 --- a/hotspot/src/share/vm/opto/superword.cpp +++ b/hotspot/src/share/vm/opto/superword.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1424,9 +1424,9 @@ int SuperWord::memory_alignment(MemNode* s, int iv_adjust_in_bytes) { //---------------------------container_type--------------------------- // Smallest type containing range of values const Type* SuperWord::container_type(const Type* t) { - if (t->isa_narrowoop()) t = t->is_narrowoop()->make_oopptr(); - if (t->isa_aryptr()) { - t = t->is_aryptr()->elem(); + const Type* tp = t->make_ptr(); + if (tp && tp->isa_aryptr()) { + t = tp->is_aryptr()->elem(); } if (t->basic_type() == T_INT) { if (t->higher_equal(TypeInt::BOOL)) return TypeInt::BOOL; diff --git a/hotspot/src/share/vm/opto/type.cpp b/hotspot/src/share/vm/opto/type.cpp index 0715ef22a46..bb6c959388f 100644 --- a/hotspot/src/share/vm/opto/type.cpp +++ b/hotspot/src/share/vm/opto/type.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -311,8 +311,18 @@ void Type::Initialize_shared(Compile* current) { mreg2type[Op_RegFlags] = TypeInt::CC; TypeAryPtr::RANGE = TypeAryPtr::make( TypePtr::BotPTR, TypeAry::make(Type::BOTTOM,TypeInt::POS), current->env()->Object_klass(), false, arrayOopDesc::length_offset_in_bytes()); - // There is no shared klass for Object[]. See note in TypeAryPtr::klass(). - TypeAryPtr::OOPS = TypeAryPtr::make(TypePtr::BotPTR, TypeAry::make(TypeInstPtr::BOTTOM,TypeInt::POS), NULL /*ciArrayKlass::make(o)*/, false, Type::OffsetBot); + + TypeAryPtr::NARROWOOPS = TypeAryPtr::make(TypePtr::BotPTR, TypeAry::make(TypeNarrowOop::BOTTOM, TypeInt::POS), NULL /*ciArrayKlass::make(o)*/, false, Type::OffsetBot); + +#ifdef _LP64 + if (UseCompressedOops) { + TypeAryPtr::OOPS = TypeAryPtr::NARROWOOPS; + } else +#endif + { + // There is no shared klass for Object[]. See note in TypeAryPtr::klass(). + TypeAryPtr::OOPS = TypeAryPtr::make(TypePtr::BotPTR, TypeAry::make(TypeInstPtr::BOTTOM,TypeInt::POS), NULL /*ciArrayKlass::make(o)*/, false, Type::OffsetBot); + } TypeAryPtr::BYTES = TypeAryPtr::make(TypePtr::BotPTR, TypeAry::make(TypeInt::BYTE ,TypeInt::POS), ciTypeArrayKlass::make(T_BYTE), true, Type::OffsetBot); TypeAryPtr::SHORTS = TypeAryPtr::make(TypePtr::BotPTR, TypeAry::make(TypeInt::SHORT ,TypeInt::POS), ciTypeArrayKlass::make(T_SHORT), true, Type::OffsetBot); TypeAryPtr::CHARS = TypeAryPtr::make(TypePtr::BotPTR, TypeAry::make(TypeInt::CHAR ,TypeInt::POS), ciTypeArrayKlass::make(T_CHAR), true, Type::OffsetBot); @@ -321,9 +331,10 @@ void Type::Initialize_shared(Compile* current) { TypeAryPtr::FLOATS = TypeAryPtr::make(TypePtr::BotPTR, TypeAry::make(Type::FLOAT ,TypeInt::POS), ciTypeArrayKlass::make(T_FLOAT), true, Type::OffsetBot); TypeAryPtr::DOUBLES = TypeAryPtr::make(TypePtr::BotPTR, TypeAry::make(Type::DOUBLE ,TypeInt::POS), ciTypeArrayKlass::make(T_DOUBLE), true, Type::OffsetBot); - TypeAryPtr::_array_body_type[T_NARROWOOP] = NULL; // what should this be? + // Nobody should ask _array_body_type[T_NARROWOOP]. Use NULL as assert. + TypeAryPtr::_array_body_type[T_NARROWOOP] = NULL; TypeAryPtr::_array_body_type[T_OBJECT] = TypeAryPtr::OOPS; - TypeAryPtr::_array_body_type[T_ARRAY] = TypeAryPtr::OOPS; // arrays are stored in oop arrays + TypeAryPtr::_array_body_type[T_ARRAY] = TypeAryPtr::OOPS; // arrays are stored in oop arrays TypeAryPtr::_array_body_type[T_BYTE] = TypeAryPtr::BYTES; TypeAryPtr::_array_body_type[T_BOOLEAN] = TypeAryPtr::BYTES; // boolean[] is a byte array TypeAryPtr::_array_body_type[T_SHORT] = TypeAryPtr::SHORTS; @@ -480,14 +491,8 @@ bool Type::is_nan() const { // commutative and the lattice is symmetric. const Type *Type::meet( const Type *t ) const { if (isa_narrowoop() && t->isa_narrowoop()) { - const Type* result = is_narrowoop()->make_oopptr()->meet(t->is_narrowoop()->make_oopptr()); - if (result->isa_oopptr()) { - return result->isa_oopptr()->make_narrowoop(); - } else if (result == TypePtr::NULL_PTR) { - return TypeNarrowOop::NULL_PTR; - } else { - return result; - } + const Type* result = make_ptr()->meet(t->make_ptr()); + return result->make_narrowoop(); } const Type *mt = xmeet(t); @@ -509,23 +514,8 @@ const Type *Type::meet( const Type *t ) const { bool t_interface = t_inst->klass()->is_interface(); interface_vs_oop = this_interface ^ t_interface; } - const Type *tdual = t->_dual; - const Type *thisdual = _dual; - // strip out instances - if (t2t->isa_oopptr() != NULL) { - t2t = t2t->isa_oopptr()->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE); - } - if (t2this->isa_oopptr() != NULL) { - t2this = t2this->isa_oopptr()->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE); - } - if (tdual->isa_oopptr() != NULL) { - tdual = tdual->isa_oopptr()->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE); - } - if (thisdual->isa_oopptr() != NULL) { - thisdual = thisdual->isa_oopptr()->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE); - } - if( !interface_vs_oop && (t2t != tdual || t2this != thisdual) ) { + if( !interface_vs_oop && (t2t != t->_dual || t2this != _dual) ) { tty->print_cr("=== Meet Not Symmetric ==="); tty->print("t = "); t->dump(); tty->cr(); tty->print("this= "); dump(); tty->cr(); @@ -696,7 +686,7 @@ void Type::dump_on(outputStream *st) const { ResourceMark rm; Dict d(cmpkey,hashkey); // Stop recursive type dumping dump2(d,1, st); - if (isa_ptr() && is_ptr()->is_narrow()) { + if (is_ptr_to_narrowoop()) { st->print(" [narrow]"); } } @@ -929,6 +919,7 @@ const Type *TypeD::xmeet( const Type *t ) const { case InstPtr: case KlassPtr: case AryPtr: + case NarrowOop: case Int: case Long: case FloatTop: @@ -1075,6 +1066,7 @@ const Type *TypeInt::xmeet( const Type *t ) const { case InstPtr: case KlassPtr: case AryPtr: + case NarrowOop: case Long: case FloatTop: case FloatCon: @@ -1082,7 +1074,6 @@ const Type *TypeInt::xmeet( const Type *t ) const { case DoubleTop: case DoubleCon: case DoubleBot: - case NarrowOop: case Bottom: // Ye Olde Default return Type::BOTTOM; default: // All else is a mistake @@ -1317,6 +1308,7 @@ const Type *TypeLong::xmeet( const Type *t ) const { case InstPtr: case KlassPtr: case AryPtr: + case NarrowOop: case Int: case FloatTop: case FloatCon: @@ -1751,7 +1743,7 @@ inline const TypeInt* normalize_array_size(const TypeInt* size) { //------------------------------make------------------------------------------- const TypeAry *TypeAry::make( const Type *elem, const TypeInt *size) { if (UseCompressedOops && elem->isa_oopptr()) { - elem = elem->is_oopptr()->make_narrowoop(); + elem = elem->make_narrowoop(); } size = normalize_array_size(size); return (TypeAry*)(new TypeAry(elem,size))->hashcons(); @@ -1836,9 +1828,8 @@ bool TypeAry::ary_must_be_exact() const { if (_elem == BOTTOM) return false; // general array not exact if (_elem == TOP ) return false; // inverted general array not exact const TypeOopPtr* toop = NULL; - if (UseCompressedOops) { - const TypeNarrowOop* noop = _elem->isa_narrowoop(); - if (noop) toop = noop->make_oopptr()->isa_oopptr(); + if (UseCompressedOops && _elem->isa_narrowoop()) { + toop = _elem->make_ptr()->isa_oopptr(); } else { toop = _elem->isa_oopptr(); } @@ -1848,16 +1839,18 @@ bool TypeAry::ary_must_be_exact() const { if (!tklass->is_loaded()) return false; // unloaded class const TypeInstPtr* tinst; if (_elem->isa_narrowoop()) - tinst = _elem->is_narrowoop()->make_oopptr()->isa_instptr(); + tinst = _elem->make_ptr()->isa_instptr(); else tinst = _elem->isa_instptr(); - if (tinst) return tklass->as_instance_klass()->is_final(); + if (tinst) + return tklass->as_instance_klass()->is_final(); const TypeAryPtr* tap; if (_elem->isa_narrowoop()) - tap = _elem->is_narrowoop()->make_oopptr()->isa_aryptr(); + tap = _elem->make_ptr()->isa_aryptr(); else tap = _elem->isa_aryptr(); - if (tap) return tap->ary()->ary_must_be_exact(); + if (tap) + return tap->ary()->ary_must_be_exact(); return false; } @@ -2146,6 +2139,67 @@ void TypeRawPtr::dump2( Dict &d, uint depth, outputStream *st ) const { // Convenience common pre-built type. const TypeOopPtr *TypeOopPtr::BOTTOM; +//------------------------------TypeOopPtr------------------------------------- +TypeOopPtr::TypeOopPtr( TYPES t, PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id ) + : TypePtr(t, ptr, offset), + _const_oop(o), _klass(k), + _klass_is_exact(xk), + _is_ptr_to_narrowoop(false), + _instance_id(instance_id) { +#ifdef _LP64 + if (UseCompressedOops && _offset != 0) { + if (klass() == NULL) { + assert(this->isa_aryptr(), "only arrays without klass"); + _is_ptr_to_narrowoop = true; + } else if (_offset == oopDesc::klass_offset_in_bytes()) { + _is_ptr_to_narrowoop = true; + } else if (this->isa_aryptr()) { + _is_ptr_to_narrowoop = (klass()->is_obj_array_klass() && + _offset != arrayOopDesc::length_offset_in_bytes()); + } else if (klass() == ciEnv::current()->Class_klass() && + (_offset == java_lang_Class::klass_offset_in_bytes() || + _offset == java_lang_Class::array_klass_offset_in_bytes())) { + // Special hidden fields from the Class. + assert(this->isa_instptr(), "must be an instance ptr."); + _is_ptr_to_narrowoop = true; + } else if (klass()->is_instance_klass()) { + ciInstanceKlass* ik = klass()->as_instance_klass(); + ciField* field = NULL; + if (this->isa_klassptr()) { + // Perm objects don't use compressed references, except for + // static fields which are currently compressed. + field = ik->get_field_by_offset(_offset, true); + if (field != NULL) { + BasicType basic_elem_type = field->layout_type(); + _is_ptr_to_narrowoop = (basic_elem_type == T_OBJECT || + basic_elem_type == T_ARRAY); + } + } else if (_offset == OffsetBot || _offset == OffsetTop) { + // unsafe access + _is_ptr_to_narrowoop = true; + } else { // exclude unsafe ops + assert(this->isa_instptr(), "must be an instance ptr."); + // Field which contains a compressed oop references. + field = ik->get_field_by_offset(_offset, false); + if (field != NULL) { + BasicType basic_elem_type = field->layout_type(); + _is_ptr_to_narrowoop = (basic_elem_type == T_OBJECT || + basic_elem_type == T_ARRAY); + } else if (klass()->equals(ciEnv::current()->Object_klass())) { + // Compile::find_alias_type() cast exactness on all types to verify + // that it does not affect alias type. + _is_ptr_to_narrowoop = true; + } else { + // Type for the copy start in LibraryCallKit::inline_native_clone(). + assert(!klass_is_exact(), "only non-exact klass"); + _is_ptr_to_narrowoop = true; + } + } + } + } +#endif +} + //------------------------------make------------------------------------------- const TypeOopPtr *TypeOopPtr::make(PTR ptr, int offset) { @@ -2153,7 +2207,7 @@ const TypeOopPtr *TypeOopPtr::make(PTR ptr, ciKlass* k = ciKlassKlass::make(); bool xk = false; ciObject* o = NULL; - return (TypeOopPtr*)(new TypeOopPtr(OopPtr, ptr, k, xk, o, offset, UNKNOWN_INSTANCE))->hashcons(); + return (TypeOopPtr*)(new TypeOopPtr(OopPtr, ptr, k, xk, o, offset, InstanceBot))->hashcons(); } @@ -2165,7 +2219,7 @@ const Type *TypeOopPtr::cast_to_ptr_type(PTR ptr) const { } //-----------------------------cast_to_instance------------------------------- -const TypeOopPtr *TypeOopPtr::cast_to_instance(int instance_id) const { +const TypeOopPtr *TypeOopPtr::cast_to_instance_id(int instance_id) const { // There are no instances of a general oop. // Return self unchanged. return this; @@ -2259,7 +2313,7 @@ const Type *TypeOopPtr::xmeet( const Type *t ) const { const Type *TypeOopPtr::xdual() const { assert(klass() == ciKlassKlass::make(), "no klasses here"); assert(const_oop() == NULL, "no constants here"); - return new TypeOopPtr(_base, dual_ptr(), klass(), klass_is_exact(), const_oop(), dual_offset(), dual_instance() ); + return new TypeOopPtr(_base, dual_ptr(), klass(), klass_is_exact(), const_oop(), dual_offset(), dual_instance_id() ); } //--------------------------make_from_klass_common----------------------------- @@ -2473,7 +2527,9 @@ void TypeOopPtr::dump2( Dict &d, uint depth, outputStream *st ) const { case 0: break; default: st->print("+%d",_offset); break; } - if (_instance_id != UNKNOWN_INSTANCE) + if (_instance_id == InstanceTop) + st->print(",iid=top"); + else if (_instance_id != InstanceBot) st->print(",iid=%d",_instance_id); } #endif @@ -2505,20 +2561,24 @@ const TypePtr *TypeOopPtr::add_offset( int offset ) const { return make( _ptr, xadd_offset(offset) ); } -const TypeNarrowOop* TypeOopPtr::make_narrowoop() const { - return TypeNarrowOop::make(this); +//------------------------------meet_instance_id-------------------------------- +int TypeOopPtr::meet_instance_id( int instance_id ) const { + // Either is 'TOP' instance? Return the other instance! + if( _instance_id == InstanceTop ) return instance_id; + if( instance_id == InstanceTop ) return _instance_id; + // If either is different, return 'BOTTOM' instance + if( _instance_id != instance_id ) return InstanceBot; + return _instance_id; } -int TypeOopPtr::meet_instance(int iid) const { - if (iid == 0) { - return (_instance_id < 0) ? _instance_id : UNKNOWN_INSTANCE; - } else if (_instance_id == UNKNOWN_INSTANCE) { - return (iid < 0) ? iid : UNKNOWN_INSTANCE; - } else { - return (_instance_id == iid) ? iid : UNKNOWN_INSTANCE; - } +//------------------------------dual_instance_id-------------------------------- +int TypeOopPtr::dual_instance_id( ) const { + if( _instance_id == InstanceTop ) return InstanceBot; // Map TOP into BOTTOM + if( _instance_id == InstanceBot ) return InstanceTop; // Map BOTTOM into TOP + return _instance_id; // Map everything else into self } + //============================================================================= // Convenience common pre-built types. const TypeInstPtr *TypeInstPtr::NOTNULL; @@ -2550,7 +2610,7 @@ const TypeInstPtr *TypeInstPtr::make(PTR ptr, // Ptr is never Null assert( ptr != Null, "NULL pointers are not typed" ); - if (instance_id != UNKNOWN_INSTANCE) + if ( instance_id > 0 ) xk = true; // instances are always exactly typed if (!UseExactTypes) xk = false; if (ptr == Constant) { @@ -2575,7 +2635,7 @@ const Type *TypeInstPtr::cast_to_ptr_type(PTR ptr) const { if( ptr == _ptr ) return this; // Reconstruct _sig info here since not a problem with later lazy // construction, _sig will show up on demand. - return make(ptr, klass(), klass_is_exact(), const_oop(), _offset); + return make(ptr, klass(), klass_is_exact(), const_oop(), _offset, _instance_id); } @@ -2591,11 +2651,15 @@ const Type *TypeInstPtr::cast_to_exactness(bool klass_is_exact) const { } //-----------------------------cast_to_instance------------------------------- -const TypeOopPtr *TypeInstPtr::cast_to_instance(int instance_id) const { - if( instance_id == _instance_id) return this; - bool exact = (instance_id == UNKNOWN_INSTANCE) ? _klass_is_exact : true; - - return make(ptr(), klass(), exact, const_oop(), _offset, instance_id); +const TypeOopPtr *TypeInstPtr::cast_to_instance_id(int instance_id) const { + if( instance_id == _instance_id ) return this; + bool exact = _klass_is_exact; + PTR ptr_t = _ptr; + if ( instance_id > 0 ) { // instances are always exactly typed + if (UseExactTypes) exact = true; + ptr_t = NotNull; + } + return make(ptr_t, klass(), exact, const_oop(), _offset, instance_id); } //------------------------------xmeet_unloaded--------------------------------- @@ -2676,16 +2740,17 @@ const Type *TypeInstPtr::xmeet( const Type *t ) const { const TypeAryPtr *tp = t->is_aryptr(); int offset = meet_offset(tp->offset()); PTR ptr = meet_ptr(tp->ptr()); - int iid = meet_instance(tp->instance_id()); + int instance_id = meet_instance_id(tp->instance_id()); switch (ptr) { case TopPTR: case AnyNull: // Fall 'down' to dual of object klass if (klass()->equals(ciEnv::current()->Object_klass())) { - return TypeAryPtr::make(ptr, tp->ary(), tp->klass(), tp->klass_is_exact(), offset, iid); + return TypeAryPtr::make(ptr, tp->ary(), tp->klass(), tp->klass_is_exact(), offset, instance_id); } else { // cannot subclass, so the meet has to fall badly below the centerline ptr = NotNull; - return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL, offset, iid); + instance_id = InstanceBot; + return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL, offset, instance_id); } case Constant: case NotNull: @@ -2696,14 +2761,15 @@ const Type *TypeInstPtr::xmeet( const Type *t ) const { // then we can subclass in the Java class heirarchy. if (klass()->equals(ciEnv::current()->Object_klass())) { // that is, tp's array type is a subtype of my klass - return TypeAryPtr::make(ptr, tp->ary(), tp->klass(), tp->klass_is_exact(), offset, iid); + return TypeAryPtr::make(ptr, tp->ary(), tp->klass(), tp->klass_is_exact(), offset, instance_id); } } // The other case cannot happen, since I cannot be a subtype of an array. // The meet falls down to Object class below centerline. if( ptr == Constant ) ptr = NotNull; - return make( ptr, ciEnv::current()->Object_klass(), false, NULL, offset, iid ); + instance_id = InstanceBot; + return make( ptr, ciEnv::current()->Object_klass(), false, NULL, offset, instance_id ); default: typerr(t); } } @@ -2715,9 +2781,11 @@ const Type *TypeInstPtr::xmeet( const Type *t ) const { PTR ptr = meet_ptr(tp->ptr()); switch (tp->ptr()) { case TopPTR: - case AnyNull: + case AnyNull: { + int instance_id = meet_instance_id(InstanceTop); return make(ptr, klass(), klass_is_exact(), - (ptr == Constant ? const_oop() : NULL), offset); + (ptr == Constant ? const_oop() : NULL), offset, instance_id); + } case NotNull: case BotPTR: return TypeOopPtr::make(ptr, offset); @@ -2733,10 +2801,13 @@ const Type *TypeInstPtr::xmeet( const Type *t ) const { switch (tp->ptr()) { case Null: if( ptr == Null ) return TypePtr::make( AnyPtr, ptr, offset ); + // else fall through to AnyNull case TopPTR: - case AnyNull: + case AnyNull: { + int instance_id = meet_instance_id(InstanceTop); return make( ptr, klass(), klass_is_exact(), - (ptr == Constant ? const_oop() : NULL), offset ); + (ptr == Constant ? const_oop() : NULL), offset, instance_id); + } case NotNull: case BotPTR: return TypePtr::make( AnyPtr, ptr, offset ); @@ -2765,7 +2836,7 @@ const Type *TypeInstPtr::xmeet( const Type *t ) const { const TypeInstPtr *tinst = t->is_instptr(); int off = meet_offset( tinst->offset() ); PTR ptr = meet_ptr( tinst->ptr() ); - int instance_id = meet_instance(tinst->instance_id()); + int instance_id = meet_instance_id(tinst->instance_id()); // Check for easy case; klasses are equal (and perhaps not loaded!) // If we have constants, then we created oops so classes are loaded @@ -2834,7 +2905,7 @@ const Type *TypeInstPtr::xmeet( const Type *t ) const { // Find out which constant. o = (this_klass == klass()) ? const_oop() : tinst->const_oop(); } - return make( ptr, k, xk, o, off ); + return make( ptr, k, xk, o, off, instance_id ); } // Either oop vs oop or interface vs interface or interface vs Object @@ -2921,7 +2992,7 @@ const Type *TypeInstPtr::xmeet( const Type *t ) const { // Now we find the LCA of Java classes ciKlass* k = this_klass->least_common_ancestor(tinst_klass); - return make( ptr, k, false, NULL, off ); + return make( ptr, k, false, NULL, off, instance_id ); } // End of case InstPtr case KlassPtr: @@ -2948,7 +3019,7 @@ ciType* TypeInstPtr::java_mirror_type() const { // Dual: do NOT dual on klasses. This means I do NOT understand the Java // inheritence mechanism. const Type *TypeInstPtr::xdual() const { - return new TypeInstPtr( dual_ptr(), klass(), klass_is_exact(), const_oop(), dual_offset(), dual_instance() ); + return new TypeInstPtr( dual_ptr(), klass(), klass_is_exact(), const_oop(), dual_offset(), dual_instance_id() ); } //------------------------------eq--------------------------------------------- @@ -3000,7 +3071,9 @@ void TypeInstPtr::dump2( Dict &d, uint depth, outputStream *st ) const { } st->print(" *"); - if (_instance_id != UNKNOWN_INSTANCE) + if (_instance_id == InstanceTop) + st->print(",iid=top"); + else if (_instance_id != InstanceBot) st->print(",iid=%d",_instance_id); } #endif @@ -3014,6 +3087,7 @@ const TypePtr *TypeInstPtr::add_offset( int offset ) const { // Convenience common pre-built types. const TypeAryPtr *TypeAryPtr::RANGE; const TypeAryPtr *TypeAryPtr::OOPS; +const TypeAryPtr *TypeAryPtr::NARROWOOPS; const TypeAryPtr *TypeAryPtr::BYTES; const TypeAryPtr *TypeAryPtr::SHORTS; const TypeAryPtr *TypeAryPtr::CHARS; @@ -3027,7 +3101,7 @@ const TypeAryPtr *TypeAryPtr::make( PTR ptr, const TypeAry *ary, ciKlass* k, boo assert(!(k == NULL && ary->_elem->isa_int()), "integral arrays must be pre-equipped with a class"); if (!xk) xk = ary->ary_must_be_exact(); - if (instance_id != UNKNOWN_INSTANCE) + if ( instance_id > 0 ) xk = true; // instances are always exactly typed if (!UseExactTypes) xk = (ptr == Constant); return (TypeAryPtr*)(new TypeAryPtr(ptr, NULL, ary, k, xk, offset, instance_id))->hashcons(); @@ -3039,7 +3113,7 @@ const TypeAryPtr *TypeAryPtr::make( PTR ptr, ciObject* o, const TypeAry *ary, ci "integral arrays must be pre-equipped with a class"); assert( (ptr==Constant && o) || (ptr!=Constant && !o), "" ); if (!xk) xk = (o != NULL) || ary->ary_must_be_exact(); - if (instance_id != UNKNOWN_INSTANCE) + if ( instance_id > 0 ) xk = true; // instances are always exactly typed if (!UseExactTypes) xk = (ptr == Constant); return (TypeAryPtr*)(new TypeAryPtr(ptr, o, ary, k, xk, offset, instance_id))->hashcons(); @@ -3048,7 +3122,7 @@ const TypeAryPtr *TypeAryPtr::make( PTR ptr, ciObject* o, const TypeAry *ary, ci //------------------------------cast_to_ptr_type------------------------------- const Type *TypeAryPtr::cast_to_ptr_type(PTR ptr) const { if( ptr == _ptr ) return this; - return make(ptr, const_oop(), _ary, klass(), klass_is_exact(), _offset); + return make(ptr, const_oop(), _ary, klass(), klass_is_exact(), _offset, _instance_id); } @@ -3061,10 +3135,15 @@ const Type *TypeAryPtr::cast_to_exactness(bool klass_is_exact) const { } //-----------------------------cast_to_instance------------------------------- -const TypeOopPtr *TypeAryPtr::cast_to_instance(int instance_id) const { - if( instance_id == _instance_id) return this; - bool exact = (instance_id == UNKNOWN_INSTANCE) ? _klass_is_exact : true; - return make(ptr(), const_oop(), _ary, klass(), exact, _offset, instance_id); +const TypeOopPtr *TypeAryPtr::cast_to_instance_id(int instance_id) const { + if( instance_id == _instance_id ) return this; + bool exact = _klass_is_exact; + PTR ptr_t = _ptr; + if ( instance_id > 0 ) { // instances are always exactly typed + if (UseExactTypes) exact = true; + ptr_t = NotNull; + } + return make(ptr_t, const_oop(), _ary, klass(), exact, _offset, instance_id); } //-----------------------------narrow_size_type------------------------------- @@ -3115,7 +3194,7 @@ const TypeAryPtr* TypeAryPtr::cast_to_size(const TypeInt* new_size) const { new_size = TypeInt::ZERO; // intermediate dead fast-path goo if (new_size == size()) return this; const TypeAry* new_ary = TypeAry::make(elem(), new_size); - return make(ptr(), const_oop(), new_ary, klass(), klass_is_exact(), _offset); + return make(ptr(), const_oop(), new_ary, klass(), klass_is_exact(), _offset, _instance_id); } @@ -3167,8 +3246,11 @@ const Type *TypeAryPtr::xmeet( const Type *t ) const { PTR ptr = meet_ptr(tp->ptr()); switch (tp->ptr()) { case TopPTR: - case AnyNull: - return make(ptr, (ptr == Constant ? const_oop() : NULL), _ary, _klass, _klass_is_exact, offset); + case AnyNull: { + int instance_id = meet_instance_id(InstanceTop); + return make(ptr, (ptr == Constant ? const_oop() : NULL), + _ary, _klass, _klass_is_exact, offset, instance_id); + } case BotPTR: case NotNull: return TypeOopPtr::make(ptr, offset); @@ -3189,8 +3271,12 @@ const Type *TypeAryPtr::xmeet( const Type *t ) const { return TypePtr::make(AnyPtr, ptr, offset); case Null: if( ptr == Null ) return TypePtr::make(AnyPtr, ptr, offset); - case AnyNull: - return make( ptr, (ptr == Constant ? const_oop() : NULL), _ary, _klass, _klass_is_exact, offset ); + // else fall through to AnyNull + case AnyNull: { + int instance_id = meet_instance_id(InstanceTop); + return make( ptr, (ptr == Constant ? const_oop() : NULL), + _ary, _klass, _klass_is_exact, offset, instance_id); + } default: ShouldNotReachHere(); } } @@ -3202,7 +3288,7 @@ const Type *TypeAryPtr::xmeet( const Type *t ) const { int off = meet_offset(tap->offset()); const TypeAry *tary = _ary->meet(tap->_ary)->is_ary(); PTR ptr = meet_ptr(tap->ptr()); - int iid = meet_instance(tap->instance_id()); + int instance_id = meet_instance_id(tap->instance_id()); ciKlass* lazy_klass = NULL; if (tary->_elem->isa_int()) { // Integral array element types have irrelevant lattice relations. @@ -3223,7 +3309,7 @@ const Type *TypeAryPtr::xmeet( const Type *t ) const { case TopPTR: // Compute new klass on demand, do not use tap->_klass xk = (tap->_klass_is_exact | this->_klass_is_exact); - return make( ptr, const_oop(), tary, lazy_klass, xk, off, iid ); + return make( ptr, const_oop(), tary, lazy_klass, xk, off, instance_id ); case Constant: { ciObject* o = const_oop(); if( _ptr == Constant ) { @@ -3235,7 +3321,7 @@ const Type *TypeAryPtr::xmeet( const Type *t ) const { o = tap->const_oop(); } xk = true; - return TypeAryPtr::make( ptr, o, tary, tap->_klass, xk, off, iid ); + return TypeAryPtr::make( ptr, o, tary, tap->_klass, xk, off, instance_id ); } case NotNull: case BotPTR: @@ -3246,7 +3332,7 @@ const Type *TypeAryPtr::xmeet( const Type *t ) const { xk = this->_klass_is_exact; else xk = (tap->_klass_is_exact & this->_klass_is_exact) && (klass() == tap->klass()); // Only precise for identical arrays - return TypeAryPtr::make( ptr, NULL, tary, lazy_klass, xk, off, iid ); + return TypeAryPtr::make( ptr, NULL, tary, lazy_klass, xk, off, instance_id ); default: ShouldNotReachHere(); } } @@ -3256,16 +3342,17 @@ const Type *TypeAryPtr::xmeet( const Type *t ) const { const TypeInstPtr *tp = t->is_instptr(); int offset = meet_offset(tp->offset()); PTR ptr = meet_ptr(tp->ptr()); - int iid = meet_instance(tp->instance_id()); + int instance_id = meet_instance_id(tp->instance_id()); switch (ptr) { case TopPTR: case AnyNull: // Fall 'down' to dual of object klass if( tp->klass()->equals(ciEnv::current()->Object_klass()) ) { - return TypeAryPtr::make( ptr, _ary, _klass, _klass_is_exact, offset, iid ); + return TypeAryPtr::make( ptr, _ary, _klass, _klass_is_exact, offset, instance_id ); } else { // cannot subclass, so the meet has to fall badly below the centerline ptr = NotNull; - return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL,offset, iid); + instance_id = InstanceBot; + return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL,offset, instance_id); } case Constant: case NotNull: @@ -3276,14 +3363,15 @@ const Type *TypeAryPtr::xmeet( const Type *t ) const { // then we can subclass in the Java class heirarchy. if( tp->klass()->equals(ciEnv::current()->Object_klass()) ) { // that is, my array type is a subtype of 'tp' klass - return make( ptr, _ary, _klass, _klass_is_exact, offset, iid ); + return make( ptr, _ary, _klass, _klass_is_exact, offset, instance_id ); } } // The other case cannot happen, since t cannot be a subtype of an array. // The meet falls down to Object class below centerline. if( ptr == Constant ) ptr = NotNull; - return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL,offset, iid); + instance_id = InstanceBot; + return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL,offset, instance_id); default: typerr(t); } } @@ -3298,7 +3386,7 @@ const Type *TypeAryPtr::xmeet( const Type *t ) const { //------------------------------xdual------------------------------------------ // Dual: compute field-by-field dual const Type *TypeAryPtr::xdual() const { - return new TypeAryPtr( dual_ptr(), _const_oop, _ary->dual()->is_ary(),_klass, _klass_is_exact, dual_offset(), dual_instance() ); + return new TypeAryPtr( dual_ptr(), _const_oop, _ary->dual()->is_ary(),_klass, _klass_is_exact, dual_offset(), dual_instance_id() ); } //------------------------------dump2------------------------------------------ @@ -3335,7 +3423,9 @@ void TypeAryPtr::dump2( Dict &d, uint depth, outputStream *st ) const { } } st->print(" *"); - if (_instance_id != UNKNOWN_INSTANCE) + if (_instance_id == InstanceTop) + st->print(",iid=top"); + else if (_instance_id != InstanceBot) st->print(",iid=%d",_instance_id); } #endif @@ -3410,7 +3500,7 @@ const Type *TypeNarrowOop::xmeet( const Type *t ) const { return this; case NarrowOop: { - const Type* result = _ooptype->xmeet(t->is_narrowoop()->make_oopptr()); + const Type* result = _ooptype->xmeet(t->make_ptr()); if (result->isa_ptr()) { return TypeNarrowOop::make(result->is_ptr()); } @@ -3520,7 +3610,7 @@ ciKlass* TypeAryPtr::klass() const { const TypeAryPtr *tary; const Type* el = elem(); if (el->isa_narrowoop()) { - el = el->is_narrowoop()->make_oopptr(); + el = el->make_ptr(); } // Get element klass @@ -3547,7 +3637,7 @@ ciKlass* TypeAryPtr::klass() const { k_ary = ciTypeArrayKlass::make(el->basic_type()); } - if( this != TypeAryPtr::OOPS ) + if( this != TypeAryPtr::OOPS ) { // The _klass field acts as a cache of the underlying // ciKlass for this array type. In order to set the field, // we need to cast away const-ness. @@ -3562,6 +3652,11 @@ ciKlass* TypeAryPtr::klass() const { // a bit less efficient than caching, but calls to // TypeAryPtr::OOPS->klass() are not common enough to matter. ((TypeAryPtr*)this)->_klass = k_ary; + if (UseCompressedOops && k_ary != NULL && k_ary->is_obj_array_klass() && + _offset != 0 && _offset != arrayOopDesc::length_offset_in_bytes()) { + ((TypeAryPtr*)this)->_is_ptr_to_narrowoop = true; + } + } return k_ary; } diff --git a/hotspot/src/share/vm/opto/type.hpp b/hotspot/src/share/vm/opto/type.hpp index 194d3438fa3..7dbcf096277 100644 --- a/hotspot/src/share/vm/opto/type.hpp +++ b/hotspot/src/share/vm/opto/type.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -191,9 +191,8 @@ public: virtual const Type *filter( const Type *kills ) const; // Returns true if this pointer points at memory which contains a - // compressed oop references. In 32-bit builds it's non-virtual - // since we don't support compressed oops at all in the mode. - LP64_ONLY(virtual) bool is_narrow() const { return false; } + // compressed oop references. + bool is_ptr_to_narrowoop() const; // Convenience access float getf() const; @@ -213,8 +212,8 @@ public: const TypePtr *isa_ptr() const; // Returns NULL if not ptr type const TypeRawPtr *isa_rawptr() const; // NOT Java oop const TypeRawPtr *is_rawptr() const; // Asserts is rawptr - const TypeNarrowOop *is_narrowoop() const; // Java-style GC'd pointer - const TypeNarrowOop *isa_narrowoop() const; // Returns NULL if not oop ptr type + const TypeNarrowOop *is_narrowoop() const; // Java-style GC'd pointer + const TypeNarrowOop *isa_narrowoop() const; // Returns NULL if not oop ptr type const TypeOopPtr *isa_oopptr() const; // Returns NULL if not oop ptr type const TypeOopPtr *is_oopptr() const; // Java-style GC'd pointer const TypeKlassPtr *isa_klassptr() const; // Returns NULL if not KlassPtr @@ -226,6 +225,12 @@ public: virtual bool is_finite() const; // Has a finite value virtual bool is_nan() const; // Is not a number (NaN) + // Returns this ptr type or the equivalent ptr type for this compressed pointer. + const TypePtr* make_ptr() const; + // Returns this compressed pointer or the equivalent compressed version + // of this pointer type. + const TypeNarrowOop* make_narrowoop() const; + // Special test for register pressure heuristic bool is_floatingpoint() const; // True if Float or Double base type @@ -643,13 +648,14 @@ public: // Some kind of oop (Java pointer), either klass or instance or array. class TypeOopPtr : public TypePtr { protected: - TypeOopPtr( TYPES t, PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id ) : TypePtr(t, ptr, offset), _const_oop(o), _klass(k), _klass_is_exact(xk), _instance_id(instance_id) { } + TypeOopPtr( TYPES t, PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id ); public: virtual bool eq( const Type *t ) const; virtual int hash() const; // Type specific hashing virtual bool singleton(void) const; // TRUE if type is a singleton enum { - UNKNOWN_INSTANCE = 0 + InstanceTop = -1, // undefined instance + InstanceBot = 0 // any possible instance }; protected: @@ -660,15 +666,17 @@ protected: ciKlass* _klass; // Klass object // Does the type exclude subclasses of the klass? (Inexact == polymorphic.) bool _klass_is_exact; + bool _is_ptr_to_narrowoop; - int _instance_id; // if not UNKNOWN_INSTANCE, indicates that this is a particular instance - // of this type which is distinct. This is the the node index of the - // node creating this instance + // If not InstanceTop or InstanceBot, indicates that this is + // a particular instance of this type which is distinct. + // This is the the node index of the allocation node creating this instance. + int _instance_id; static const TypeOopPtr* make_from_klass_common(ciKlass* klass, bool klass_change, bool try_for_exact); - int dual_instance() const { return -_instance_id; } - int meet_instance(int uid) const; + int dual_instance_id() const; + int meet_instance_id(int uid) const; public: // Creates a type given a klass. Correctly handles multi-dimensional arrays @@ -696,9 +704,14 @@ public: ciObject* const_oop() const { return _const_oop; } virtual ciKlass* klass() const { return _klass; } bool klass_is_exact() const { return _klass_is_exact; } - bool is_instance() const { return _instance_id != UNKNOWN_INSTANCE; } - uint instance_id() const { return _instance_id; } - bool is_instance_field() const { return _instance_id != UNKNOWN_INSTANCE && _offset >= 0; } + + // Returns true if this pointer points at memory which contains a + // compressed oop references. + bool is_ptr_to_narrowoop_nv() const { return _is_ptr_to_narrowoop; } + + bool is_known_instance() const { return _instance_id > 0; } + int instance_id() const { return _instance_id; } + bool is_known_instance_field() const { return is_known_instance() && _offset >= 0; } virtual intptr_t get_con() const; @@ -706,22 +719,13 @@ public: virtual const Type *cast_to_exactness(bool klass_is_exact) const; - virtual const TypeOopPtr *cast_to_instance(int instance_id) const; + virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const; // corresponding pointer to klass, for a given instance const TypeKlassPtr* as_klass_type() const; virtual const TypePtr *add_offset( int offset ) const; - // returns the equivalent compressed version of this pointer type - virtual const TypeNarrowOop* make_narrowoop() const; - -#ifdef _LP64 - virtual bool is_narrow() const { - return (UseCompressedOops && _offset != 0); - } -#endif - virtual const Type *xmeet( const Type *t ) const; virtual const Type *xdual() const; // Compute dual right now. @@ -776,7 +780,7 @@ class TypeInstPtr : public TypeOopPtr { } // Make a pointer to an oop. - static const TypeInstPtr *make(PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id = 0 ); + static const TypeInstPtr *make(PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id = InstanceBot ); // If this is a java.lang.Class constant, return the type for it or NULL. // Pass to Type::get_const_type to turn it to a type, which will usually @@ -787,7 +791,7 @@ class TypeInstPtr : public TypeOopPtr { virtual const Type *cast_to_exactness(bool klass_is_exact) const; - virtual const TypeOopPtr *cast_to_instance(int instance_id) const; + virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const; virtual const TypePtr *add_offset( int offset ) const; @@ -821,9 +825,9 @@ public: const Type* elem() const { return _ary->_elem; } const TypeInt* size() const { return _ary->_size; } - static const TypeAryPtr *make( PTR ptr, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id = 0); + static const TypeAryPtr *make( PTR ptr, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id = InstanceBot); // Constant pointer to array - static const TypeAryPtr *make( PTR ptr, ciObject* o, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id = 0); + static const TypeAryPtr *make( PTR ptr, ciObject* o, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id = InstanceBot); // Convenience static const TypeAryPtr *make(ciObject* o); @@ -833,7 +837,7 @@ public: virtual const Type *cast_to_exactness(bool klass_is_exact) const; - virtual const TypeOopPtr *cast_to_instance(int instance_id) const; + virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const; virtual const TypeAryPtr* cast_to_size(const TypeInt* size) const; @@ -843,15 +847,10 @@ public: virtual const Type *xmeet( const Type *t ) const; virtual const Type *xdual() const; // Compute dual right now. -#ifdef _LP64 - virtual bool is_narrow() const { - return (UseCompressedOops && klass() != NULL && _offset != 0); - } -#endif - // Convenience common pre-built types. static const TypeAryPtr *RANGE; static const TypeAryPtr *OOPS; + static const TypeAryPtr *NARROWOOPS; static const TypeAryPtr *BYTES; static const TypeAryPtr *SHORTS; static const TypeAryPtr *CHARS; @@ -901,18 +900,6 @@ public: virtual const Type *xmeet( const Type *t ) const; virtual const Type *xdual() const; // Compute dual right now. -#ifdef _LP64 - // Perm objects don't use compressed references, except for static fields - // which are currently compressed - virtual bool is_narrow() const { - if (UseCompressedOops && _offset != 0 && _klass->is_instance_klass()) { - ciInstanceKlass* ik = _klass->as_instance_klass(); - return ik != NULL && ik->get_field_by_offset(_offset, true) != NULL; - } - return false; - } -#endif - // Convenience common pre-built types. static const TypeKlassPtr* OBJECT; // Not-null object klass or below static const TypeKlassPtr* OBJECT_OR_NULL; // Maybe-null version of same @@ -921,7 +908,7 @@ public: #endif }; -//------------------------------TypeNarrowOop---------------------------------------- +//------------------------------TypeNarrowOop---------------------------------- // A compressed reference to some kind of Oop. This type wraps around // a preexisting TypeOopPtr and forwards most of it's operations to // the underlying type. It's only real purpose is to track the @@ -929,7 +916,7 @@ public: // between the normal and the compressed form. class TypeNarrowOop : public Type { protected: - const TypePtr* _ooptype; + const TypePtr* _ooptype; // Could be TypePtr::NULL_PTR TypeNarrowOop( const TypePtr* ooptype): Type(NarrowOop), _ooptype(ooptype) { @@ -958,8 +945,8 @@ public: return make(TypeOopPtr::make_from_constant(con)); } - // returns the equivalent oopptr type for this compressed pointer - virtual const TypePtr *make_oopptr() const { + // returns the equivalent ptr type for this compressed pointer + const TypePtr *make_oopptr() const { return _ooptype; } @@ -1013,6 +1000,14 @@ public: }; //------------------------------accessors-------------------------------------- +inline bool Type::is_ptr_to_narrowoop() const { +#ifdef _LP64 + return (isa_oopptr() != NULL && is_oopptr()->is_ptr_to_narrowoop_nv()); +#else + return false; +#endif +} + inline float Type::getf() const { assert( _base == FloatCon, "Not a FloatCon" ); return ((TypeF*)this)->_f; @@ -1138,6 +1133,16 @@ inline const TypeKlassPtr *Type::is_klassptr() const { return (TypeKlassPtr*)this; } +inline const TypePtr* Type::make_ptr() const { + return (_base == NarrowOop) ? is_narrowoop()->make_oopptr() : + (isa_ptr() ? is_ptr() : NULL); +} + +inline const TypeNarrowOop* Type::make_narrowoop() const { + return (_base == NarrowOop) ? is_narrowoop() : + (isa_ptr() ? TypeNarrowOop::make(is_ptr()) : NULL); +} + inline bool Type::is_floatingpoint() const { if( (_base == FloatCon) || (_base == FloatBot) || (_base == DoubleCon) || (_base == DoubleBot) ) diff --git a/hotspot/src/share/vm/opto/vectornode.cpp b/hotspot/src/share/vm/opto/vectornode.cpp index 7a581282d9c..bf2cdc81ac8 100644 --- a/hotspot/src/share/vm/opto/vectornode.cpp +++ b/hotspot/src/share/vm/opto/vectornode.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/opto/vectornode.hpp b/hotspot/src/share/vm/opto/vectornode.hpp index ed442b973ba..41f71421c6b 100644 --- a/hotspot/src/share/vm/opto/vectornode.hpp +++ b/hotspot/src/share/vm/opto/vectornode.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/prims/forte.cpp b/hotspot/src/share/vm/prims/forte.cpp index 70f785d80b4..146bb854993 100644 --- a/hotspot/src/share/vm/prims/forte.cpp +++ b/hotspot/src/share/vm/prims/forte.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/prims/jni.cpp b/hotspot/src/share/vm/prims/jni.cpp index 91fb8cb3c17..49ace5c9823 100644 --- a/hotspot/src/share/vm/prims/jni.cpp +++ b/hotspot/src/share/vm/prims/jni.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -631,7 +631,7 @@ JNI_ENTRY(void, jni_FatalError(JNIEnv *env, const char *msg)) DTRACE_PROBE2(hotspot_jni, FatalError__entry, env, msg); tty->print_cr("FATAL ERROR in native method: %s", msg); thread->print_stack(); - os::abort(false); // Prevent core dump, causes a jck failure. + os::abort(); // Dump core and abort JNI_END @@ -2173,8 +2173,7 @@ static char* get_bad_address() { size_t size = os::vm_allocation_granularity(); bad_address = os::reserve_memory(size); if (bad_address != NULL) { - os::commit_memory(bad_address, size); - os::protect_memory(bad_address, size); + os::protect_memory(bad_address, size, os::MEM_PROT_READ); } } return bad_address; diff --git a/hotspot/src/share/vm/prims/jvm.cpp b/hotspot/src/share/vm/prims/jvm.cpp index deaba3a9ed7..75becdfb25e 100644 --- a/hotspot/src/share/vm/prims/jvm.cpp +++ b/hotspot/src/share/vm/prims/jvm.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -624,6 +624,30 @@ JVM_ENTRY(void, JVM_ResolveClass(JNIEnv* env, jclass cls)) if (PrintJVMWarnings) warning("JVM_ResolveClass not implemented"); JVM_END +// Rationale behind JVM_FindClassFromBootLoader +// a> JVM_FindClassFromClassLoader was never exported in the export tables. +// b> because of (a) java.dll has a direct dependecy on the unexported +// private symbol "_JVM_FindClassFromClassLoader@20". +// c> the launcher cannot use the private symbol as it dynamically opens +// the entry point, so if something changes, the launcher will fail +// unexpectedly at runtime, it is safest for the launcher to dlopen a +// stable exported interface. +// d> re-exporting JVM_FindClassFromClassLoader as public, will cause its +// signature to change from _JVM_FindClassFromClassLoader@20 to +// JVM_FindClassFromClassLoader and will not be backward compatible +// with older JDKs. +// Thus a public/stable exported entry point is the right solution, +// public here means public in linker semantics, and is exported only +// to the JDK, and is not intended to be a public API. + +JVM_ENTRY(jclass, JVM_FindClassFromBootLoader(JNIEnv* env, + const char* name, + jboolean throwError)) + JVMWrapper3("JVM_FindClassFromBootLoader %s throw %s", name, + throwError ? "error" : "exception"); + return JVM_FindClassFromClassLoader(env, name, JNI_FALSE, + (jobject)NULL, throwError); +JVM_END JVM_ENTRY(jclass, JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, jboolean init, jobject loader, diff --git a/hotspot/src/share/vm/prims/jvm.h b/hotspot/src/share/vm/prims/jvm.h index feaf0d4a13f..131e0ddc92b 100644 --- a/hotspot/src/share/vm/prims/jvm.h +++ b/hotspot/src/share/vm/prims/jvm.h @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -389,6 +389,17 @@ JNIEXPORT jclass JNICALL JVM_FindClassFromClassLoader(JNIEnv *env, const char *name, jboolean init, jobject loader, jboolean throwError); +/* + * Find a class from a boot class loader. Throw ClassNotFoundException + * or NoClassDefFoundError depending on the value of the last + * argument. This is the same as FindClassFromClassLoader but provided + * as a convenience method exported correctly on all platforms for + * JSR 277 launcher class loading. + */ +JNIEXPORT jclass JNICALL +JVM_FindClassFromBootLoader(JNIEnv *env, const char *name, + jboolean throwError); + /* * Find a class from a given class. */ diff --git a/hotspot/src/share/vm/prims/jvmtiRedefineClassesTrace.hpp b/hotspot/src/share/vm/prims/jvmtiRedefineClassesTrace.hpp index ed0f472b3d4..83192cf16d7 100644 --- a/hotspot/src/share/vm/prims/jvmtiRedefineClassesTrace.hpp +++ b/hotspot/src/share/vm/prims/jvmtiRedefineClassesTrace.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/prims/jvmtiTagMap.cpp b/hotspot/src/share/vm/prims/jvmtiTagMap.cpp index 30d9fee4611..96db99c4112 100644 --- a/hotspot/src/share/vm/prims/jvmtiTagMap.cpp +++ b/hotspot/src/share/vm/prims/jvmtiTagMap.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/prims/unsafe.cpp b/hotspot/src/share/vm/prims/unsafe.cpp index 899a99296be..dbdbcead8fc 100644 --- a/hotspot/src/share/vm/prims/unsafe.cpp +++ b/hotspot/src/share/vm/prims/unsafe.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/arguments.cpp b/hotspot/src/share/vm/runtime/arguments.cpp index aa8331bfd40..882e92b337d 100644 --- a/hotspot/src/share/vm/runtime/arguments.cpp +++ b/hotspot/src/share/vm/runtime/arguments.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1174,9 +1174,10 @@ void Arguments::set_ergonomics_flags() { // field offset to determine free list chunk markers. // Check that UseCompressedOops can be set with the max heap size allocated // by ergonomics. - if (!UseConcMarkSweepGC && MaxHeapSize <= max_heap_for_compressed_oops()) { + if (MaxHeapSize <= max_heap_for_compressed_oops()) { if (FLAG_IS_DEFAULT(UseCompressedOops)) { - FLAG_SET_ERGO(bool, UseCompressedOops, true); + // Turn off until bug is fixed. + // FLAG_SET_ERGO(bool, UseCompressedOops, true); } } else { if (UseCompressedOops && !FLAG_IS_DEFAULT(UseCompressedOops)) { @@ -1312,6 +1313,9 @@ void Arguments::set_aggressive_opts_flags() { if (AggressiveOpts && FLAG_IS_DEFAULT(DoEscapeAnalysis)) { FLAG_SET_DEFAULT(DoEscapeAnalysis, true); } + if (AggressiveOpts && FLAG_IS_DEFAULT(SpecialArraysEquals)) { + FLAG_SET_DEFAULT(SpecialArraysEquals, true); + } #endif if (AggressiveOpts) { diff --git a/hotspot/src/share/vm/runtime/arguments.hpp b/hotspot/src/share/vm/runtime/arguments.hpp index b806f4800f8..bbc91c89c95 100644 --- a/hotspot/src/share/vm/runtime/arguments.hpp +++ b/hotspot/src/share/vm/runtime/arguments.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/atomic.cpp b/hotspot/src/share/vm/runtime/atomic.cpp index 847cf086196..0475f6242b7 100644 --- a/hotspot/src/share/vm/runtime/atomic.cpp +++ b/hotspot/src/share/vm/runtime/atomic.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/atomic.hpp b/hotspot/src/share/vm/runtime/atomic.hpp index a8b7dfa7ab9..c54103cbd49 100644 --- a/hotspot/src/share/vm/runtime/atomic.hpp +++ b/hotspot/src/share/vm/runtime/atomic.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/biasedLocking.cpp b/hotspot/src/share/vm/runtime/biasedLocking.cpp index 64807d8b75d..a16a96dfdb6 100644 --- a/hotspot/src/share/vm/runtime/biasedLocking.cpp +++ b/hotspot/src/share/vm/runtime/biasedLocking.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/deoptimization.cpp b/hotspot/src/share/vm/runtime/deoptimization.cpp index ccca77a5e13..e18f38ef6c5 100644 --- a/hotspot/src/share/vm/runtime/deoptimization.cpp +++ b/hotspot/src/share/vm/runtime/deoptimization.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/deoptimization.hpp b/hotspot/src/share/vm/runtime/deoptimization.hpp index 6edb6a08936..7f00eba27df 100644 --- a/hotspot/src/share/vm/runtime/deoptimization.hpp +++ b/hotspot/src/share/vm/runtime/deoptimization.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/dtraceJSDT.cpp b/hotspot/src/share/vm/runtime/dtraceJSDT.cpp index 57095dec4ed..406c4e6c0be 100644 --- a/hotspot/src/share/vm/runtime/dtraceJSDT.cpp +++ b/hotspot/src/share/vm/runtime/dtraceJSDT.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/dtraceJSDT.hpp b/hotspot/src/share/vm/runtime/dtraceJSDT.hpp index 37b18b04f00..cfbe43d0dff 100644 --- a/hotspot/src/share/vm/runtime/dtraceJSDT.hpp +++ b/hotspot/src/share/vm/runtime/dtraceJSDT.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/fprofiler.cpp b/hotspot/src/share/vm/runtime/fprofiler.cpp index 31f11617824..adecc642de4 100644 --- a/hotspot/src/share/vm/runtime/fprofiler.cpp +++ b/hotspot/src/share/vm/runtime/fprofiler.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/fprofiler.hpp b/hotspot/src/share/vm/runtime/fprofiler.hpp index 371358dca13..ff9ce96e8ce 100644 --- a/hotspot/src/share/vm/runtime/fprofiler.hpp +++ b/hotspot/src/share/vm/runtime/fprofiler.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/frame.cpp b/hotspot/src/share/vm/runtime/frame.cpp index 4db33fc54a3..6baf659d0ff 100644 --- a/hotspot/src/share/vm/runtime/frame.cpp +++ b/hotspot/src/share/vm/runtime/frame.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/frame.hpp b/hotspot/src/share/vm/runtime/frame.hpp index ec13e57a296..35372751894 100644 --- a/hotspot/src/share/vm/runtime/frame.hpp +++ b/hotspot/src/share/vm/runtime/frame.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/globals.cpp b/hotspot/src/share/vm/runtime/globals.cpp index ffd62d14a66..5adadcb98b5 100644 --- a/hotspot/src/share/vm/runtime/globals.cpp +++ b/hotspot/src/share/vm/runtime/globals.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/globals.hpp b/hotspot/src/share/vm/runtime/globals.hpp index 5b2c1fda1d6..8d797953cd5 100644 --- a/hotspot/src/share/vm/runtime/globals.hpp +++ b/hotspot/src/share/vm/runtime/globals.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -291,6 +291,9 @@ class CommandLineFlags { "Use 32-bit object references in 64-bit VM. " \ "lp64_product means flag is always constant in 32 bit VM") \ \ + lp64_product(bool, CheckCompressedOops, trueInDebug, \ + "generate checks in encoding/decoding code") \ + \ /* UseMembar is theoretically a temp flag used for memory barrier \ * removal testing. It was supposed to be removed before FCS but has \ * been re-added (see 6401008) */ \ @@ -457,6 +460,9 @@ class CommandLineFlags { develop(bool, SpecialStringIndexOf, true, \ "special version of string indexOf") \ \ + product(bool, SpecialArraysEquals, false, \ + "special version of Arrays.equals(char[],char[])") \ + \ develop(bool, TraceCallFixup, false, \ "traces all call fixups") \ \ @@ -940,6 +946,9 @@ class CommandLineFlags { diagnostic(bool, UseIncDec, true, \ "Use INC, DEC instructions on x86") \ \ + product(bool, UseNewLongLShift, false, \ + "Use optimized bitwise shift left") \ + \ product(bool, UseStoreImmI16, true, \ "Use store immediate 16-bits value instruction on x86") \ \ @@ -2240,6 +2249,9 @@ class CommandLineFlags { product(bool, AggressiveOpts, false, \ "Enable aggressive optimizations - see arguments.cpp") \ \ + product(bool, UseStringCache, false, \ + "Enable String cache capabilities on String.java") \ + \ /* statistics */ \ develop(bool, UseVTune, false, \ "enable support for Intel's VTune profiler") \ diff --git a/hotspot/src/share/vm/runtime/globals_extension.hpp b/hotspot/src/share/vm/runtime/globals_extension.hpp index ffb8071b250..1d9dc0387ca 100644 --- a/hotspot/src/share/vm/runtime/globals_extension.hpp +++ b/hotspot/src/share/vm/runtime/globals_extension.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/hpi.cpp b/hotspot/src/share/vm/runtime/hpi.cpp index 1b8e361df86..77483de0967 100644 --- a/hotspot/src/share/vm/runtime/hpi.cpp +++ b/hotspot/src/share/vm/runtime/hpi.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/hpi.hpp b/hotspot/src/share/vm/runtime/hpi.hpp index 00fc21c90a5..1e05ca7525a 100644 --- a/hotspot/src/share/vm/runtime/hpi.hpp +++ b/hotspot/src/share/vm/runtime/hpi.hpp @@ -66,6 +66,8 @@ public: static inline int socket_shutdown(int fd, int howto); static inline int recv(int fd, char *buf, int nBytes, int flags); static inline int send(int fd, char *buf, int nBytes, int flags); + // Variant of send that doesn't support interruptible I/O + static inline int raw_send(int fd, char *buf, int nBytes, int flags); static inline int timeout(int fd, long timeout); static inline int listen(int fd, int count); static inline int connect(int fd, struct sockaddr *him, int len); diff --git a/hotspot/src/share/vm/runtime/init.cpp b/hotspot/src/share/vm/runtime/init.cpp index dfadab63012..4851d19a15a 100644 --- a/hotspot/src/share/vm/runtime/init.cpp +++ b/hotspot/src/share/vm/runtime/init.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/java.cpp b/hotspot/src/share/vm/runtime/java.cpp index a9f6fc7db02..4e0ba39e629 100644 --- a/hotspot/src/share/vm/runtime/java.cpp +++ b/hotspot/src/share/vm/runtime/java.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -502,9 +502,9 @@ void vm_shutdown() os::shutdown(); } -void vm_abort() { +void vm_abort(bool dump_core) { vm_perform_shutdown_actions(); - os::abort(PRODUCT_ONLY(false)); + os::abort(dump_core); ShouldNotReachHere(); } @@ -538,18 +538,24 @@ void vm_exit_during_initialization(Handle exception) { java_lang_Throwable::print_stack_trace(exception(), tty); tty->cr(); vm_notify_during_shutdown(NULL, NULL); - vm_abort(); + + // Failure during initialization, we don't want to dump core + vm_abort(false); } void vm_exit_during_initialization(symbolHandle ex, const char* message) { ResourceMark rm; vm_notify_during_shutdown(ex->as_C_string(), message); - vm_abort(); + + // Failure during initialization, we don't want to dump core + vm_abort(false); } void vm_exit_during_initialization(const char* error, const char* message) { vm_notify_during_shutdown(error, message); - vm_abort(); + + // Failure during initialization, we don't want to dump core + vm_abort(false); } void vm_shutdown_during_initialization(const char* error, const char* message) { diff --git a/hotspot/src/share/vm/runtime/java.hpp b/hotspot/src/share/vm/runtime/java.hpp index e3ce6d41997..160c62bb26a 100644 --- a/hotspot/src/share/vm/runtime/java.hpp +++ b/hotspot/src/share/vm/runtime/java.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,7 +37,7 @@ extern void vm_direct_exit(int code); // Shutdown the VM but do not exit the process extern void vm_shutdown(); // Shutdown the VM and abort the process -extern void vm_abort(); +extern void vm_abort(bool dump_core=true); // Trigger any necessary notification of the VM being shutdown extern void notify_vm_shutdown(); @@ -68,8 +68,24 @@ class JDK_Version : AllStatic { static bool is_jdk13x_version() { assert(is_jdk_version_initialized(), "must have been initialized"); return _jdk_version == 3; } static bool is_jdk14x_version() { assert(is_jdk_version_initialized(), "must have been initialized"); return _jdk_version == 4; } static bool is_jdk15x_version() { assert(is_jdk_version_initialized(), "must have been initialized"); return _jdk_version == 5; } - static bool is_jdk16x_version() { assert(is_jdk_version_initialized(), "must have been initialized"); return _jdk_version == 6; } - static bool is_jdk17x_version() { assert(is_jdk_version_initialized(), "must have been initialized"); return _jdk_version == 7; } + + static bool is_jdk16x_version() { + if (is_jdk_version_initialized()) { + return _jdk_version == 6; + } else { + assert(is_pre_jdk16_version(), "must have been initialized"); + return false; + } + } + + static bool is_jdk17x_version() { + if (is_jdk_version_initialized()) { + return _jdk_version == 7; + } else { + assert(is_pre_jdk16_version(), "must have been initialized"); + return false; + } + } static bool supports_thread_park_blocker() { return _version_info.thread_park_blocker; } @@ -85,14 +101,22 @@ class JDK_Version : AllStatic { } static bool is_gte_jdk16x_version() { // Keep the semantics of this that the version number is >= 1.6 - assert(is_jdk_version_initialized(), "Not initialized"); - return _jdk_version >= 6; + if (is_jdk_version_initialized()) { + return _jdk_version >= 6; + } else { + assert(is_pre_jdk16_version(), "Not initialized"); + return false; + } } static bool is_gte_jdk17x_version() { // Keep the semantics of this that the version number is >= 1.7 - assert(is_jdk_version_initialized(), "Not initialized"); - return _jdk_version >= 7; + if (is_jdk_version_initialized()) { + return _jdk_version >= 7; + } else { + assert(is_pre_jdk16_version(), "Not initialized"); + return false; + } } static bool is_jdk_version_initialized() { diff --git a/hotspot/src/share/vm/runtime/jniHandles.cpp b/hotspot/src/share/vm/runtime/jniHandles.cpp index 6f91a4daef4..ef0d809471c 100644 --- a/hotspot/src/share/vm/runtime/jniHandles.cpp +++ b/hotspot/src/share/vm/runtime/jniHandles.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/mutex.cpp b/hotspot/src/share/vm/runtime/mutex.cpp index c8751c2121c..9804bee0403 100644 --- a/hotspot/src/share/vm/runtime/mutex.cpp +++ b/hotspot/src/share/vm/runtime/mutex.cpp @@ -1,6 +1,6 @@ /* - * Copyright 1998-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/mutex.hpp b/hotspot/src/share/vm/runtime/mutex.hpp index 56988e20e79..edebb8800ae 100644 --- a/hotspot/src/share/vm/runtime/mutex.hpp +++ b/hotspot/src/share/vm/runtime/mutex.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/mutexLocker.cpp b/hotspot/src/share/vm/runtime/mutexLocker.cpp index a639519d26d..bc61fd22dc4 100644 --- a/hotspot/src/share/vm/runtime/mutexLocker.cpp +++ b/hotspot/src/share/vm/runtime/mutexLocker.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/mutexLocker.hpp b/hotspot/src/share/vm/runtime/mutexLocker.hpp index e21367cb960..244fb33e503 100644 --- a/hotspot/src/share/vm/runtime/mutexLocker.hpp +++ b/hotspot/src/share/vm/runtime/mutexLocker.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/os.cpp b/hotspot/src/share/vm/runtime/os.cpp index 164ba95a105..f276e7e7250 100644 --- a/hotspot/src/share/vm/runtime/os.cpp +++ b/hotspot/src/share/vm/runtime/os.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -922,8 +922,9 @@ void os::serialize_thread_states() { // time and expensive page trap spinning, 'SerializePageLock' is used to block // the mutator thread if such case is encountered. See bug 6546278 for details. Thread::muxAcquire(&SerializePageLock, "serialize_thread_states"); - os::protect_memory( (char *)os::get_memory_serialize_page(), os::vm_page_size() ); - os::unguard_memory( (char *)os::get_memory_serialize_page(), os::vm_page_size() ); + os::protect_memory((char *)os::get_memory_serialize_page(), + os::vm_page_size(), MEM_PROT_READ, /*is_committed*/true ); + os::unguard_memory((char *)os::get_memory_serialize_page(), os::vm_page_size()); Thread::muxRelease(&SerializePageLock); } diff --git a/hotspot/src/share/vm/runtime/os.hpp b/hotspot/src/share/vm/runtime/os.hpp index 547b25d434c..0b8cea57884 100644 --- a/hotspot/src/share/vm/runtime/os.hpp +++ b/hotspot/src/share/vm/runtime/os.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -193,7 +193,11 @@ class os: AllStatic { static bool commit_memory(char* addr, size_t size, size_t alignment_hint); static bool uncommit_memory(char* addr, size_t bytes); static bool release_memory(char* addr, size_t bytes); - static bool protect_memory(char* addr, size_t bytes); + + enum ProtType { MEM_PROT_NONE, MEM_PROT_READ, MEM_PROT_RW, MEM_PROT_RWX }; + static bool protect_memory(char* addr, size_t bytes, ProtType prot, + bool is_committed = false); + static bool guard_memory(char* addr, size_t bytes); static bool unguard_memory(char* addr, size_t bytes); static char* map_memory(int fd, const char* file_name, size_t file_offset, diff --git a/hotspot/src/share/vm/runtime/reflection.cpp b/hotspot/src/share/vm/runtime/reflection.cpp index ebe0899a148..d57b6670df1 100644 --- a/hotspot/src/share/vm/runtime/reflection.cpp +++ b/hotspot/src/share/vm/runtime/reflection.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/sharedRuntime.cpp b/hotspot/src/share/vm/runtime/sharedRuntime.cpp index 59219cda39d..39ac102ec00 100644 --- a/hotspot/src/share/vm/runtime/sharedRuntime.cpp +++ b/hotspot/src/share/vm/runtime/sharedRuntime.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/sharedRuntime.hpp b/hotspot/src/share/vm/runtime/sharedRuntime.hpp index 22bb552ddc9..a785955d44c 100644 --- a/hotspot/src/share/vm/runtime/sharedRuntime.hpp +++ b/hotspot/src/share/vm/runtime/sharedRuntime.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/stubCodeGenerator.cpp b/hotspot/src/share/vm/runtime/stubCodeGenerator.cpp index 9b54e95eaa1..885edecc0d4 100644 --- a/hotspot/src/share/vm/runtime/stubCodeGenerator.cpp +++ b/hotspot/src/share/vm/runtime/stubCodeGenerator.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/task.cpp b/hotspot/src/share/vm/runtime/task.cpp index 68959a120d2..056f6f33558 100644 --- a/hotspot/src/share/vm/runtime/task.cpp +++ b/hotspot/src/share/vm/runtime/task.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/task.hpp b/hotspot/src/share/vm/runtime/task.hpp index 83e595cf30d..5b69a04373f 100644 --- a/hotspot/src/share/vm/runtime/task.hpp +++ b/hotspot/src/share/vm/runtime/task.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/thread.cpp b/hotspot/src/share/vm/runtime/thread.cpp index 21f8a4b76ee..c488b3f2c52 100644 --- a/hotspot/src/share/vm/runtime/thread.cpp +++ b/hotspot/src/share/vm/runtime/thread.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -2926,21 +2926,42 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) { } if (AggressiveOpts) { - // Forcibly initialize java/util/HashMap and mutate the private - // static final "frontCacheEnabled" field before we start creating instances + { + // Forcibly initialize java/util/HashMap and mutate the private + // static final "frontCacheEnabled" field before we start creating instances #ifdef ASSERT - klassOop tmp_k = SystemDictionary::find(vmSymbolHandles::java_util_HashMap(), Handle(), Handle(), CHECK_0); - assert(tmp_k == NULL, "java/util/HashMap should not be loaded yet"); + klassOop tmp_k = SystemDictionary::find(vmSymbolHandles::java_util_HashMap(), Handle(), Handle(), CHECK_0); + assert(tmp_k == NULL, "java/util/HashMap should not be loaded yet"); #endif - klassOop k_o = SystemDictionary::resolve_or_null(vmSymbolHandles::java_util_HashMap(), Handle(), Handle(), CHECK_0); - KlassHandle k = KlassHandle(THREAD, k_o); - guarantee(k.not_null(), "Must find java/util/HashMap"); - instanceKlassHandle ik = instanceKlassHandle(THREAD, k()); - ik->initialize(CHECK_0); - fieldDescriptor fd; - // Possible we might not find this field; if so, don't break - if (ik->find_local_field(vmSymbols::frontCacheEnabled_name(), vmSymbols::bool_signature(), &fd)) { - k()->bool_field_put(fd.offset(), true); + klassOop k_o = SystemDictionary::resolve_or_null(vmSymbolHandles::java_util_HashMap(), Handle(), Handle(), CHECK_0); + KlassHandle k = KlassHandle(THREAD, k_o); + guarantee(k.not_null(), "Must find java/util/HashMap"); + instanceKlassHandle ik = instanceKlassHandle(THREAD, k()); + ik->initialize(CHECK_0); + fieldDescriptor fd; + // Possible we might not find this field; if so, don't break + if (ik->find_local_field(vmSymbols::frontCacheEnabled_name(), vmSymbols::bool_signature(), &fd)) { + k()->bool_field_put(fd.offset(), true); + } + } + + if (UseStringCache) { + // Forcibly initialize java/lang/String and mutate the private + // static final "stringCacheEnabled" field before we start creating instances +#ifdef ASSERT + klassOop tmp_k = SystemDictionary::find(vmSymbolHandles::java_lang_String(), Handle(), Handle(), CHECK_0); + assert(tmp_k == NULL, "java/lang/String should not be loaded yet"); +#endif + klassOop k_o = SystemDictionary::resolve_or_null(vmSymbolHandles::java_lang_String(), Handle(), Handle(), CHECK_0); + KlassHandle k = KlassHandle(THREAD, k_o); + guarantee(k.not_null(), "Must find java/lang/String"); + instanceKlassHandle ik = instanceKlassHandle(THREAD, k()); + ik->initialize(CHECK_0); + fieldDescriptor fd; + // Possible we might not find this field; if so, don't break + if (ik->find_local_field(vmSymbols::stringCacheEnabled_name(), vmSymbols::bool_signature(), &fd)) { + k()->bool_field_put(fd.offset(), true); + } } } diff --git a/hotspot/src/share/vm/runtime/vframe.cpp b/hotspot/src/share/vm/runtime/vframe.cpp index 3e9b65bfc03..ce5a71517f3 100644 --- a/hotspot/src/share/vm/runtime/vframe.cpp +++ b/hotspot/src/share/vm/runtime/vframe.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/vframe.hpp b/hotspot/src/share/vm/runtime/vframe.hpp index 670e6c5d192..febfb02cb46 100644 --- a/hotspot/src/share/vm/runtime/vframe.hpp +++ b/hotspot/src/share/vm/runtime/vframe.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/vframe_hp.cpp b/hotspot/src/share/vm/runtime/vframe_hp.cpp index 35f0713a23f..5f781f39c47 100644 --- a/hotspot/src/share/vm/runtime/vframe_hp.cpp +++ b/hotspot/src/share/vm/runtime/vframe_hp.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/virtualspace.cpp b/hotspot/src/share/vm/runtime/virtualspace.cpp index 23b75dc9dd4..44471632df6 100644 --- a/hotspot/src/share/vm/runtime/virtualspace.cpp +++ b/hotspot/src/share/vm/runtime/virtualspace.cpp @@ -28,12 +28,15 @@ // ReservedSpace ReservedSpace::ReservedSpace(size_t size) { - initialize(size, 0, false, NULL); + initialize(size, 0, false, NULL, 0); } ReservedSpace::ReservedSpace(size_t size, size_t alignment, - bool large, char* requested_address) { - initialize(size, alignment, large, requested_address); + bool large, + char* requested_address, + const size_t noaccess_prefix) { + initialize(size+noaccess_prefix, alignment, large, requested_address, + noaccess_prefix); } char * @@ -105,7 +108,8 @@ char* ReservedSpace::reserve_and_align(const size_t reserve_size, ReservedSpace::ReservedSpace(const size_t prefix_size, const size_t prefix_align, const size_t suffix_size, - const size_t suffix_align) + const size_t suffix_align, + const size_t noaccess_prefix) { assert(prefix_size != 0, "sanity"); assert(prefix_align != 0, "sanity"); @@ -118,12 +122,16 @@ ReservedSpace::ReservedSpace(const size_t prefix_size, assert((suffix_align & prefix_align - 1) == 0, "suffix_align not divisible by prefix_align"); + // Add in noaccess_prefix to prefix_size; + const size_t adjusted_prefix_size = prefix_size + noaccess_prefix; + const size_t size = adjusted_prefix_size + suffix_size; + // On systems where the entire region has to be reserved and committed up // front, the compound alignment normally done by this method is unnecessary. const bool try_reserve_special = UseLargePages && prefix_align == os::large_page_size(); if (!os::can_commit_large_page_memory() && try_reserve_special) { - initialize(prefix_size + suffix_size, prefix_align, true); + initialize(size, prefix_align, true, NULL, noaccess_prefix); return; } @@ -131,15 +139,19 @@ ReservedSpace::ReservedSpace(const size_t prefix_size, _size = 0; _alignment = 0; _special = false; + _noaccess_prefix = 0; + + // Assert that if noaccess_prefix is used, it is the same as prefix_align. + assert(noaccess_prefix == 0 || + noaccess_prefix == prefix_align, "noaccess prefix wrong"); // Optimistically try to reserve the exact size needed. - const size_t size = prefix_size + suffix_size; char* addr = os::reserve_memory(size, NULL, prefix_align); if (addr == NULL) return; // Check whether the result has the needed alignment (unlikely unless // prefix_align == suffix_align). - const size_t ofs = size_t(addr) + prefix_size & suffix_align - 1; + const size_t ofs = size_t(addr) + adjusted_prefix_size & suffix_align - 1; if (ofs != 0) { // Wrong alignment. Release, allocate more space and do manual alignment. // @@ -153,11 +165,11 @@ ReservedSpace::ReservedSpace(const size_t prefix_size, } const size_t extra = MAX2(ofs, suffix_align - ofs); - addr = reserve_and_align(size + extra, prefix_size, prefix_align, + addr = reserve_and_align(size + extra, adjusted_prefix_size, prefix_align, suffix_size, suffix_align); if (addr == NULL) { // Try an even larger region. If this fails, address space is exhausted. - addr = reserve_and_align(size + suffix_align, prefix_size, + addr = reserve_and_align(size + suffix_align, adjusted_prefix_size, prefix_align, suffix_size, suffix_align); } } @@ -165,10 +177,12 @@ ReservedSpace::ReservedSpace(const size_t prefix_size, _base = addr; _size = size; _alignment = prefix_align; + _noaccess_prefix = noaccess_prefix; } void ReservedSpace::initialize(size_t size, size_t alignment, bool large, - char* requested_address) { + char* requested_address, + const size_t noaccess_prefix) { const size_t granularity = os::vm_allocation_granularity(); assert((size & granularity - 1) == 0, "size not aligned to os::vm_allocation_granularity()"); @@ -181,6 +195,7 @@ void ReservedSpace::initialize(size_t size, size_t alignment, bool large, _size = 0; _special = false; _alignment = 0; + _noaccess_prefix = 0; if (size == 0) { return; } @@ -220,7 +235,8 @@ void ReservedSpace::initialize(size_t size, size_t alignment, bool large, // important. If available space is not detected, return NULL. if (requested_address != 0) { - base = os::attempt_reserve_memory_at(size, requested_address); + base = os::attempt_reserve_memory_at(size, + requested_address-noaccess_prefix); } else { base = os::reserve_memory(size, NULL, alignment); } @@ -259,6 +275,11 @@ void ReservedSpace::initialize(size_t size, size_t alignment, bool large, _base = base; _size = size; _alignment = MAX2(alignment, (size_t) os::vm_page_size()); + _noaccess_prefix = noaccess_prefix; + + // Assert that if noaccess_prefix is used, it is the same as alignment. + assert(noaccess_prefix == 0 || + noaccess_prefix == _alignment, "noaccess prefix wrong"); assert(markOopDesc::encode_pointer_as_mark(_base)->decode_pointer() == _base, "area must be distinguisable from marks for mark-sweep"); @@ -274,6 +295,7 @@ ReservedSpace::ReservedSpace(char* base, size_t size, size_t alignment, _base = base; _size = size; _alignment = alignment; + _noaccess_prefix = 0; _special = special; } @@ -320,17 +342,58 @@ size_t ReservedSpace::allocation_align_size_down(size_t size) { void ReservedSpace::release() { if (is_reserved()) { + char *real_base = _base - _noaccess_prefix; + const size_t real_size = _size + _noaccess_prefix; if (special()) { - os::release_memory_special(_base, _size); + os::release_memory_special(real_base, real_size); } else{ - os::release_memory(_base, _size); + os::release_memory(real_base, real_size); } _base = NULL; _size = 0; + _noaccess_prefix = 0; _special = false; } } +void ReservedSpace::protect_noaccess_prefix(const size_t size) { + // If there is noaccess prefix, return. + if (_noaccess_prefix == 0) return; + + assert(_noaccess_prefix >= (size_t)os::vm_page_size(), + "must be at least page size big"); + + // Protect memory at the base of the allocated region. + // If special, the page was committed (only matters on windows) + if (!os::protect_memory(_base, _noaccess_prefix, os::MEM_PROT_NONE, + _special)) { + fatal("cannot protect protection page"); + } + + _base += _noaccess_prefix; + _size -= _noaccess_prefix; + assert((size == _size) && ((uintptr_t)_base % _alignment == 0), + "must be exactly of required size and alignment"); +} + +ReservedHeapSpace::ReservedHeapSpace(size_t size, size_t alignment, + bool large, char* requested_address) : + ReservedSpace(size, alignment, large, + requested_address, + UseCompressedOops ? lcm(os::vm_page_size(), alignment) : 0) { + // Only reserved space for the java heap should have a noaccess_prefix + // if using compressed oops. + protect_noaccess_prefix(size); +} + +ReservedHeapSpace::ReservedHeapSpace(const size_t prefix_size, + const size_t prefix_align, + const size_t suffix_size, + const size_t suffix_align) : + ReservedSpace(prefix_size, prefix_align, suffix_size, suffix_align, + UseCompressedOops ? lcm(os::vm_page_size(), prefix_align) : 0) { + protect_noaccess_prefix(prefix_size+suffix_size); +} // VirtualSpace @@ -348,6 +411,7 @@ VirtualSpace::VirtualSpace() { _lower_alignment = 0; _middle_alignment = 0; _upper_alignment = 0; + _special = false; } @@ -402,7 +466,8 @@ VirtualSpace::~VirtualSpace() { void VirtualSpace::release() { - (void)os::release_memory(low_boundary(), reserved_size()); + // This does not release memory it never reserved. + // Caller must release via rs.release(); _low_boundary = NULL; _high_boundary = NULL; _low = NULL; diff --git a/hotspot/src/share/vm/runtime/virtualspace.hpp b/hotspot/src/share/vm/runtime/virtualspace.hpp index ad952e49a3d..556b4c92bb6 100644 --- a/hotspot/src/share/vm/runtime/virtualspace.hpp +++ b/hotspot/src/share/vm/runtime/virtualspace.hpp @@ -29,13 +29,15 @@ class ReservedSpace VALUE_OBJ_CLASS_SPEC { private: char* _base; size_t _size; + size_t _noaccess_prefix; size_t _alignment; bool _special; // ReservedSpace ReservedSpace(char* base, size_t size, size_t alignment, bool special); void initialize(size_t size, size_t alignment, bool large, - char* requested_address = NULL); + char* requested_address, + const size_t noaccess_prefix); // Release parts of an already-reserved memory region [addr, addr + len) to // get a new region that has "compound alignment." Return the start of the @@ -59,13 +61,19 @@ class ReservedSpace VALUE_OBJ_CLASS_SPEC { const size_t suffix_size, const size_t suffix_align); + protected: + // Create protection page at the beginning of the space. + void protect_noaccess_prefix(const size_t size); + public: // Constructor ReservedSpace(size_t size); ReservedSpace(size_t size, size_t alignment, bool large, - char* requested_address = NULL); + char* requested_address = NULL, + const size_t noaccess_prefix = 0); ReservedSpace(const size_t prefix_size, const size_t prefix_align, - const size_t suffix_size, const size_t suffix_align); + const size_t suffix_size, const size_t suffix_align, + const size_t noaccess_prefix); // Accessors char* base() const { return _base; } @@ -73,6 +81,8 @@ class ReservedSpace VALUE_OBJ_CLASS_SPEC { size_t alignment() const { return _alignment; } bool special() const { return _special; } + size_t noaccess_prefix() const { return _noaccess_prefix; } + bool is_reserved() const { return _base != NULL; } void release(); @@ -104,6 +114,16 @@ ReservedSpace ReservedSpace::last_part(size_t partition_size) return last_part(partition_size, alignment()); } +// Class encapsulating behavior specific of memory space reserved for Java heap +class ReservedHeapSpace : public ReservedSpace { +public: + // Constructor + ReservedHeapSpace(size_t size, size_t forced_base_alignment, + bool large, char* requested_address); + ReservedHeapSpace(const size_t prefix_size, const size_t prefix_align, + const size_t suffix_size, const size_t suffix_align); +}; + // VirtualSpace is data structure for committing a previously reserved address range in smaller chunks. class VirtualSpace VALUE_OBJ_CLASS_SPEC { diff --git a/hotspot/src/share/vm/runtime/vmStructs.cpp b/hotspot/src/share/vm/runtime/vmStructs.cpp index 561389eaa92..eeda67501aa 100644 --- a/hotspot/src/share/vm/runtime/vmStructs.cpp +++ b/hotspot/src/share/vm/runtime/vmStructs.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -894,6 +894,7 @@ static inline uint64_t cast_uint64_t(size_t x) /*******************************************************************/ \ \ declare_unsigned_integer_type(size_t) \ + declare_integer_type(ssize_t) \ declare_unsigned_integer_type(const size_t) \ declare_integer_type(intx) \ declare_integer_type(intptr_t) \ @@ -1694,7 +1695,12 @@ static inline uint64_t cast_uint64_t(size_t x) declare_constant(markOopDesc::no_hash) \ declare_constant(markOopDesc::no_hash_in_place) \ declare_constant(markOopDesc::no_lock_in_place) \ - declare_constant(markOopDesc::max_age) + declare_constant(markOopDesc::max_age) \ + \ + /* Constants in markOop used by CMS. */ \ + declare_constant(markOopDesc::cms_shift) \ + declare_constant(markOopDesc::cms_mask) \ + declare_constant(markOopDesc::size_shift) \ /* NOTE that we do not use the last_entry() macro here; it is used */ /* in vmStructs__.hpp's VM_LONG_CONSTANTS_OS_CPU macro (and */ @@ -1958,6 +1964,7 @@ VMStructEntry VMStructs::localHotSpotVMStructs[] = { GENERATE_STATIC_VM_STRUCT_ENTRY) VM_STRUCTS_CMS(GENERATE_NONSTATIC_VM_STRUCT_ENTRY, \ + GENERATE_NONSTATIC_VM_STRUCT_ENTRY, \ GENERATE_STATIC_VM_STRUCT_ENTRY) #endif // SERIALGC @@ -2099,6 +2106,7 @@ VMStructs::init() { CHECK_STATIC_VM_STRUCT_ENTRY); VM_STRUCTS_CMS(CHECK_NONSTATIC_VM_STRUCT_ENTRY, + CHECK_VOLATILE_NONSTATIC_VM_STRUCT_ENTRY, CHECK_STATIC_VM_STRUCT_ENTRY); #endif // SERIALGC @@ -2203,6 +2211,7 @@ VMStructs::init() { debug_only(VM_STRUCTS_PARALLELGC(ENSURE_FIELD_TYPE_PRESENT, \ ENSURE_FIELD_TYPE_PRESENT)); debug_only(VM_STRUCTS_CMS(ENSURE_FIELD_TYPE_PRESENT, \ + ENSURE_FIELD_TYPE_PRESENT, \ ENSURE_FIELD_TYPE_PRESENT)); #endif // SERIALGC debug_only(VM_STRUCTS_CPU(ENSURE_FIELD_TYPE_PRESENT, \ diff --git a/hotspot/src/share/vm/runtime/vm_operations.hpp b/hotspot/src/share/vm/runtime/vm_operations.hpp index 54264ad0dde..673ba2bbd63 100644 --- a/hotspot/src/share/vm/runtime/vm_operations.hpp +++ b/hotspot/src/share/vm/runtime/vm_operations.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/vm_version.cpp b/hotspot/src/share/vm/runtime/vm_version.cpp index 9c335eb44b3..653309db0ac 100644 --- a/hotspot/src/share/vm/runtime/vm_version.cpp +++ b/hotspot/src/share/vm/runtime/vm_version.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/runtime/vm_version.hpp b/hotspot/src/share/vm/runtime/vm_version.hpp index 5a46f04fb1d..f3ae4385bc7 100644 --- a/hotspot/src/share/vm/runtime/vm_version.hpp +++ b/hotspot/src/share/vm/runtime/vm_version.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/services/heapDumper.cpp b/hotspot/src/share/vm/services/heapDumper.cpp index 1a30c05b5c1..4ad842ad747 100644 --- a/hotspot/src/share/vm/services/heapDumper.cpp +++ b/hotspot/src/share/vm/services/heapDumper.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/services/threadService.cpp b/hotspot/src/share/vm/services/threadService.cpp index 396f6204de9..5084dbf0b4e 100644 --- a/hotspot/src/share/vm/services/threadService.cpp +++ b/hotspot/src/share/vm/services/threadService.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/utilities/copy.hpp b/hotspot/src/share/vm/utilities/copy.hpp index f3f84d0f21e..8122011ac40 100644 --- a/hotspot/src/share/vm/utilities/copy.hpp +++ b/hotspot/src/share/vm/utilities/copy.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/utilities/debug.cpp b/hotspot/src/share/vm/utilities/debug.cpp index 05360107789..e395102a666 100644 --- a/hotspot/src/share/vm/utilities/debug.cpp +++ b/hotspot/src/share/vm/utilities/debug.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -208,7 +208,9 @@ void report_vm_out_of_memory(const char* file_name, int line_no, size_t size, co Thread* thread = ThreadLocalStorage::get_thread_slow(); VMError(thread, size, message, file_name, line_no).report_and_die(); } - vm_abort(); + + // Dump core and abort + vm_abort(true); } void report_vm_out_of_memory_vararg(const char* file_name, int line_no, size_t size, const char* format, ...) { diff --git a/hotspot/src/share/vm/utilities/globalDefinitions.cpp b/hotspot/src/share/vm/utilities/globalDefinitions.cpp index acb8875acca..0bc9ba7692b 100644 --- a/hotspot/src/share/vm/utilities/globalDefinitions.cpp +++ b/hotspot/src/share/vm/utilities/globalDefinitions.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/utilities/globalDefinitions.hpp b/hotspot/src/share/vm/utilities/globalDefinitions.hpp index c46312f49d7..0eeb5dbe3d4 100644 --- a/hotspot/src/share/vm/utilities/globalDefinitions.hpp +++ b/hotspot/src/share/vm/utilities/globalDefinitions.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/utilities/globalDefinitions_sparcWorks.hpp b/hotspot/src/share/vm/utilities/globalDefinitions_sparcWorks.hpp index a5629b2f826..f25364b72bf 100644 --- a/hotspot/src/share/vm/utilities/globalDefinitions_sparcWorks.hpp +++ b/hotspot/src/share/vm/utilities/globalDefinitions_sparcWorks.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/utilities/ostream.cpp b/hotspot/src/share/vm/utilities/ostream.cpp index f50e8ba0a07..6839c78ba95 100644 --- a/hotspot/src/share/vm/utilities/ostream.cpp +++ b/hotspot/src/share/vm/utilities/ostream.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -753,21 +753,28 @@ void staticBufferStream::vprint_cr(const char* format, va_list argptr) { write(str, len); } -bufferedStream::bufferedStream(size_t initial_size) : outputStream() { +bufferedStream::bufferedStream(size_t initial_size, size_t bufmax) : outputStream() { buffer_length = initial_size; buffer = NEW_C_HEAP_ARRAY(char, buffer_length); buffer_pos = 0; buffer_fixed = false; + buffer_max = bufmax; } -bufferedStream::bufferedStream(char* fixed_buffer, size_t fixed_buffer_size) : outputStream() { +bufferedStream::bufferedStream(char* fixed_buffer, size_t fixed_buffer_size, size_t bufmax) : outputStream() { buffer_length = fixed_buffer_size; buffer = fixed_buffer; buffer_pos = 0; buffer_fixed = true; + buffer_max = bufmax; } void bufferedStream::write(const char* s, size_t len) { + + if(buffer_pos + len > buffer_max) { + flush(); + } + size_t end = buffer_pos + len; if (end >= buffer_length) { if (buffer_fixed) { @@ -811,7 +818,7 @@ bufferedStream::~bufferedStream() { #endif // Network access -networkStream::networkStream() { +networkStream::networkStream() : bufferedStream(1024*10, 1024*10) { _socket = -1; @@ -831,7 +838,9 @@ int networkStream::read(char *buf, size_t len) { void networkStream::flush() { if (size() != 0) { - hpi::send(_socket, (char *)base(), (int)size(), 0); + int result = hpi::raw_send(_socket, (char *)base(), (int)size(), 0); + assert(result != -1, "connection error"); + assert(result == (int)size(), "didn't send enough data"); } reset(); } diff --git a/hotspot/src/share/vm/utilities/ostream.hpp b/hotspot/src/share/vm/utilities/ostream.hpp index 7232b485096..b69fac590c8 100644 --- a/hotspot/src/share/vm/utilities/ostream.hpp +++ b/hotspot/src/share/vm/utilities/ostream.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -206,11 +206,12 @@ class bufferedStream : public outputStream { protected: char* buffer; size_t buffer_pos; + size_t buffer_max; size_t buffer_length; bool buffer_fixed; public: - bufferedStream(size_t initial_bufsize = 256); - bufferedStream(char* fixed_buffer, size_t fixed_buffer_size); + bufferedStream(size_t initial_bufsize = 256, size_t bufmax = 1024*1024*10); + bufferedStream(char* fixed_buffer, size_t fixed_buffer_size, size_t bufmax = 1024*1024*10); ~bufferedStream(); virtual void write(const char* c, size_t len); size_t size() { return buffer_pos; } diff --git a/hotspot/src/share/vm/utilities/taskqueue.hpp b/hotspot/src/share/vm/utilities/taskqueue.hpp index 6e883d9e673..3221ddaacc8 100644 --- a/hotspot/src/share/vm/utilities/taskqueue.hpp +++ b/hotspot/src/share/vm/utilities/taskqueue.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/utilities/vmError.cpp b/hotspot/src/share/vm/utilities/vmError.cpp index f8df9042128..71ab720f028 100644 --- a/hotspot/src/share/vm/utilities/vmError.cpp +++ b/hotspot/src/share/vm/utilities/vmError.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/hotspot/src/share/vm/utilities/xmlstream.cpp b/hotspot/src/share/vm/utilities/xmlstream.cpp index b7098c857aa..3f03a442773 100644 --- a/hotspot/src/share/vm/utilities/xmlstream.cpp +++ b/hotspot/src/share/vm/utilities/xmlstream.cpp @@ -59,6 +59,7 @@ void xmlStream::write(const char* s, size_t len) { if (!is_open()) return; out()->write(s, len); + update_position(s, len); } diff --git a/hotspot/test/compiler/6659207/Test.java b/hotspot/test/compiler/6659207/Test.java index 3c729758ef4..c684573a547 100644 --- a/hotspot/test/compiler/6659207/Test.java +++ b/hotspot/test/compiler/6659207/Test.java @@ -1,23 +1,24 @@ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - * - * - * - * - * - * - * - * - * - * - * - * - * + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. * */ diff --git a/hotspot/test/compiler/6661247/Test.java b/hotspot/test/compiler/6661247/Test.java index 7a9f4318d54..b702f8d9837 100644 --- a/hotspot/test/compiler/6661247/Test.java +++ b/hotspot/test/compiler/6661247/Test.java @@ -1,23 +1,24 @@ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - * - * - * - * - * - * - * - * - * - * - * - * - * + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. * */ diff --git a/hotspot/test/compiler/6663621/IVTest.java b/hotspot/test/compiler/6663621/IVTest.java index 7374f08c203..c0a1ab54afb 100644 --- a/hotspot/test/compiler/6663621/IVTest.java +++ b/hotspot/test/compiler/6663621/IVTest.java @@ -1,23 +1,24 @@ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - * - * - * - * - * - * - * - * - * - * - * - * - * + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. * */ diff --git a/hotspot/test/compiler/6689060/Test.java b/hotspot/test/compiler/6689060/Test.java new file mode 100644 index 00000000000..f6361aee067 --- /dev/null +++ b/hotspot/test/compiler/6689060/Test.java @@ -0,0 +1,577 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ + +/* + * @test + * @bug 6689060 + * @summary Escape Analysis does not work with Compressed Oops + * @run main/othervm -Xbatch -XX:CompileCommand=exclude,Test.dummy -XX:+AggressiveOpts Test + */ + +import java.lang.reflect.Array; + +class Point { + int x; + int y; + Point next; + int ax[]; + int ay[]; + Point pax[]; + Point pay[]; + public Point getNext() { + return next; + } +} + +public class Test { + + void dummy() { + // Empty method to verify correctness of DebugInfo. + // Use -XX:CompileCommand=exclude,Test.dummy + } + + int ival(int i) { + return i*2; + } + + int test80(int y, int l, int i) { + Point p = new Point(); + p.ax = new int[2]; + p.ay = new int[2]; + int x = 3; + p.ax[0] = x; + p.ay[1] = 3 * x + y; + dummy(); + return p.ax[0] * p.ay[1]; + } + + int test81(int y, int l, int i) { + Point p = new Point(); + p.ax = new int[2]; + p.ay = new int[2]; + int x = 3; + p.ax[0] = x; + p.ay[1] = 3 * x + y; + dummy(); + return p.ax[0] * p.ay[1]; + } + + + int test44(int y) { + Point p1 = new Point(); + p1.x = ival(3); + dummy(); + p1.y = 3 * p1.x + y; + return p1.y; + } + + int test43(int y) { + Point p1 = new Point(); + if ( (y & 1) == 1 ) { + p1.x = ival(3); + } else { + p1.x = ival(5); + } + dummy(); + p1.y = 3 * p1.x + y; + return p1.y; + } + + int test42(int y) { + Point p1 = new Point(); + p1.x = 3; + for (int i = 0; i < y; i++) { + if ( (i & 1) == 1 ) { + p1.x += 4; + } + } + p1.y = 3 * y + p1.x; + return p1.y; + } + + int test40(int y) { + Point p1 = new Point(); + if ( (y & 1) == 1 ) { + p1.x = 3; + } else { + p1.x = 5; + } + p1.y = 3 * p1.x + y; + return p1.y; + } + + int test41(int y) { + Point p1 = new Point(); + if ( (y & 1) == 1 ) { + p1.x += 4; + } else { + p1.x += 5; + } + p1.y = 3 * p1.x + y; + return p1.y; + } + + Point test00(int y) { + int x = 3; + Point p = new Point(); + p.x = x; + p.y = 3 * x + y; + return p; + } + + Point test01(int y) { + int x = 3; + Point p = new Point(); + p.x = x; + p.y = 3 * x + y; + dummy(); + return p; + } + + Point test02(int y) { + int x = 3; + Point p1 = null; + for (int i = 0; i < y; i++) { + Point p2 = new Point(); + p2.x = x; + p2.y = 3 * y + x; + p2.next = p1; + p1 = p2; + } + return p1; + } + + Point test03(int y) { + int x = 3; + Point p1 = null; + for (int i = 0; i < y; i++) { + Point p2 = new Point(); + p2.x = x; + p2.y = 3 * y + x; + p2.next = p1; + p1 = p2; + } + dummy(); + return p1; + } + + Point test04(int y) { + int x = 3; + Point p1 = null; + for (int i = 0; i < y; i++) { + Point p2 = new Point(); + p2.x = x; + p2.y = 3 * y + x; + p2.next = p1; + dummy(); + p1 = p2; + } + return p1; + } + + int test05(int y) { + int x = 3; + Point p1 = new Point(); + for (int i = 0; i < y; i++) { + Point p2 = new Point(); + p2.x = x; + p2.y = 3 * y + x; + p1.next = p2; + p1 = p2; + } + return p1.y; + } + + int test0(int y) { + int x = 3; + Point p = new Point(); + p.x = x; + p.y = 3 * x + y; + dummy(); + return p.x * p.y; + } + + int test1(int y) { + Point p = new Point(); + if ( (y & 1) == 1 ) { + p = new Point(); // Kill previous + } + int x = 3; + p.x = x; + p.y = 3 * x + y; + dummy(); + return p.x * p.y; + } + + int test2(int y) { + Point p1 = new Point(); + Point p2 = new Point(); + p1.x = 3; + p2.x = 4; + p1.y = 3 * p2.x + y; + p2.y = 3 * p1.x + y; + dummy(); + return p1.y * p2.y; + } + + int test3(int y, Point p1) { + Point p2 = new Point(); + p1.x = 3; + p2.x = 4; + p1.y = 3 * p2.x + y; + p2.y = 3 * p1.x + y; + dummy(); + return p1.y * p2.y; + } + + int test4(int y) { + Point p1 = new Point(); + Point p2 = new Point(); + if ( (y & 1) == 1 ) { + p1.x = 3; + p2.x = 4; + } else { + p1.x = 5; + p2.x = 6; + } + p1.y = 3 * p2.x + y; + p2.y = 3 * p1.x + y; + dummy(); + return p1.y * p2.y; + } + + int test5(int y, Point p1) { + Point p2 = new Point(); + if ( (y & 1) == 1 ) { + p1.x = 3; + p2.x = 4; + } else { + p1.x = 5; + p2.x = 6; + } + p1.y = 3 * p2.x + y; + p2.y = 3 * p1.x + y; + dummy(); + return p1.y * p2.y; + } + + int test6(int y) { + Point p1 = new Point(); + Point p2 = new Point(); + p1.next = p2; + if ( (y & 1) == 1 ) { + p1.x = 3; + p1.getNext().x = 4; + } else { + p1.x = 5; + p1.getNext().x = 6; + } + p1.y = 3 * p2.x + y; + p2.y = 3 * p1.x + y; + dummy(); + return p1.y * p2.y; + } + + int test7(int y, Point p1) { + Point p2 = new Point(); + p1.next = p2; + if ( (y & 1) == 1 ) { + p1.x = 3; + p1.getNext().x = 4; + } else { + p1.x = 5; + p1.getNext().x = 6; + } + p1.y = 3 * p2.x + y; + p2.y = 3 * p1.x + y; + dummy(); + return p1.y * p2.y; + } + + int test8(int y, int l, int i) { + Point p = new Point(); + p.ax = new int[l]; + p.ay = new int[l]; + int x = 3; + p.ax[i] = x; + p.ay[i] = 3 * x + y; + dummy(); + return p.ax[i] * p.ay[i]; + } + + int test9(int y, int l, int i) { + Point p = new Point(); + p.pax = new Point[l]; + p.pay = new Point[l]; + p.pax[i] = new Point(); + p.pay[i] = new Point(); + p.pax[i].x = 3; + p.pay[i].x = 4; + p.pax[i].y = 3 * p.pay[i].x + y; + p.pay[i].y = 3 * p.pax[i].x + y; + dummy(); + return p.pax[i].y * p.pay[i].y; + } + + int test10(int y, int l, int i, Class cls) { + Point p = new Point(); + try { + p.pax = (Point[])Array.newInstance(cls, l); + p.pax[i] = (Point)cls.newInstance(); + } + catch(java.lang.InstantiationException ex) { + return 0; + } + catch(java.lang.IllegalAccessException ex) { + return 0; + } + p.pax[i].x = 3; + p.pax[i].y = 3 * p.pax[i].x + y; + dummy(); + return p.pax[i].x * p.pax[i].y; + } + + int test11(int y) { + Point p1 = new Point(); + Point p2 = new Point(); + p1.next = p2; + if ( (y & 1) == 1 ) { + p1.x = 3; + p1.next.x = 4; + } else { + p1.x = 5; + p1.next.x = 6; + } + p1.y = 3 * p1.next.x + y; + p1.next.y = 3 * p1.x + y; + dummy(); + return p1.y * p1.next.y; + } + + int test12(int y) { + Point p1 = new Point(); + p1.next = p1; + if ( (y & 1) == 1 ) { + p1.x = 3; + p1.next.x = 4; + } else { + p1.x = 5; + p1.next.x = 6; + } + p1.y = 3 * p1.next.x + y; + p1.next.y = 3 * p1.x + y; + dummy(); + return p1.y * p1.next.y; + } + + + public static void main(String args[]) { + Test tsr = new Test(); + Point p = new Point(); + Point ptmp = p; + Class cls = Point.class; + int y = 0; + for (int i=0; i<10000; i++) { + ptmp.next = tsr.test00(1); + ptmp.next = tsr.test01(1); + ptmp.next = tsr.test02(1); + ptmp.next = tsr.test03(1); + ptmp.next = tsr.test04(1); + + y = tsr.test05(1); + + y = tsr.test80(y, 1, 0); + y = tsr.test81(y, 1, 0); + + y = tsr.test44(y); + y = tsr.test43(y); + y = tsr.test42(y); + y = tsr.test40(y); + y = tsr.test41(y); + + y = tsr.test0(y); + y = tsr.test1(y); + y = tsr.test2(y); + y = tsr.test3(y, p); + y = tsr.test4(y); + y = tsr.test5(y, p); + y = tsr.test6(y); + y = tsr.test7(y, p); + y = tsr.test8(y, 1, 0); + y = tsr.test9(y, 1, 0); + y = tsr.test10(y, 1, 0, cls); + y = tsr.test11(y); + y = tsr.test12(y); + } + for (int i=0; i<10000; i++) { + ptmp.next = tsr.test00(1); + ptmp.next = tsr.test01(1); + ptmp.next = tsr.test02(1); + ptmp.next = tsr.test03(1); + ptmp.next = tsr.test04(1); + + y = tsr.test05(1); + + y = tsr.test80(y, 1, 0); + y = tsr.test81(y, 1, 0); + + y = tsr.test44(y); + y = tsr.test43(y); + y = tsr.test42(y); + y = tsr.test40(y); + y = tsr.test41(y); + + y = tsr.test0(y); + y = tsr.test1(y); + y = tsr.test2(y); + y = tsr.test3(y, p); + y = tsr.test4(y); + y = tsr.test5(y, p); + y = tsr.test6(y); + y = tsr.test7(y, p); + y = tsr.test8(y, 1, 0); + y = tsr.test9(y, 1, 0); + y = tsr.test10(y, 1, 0, cls); + y = tsr.test11(y); + y = tsr.test12(y); + } + for (int i=0; i<10000; i++) { + ptmp.next = tsr.test00(1); + ptmp.next = tsr.test01(1); + ptmp.next = tsr.test02(1); + ptmp.next = tsr.test03(1); + ptmp.next = tsr.test04(1); + + y = tsr.test05(1); + + y = tsr.test80(y, 1, 0); + y = tsr.test81(y, 1, 0); + + y = tsr.test44(y); + y = tsr.test43(y); + y = tsr.test42(y); + y = tsr.test40(y); + y = tsr.test41(y); + + y = tsr.test0(y); + y = tsr.test1(y); + y = tsr.test2(y); + y = tsr.test3(y, p); + y = tsr.test4(y); + y = tsr.test5(y, p); + y = tsr.test6(y); + y = tsr.test7(y, p); + y = tsr.test8(y, 1, 0); + y = tsr.test9(y, 1, 0); + y = tsr.test10(y, 1, 0, cls); + y = tsr.test11(y); + y = tsr.test12(y); + } + + int z = 0; + y = tsr.test80(0, 1, 0); + z += y; + System.out.println("After 'test80' y=" + y); + y = tsr.test81(0, 1, 0); + z += y; + System.out.println("After 'test81' y=" + y); + + y = tsr.test44(0); + z += y; + System.out.println("After 'test44' y=" + y); + y = tsr.test43(0); + z += y; + System.out.println("After 'test43' y=" + y); + y = tsr.test42(0); + z += y; + System.out.println("After 'test42' y=" + y); + y = tsr.test40(0); + z += y; + System.out.println("After 'test40' y=" + y); + y = tsr.test41(0); + z += y; + System.out.println("After 'test41' y=" + y); + + ptmp.next = tsr.test00(1); + z += y; + System.out.println("After 'test00' p.y=" + ptmp.next.y); + ptmp.next = tsr.test01(1); + z += y; + System.out.println("After 'test01' p.y=" + ptmp.next.y); + ptmp.next = tsr.test02(1); + z += y; + System.out.println("After 'test02' p.y=" + ptmp.next.y); + ptmp.next = tsr.test03(1); + z += y; + System.out.println("After 'test03' p.y=" + ptmp.next.y); + ptmp.next = tsr.test04(1); + z += y; + System.out.println("After 'test04' p.y=" + ptmp.next.y); + + y = tsr.test05(1); + z += y; + System.out.println("After 'test05' y=" + y); + + y = tsr.test0(0); + z += y; + System.out.println("After 'test0' y=" + y); + y = tsr.test1(0); + z += y; + System.out.println("After 'test1' y=" + y); + y = tsr.test2(0); + z += y; + System.out.println("After 'test2' y=" + y); + y = tsr.test3(0, new Point()); + z += y; + System.out.println("After 'test3' y=" + y); + y = tsr.test4(0); + z += y; + System.out.println("After 'test4' y=" + y); + y = tsr.test5(0, new Point()); + z += y; + System.out.println("After 'test5' y=" + y); + y = tsr.test6(0); + z += y; + System.out.println("After 'test6' y=" + y); + y = tsr.test7(0, new Point()); + z += y; + System.out.println("After 'test7' y=" + y); + y = tsr.test8(0, 1, 0); + z += y; + System.out.println("After 'test8' y=" + y); + y = tsr.test9(0, 1, 0); + z += y; + System.out.println("After 'test9' y=" + y); + y = tsr.test10(0, 1, 0, cls); + z += y; + System.out.println("After 'test10' y=" + y); + y = tsr.test11(0); + z += y; + System.out.println("After 'test11' y=" + y); + y = tsr.test12(0); + z += y; + System.out.println("After 'test12' y=" + y); + System.out.println("Sum of y =" + z); + } +} diff --git a/hotspot/test/compiler/6695810/Test.java b/hotspot/test/compiler/6695810/Test.java new file mode 100644 index 00000000000..77297671082 --- /dev/null +++ b/hotspot/test/compiler/6695810/Test.java @@ -0,0 +1,56 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ + +/* + * @test + * @bug 6695810 + * @summary null oop passed to encode_heap_oop_not_null + * @run main/othervm -Xbatch Test + */ + +public class Test { + Test _t; + + static void test(Test t1, Test t2) { + if (t2 != null) + t1._t = t2; + + if (t2 != null) + t1._t = t2; + } + + public static void main(String[] args) { + Test t = new Test(); + for (int i = 0; i < 50; i++) { + for (int j = 0; j < 100; j++) { + test(t, t); + } + test(t, null); + } + for (int i = 0; i < 10000; i++) { + test(t, t); + } + test(t, null); + } +} diff --git a/hotspot/test/compiler/6714694/Tester.java b/hotspot/test/compiler/6714694/Tester.java new file mode 100644 index 00000000000..1431c413777 --- /dev/null +++ b/hotspot/test/compiler/6714694/Tester.java @@ -0,0 +1,820 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6714694 + * @summary assertion in 64bit server vm (store->find_edge(load) != -1,"missing precedence edge") with COOPs + * @run main/othervm -Xcomp Tester + */ + +/* Complexity upper bound: 38602 ops */ + +interface Tester_Interface_0 { +} + + +abstract class Tester_Class_1 implements Tester_Interface_0 { + static int var_1 = (false ? (short)'b' : (short)-2.4256387E38F) | (byte)('g' * -7.660532860983624E307); + float var_2; + byte var_3; + static boolean var_4 = true; + double var_5 = 8.818325751338691E307; + Object var_6; + static short var_7; + final static char var_8 = 'x'; + final static float var_9 = 2.2030989E38F; + + + public Tester_Class_1() + { + var_6 = (var_6 = (var_6 = "xkx")); + switch (var_7 = (var_3 = (byte)var_5)) + { + case 113: + + case 114: + Object var_12; + var_4 = 4.9121917E37F < 1957795258; + var_4 |= (var_4 ^= !var_4) ^ (var_4 |= var_4); + var_3 = (var_3 = (var_3 = (byte)+6010964363045275648L)); + break; + + case 102: + + } + final float var_13 = 1.2443151E38F; + var_3 = (byte)(var_1 |= (var_7 = (var_3 = (byte)var_5))); + var_2 = (long)(var_7 = (var_3 = (byte)var_8)) - (var_7 = (byte)386742565); + var_4 &= var_4; + var_2 = (long)((var_3 = (var_3 = (byte)var_8)) / ((var_4 ^= (var_5 /= var_9) <= (var_1 &= var_1)) ? (var_7 = (short)6872886933545336832L) : (byte)var_8)); + var_6 = "uqflj"; + { + switch (((new String[var_3 = (byte)var_5])[var_3 = (byte)8097442298927900672L]).charAt(1540148550)) + { + case 'l': + + } + var_2 = (var_7 = (byte)2.9859440663042714E307); + { + Object var_14; + } + var_3 = (var_3 = (var_3 = (byte)3.3634427195550136E307)); + var_5 += '_'; + } + var_6 = "tempfdjen"; + var_3 = (((var_4 ^= new String("jmwiwmk").endsWith("rtlstmnuo")) ? !true : !false) ? true : (var_4 = false)) ? (var_3 = (byte)var_5) : (var_3 = (var_3 = (byte)var_5)); + var_4 ^= false; + if (1.6435436003809043E307 != var_9) + { + boolean var_15 = true; + } + else + { + var_4 = false; + } + { + Object var_16 = ((new Tester_Class_1[(byte)71832757][(byte)1.0694914E38F])[(byte)1315653071][(byte)(var_7 = (var_7 = (byte)var_8))]).var_6 = new int[(byte)var_8][var_3 = (byte)1933656747]; + } + var_7 = (var_4 = var_4) ? (short)2.756967E37F : (short)'K'; + byte var_17; + } + + + + abstract public Tester_Interface_0 func_0(double[][] arg_0, final Object arg_1); + + + final double func_0(final float arg_0, final short arg_1, final boolean arg_2) + { + var_6 = (var_6 = "lmshbl"); + var_3 = (var_3 = (new byte[(new byte[(byte)arg_1])[var_3 = (byte)arg_0]])[var_3 = (var_3 = (byte)(var_1 >>>= var_1))]); + var_5 %= (var_3 = (byte)1909375874); + var_1 /= (char)(short)'i'; + { + "vgar".length(); + } + int var_10; + { + var_3 = (var_4 &= true) ? (byte)(var_5 *= 6375499657746206720L) : (byte)+ (var_5 /= var_9); + var_7 = (var_4 = true) ? (byte)(false ? (short)749593632 : (byte)8.692758043260743E307) : (byte)var_1; + ((new Tester_Class_1[(byte)1.2890904018345944E308])[(byte)var_1]).var_3 = (var_3 = (byte)arg_0); + var_4 = true ^ var_4; + } + { + var_1 ^= (var_3 = (var_3 = (var_3 = (byte)'U'))); + } + var_3 = (var_3 = (var_3 = (var_3 = (byte)arg_1))); + char var_11; + var_1 += (var_2 = (var_7 = arg_1)); + { + var_7 = (var_7 = arg_1); + } + var_7 = arg_1; + var_6 = (new char[(byte)1985094111797788672L][var_3 = (byte)3112604683090268160L])[var_3 = (byte)~ (var_3 = (byte)(var_5 += var_1))]; + var_3 = (var_3 = (var_3 = (var_3 = (byte)3694858000202921984L))); + var_1 /= ~ ((byte)1311538336); + (((var_4 |= arg_2 ? !true && arg_2 : false) ? arg_2 : arg_2) ? "iih".substring(~ (var_3 = (byte)3.5401308E37F), 'g' * arg_1) : "gynskmvoj").trim(); + var_3 = (var_3 = arg_2 ? (byte)+ ~5247392660383928320L : (byte)8392160279007184896L); + var_3 = (var_3 = (var_3 = (byte)var_8)); + return (var_5 += 7.157559E37F) + (var_11 = 'V'); + } + + public String toString() + { + String result = "[\n"; + result += "Tester_Class_1.var_7 = "; result += Tester.Printer.print(var_7); + result += "\n"; + result += "Tester_Class_1.var_3 = "; result += Tester.Printer.print(var_3); + result += "\n"; + result += "Tester_Class_1.var_8 = "; result += Tester.Printer.print(var_8); + result += "\n"; + result += "Tester_Class_1.var_1 = "; result += Tester.Printer.print(var_1); + result += "\n"; + result += "Tester_Class_1.var_4 = "; result += Tester.Printer.print(var_4); + result += "\n"; + result += "Tester_Class_1.var_5 = "; result += Tester.Printer.print(var_5); + result += "\n"; + result += "Tester_Class_1.var_2 = "; result += Tester.Printer.print(var_2); + result += "\n"; + result += "Tester_Class_1.var_9 = "; result += Tester.Printer.print(var_9); + result += "\n"; + result += "Tester_Class_1.var_6 = "; result += Tester.Printer.print(var_6); + result += ""; + result += "\n]"; + return result; + } +} + + +class Tester_Class_2 extends Tester_Class_1 implements Tester_Interface_0 { + final static String var_18 = false | Tester_Class_1.var_4 | (Tester_Class_1.var_4 &= (Tester_Class_1.var_4 |= (Tester_Class_1.var_4 = var_4))) ? "tbobyhqne" : ""; + static String var_19 = "acxfj"; + + + public Tester_Class_2() + { + Tester_Class_1.var_4 = !Tester_Class_1.var_4; + var_1++; + var_2 = (byte)2.4009747E38F; + new String(); + var_6 = (var_19 = "hsshyw"); + var_19 = var_19; + } + + + public Tester_Interface_0 func_0(double[][] arg_0, final Object arg_1) + { + var_5 = 4.0352057E37F; + (((false && ! ((Tester_Class_1.var_4 |= !true) ^ (Tester_Class_1.var_4 ^ false))) ^ (var_4 &= true) ? var_4 : (var_4 ^= true)) ? "spskwj" : "xcqianm").length(); + ((var_4 |= (Tester_Class_1.var_4 ^= Tester_Class_1.var_4) ? (Tester_Class_1.var_4 &= false) : (Tester_Class_1.var_4 |= Tester_Class_1.var_4)) ? (Tester_Class_1)(var_6 = new double[(byte)6.628342687109622E307]) : (Tester_Class_1)arg_1).var_6 = arg_0; + var_7 = (short)(byte)(short)8775325134193811456L; + var_4 ^= (var_4 &= !false); + ((Tester_Class_1)arg_1).var_3 = (var_3 = (byte)(var_5 %= 8.933448E37F)); + Tester_Class_1 var_20 = Tester_Class_1.var_4 ? (Tester_Class_1)arg_1 : (Tester_Class_1)arg_1; + { + var_19.endsWith(var_19); + var_6 = var_20; + (var_20 = (var_20 = var_20)).var_2 = (short)('p' <= 1986176769 % (int)2242661265280256000L % 2664882044098145280L ? ~ (var_3 = (byte)1.1892553447967157E308) & ~1806805036550279168L : (var_7 = (byte)var_8)); + } + final boolean var_21 = Tester_Class_1.var_4; + var_20.var_3 = (var_3 = (var_20.var_3 = (byte)'t')); + boolean var_22 = true; + Tester_Class_1.var_4 |= (var_4 = var_21); + var_19 = "ocn"; + var_19 = var_19; + var_1 *= Tester_Class_1.var_8; + var_20 = var_22 ? var_20 : var_20; + var_7 = var_21 ? (byte)+ ((byte)var_1) : ((var_20 = (var_20 = var_20)).var_3 = (var_3 = (var_3 = (byte)'L'))); + return true ? (var_20 = var_20) : (new Tester_Interface_0[(byte)5618282952859970560L])[var_3 = (byte)Tester_Class_1.var_8]; + } + + + public boolean equals(Object obj) + { + Tester_Class_1.var_7 = (var_7 = (((Tester_Class_1)obj).var_3 = (byte)var_9)); + { + final Tester_Class_1 var_23 = (Tester_Class_1)obj; + } + ++Tester_Class_1.var_1; + var_5 = (Tester_Class_1.var_7 = var_4 ? (Tester_Class_1.var_7 = (((Tester_Class_1)obj).var_3 = (byte)Tester_Class_1.var_8)) : (var_7 = (byte)var_9)); + ((Tester_Class_1)obj).var_6 = var_18.replace(Tester_Class_1.var_8, Tester_Class_1.var_8); + ((new Tester_Class_1[((Tester_Class_1)(obj = new char[var_3 = (byte)Tester_Class_1.var_8])).var_3 = (((Tester_Class_1)obj).var_3 = (byte)(var_1 %= 787509251458841600L))])[(new byte[var_3 = (byte)Tester_Class_1.var_1])[((Tester_Class_1)obj).var_3 = (byte)1.2382548E38F]]).var_3 = (((Tester_Class_1)obj).var_3 = var_4 ? (byte)Tester_Class_1.var_8 : (byte)4.1085164E36F); + var_1 &= var_8; + var_7 = var_4 ? (var_3 = (byte)var_8) : (byte)var_5; + var_19 = var_18; + ("o".compareTo("kwlfk") > (var_2 = 5289241662482067456L) ? (Tester_Class_1)obj : (Tester_Class_1)obj).var_5 -= (((Tester_Class_1)obj).var_3 = (((Tester_Class_1)obj).var_3 = (((Tester_Class_1)obj).var_3 = (byte)var_9))); + return true; + } + + + public String toString() + { + String result = "[\n"; + result += "Tester_Class_2.var_7 = "; result += Tester.Printer.print(var_7); + result += "\n"; + result += "Tester_Class_2.var_8 = "; result += Tester.Printer.print(var_8); + result += "\n"; + result += "Tester_Class_2.var_3 = "; result += Tester.Printer.print(var_3); + result += "\n"; + result += "Tester_Class_2.var_18 = "; result += Tester.Printer.print(var_18); + result += "\n"; + result += "Tester_Class_2.var_19 = "; result += Tester.Printer.print(var_19); + result += "\n"; + result += "Tester_Class_2.var_1 = "; result += Tester.Printer.print(var_1); + result += "\n"; + result += "Tester_Class_2.var_4 = "; result += Tester.Printer.print(var_4); + result += "\n"; + result += "Tester_Class_2.var_5 = "; result += Tester.Printer.print(var_5); + result += "\n"; + result += "Tester_Class_2.var_2 = "; result += Tester.Printer.print(var_2); + result += "\n"; + result += "Tester_Class_2.var_9 = "; result += Tester.Printer.print(var_9); + result += "\n"; + result += "Tester_Class_2.var_6 = "; result += Tester.Printer.print(var_6); + result += ""; + result += "\n]"; + return result; + } +} + + +class Tester_Class_3 extends Tester_Class_2 implements Tester_Interface_0 { + long var_24 = 9026266006808413184L; + char var_25; + String var_26 = ((var_4 ^= Tester_Class_1.var_4) ? (!true ? false : (var_4 |= true)) : (Tester_Class_2.var_4 ^= var_4)) ? "dkmhvhl" : (var_19 = (Tester_Class_2.var_19 = (Tester_Class_2.var_19 = var_18))); + static Tester_Class_2 var_27; + short var_28 = Tester_Class_2.var_7 = (short)(Tester_Class_2.var_1 &= (var_3 = (var_3 = (var_3 = (byte)Tester_Class_2.var_9)))); + static boolean var_29 = false; + static Object[][] var_30; + int var_31 = 750583762; + Tester_Class_2 var_32; + final static long var_33 = 3050784555932008448L; + + + public Tester_Class_3() + { + byte[] var_34; + var_4 &= (Tester_Class_1.var_4 = true); + Tester_Class_1.var_1--; + switch (var_28 >>= ~ ((byte)var_28)) + { + case 9: + + case 26: + Tester_Class_1.var_4 ^= Tester_Class_1.var_4; + (Tester_Class_2.var_19 = "pwtic").indexOf(Tester_Class_2.var_18); + var_26.indexOf(var_19); + ((Tester_Class_1)(new Tester_Interface_0[(byte)var_5])[var_24 <= var_31 ? (byte)'^' : (byte)var_24]).var_2 = 5611775846881101824L; + var_29 |= (Tester_Class_2.var_4 ^= var_29); + Tester_Class_2 var_35; + var_24 <<= (var_31 >>= (var_25 = var_8)); + break; + + case 28: + + } + new String(); + var_5 %= (var_25 = 'n'); + ((Tester_Class_2)(Tester_Class_1)(((Tester_Class_1)(var_6 = Tester_Class_2.var_18)).var_6 = (var_26 = ""))).var_2 = var_31; + --var_1; + } + + + + + public String toString() + { + String result = "[\n"; + result += "Tester_Class_3.var_8 = "; result += Tester.Printer.print(var_8); + result += "\n"; + result += "Tester_Class_3.var_25 = "; result += Tester.Printer.print(var_25); + result += "\n"; + result += "Tester_Class_3.var_1 = "; result += Tester.Printer.print(var_1); + result += "\n"; + result += "Tester_Class_3.var_31 = "; result += Tester.Printer.print(var_31); + result += "\n"; + result += "Tester_Class_3.var_30 = "; result += Tester.Printer.print(var_30); + result += "\n"; + result += "Tester_Class_3.var_24 = "; result += Tester.Printer.print(var_24); + result += "\n"; + result += "Tester_Class_3.var_33 = "; result += Tester.Printer.print(var_33); + result += "\n"; + result += "Tester_Class_3.var_5 = "; result += Tester.Printer.print(var_5); + result += "\n"; + result += "Tester_Class_3.var_2 = "; result += Tester.Printer.print(var_2); + result += "\n"; + result += "Tester_Class_3.var_9 = "; result += Tester.Printer.print(var_9); + result += "\n"; + result += "Tester_Class_3.var_7 = "; result += Tester.Printer.print(var_7); + result += "\n"; + result += "Tester_Class_3.var_28 = "; result += Tester.Printer.print(var_28); + result += "\n"; + result += "Tester_Class_3.var_3 = "; result += Tester.Printer.print(var_3); + result += "\n"; + result += "Tester_Class_3.var_18 = "; result += Tester.Printer.print(var_18); + result += "\n"; + result += "Tester_Class_3.var_19 = "; result += Tester.Printer.print(var_19); + result += "\n"; + result += "Tester_Class_3.var_26 = "; result += Tester.Printer.print(var_26); + result += "\n"; + result += "Tester_Class_3.var_4 = "; result += Tester.Printer.print(var_4); + result += "\n"; + result += "Tester_Class_3.var_29 = "; result += Tester.Printer.print(var_29); + result += "\n"; + result += "Tester_Class_3.var_27 = "; result += Tester.Printer.print(var_27); + result += "\n"; + result += "Tester_Class_3.var_32 = "; result += Tester.Printer.print(var_32); + result += "\n"; + result += "Tester_Class_3.var_6 = "; result += Tester.Printer.print(var_6); + result += ""; + result += "\n]"; + return result; + } +} + +public class Tester { + static double var_36 = 2.679028326789642E307; + float var_37; + String var_38 = Tester_Class_2.var_18; + static Tester_Interface_0 var_39; + static char var_40 = 'D'; + Tester_Class_1 var_41; + static int var_42; + final static boolean var_43 = false; + + + final static Tester_Class_2 func_0(Tester_Class_1 arg_0, final Tester_Class_2 arg_1) + { + "ooots".replaceFirst("rdxor", ((new Tester_Class_3[arg_1.var_3 = (byte)2.7836305E38F])[arg_0.var_3 = (byte)+ + +1.4958218616334936E307]).var_26); + if (true) + { + arg_0 = (Tester_Class_3)arg_0; + ((Tester_Class_3)arg_0).var_25 = var_40; + final Tester_Class_2 var_44 = (Tester_Class_2)((Tester_Class_3.var_29 |= var_43) ? arg_0 : (arg_0.var_6 = Tester_Class_3.var_18)); + } + else + { + var_39 = (Tester_Class_3.var_27 = (Tester_Class_3)arg_1); + } + Tester_Class_3.var_19 = "onndgsil"; + var_39 = arg_0; + return (Tester_Class_2.var_4 &= Tester_Class_2.var_4 ^ true) ? (((Tester_Class_3)arg_0).var_32 = (Tester_Class_3)arg_1) : (((Tester_Class_3)arg_0).var_32 = (Tester_Class_3)arg_1); + } + + private final static float func_1(final short arg_0, int[][] arg_1, final long arg_2) + { + Tester_Class_2.var_1 *= arg_0; + double var_45 = 6.841391103184752E307; + long var_46; + Tester_Class_2.var_1--; + --var_40; + ++var_40; + ++Tester_Class_3.var_1; + Tester_Class_1.var_4 = false; + var_36 %= 'X'; + ++Tester_Class_2.var_1; + Tester_Class_1.var_1++; + return 3.2422038E38F; + } + + private final static char func_2(double arg_0, final byte arg_1, int arg_2) + { + --Tester_Class_3.var_1; + if (Tester_Class_1.var_4) + { + if (var_43) + { + Tester_Class_3.var_1++; + } + else + { + var_40 <<= 1329560515532651520L; + } + (false & Tester_Class_2.var_4 ? (new Tester_Class_1[arg_1])[arg_1] : (new Tester_Class_1[arg_1][arg_1])[arg_1][arg_1]).var_3 = arg_1; + Tester_Class_2.var_19 = Tester_Class_3.var_19; + --var_40; + final long var_47 = ~Tester_Class_3.var_33 << var_40--; + ((Tester_Class_3)(new Tester_Class_2[arg_1][arg_1])[arg_1][arg_1]).var_24 *= (var_36 *= (long)arg_1 * ~arg_1); + Tester_Class_2.var_19 = Tester_Class_2.var_19; + ++((new Tester_Class_3[arg_1])[arg_1]).var_24; + } + else + { + var_40++; + } + var_40 <<= var_40; + if (true) + { + ++arg_2; + } + else + { + Tester_Class_2.var_7 = arg_1; + } + boolean var_48 = true; + var_36 /= arg_1; + final short var_49 = 15276; + Tester_Interface_0 var_50; + ((Tester_Class_2.var_19 = (Tester_Class_2.var_19 = Tester_Class_2.var_19)) + "xhi").toString(); + arg_2++; + return var_40; + } + + public final static char func_4(final boolean arg_0) + { + float var_52 = 2.8063675E38F; + var_40--; + Object var_53; + Tester_Class_3.var_29 |= (Tester_Class_3.var_29 &= true); + if (!Tester_Class_1.var_4) + { + --var_40; + } + else + { + var_52 %= 2027756834; + } + int var_54 = Tester_Class_1.var_1++; + var_40--; + long var_55; + byte var_56 = 97; + var_36 *= 9.75628909363086E307 % + -1.9812653793936264E306; + int var_57; + boolean var_58 = Tester_Class_1.var_4 ^= var_43; + return 'J'; + } + + static float func_5(final Object arg_0, float arg_1, final Tester_Class_2 arg_2) + { + var_39 = arg_2; + Tester_Class_3.var_27 = arg_2; + arg_1 %= 1.7777554E38F; + var_39 = (Tester_Class_3.var_27 = arg_2); + Tester_Class_3 var_59; + { + var_40 -= arg_1 - ~ (((Tester_Class_3)arg_2).var_3 = (byte)1455854212); + } + Object var_60 = Tester_Class_1.var_4 ? arg_0 : new String[arg_2.var_3 = (byte)arg_1][(byte)((Tester_Class_3)arg_0).var_28]; + Tester_Class_3.var_27 = (Tester_Class_2)(var_39 = arg_2); + ((Tester_Class_3.var_4 |= var_43) ? (var_59 = (var_59 = (var_59 = (Tester_Class_3)var_60))) : (var_59 = (Tester_Class_3)arg_2)).var_24 ^= Tester_Class_3.var_1; + return Tester_Class_1.var_9; + } + + private static void func_6(char arg_0, final Tester_Class_3 arg_1, String arg_2, final double arg_3) + { + ((new Tester_Class_1[(byte)arg_1.var_28])[(arg_1.var_32 = arg_1).var_3 = (byte)var_40]).var_2 = Tester_Class_3.var_9; + double var_61; + (true ? (arg_1.var_32 = arg_1) : (arg_1.var_32 = (Tester_Class_3.var_27 = (arg_1.var_32 = arg_1)))).var_6 = var_43 | (Tester_Class_2.var_4 = !Tester_Class_3.var_4) ? (arg_1.var_26 = arg_2) : (Tester_Class_2.var_19 = Tester_Class_2.var_18); + } + + private final char func_7(int arg_0) + { + Tester_Class_2.var_4 &= var_43; + float var_62 = Tester_Class_3.var_9; + --var_40; + int var_63 = Tester_Class_1.var_1++; + { + "nncjfoit".indexOf((new int[(byte)'\\'])[(byte)var_36]); + if (var_43) + { + ((new Tester_Class_3[(byte)var_40][(byte)Tester_Class_2.var_1])[(byte)5046997225818337280L][(byte)var_63]).var_24 >>>= var_40; + } + else + { + --var_40; + } + --Tester_Class_2.var_1; + --var_63; + } + { + final byte var_64 = Tester_Class_1.var_4 ? (byte)'M' : (byte)(var_62 -= + ((byte)Tester_Class_1.var_8)); + float var_65; + var_62 *= ((Tester_Class_3)(new Tester_Interface_0[var_64])[var_64]).var_24++; + var_36 /= var_64; + { + double var_66; + } + var_40 += 3500240160155094016L; + ((new Tester_Class_1[var_64][var_64])[var_64][var_64]).var_3 = (byte)(Tester_Class_2.var_7 = (Tester_Class_1.var_7 = (Tester_Class_1.var_7 = (Tester_Class_1.var_7 = var_64)))); + ++Tester_Class_3.var_1; + } + --arg_0; + { + arg_0++; + } + Tester_Class_2.var_1++; + var_40 &= (short)((byte)Tester_Class_2.var_8 >> (((new Tester_Class_3[(byte)var_36])[(byte)(var_40 = Tester_Class_3.var_8)]).var_3 = (byte)((byte)3.3531374E38F * var_40))); + var_36 %= (var_62 = (byte)900943133); + var_36 = Tester_Class_3.var_33; + var_62 += (var_40 /= (byte)6766658341842315264L % (byte)'p') * (short)2019461672; + --var_40; + if (true) + { + var_62 *= 365879806965555200L; + } + else + { + var_36 -= ~9163555887358003200L; + } + Tester_Class_1.var_4 = Tester_Class_1.var_4; + { + var_40 <<= var_63; + } + var_40++; + String var_67; + return Tester_Class_1.var_8; + } + + private final static Tester_Interface_0 func_8(char arg_0, final Tester_Class_2 arg_1, final String arg_2) + { + ((new Tester[(byte)((Tester_Class_3)arg_1).var_28])[((Tester_Class_1)(var_39 = arg_1)).var_3 = ((Tester_Class_3.var_27 = (Tester_Class_3)arg_1).var_3 = (byte)+ -9.9100855E36F)]).var_38 = (var_43 ? "k" : Tester_Class_2.var_19).substring(350785312); + return (new Tester_Interface_0[(byte)'l'])[((Tester_Class_1)(var_39 = (Tester_Class_3.var_27 = (Tester_Class_3)arg_1))).var_3 = ((Tester_Class_3.var_27 = arg_1).var_3 = (((Tester_Class_3)arg_1).var_3 = (arg_1.var_3 = (arg_1.var_3 = (byte)'['))))]; + } + + private final int func_9(Tester_Class_3 arg_0, char arg_1) + { + final float var_68 = Tester_Class_3.var_9; + Tester_Class_2.var_18.toLowerCase(); + double var_69; + { + Tester_Class_3.var_29 ^= !false || Tester_Class_2.var_4; + } + Tester_Class_1 var_70; + (Tester_Class_3.var_27 = (Tester_Class_2)(var_70 = arg_0)).var_6 = (Tester_Class_2)((var_41 = arg_0).var_6 = (arg_0.var_6 = arg_0)); + "hv".codePointBefore(--Tester_Class_2.var_1); + var_41 = arg_0; + return ~ (((arg_0 = arg_0).var_24 &= arg_1) == 3.0764282E38F ? (byte)457565863 : ((arg_0 = arg_0).var_3 = (byte)arg_0.var_28)); + } + + private static void func_10(double arg_0, final Tester_Class_3 arg_1, double arg_2) + { + arg_1.var_32 = 'g' != 1.520646515461986E307 ? (arg_1.var_32 = arg_1) : arg_1; + Tester_Class_2.var_19.startsWith(Tester_Class_2.var_19 = Tester_Class_3.var_18); + Tester_Class_1.var_4 ^= true & (arg_1.var_3 = (arg_1.var_3 = (byte)- ((byte)1.4509185661781193E308))) > (arg_1.var_2 = var_40); + var_36 += Tester_Class_3.var_9; + } + + Tester_Interface_0 func_12(final Object arg_0, float arg_1) + { + switch (((Tester_Class_3)arg_0).var_3 = (byte)arg_1) + { + case 4: + var_41 = (Tester_Class_3)(var_39 = (Tester_Class_3.var_27 = (Tester_Class_3.var_27 = (Tester_Class_3)arg_0))); + double var_72 = (double)3858573493713776640L; + byte var_73 = (var_41 = (Tester_Class_2)arg_0).var_3 = (((Tester_Class_3)arg_0).var_3 = (byte)var_72); + break; + + case 13: + (Tester_Class_3.var_27 = (((Tester_Class_3)arg_0).var_32 = (Tester_Class_3)(Tester_Class_2)arg_0)).var_3 = (Tester_Class_2.var_1 *= ((Tester_Class_3)arg_0).var_24) == (byte)Tester_Class_3.var_33 ? (byte)188693954866039808L : (byte)Tester_Class_2.var_8; + break; + + default: + var_40 <<= (byte)157510337; + break; + + case 26: + + case 122: + + } + Tester_Interface_0 var_74; + long var_75; + var_41 = (var_41 = (var_41 = (Tester_Class_2)arg_0)); + arg_1 *= 1601420762; + var_74 = (var_41 = Tester_Class_1.var_4 ? (Tester_Class_3)arg_0 : (Tester_Class_2)arg_0); + (Tester_Class_1.var_4 ? (Tester_Class_3)(var_39 = (Tester_Class_3)arg_0) : (true ? (Tester_Class_3)arg_0 : (Tester_Class_3)arg_0)).var_28 *= 1066935145; + var_40 >>>= (byte)6.643183E36F / - ((byte)1.277596E37F); + { + ((Tester_Class_3)(((Tester_Class_3)((Tester_Class_3.var_29 ^= (Tester_Class_3.var_29 &= var_43)) ? (Tester_Class_2)arg_0 : (Tester_Class_2)arg_0)).var_32 = (Tester_Class_3.var_27 = (Tester_Class_2)arg_0))).var_28--; + } + var_38 = "qad"; + byte var_76 = ((Tester_Class_2)(var_39 = (Tester_Class_3)arg_0)).var_3 = true ? ((var_41 = (var_41 = (Tester_Class_3)arg_0)).var_3 = (byte)1.7128118638075888E308) : (byte)1.6562746603631249E308; + return var_39 = (Tester_Class_3)((var_41 = (Tester_Class_3)arg_0).var_6 = Tester_Class_2.var_18); + } + + protected final String func_13() + { + float var_77; + var_38 = (Tester_Class_2.var_19 = var_38); + Tester_Class_2.var_4 ^= !var_43 | (Tester_Class_3.var_29 ^= Tester_Class_1.var_4); + Tester_Class_3.var_1--; + Tester_Class_2.var_1++; + return Tester_Class_2.var_18; + } + + public static String execute() + { + try { + Tester t = new Tester(); + try { t.test(); } + catch(Throwable e) { } + try { return t.toString(); } + catch (Throwable e) { return "Error during result conversion to String"; } + } catch (Throwable e) { return "Error during test execution"; } + } + + public static void main(String[] args) + { + try { + Tester t = new Tester(); + try { t.test(); } + catch(Throwable e) { } + try { System.out.println(t); } + catch(Throwable e) { } + } catch (Throwable e) { } + } + + private void test() + { + int var_78 = 0; + var_39 = (new Tester_Class_1[(byte)var_40])[(byte)Tester_Class_3.var_33]; + while (var_43 && (var_78 < 70 && true)) + { + var_40 *= ~ ~Tester_Class_3.var_33 % Tester_Class_3.var_9; + var_78++; + var_39 = new Tester_Class_3(); + var_39 = (var_41 = (Tester_Class_3.var_27 = new Tester_Class_2())); + } + final Tester_Class_3 var_79 = (Tester_Class_1.var_4 ? ~Tester_Class_3.var_33 : var_36) == 1433764895112462336L ? new Tester_Class_3() : new Tester_Class_3(); + Tester_Class_2 var_80; + } + public String toString() + { + String result = "[\n"; + result += "Tester.var_40 = "; result += Printer.print(var_40); + result += "\n"; + result += "Tester.var_42 = "; result += Printer.print(var_42); + result += "\n"; + result += "Tester.var_36 = "; result += Printer.print(var_36); + result += "\n"; + result += "Tester.var_37 = "; result += Printer.print(var_37); + result += "\n"; + result += "Tester.var_39 = "; result += Printer.print(var_39); + result += "\n"; + result += "Tester.var_38 = "; result += Printer.print(var_38); + result += "\n"; + result += "Tester.var_43 = "; result += Printer.print(var_43); + result += "\n"; + result += "Tester.var_41 = "; result += Printer.print(var_41); + result += ""; + result += "\n]"; + return result; + } + static class Printer + { + public static String print(boolean arg) { return String.valueOf(arg); } + public static String print(byte arg) { return String.valueOf(arg); } + public static String print(short arg) { return String.valueOf(arg); } + public static String print(char arg) { return String.valueOf((int)arg); } + public static String print(int arg) { return String.valueOf(arg); } + public static String print(long arg) { return String.valueOf(arg); } + public static String print(float arg) { return String.valueOf(arg); } + public static String print(double arg) { return String.valueOf(arg); } + + + public static String print(Object arg) + { + return print_r(new java.util.Stack(), arg); + } + + private static String print_r(java.util.Stack visitedObjects, Object arg) + { + String result = ""; + if (arg == null) + result += "null"; + else + if (arg.getClass().isArray()) + { + for (int i = 0; i < visitedObjects.size(); i++) + if (visitedObjects.elementAt(i) == arg) return ""; + + visitedObjects.push(arg); + + final String delimiter = ", "; + result += "["; + + if (arg instanceof Object[]) + { + Object[] array = (Object[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print_r(visitedObjects, array[i]); + if (i < array.length - 1) result += delimiter; + } + } + else + if (arg instanceof boolean[]) + { + boolean[] array = (boolean[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print(array[i]); + if (i < array.length - 1) result += delimiter; + } + } + else + if (arg instanceof byte[]) + { + byte[] array = (byte[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print(array[i]); + if (i < array.length - 1) result += delimiter; + } + } + else + if (arg instanceof short[]) + { + short[] array = (short[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print(array[i]); + if (i < array.length - 1) result += delimiter; + } + } + else + if (arg instanceof char[]) + { + char[] array = (char[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print(array[i]); + if (i < array.length - 1) result += delimiter; + } + } + else + if (arg instanceof int[]) + { + int[] array = (int[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print(array[i]); + if (i < array.length - 1) result += delimiter; + } + } + else + if (arg instanceof long[]) + { + long[] array = (long[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print(array[i]); + if (i < array.length - 1) result += delimiter; + } + } + else + if (arg instanceof float[]) + { + float[] array = (float[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print(array[i]); + if (i < array.length - 1) result += delimiter; + } + } + else + if (arg instanceof double[]) + { + double[] array = (double[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print(array[i]); + if (i < array.length - 1) result += delimiter; + } + } + + result += "]"; + visitedObjects.pop(); + + } else + { + result += arg.toString(); + } + + return result; + } + } +} + + diff --git a/hotspot/test/compiler/6716441/Tester.java b/hotspot/test/compiler/6716441/Tester.java new file mode 100644 index 00000000000..9e76801cae3 --- /dev/null +++ b/hotspot/test/compiler/6716441/Tester.java @@ -0,0 +1,940 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6716441 + * @summary error in meet with +DoEscapeAnalysis + * @run main/othervm -Xcomp -XX:+AggressiveOpts Tester + */ + +/* Complexity upper bound: 70070 ops */ + +class Tester_Class_0 { + Object var_1; + + + public Tester_Class_0() + { + var_1 = "cmlv"; + { + final Object var_7 = false ? (var_1 = "flwnujmm") : (var_1 = ""); + } + float var_8 = 0F; + boolean var_9; + do + { + ((var_9 = (var_9 = (var_9 = false))) && true ? new String("yvirc") : "rmfkjbx").indexOf(99854165); + var_8++; + boolean var_10 = true; + var_10 |= true ? true : false; + var_10 |= false | var_10 ? (var_10 |= true) : true; + } while (var_8 < 1 && "tpb".charAt(~ ((byte)2449669946597620736L)) >>> (byte)1.704554E38F >= ('t' < var_8 ? (short)var_8 : 1237471887 / +4199632387838836736L)); + var_1 = (var_1 = "y"); + switch ((var_9 = "".equalsIgnoreCase("kqalxwsnu") | false) ? (new char[(byte)1.3230508534158742E308])[(byte)(short)93390917] : 'c') + { + case 'U': + + case 'W': + + case 'A': + + case 72: + + } + var_9 = (var_9 = false); + float var_11 = 0F; + var_9 = true; + for (var_1 = (var_1 = new boolean[(new byte[(byte)'O'])[(byte)'l']]); var_11 < 2; var_1 = (true ? "" : "nn").toUpperCase()) + { + var_9 = true; + var_11++; + var_9 = true; + int var_12 = (new short[(byte)1825213428])[(byte)1.6151095881186834E308] + (byte)(short)'V'; + } + var_1 = (new boolean[(byte)1546704177][(byte)6314352927310996480L][(byte)6838913812451802112L])["e".equalsIgnoreCase("d") ? (byte)3.964472879846357E307 : (byte)'L']; + var_9 = (var_9 = false); + } + + + + protected Object clone() + { + var_1 = (var_1 = "dbogknllu"); + var_1 = "jljax"; + var_1 = (var_1 = false ? "s" : "upqinst"); + if (false) + { + var_1 = (var_1 = (var_1 = "nwhu")); + } + else + { + short var_2; + var_2 = false ? (byte)((short)'e' - (byte)2.267975E38F) : (byte)1.28920093132789E308; + } + (((byte)2.3450009E38F >= (byte)- (+ - -1.6256751428449317E306 * 954071273906192384L) ? true : true) ? "gpv".substring(468176669, 1915798010) : "macqbvf").offsetByCodePoints("ivwivjege".charAt(1819923298) >>> (byte)((- ~653213024937366528L + 'N') * +1.0297164E38F) + (short)~ + -4535402293751053312L, (short)3837656677199316992L + (new byte[(byte)2.1586717E38F])[(byte)((short)719847962 - 8.599263E37F)]); + new String((char)650047353 > (short)'I' ? "maygldu".replaceAll("hpn", "bacoyows") : "nkx").endsWith(new String("h" + "vx")); + byte var_3; + return var_1 = "vbiccvdu"; + } + + public boolean equals(Object obj) + { + var_1 = "rxpocj"; + obj = "ndogtwvuh"; + { + { + var_1 = "vmdkvs"; + } + final boolean var_4 = false; + long var_5; + var_5 = (short)'G' >> + ((byte)1.1872624048733707E308); + } + var_1 = (new byte[(byte)(short)1.7804576633213148E308][(byte)(short)8.300151422843056E307])[(byte)3110360603258978304L]; + obj = "fudebwroh"; + obj = new Object[(false && false) & false ? (byte)8796624364629753856L : (byte)- +1.5843542184394165E308]; + if (true) + { + var_1 = new float[(byte)1372189277][(byte)((byte)8.352642520619892E307 == (! !false ^ true ? (short)1.3871033E37F : (byte)'f') ? 7.33899E37F - (short)2.2558552E37F : 2.6072269E38F)]; + } + else + { + var_1 = obj; + obj = new boolean[(byte)8.623747E37F][(byte)~ ((byte)(short)(byte)2100816354)]; + } + var_1 = new int[(new byte[(byte)7410132537719084032L])[(byte)1524949007]][(byte)((long)9188640 ^ 'n')]; + if (-3.0364305E38F > 8.114229090672013E307) + { + var_1 = (var_1 = new boolean[(byte)1.0354788699727844E308][(byte)-4867581638981979136L]); + } + else + { + obj = (obj = obj); + obj = (new int[(byte)'f'][(byte)7563033606293564416L])[(byte)2052737645]; + } + long var_6; + var_6 = (+ + ~3862500564271147008L != (short)8549491352795953152L || (byte)+ + (var_6 = 'D') > (var_6 = 1687952259)) && true ? (short)1756260278 : (byte)(short)3.202384E36F; + return false ^ ((false ? !true : true) ? false : (true ? ! !false : false)); + } + + + + public String toString() + { + String result = "[\n"; + result += "Tester_Class_0.var_1 = "; result += Tester.Printer.print(var_1); + result += ""; + result += "\n]"; + return result; + } +} + + +interface Tester_Interface_1 { +} + + +final class Tester_Class_2 extends Tester_Class_0 { + static char var_13; + final static long var_14 = ~ ~ (((false ? !true ^ !true : !false | true) ? (byte)1.4363583E38F : (byte)(short)'X') * + + +3767002589844008960L << (var_13 = (var_13 = 'X'))); + + + public Tester_Class_2() + { + ((true ? (byte)- ((byte)2.6338962E38F) : (byte)'H') <= (short)8.671266E37F || !false & true ? (Tester_Class_0)(var_1 = "tgoexsr") : (Tester_Class_0)(var_1 = "mptusv")).var_1 = "tbxbgyti"; + var_1 = true ? (var_1 = "islgpxwa") : "rypkbu"; + var_1 = "vngiif"; + var_13 = (var_13 = (short)~ (-3250577075350561792L + +2983539228635145216L - '`') < 861590495 * (short)1.5299644E38F ? 'V' : 'G'); + Object[] var_27; + var_1 = (var_1 = "glu"); + } + + + + + + private static int func_0(Tester_Interface_1 arg_0, Tester_Interface_1 arg_1, final int arg_2) + { + var_13 = 'i'; + new String(); + (true ? "pu" : "oltbcysyd").substring(1236315614); + byte var_15; + var_15 = (new byte[(byte)1582653493940204544L][(byte)(char)-1.5806537192822515E308])[(byte)1.2986292E38F][(byte)(short)arg_2]; + if (true || true) + { + ((new Tester_Class_2[var_15 = (byte)'q'])[var_15 = 7.653082E37F < (var_13 = 'o') ? (byte)- - + +3.1640875E38F : (byte)-6820511772487837696L]).var_1 = (new Tester_Class_0[(byte)(short)(new byte[(byte)1080194717])[(byte)8297829563314362368L]])[var_15 = (var_15 = (var_15 = (var_15 = (byte)'t')))]; + double[] var_16; + } + else + { + arg_1 = (arg_1 = arg_0); + } + var_13 = (var_13 = 'o'); + var_13 = (false || false ^ false) ^ !true ? 'Z' : (var_13 = 'i'); + return true ? (var_15 = (byte)'C') : 1120493294; + } + + static double func_1(final int arg_0, long arg_1, long arg_2) + { + "ghtfhmbeg".compareToIgnoreCase("djn"); + { + ((true ? true : ! !true) ? "" : "ioowivxge").substring(1844979226, "ppsk".startsWith("lllmn") | false ? arg_0 * arg_0 : (byte)663320199); + ((Tester_Class_0)(((new Tester_Class_2[(byte)4797509007239530496L])[(byte)(- -2.8961086E38F - arg_1)]).var_1 = new float[(byte)('m' / 6.0657416E37F)])).var_1 = new boolean[(byte)(short)(+4.515459E37F - (short)arg_0)][(byte)(-1.3002677717712297E308 + (var_13 = "bcjfdnc".charAt(arg_0)) * (arg_2 - 1.6058080036165979E308))]; + var_13 = 'E'; + } + float var_17 = 0F; + --arg_1; + do + { + final String[] var_18 = new String[(byte)(short)arg_0]; + var_17++; + Object var_19 = (new Object[(byte)var_17])[(false ? "xfkx".equalsIgnoreCase("j") : !false) ^ !false ? (byte)(1.6627987E35F * 2.62825E38F) : (byte)var_17]; + } while (var_17 < 2 && false | ((byte)1.4661115E38F | arg_0 - 'l') < ('J' & (byte)+ ((float)1200013759))); + long var_20 = 0L; + arg_2--; + for (var_13 = (var_13 = (var_13 = (var_13 = (var_13 = (var_13 = 'p'))))); var_20 < 4; var_13 = 'y') + { + new String((true | true ? "oxpfy" : "gaynucv") + (true ? "cmrrk".substring(653981013, arg_0) : "ociewl" + "srhbvcgci")); + var_20++; + arg_2 >>= arg_0; + arg_2 = false ? (byte)'l' : (byte)(~var_20 - (byte)1.1290483681734838E308); + } + ((new Tester_Class_2[(byte)arg_1++])[(byte)685259385]).var_1 = new Tester_Interface_1[(byte)arg_0]; + --arg_1; + var_13 = 483446392 - (byte)'P' < ((short)(true ? (var_13 = 't') : 'n') & (short)'l') ? (var_13 = 'q') : (var_13 = (var_13 = 'h')); + var_13 = 'y'; + return 1.097000731360761E308; + } + + private final boolean func_2(final short[][] arg_0, byte arg_1, Object arg_2) + { + var_1 = new char[arg_1]; + arg_1 /= (var_13 = 'A') + -var_14; + int var_21 = 0; + arg_2 = (new Tester_Class_0[arg_1 += var_14][arg_1])[arg_1 >>>= 'R' + + -var_14 - 4078879817303787520L]; + for (arg_1--; (+ +1.1473423E38F < 'w' & false | var_21 != (short)4633877342445358080L | !false ? false | !false : true) && (var_21 < 1 && (arg_0[arg_1])[arg_1 %= 7.136449148111178E307] > 7.362329280963185E307); arg_1++) + { + arg_1 = (arg_1 %= + -9.872181578576624E307); + var_21++; + arg_1 /= 7.365334241099395E307; + var_13 = (var_13 = (var_13 = (var_13 = (var_13 = (var_13 = 'A'))))); + } + arg_1 >>= var_14; + boolean var_22 = false; + return ((var_22 &= true) && var_22 ? (short)1.568578228250838E308 : arg_1) >= (new float[arg_1])[arg_1 /= 1.6849858816110731E308]; + } + + public final String func_3(Tester_Interface_1 arg_0) + { + arg_0 = arg_0; + arg_0 = (arg_0 = arg_0); + var_13 = (var_13 = (var_13 = (var_13 = "rqimya".charAt(390686412)))); + ((Tester_Class_0)(var_1 = "suxd")).var_1 = new Tester_Class_0[(byte)(float)(short)1.584667675541511E308]; + arg_0 = ((byte)+ + - +1.3636011E38F == 'L' ^ true) & (!true | true) ? (arg_0 = arg_0) : arg_0; + var_1 = (((Tester_Class_0)(var_1 = (Tester_Class_0)(var_1 = "ndxcurdr"))).var_1 = (var_1 = (var_1 = "schnhe"))); + var_1 = (new Object[(byte)(var_13 = (var_13 = 'G'))])[(byte)((byte)1.5366658198344074E308 - 1.0051541518022535E308)]; + var_13 = (var_13 = 'x'); + (true ? (Tester_Class_0)(var_1 = "slesdph") : (Tester_Class_0)(var_1 = "wxj")).var_1 = false ? (Tester_Class_0)(var_1 = "iddvoil") : (Tester_Class_0)(var_1 = "yjbxhuip"); + var_13 = (var_13 = 'f'); + var_1 = (new short[(byte)1.8902424351360974E307])[(new byte[(byte)1552392028])[(byte)'V']] >= (1.2449926736063704E308 + 'K') / (short)1.0847178E38F / ((short)'M' % (1.225890077244388E308 + + ((byte)1.5358312881295287E308))) ? (Tester_Class_0)(var_1 = "khfntg".toString()) : (Tester_Class_0)(var_1 = "jkttx"); + { + arg_0 = arg_0; + } + arg_0 = arg_0; + var_13 = (true ? "jndbffakc" : "hhcsc").charAt((byte)7322932713210745856L >> (short)(var_13 = (var_13 = 'R'))); + var_13 = (var_13 = (var_13 = 'U')); + { + "gepdu".trim(); + } + var_13 = 'H'; + new String(); + { + (false ^ (true ^ ((!true | ! !true) ^ ! (1.7800668444792402E308 * var_14 >= (var_13 = (var_13 = (var_13 = 'g')))))) ? "dsm" : "g").toUpperCase().toString(); + ((Tester_Class_0)(var_1 = "fcdvd")).var_1 = (Tester_Class_0)(((Tester_Class_0)(var_1 = "uwhnte")).var_1 = "vpatqpd"); + } + switch (((byte)((byte)((int)'n' / var_14) >>> (short)7.786475993917233E307 - (var_13 = 'm')) <= (("".endsWith("pbypgis") ^ false) & true ? (byte)func_0(arg_0, arg_0, 723551781) : (short)140766856) ? true | (!false || false) : 'F' != (var_13 = 'V')) ? (var_13 = 'j') : 'D') + { + case 'p': + + } + var_13 = (var_13 = (var_13 = 'y')); + var_13 = ("" + "wwbxwyt").charAt((short)8373354379880418304L << (short)(byte)1.557224945027141E308); + arg_0 = true ? (arg_0 = arg_0) : arg_0; + ((Tester_Class_0)(((Tester_Class_0)(var_1 = "rmkvbp")).var_1 = (var_1 = "gvb"))).var_1 = new Tester_Class_0[(byte)var_14]; + arg_0 = arg_0; + return 2.5245162E38F + 3.9088502076337727E307 > 1.0883030748712796E308 ? "efttufmbg" : "xy"; + } + + protected short func_4(final double arg_0, long arg_1, final Object arg_2, final byte arg_3) + { + (((("ptnmpn".startsWith("xxgxjvsie") ? !true : ! !true) ? ! !false : false) ? (true ? true : false) : (var_13 = (var_13 = 'X')) == 1948276447) ? (Tester_Class_0)(var_1 = new float[arg_3][arg_3]) : (Tester_Class_0)arg_2).var_1 = new double[(new byte[arg_3][arg_3])[arg_3][arg_3]][arg_3]; + boolean var_23; + return true ? (short)'r' : (byte)(short)('\\' >>> arg_3); + } + + final static byte func_5(final long arg_0, float arg_1, final double arg_2) + { + arg_1 = arg_2 <= ((var_13 = 'D') <= - (3463565869695079424L << 'S') ? 'a' : (var_13 = 'o')) | (true ? !false : !false) ? (byte)(short)(var_13 = 'r') : (short)(byte)'S'; + { + { + arg_1 %= '_'; + } + char var_24 = 'G'; + "hc".lastIndexOf(""); + arg_1 *= (arg_1 /= (byte)-8.308933840953204E306); + --var_24; + arg_1 /= ~ ((byte)2.2736606E38F) <= (3392301601783633920L == 3.015267E38F ^ ! !true ? (byte)88382550 : (byte)1.2019729E38F) ? 1027309963 : + -4.355887546298483E307; + ((new Tester_Class_2[(byte)arg_2])[(byte)870592870]).var_1 = "i"; + arg_1 /= 't'; + } + var_13 = 'f'; + Tester_Class_0 var_25 = (new Tester_Class_0[(byte)arg_1])[(true | false ^ !false) & ! !true & - +2.758844E38F >= (new short[(byte)5.9160883E37F])[(byte)'r'] ? (byte)arg_0 : (byte)((short)1802078016 & arg_0)]; + arg_1 /= (byte)arg_2; + var_13 = 'R'; + boolean var_26 = (true ? false : !false) ? false : !true == ! !false; + arg_1 %= (var_26 ^= (byte)1101752087 <= (short)arg_1) ? arg_1 : (float)1882235314; + var_25 = var_25; + if (var_26 &= var_26) + { + var_13 = "".startsWith("vp", - ((byte)2040501187) ^ (byte)-3921263616446438400L) ? "gam".charAt(+ ((byte)arg_1)) : (var_13 = 'H'); + arg_1 /= var_26 | ! (var_26 ^ (byte)arg_0 <= (var_13 = 'r') | (var_26 |= var_26)) ? 'N' : ~8963227563301903360L; + } + else + { + var_13 = 'l'; + var_25 = (var_25 = var_25); + } + arg_1 += (byte)(("m".substring(837996717, 861903057).startsWith("vwpky", (var_13 = 'Z') % (byte)arg_1) ? !false ^ !var_26 : var_26) ? (byte)arg_1 : ((var_26 | var_26) ^ !false ? (short)'U' : (short)'d')); + ((1.3445538E38F < (arg_1 -= 1236356135) ^ (var_26 = true)) & var_26 ? var_25 : (var_25 = var_25)).var_1 = true ? (var_25.var_1 = var_25) : (var_25.var_1 = var_25); + var_26 |= - ((byte)251113415) < (short)arg_1 & false & false; + arg_1 += (var_26 &= true) ? 7.546147305340402E307 : (true & !var_26 ? (byte)1.5107802154474685E307 : (byte)arg_1); + var_25.var_1 = true ? "bqsewhn" : "aojssvan"; + return (byte)(var_13 = (char)(new short[(byte)46697464])[(byte)var_14]); + } + + public String toString() + { + String result = "[\n"; + result += "Tester_Class_2.var_13 = "; result += Tester.Printer.print(var_13); + result += "\n"; + result += "Tester_Class_2.var_14 = "; result += Tester.Printer.print(var_14); + result += "\n"; + result += "Tester_Class_2.var_1 = "; result += Tester.Printer.print(var_1); + result += ""; + result += "\n]"; + return result; + } +} + +public class Tester { + static Tester_Class_0 var_28; + double var_29 = 4.861846831496217E307; + static byte var_30 = 79; + static boolean var_31 = false; + final byte var_32 = 48; + + + public short func_0(final byte arg_0, boolean arg_1, final double arg_2) + { + --var_30; + new Tester_Class_2().var_1 = "xdwldeqhc"; + char var_33 = 'd'; + return (var_31 = var_30 < (new short[var_30])[var_30]) ? (short)(var_33 >>>= (short)2.3152642E38F) : var_30; + } + + private final float func_1(final long arg_0, final Tester_Class_0 arg_1, Tester_Class_0 arg_2, final char arg_3) + { + { + new Tester_Class_0(); + } + var_30 >>= (short)1.1469118780047631E308; + var_31 |= var_31; + if (true) + { + Tester_Class_2 var_34 = (var_31 ^= (var_31 ^= false)) ? (Tester_Class_2)arg_1 : (new Tester_Class_2[var_32])[var_30]; + } + else + { + "shqjwg".compareToIgnoreCase(false ? "gxoyw" + "cx" : "r" + "icj"); + } + ((new Tester_Class_2[var_32])[++var_30]).var_1 = (new Object[var_30][var_32][var_32])[var_30 |= var_32]; + arg_1.var_1 = (arg_2 = arg_2); + arg_1.var_1 = (((new Tester_Class_2[var_30])[var_30 = var_32]).var_1 = new String[var_32]); + var_28 = (Tester_Class_2)((arg_2 = arg_2).var_1 = new double[var_30]); + arg_2 = arg_1; + final boolean var_35 = "qjsdfuyru".endsWith("nuw" + "bne") | arg_3 >= 1.2054153346397785E308; + var_31 &= (var_31 ^= var_35); + { + var_31 &= var_31 ? false : !false; + } + if (var_31) + { + var_28 = (new Tester_Class_2[var_32])[var_32]; + } + else + { + arg_1.equals((new Object[var_32])[var_32]); + } + ((var_31 ^= true) ? "x" : "euc").substring(+ (var_30 ^= var_30) & (byte)(new short[var_30])[var_30 /= 4.220757896697652E307]); + arg_2 = var_31 ? (Tester_Class_2)arg_1 : (Tester_Class_2)arg_2; + arg_2 = (Tester_Class_2)(new Object[var_32][var_32])[var_30][var_32]; + return 9.932983E36F * (Tester_Class_2.var_13 = arg_3); + } + + public int func_2(Tester_Class_0 arg_0) + { + "ptwusxrxn".indexOf("v"); + var_30 |= 1770666843; + var_29 += (short)(Tester_Class_2.var_14 / Tester_Class_2.var_14); + if (var_31) + { + var_30 = var_32; + } + else + { + double var_36; + } + if (true) + { + var_30 -= 2.1474216E38F; + } + else + { + var_29 += 'f'; + } + var_29 -= Tester_Class_2.var_14; + if (false) + { + arg_0.var_1 = arg_0; + } + else + { + arg_0 = (var_28 = (var_28 = arg_0)); + } + { + Tester_Class_2.var_13 = 'p'; + } + var_29 = ~Tester_Class_2.var_14 % 'y'; + switch (var_30 >>>= var_30) + { + case 115: + + } + arg_0 = arg_0; + var_31 ^= (var_31 = true); + return "".charAt(~var_32) >> ((var_31 &= true) ? var_30 : var_32); + } + + protected double func_3(boolean[] arg_0, double arg_1, long[][] arg_2) + { + switch (var_31 ? (short)(var_32 / (arg_1 /= (int)(arg_1 *= (Tester_Class_2.var_13 = ']')))) : (var_30 ^= + +Tester_Class_2.var_14 * (+ +3075166460237931520L / '['))) + { + case 31: + + case 118: + + } + Tester_Class_2.var_13 = 'm'; + "mwkh".indexOf("hdgiquve", (new char[var_32])[var_30 &= 'S'] % var_30); + final boolean var_37 = false; + char var_38 = 'F'; + var_28 = (new Tester_Class_2[var_30][var_30])[var_30 *= var_38][var_32]; + new Tester_Class_0().var_1 = new char[var_32][var_30]; + var_30 &= var_30; + var_31 |= (var_31 |= true); + int var_39 = 1769831681; + final Tester_Class_2 var_40 = (var_31 |= false ? var_31 : var_37) ? (Tester_Class_2)((new Object[var_30][var_30][var_32])[var_30 <<= var_30])[var_30][var_30++] : (Tester_Class_2)new Tester_Class_0(); + var_30 -= +var_30; + "dvmuim".replaceFirst("clmisuxu", "".toLowerCase() + "xi"); + var_39 = var_38 - (short)585806817; + arg_1 += (double)(short)(6.4329855E37F / var_32 * (var_38 += 'w')); + ++var_39; + var_40.var_1 = (var_28 = (var_28 = var_40)); + var_29 /= 3.5705444317400964E306; + Tester_Interface_1 var_41; + return arg_1; + } + + final char func_4(final long arg_0, int arg_1, final int arg_2) + { + { + Tester_Class_2.var_13 = 'D'; + var_31 = false; + } + if (var_31) + { + var_30--; + Tester_Class_0 var_42 = var_28 = (new Tester_Class_0[var_32])[var_32]; + } + else + { + Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'H'); + } + var_28 = (Tester_Class_2)(new Tester_Class_2().var_1 = (var_28 = (new Tester_Class_0[var_30])[var_30])); + arg_1 &= var_32; + --var_30; + return Tester_Class_2.var_13 = 'n'; + } + + final static Object func_5() + { + var_28 = (Tester_Class_2)(! (var_31 |= true & var_31) ? (new Tester_Class_0[var_30])[var_30] : (var_28 = (new Tester_Class_0[var_30])[var_30])); + var_31 |= false; + return var_31 ? (((Tester_Class_2)(new Object[var_30])[var_30]).var_1 = (new Tester_Class_0[var_30 /= 1366944127])[var_30]) : (new Tester_Class_0[var_30][var_30])[var_30 += 1.4070924450257891E307][var_30]; + } + + static Tester_Class_2 func_6(final Object arg_0) + { + var_28 = (var_31 ^= true) ? (Tester_Class_2)arg_0 : (Tester_Class_2)arg_0; + ((new Tester[--var_30])[var_30]).var_29 -= -3.0029087E38F * (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'k')); + var_28 = (Tester_Class_2)(var_28 = (var_28 = (var_28 = (Tester_Class_0)arg_0))); + return false ? new Tester_Class_2() : new Tester_Class_2(); + } + + private static Tester_Interface_1 func_7(byte arg_0, Tester_Class_2 arg_1, final int arg_2, char arg_3) + { + { + var_31 = var_31; + var_31 |= (var_31 &= (var_31 |= !true)); + arg_0 += Tester_Class_2.var_14; + } + var_30 = (var_30 *= ((new Tester[arg_0 ^= 1039546367])[arg_0]).var_32); + arg_1.var_1 = (var_31 ^= (var_31 &= !var_31 && !var_31)) ? (arg_1 = (arg_1 = arg_1)) : (new Tester_Class_0[arg_0++][arg_0])[arg_0][arg_0]; + arg_1.var_1 = var_31 ? "jpmg" : "epwvupaqp"; + var_28 = arg_1; + if (false) + { + arg_1 = arg_1; + } + else + { + arg_3 += var_30 % -9.298157E37F; + } + arg_1.var_1 = ((var_28 = (var_28 = arg_1)).var_1 = ((var_28 = arg_1).var_1 = "rlmf")); + var_28 = (arg_1 = arg_1); + arg_1 = arg_1; + { + var_31 = true; + } + (arg_1 = arg_1).var_1 = (arg_1.var_1 = (arg_1 = arg_1)); + final short[] var_43 = new short[(var_31 &= false) ? arg_0 : var_30]; + final short var_44 = 18087; + return false ? (new Tester_Interface_1[var_30 %= Tester_Class_2.var_14])[arg_0 -= 8.913955E37F * +arg_0] : (new Tester_Interface_1[var_30])[var_30]; + } + + private static float func_8(final Object[] arg_0, final byte arg_1, Tester_Class_0[] arg_2) + { + ((new Tester_Class_2[var_30 /= -2.37832E38F])[((new Tester[arg_1])[(new byte[arg_1])[arg_1]]).var_32]).var_1 = new Tester_Interface_1[arg_1]; + if (var_31) + { + var_28 = (Tester_Class_2)(var_28 = arg_2[var_30]); + } + else + { + var_30 -= Tester_Class_2.var_14; + final int var_45 = 1864933386; + final Tester_Class_0 var_46 = var_28 = (new Tester_Class_2[arg_1][var_30 |= Tester_Class_2.var_14])[((new Tester[arg_1][var_30])[var_30][var_30]).var_32][arg_1]; + var_31 &= (var_31 ^= false); + var_30 += (false ? 2.7581227E37F : + +1.8832631E38F) * ('P' * -1.9479086E38F); + } + (var_28 = (Tester_Class_2)arg_2[arg_1]).var_1 = (new Tester_Class_2[var_30][arg_1][arg_1])[arg_1]; + ++var_30; + (var_28 = (new Tester_Class_2[var_30])[arg_1]).var_1 = false ? (new Tester_Class_0[var_30][var_30])[var_30][arg_1] : arg_2[var_30]; + var_31 |= false; + ((new Tester[arg_1][var_30 >>>= (char)1981599])[arg_1][arg_1]).var_29 = false ^ (var_31 = var_31) ? (Tester_Class_2.var_13 = "nes".charAt(1080898679)) : - (var_30 %= 'n') ^ arg_1; + { + ((new Tester[arg_1])[var_30]).var_29 = (short)(Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'h')); + } + Tester_Class_2.var_13 = 'j'; + ((new Tester_Class_2[arg_1])[var_30]).var_1 = new byte[var_30]; + var_31 ^= (var_31 ^= !false); + "wcbi".toString(); + final byte var_47 = var_30; + if (true) + { + "mpbkilw".substring(199662864); + } + else + { + var_30++; + } + Tester_Class_2.var_13 = '`'; + "yujypq".indexOf("crve" + "inmvh", false ? ~arg_1 : "vukbkc".charAt(528096652)); + Tester_Class_2 var_48 = (Tester_Class_2)((!var_31 & (var_31 ^= false ^ !true) ? false | !true : false) ? (var_28 = (Tester_Class_2)arg_0[var_30]) : (new Tester_Class_2[arg_1])[var_30]); + return (float)(var_31 ^ var_31 ? (var_30 ^= (short)((new Tester[var_30])[var_30]).var_29) : (var_30 /= - -5.917837279005691E307 - - +3.2004715720509636E306)); + } + + final Tester_Class_0 func_9() + { + var_30 += -3531557622894482432L / ~var_30; + var_28 = (var_28 = (new Tester_Class_2[var_30 += + -7.0203367E37F])[var_30]); + var_31 ^= ! !false ^ false; + if (true) + { + byte[] var_49; + var_31 &= true; + short var_50 = 14869; + } + else + { + (((new Tester[var_32][var_30][var_32])[var_30])[var_32][var_30]).var_29 *= 'h'; + } + final int var_51 = false ? +var_32 >>> ~var_30 : --var_30; + var_31 |= false; + return (new Tester_Class_0[var_32][var_32])[var_30][var_30]; + } + + public static Object func_10() + { + Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'O'); + return ((Tester_Class_2)(new Object[--var_30])[var_30]).var_1 = (((Tester_Class_2)(new Object[var_30])[var_30]).var_1 = "iu"); + } + + protected byte func_11(final Tester_Interface_1[] arg_0) + { + { + --var_30; + var_29 *= (short)1749707986816114688L; + var_31 = (var_31 = (var_31 |= var_31)); + var_30 -= 6.4575257E37F; + } + var_28 = (var_28 = func_9()); + Tester_Class_2.var_13 = 'b'; + var_30--; + var_28 = (var_28 = (var_28 = (var_28 = (Tester_Class_2)func_10()))); + var_28 = (new Tester_Class_2[var_32])[var_30]; + char var_52 = (var_31 = false) ? (char)+ +Tester_Class_2.var_14 : (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = '_')); + if (false) + { + var_30 += (short)(var_32 + 840104459); + } + else + { + var_29 /= 2.5320765E38F; + } + if (true) + { + var_30 %= 379977167934025728L; + } + else + { + var_52 = var_52; + } + var_30 >>= ('A' ^ --var_30) & 'H'; + Tester_Class_2 var_53; + final int var_54 = 771623383; + var_29 %= (+1.938582E37F - 'G') * ++var_30; + int var_55 = (short)6.234053079170724E306 - (int)'^' / ((var_31 &= (var_31 ^= var_31)) ? (short)var_30 : ++var_30); + var_55 >>>= var_55 / ~6865244393150017536L; + var_31 ^= !false; + return var_30 >>>= 4351766607072508928L >> func_0(var_32, var_31, 1.021781609675458E308); + } + + public static String execute() + { + try { + Tester t = new Tester(); + try { t.test(); } + catch(Throwable e) { } + try { return t.toString(); } + catch (Throwable e) { return "Error during result conversion to String"; } + } catch (Throwable e) { return "Error during test execution"; } + } + + public static void main(String[] args) + { + try { + Tester t = new Tester(); + try { t.test(); } + catch(Throwable e) { } + try { System.out.println(t); } + catch(Throwable e) { } + } catch (Throwable e) { } + } + + private void test() + { + { + ((Tester_Class_2)(Tester_Class_0)((var_31 = true) ^ (var_31 |= false & true) ? func_10() : new Tester_Class_2[var_32])).var_1 = ((var_28 = new Tester_Class_0()).var_1 = (new Tester_Class_0().var_1 = new Tester_Class_2())); + } + new String(); + Tester_Class_2.var_13 = '['; + var_28 = (Tester_Class_2)(((var_31 ^= true) ? func_9() : new Tester_Class_0()).var_1 = new Tester_Class_2()); + var_28 = new Tester_Class_0(); + new String(); + { + if ((new boolean[var_30])[var_30] & 732877932 == 1.4654316E38F & "xpqy".replace(']', 'f').startsWith("pqrqunvfx") ? ((var_31 ^= (var_31 &= var_31)) ? !var_31 : (var_31 &= true)) : var_31) + { + var_31 &= var_31; + } + else + { + func_2(var_28 = new Tester_Class_0()); + } + { + ((new Tester_Class_0[var_30][var_30])[var_30][var_30]).var_1 = "uwrbjvl"; + var_28 = (Tester_Class_0)func_5(); + } + Tester_Class_2.var_13 = 's'; + Tester_Class_0 var_56 = var_28 = true ? func_6(func_5()) : (new Tester_Class_2[var_30][var_32])[var_32][var_32]; + double var_57 = 0; + var_29 += 1024895641427426304L % ~ ~Tester_Class_2.var_14; + while ((true || (var_31 = var_31)) && var_57 < 12) + { + (false & !false ? var_56 : (var_56 = var_56)).var_1 = "vbc"; + var_57++; + var_29 += func_0(var_30 /= (short)var_30 / var_32, false, var_57); + (var_31 ? (Tester_Class_2)var_56 : (new Tester_Class_2[var_30])[var_30]).var_1 = new double[var_31 ? (var_30 |= 177265600183083008L) : var_32]; + } + switch (var_31 ^ var_31 | ! (var_31 = false) & (var_31 & false) ? (true ? (short)var_30 : func_0(var_30, true, var_57)) : func_0(var_30, var_31, var_29 /= 2.7203017E38F)) + { + case 23: + var_31 ^= true ? var_31 : var_31; + break; + + case 40: + + default: + + case 104: + + } + Object var_58 = (var_31 ^= (var_31 ^= false) | (~3392263608888292352L < 1681682009 | var_31)) ? (((new Tester_Class_2[Tester_Class_2.func_5(Tester_Class_2.var_14, 3.3507317E38F, var_57)])[var_30 %= var_32]).var_1 = (var_56 = (Tester_Class_0)func_5())) : func_5(); + (var_56 = (var_28 = (var_56 = func_6(var_58)))).var_1 = (((new Tester_Class_2[var_30])[var_30]).var_1 = new float[(byte)Tester_Class_2.var_14][var_32]); + new Tester_Class_2().var_1 = new double[var_30]; + final Tester_Class_0 var_59 = var_28 = (!false & (false || (var_31 && !var_31) & false) ? var_31 : (var_31 |= !var_31)) ? (Tester_Class_2)(var_28 = new Tester_Class_2()) : (false ? new Tester_Class_2() : (Tester_Class_2)var_58); + } + var_30--; + { + var_29 += ~func_11(((new Tester_Interface_1[var_32][var_30][var_32])[var_30 ^= var_30])[var_32]); + } + float var_60 = 0F; + double var_61 = var_29; + do + { + long var_62; + var_60++; + "vcs".offsetByCodePoints((short)('w' | (short)var_30) & (new short[--var_30])[var_30], ((var_31 |= var_31) ^ (var_31 = var_31) ? var_32 : var_30) - (short)86413218); + } while (false && (var_60 < 100 && ((var_31 = false) ? var_31 : (var_31 ^= false)) & var_31)); + long var_63 = 0L; + double var_64 = (var_31 ? (Tester_Class_2.var_13 = 'V') : 'e') - (var_29 = 'A') * (var_29 = var_30); + var_31 &= (short)+ var_30-- + var_30 <= var_60; + while (false && (var_63 < 23 && false)) + { + var_30 >>= func_0(var_30, var_31, var_29) ^ ("".endsWith("mecvlajq" + "jhrbf") ? var_30 : (short)var_61); + var_63++; + var_28 = (Tester_Class_2)(var_28 = new Tester_Class_2()); + new Tester_Class_0(); + } + double var_65 = 0; + var_61 -= var_65; + for (((var_31 &= (var_31 ^= var_31)) | var_31 ? new Tester_Class_2() : new Tester_Class_2()).var_1 = ! (var_31 = false) && !var_31 ? func_10() : new Object[var_32][var_32]; var_31 | var_31 && (var_65 < 107 && (false ? !var_31 : (var_31 &= var_31))); var_30 *= Tester_Class_2.var_14) + { + var_28 = var_30 > (var_31 | true ? (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'k')) : (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'r'))) ? (Tester_Class_2)((var_28 = (Tester_Class_0)func_5()).var_1 = func_5()) : new Tester_Class_2(); + var_65++; + var_29 = "efothsl".startsWith("qk") ? 3.2306712E37F : +1.1835607464479516E308; + new Tester_Class_2().var_1 = new Tester_Class_0(); + } + double var_66 = 0; + func_6(((Tester_Class_2)((true ? (Tester_Class_2)func_10() : (Tester_Class_2)func_9()).var_1 = (var_28 = (Tester_Class_2)func_10()))).var_1 = ""); + while (false | (new boolean[var_30][var_30])[var_30][var_32] && (var_66 < 104 && false)) + { + ((var_31 ^= !false) ? "" : "slgr").toUpperCase(); + var_66++; + var_28 = func_6(func_9().var_1 = func_10()); + var_31 |= (var_31 |= true); + } + Tester_Class_2.var_13 = var_31 ? (Tester_Class_2.var_13 = 'Y') : (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = func_4(var_63, 137999726, 1870981930)))); + int var_67 = 0; + final double var_68 = 9.955130040461458E307; + do + { + "".lastIndexOf(var_32 != (Tester_Class_2.var_13 = 'f') ? (Tester_Class_2.var_13 = 'C') : ~var_30, (char)3.187607E38F + (var_30 /= var_30)); + var_67++; + Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'B'); + } while (var_67 < 9 && var_31 ^ var_31); + int var_69 = 0; + (true ? func_6(func_10()) : (Tester_Class_2)func_9()).var_1 = ((var_28 = (var_28 = new Tester_Class_2())).var_1 = (func_6(new Tester_Class_2().var_1 = new Tester_Class_0()).var_1 = (Tester_Class_2)func_9())); + do + { + var_28 = (Tester_Class_2)(var_28 = (Tester_Class_0)(new Tester_Class_2().var_1 = "qs")); + var_69++; + var_31 ^= var_31; + } while (var_69 < 189); + (! (var_31 = true) | var_31 ? new Tester_Class_2() : (new Tester_Class_0[var_30])[var_30]).var_1 = (((new Tester_Class_2[var_30 ^= (short)var_30])[var_30]).var_1 = (var_31 ? var_31 : (var_31 |= false)) ? "lfhliyphg" : "impovq"); + ((var_31 ? var_32 == (short)8901596111720974336L : 220705842 != var_60) ? (new Tester_Class_2[var_30])[var_32] : (new Tester_Class_2[var_30][var_32])[var_30][var_30]).var_1 = (var_28 = ((char)var_30 >= "pngjthlf".lastIndexOf("jjbuojp") & var_31 ? var_31 : var_31) ? (new Tester_Class_2[var_32])[var_30] : func_6(new Tester_Class_2().var_1 = new String[var_32])); + Tester_Class_2.var_13 = 'c'; + } + public String toString() + { + String result = "[\n"; + result += "Tester.var_29 = "; result += Printer.print(var_29); + result += "\n"; + result += "Tester.var_30 = "; result += Printer.print(var_30); + result += "\n"; + result += "Tester.var_32 = "; result += Printer.print(var_32); + result += "\n"; + result += "Tester.var_31 = "; result += Printer.print(var_31); + result += "\n"; + result += "Tester.var_28 = "; result += Printer.print(var_28); + result += ""; + result += "\n]"; + return result; + } + static class Printer + { + public static String print(boolean arg) { return String.valueOf(arg); } + public static String print(byte arg) { return String.valueOf(arg); } + public static String print(short arg) { return String.valueOf(arg); } + public static String print(char arg) { return String.valueOf((int)arg); } + public static String print(int arg) { return String.valueOf(arg); } + public static String print(long arg) { return String.valueOf(arg); } + public static String print(float arg) { return String.valueOf(arg); } + public static String print(double arg) { return String.valueOf(arg); } + + + public static String print(Object arg) + { + return print_r(new java.util.Stack(), arg); + } + + private static String print_r(java.util.Stack visitedObjects, Object arg) + { + String result = ""; + if (arg == null) + result += "null"; + else + if (arg.getClass().isArray()) + { + for (int i = 0; i < visitedObjects.size(); i++) + if (visitedObjects.elementAt(i) == arg) return ""; + + visitedObjects.push(arg); + + final String delimiter = ", "; + result += "["; + + if (arg instanceof Object[]) + { + Object[] array = (Object[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print_r(visitedObjects, array[i]); + if (i < array.length - 1) result += delimiter; + } + } + else + if (arg instanceof boolean[]) + { + boolean[] array = (boolean[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print(array[i]); + if (i < array.length - 1) result += delimiter; + } + } + else + if (arg instanceof byte[]) + { + byte[] array = (byte[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print(array[i]); + if (i < array.length - 1) result += delimiter; + } + } + else + if (arg instanceof short[]) + { + short[] array = (short[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print(array[i]); + if (i < array.length - 1) result += delimiter; + } + } + else + if (arg instanceof char[]) + { + char[] array = (char[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print(array[i]); + if (i < array.length - 1) result += delimiter; + } + } + else + if (arg instanceof int[]) + { + int[] array = (int[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print(array[i]); + if (i < array.length - 1) result += delimiter; + } + } + else + if (arg instanceof long[]) + { + long[] array = (long[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print(array[i]); + if (i < array.length - 1) result += delimiter; + } + } + else + if (arg instanceof float[]) + { + float[] array = (float[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print(array[i]); + if (i < array.length - 1) result += delimiter; + } + } + else + if (arg instanceof double[]) + { + double[] array = (double[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print(array[i]); + if (i < array.length - 1) result += delimiter; + } + } + + result += "]"; + visitedObjects.pop(); + + } else + { + result += arg.toString(); + } + + return result; + } + } +} + + diff --git a/jaxp/.hgtags b/jaxp/.hgtags index 63a4b81940f..c749c17a66d 100644 --- a/jaxp/.hgtags +++ b/jaxp/.hgtags @@ -2,3 +2,7 @@ a3b3ba7d6034dc754b51ddc3d281399ac1cae5f1 jdk7-b25 da43cb85fac1646d6f97e4a35e510bbfdff97bdb jdk7-b26 bafed478d67c3acf7744aaad88b9404261ea6739 jdk7-b27 +b996318955c0ad8e9fa0ffb56c74f626786e863f jdk7-b28 +617ee8607cfd5fd81f233f3c0b690f85084687a0 jdk7-b29 +2d94a238a1641d074e6032dcdceed461d6f85d6a jdk7-b30 +255d64ee287e926e8629dd80bc67690e65eeba30 jdk7-b31 diff --git a/jaxp/make/Makefile b/jaxp/make/Makefile index 6de97e7e673..1f742fd849d 100644 --- a/jaxp/make/Makefile +++ b/jaxp/make/Makefile @@ -1,5 +1,5 @@ # -# Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jaxws/.hgtags b/jaxws/.hgtags index 95df1d8c5f8..0224fa8b6b1 100644 --- a/jaxws/.hgtags +++ b/jaxws/.hgtags @@ -2,3 +2,7 @@ 59fd8224ba2da5c2d8d4c68e33cf33ab41ce8de0 jdk7-b25 debd37e1a422e580edb086c95d6e89199133a39c jdk7-b26 27d8f42862c11b4ddc4af2dd2d2a3cd86cda04c2 jdk7-b27 +eefcd5204500a11d6aa802dca9f961cf10ab64c2 jdk7-b28 +836c55713abab186e4de0c6eabd06ff008c7b8d0 jdk7-b29 +7f2466f8cc7009702e548d1a763254f546024d7e jdk7-b30 +f978623825364a2ad9c6f51d02fc9424a8b0bc86 jdk7-b31 diff --git a/jaxws/make/Makefile b/jaxws/make/Makefile index 3dc17bfa39f..e3019a3d45e 100644 --- a/jaxws/make/Makefile +++ b/jaxws/make/Makefile @@ -1,5 +1,5 @@ # -# Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/.hgtags b/jdk/.hgtags index 6f79b84210f..92c22dd5bf0 100644 --- a/jdk/.hgtags +++ b/jdk/.hgtags @@ -2,3 +2,8 @@ 75fca0b0ab83ab1392e615910cea020f66535390 jdk7-b25 fb57027902e04ecafceae31a605e69b436c23d57 jdk7-b26 3e599d98875ddf919c8ea11cff9b3a99ba631a9b jdk7-b27 +02e4c5348592a8d7fc2cba28bc5f8e35c0e17277 jdk7-b28 +e21f4266466cd1306b176aaa08b2cd8337a9be3d jdk7-b29 +b6d6877c1155621a175dccd12dc14c54f938fb8b jdk7-b30 +b7474b739d13bacd9972f88ac91f6350b7b0be12 jdk7-b31 +c51121419e30eac5f0fbbce45ff1711c4ce0de28 jdk7-b32 diff --git a/jdk/make/com/sun/Makefile b/jdk/make/com/sun/Makefile index 10a8642c817..0328f120d31 100644 --- a/jdk/make/com/sun/Makefile +++ b/jdk/make/com/sun/Makefile @@ -1,5 +1,5 @@ # -# Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/com/sun/java/pack/Makefile b/jdk/make/com/sun/java/pack/Makefile index 0a230f7364f..9229e3f4c99 100644 --- a/jdk/make/com/sun/java/pack/Makefile +++ b/jdk/make/com/sun/java/pack/Makefile @@ -97,9 +97,6 @@ ifeq ($(PLATFORM), windows) /D "J2SE_FTYPE=0x1L" RES = $(OBJDIR)/$(PGRM).res - - # Files built here do not compile with warning level 3 if warnings are fatal - COMPILER_WARNINGS_FATAL=false else LDOUTPUT = -o #Have a space LDDFLAGS += -lc diff --git a/jdk/make/com/sun/security/auth/module/Makefile b/jdk/make/com/sun/security/auth/module/Makefile index 303c8475163..d9f705d4df7 100644 --- a/jdk/make/com/sun/security/auth/module/Makefile +++ b/jdk/make/com/sun/security/auth/module/Makefile @@ -55,9 +55,6 @@ LIBRARY = jaas_nt EXTRA_LIBS += netapi32.lib user32.lib mpr.lib endif #fdlibm # code generates errors when compiled at warning level 3 and warnings are fatal - ifeq ($(ARCH_DATA_MODEL), 64) - COMPILER_WARNINGS_FATAL=false - endif # ARCH_DATA_MODEL endif # windows ifeq ($(PLATFORM), solaris) diff --git a/jdk/make/common/Defs-linux.gmk b/jdk/make/common/Defs-linux.gmk index 674b6f6a0e6..65814ba472a 100644 --- a/jdk/make/common/Defs-linux.gmk +++ b/jdk/make/common/Defs-linux.gmk @@ -1,5 +1,5 @@ # -# Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -149,10 +149,9 @@ endif # ARCH PIC_CODE_LARGE = -fPIC PIC_CODE_SMALL = -fpic GLOBAL_KPIC = $(PIC_CODE_LARGE) +CFLAGS_COMMON += $(GLOBAL_KPIC) $(GCC_WARNINGS) ifeq ($(ARCH), amd64) - CFLAGS_COMMON += $(GLOBAL_KPIC) $(GCC_WARNINGS) -pipe -else - CFLAGS_COMMON += $(GLOBAL_KPIC) $(GCC_WARNINGS) + CFLAGS_COMMON += -pipe endif # Linux 64bit machines use Dwarf2, which can be HUGE, have fastdebug use -g1 diff --git a/jdk/make/common/Defs-solaris.gmk b/jdk/make/common/Defs-solaris.gmk index 052c0c88fc8..d0874e43070 100644 --- a/jdk/make/common/Defs-solaris.gmk +++ b/jdk/make/common/Defs-solaris.gmk @@ -1,5 +1,5 @@ # -# Copyright 1995-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -40,6 +40,9 @@ # LDLIBS (set $(EXTRA_LIBS) instead) # LDLIBS_COMMON (set $(EXTRA_LIBS) instead) # LINTFLAGS (set $(OTHER_LINTFLAGS) instead) +# +# Note: CPPFLAGS are used in C and C++ compiles. +# # Get shared JDK settings include $(JDK_MAKE_SHARED_DIR)/Defs.gmk @@ -112,6 +115,10 @@ endif # Required with many of the source files. # -mt Assume multi-threaded (important) # +# The more unusual options to the Sun C compiler: +# +w Print more warnings +# +w2 Maximum warnings +# # # Debug flag for C and C++ compiler @@ -140,15 +147,34 @@ ifeq ($(FASTDEBUG), true) CXXFLAGS_DEBUG_OPTION = -g0 $(CC_FASTDEBUG_OPT) endif -CFLAGS_COMMON = -v -mt -L$(OBJDIR) -xc99=%none +CFLAGS_COMMON = -L$(OBJDIR) + +# Do not allow C99 language features like declarations in code etc. +CFLAGS_COMMON += -xc99=%none + +# Allow C++ comments in C code CFLAGS_COMMON += -xCC -CFLAGS_COMMON += -errshort=tags + +# Show error message tags on errors +CFLAGS_COMMON += -errshort=tags +CXXFLAGS_COMMON += -errtags=yes + +# Optimization flags CFLAGS_OPT = $(POPT) + +# Debug version flags CFLAGS_DBG = $(CFLAGS_DEBUG_OPTION) -CFLAGS_COMMON += -Xa $(CFLAGS_REQUIRED) + +# Required C compiler flags +CFLAGS_COMMON += -Xa $(CFLAGS_REQUIRED) + +# Maximum warnings all the time +CXXFLAGS_COMMON += +w +CFLAGS_COMMON += -v # Assume MT behavior all the time (important) -CXXFLAGS_COMMON = -mt +CXXFLAGS_COMMON += -mt +CFLAGS_COMMON += -mt # Assume no C++ exceptions are used CXXFLAGS_COMMON += -features=no%except -DCC_NOEX @@ -197,7 +223,6 @@ endif # Lint Flags: # -Xa ANSI C plus K&R, favor ANSI rules -# -Xarch=XXX Same as 'cc -xarch=XXX' # -fd report on old style func defs # -errchk=structarg report on 64bit struct args by value # -errchk=longptr64 report on 64bit to 32bit issues (ignores casts) @@ -206,6 +231,7 @@ endif # -x suppress unused externs # -u suppress extern func/vars used/defined # -errfmt=simple use one line errors with position info +# $(LINT_XARCH_OPTION) See Compiler-sun.gwk LINTFLAGS_COMMON = -Xa LINTFLAGS_COMMON += -fd @@ -224,42 +250,12 @@ LINTFLAGS_DBG = # Tell the compilers to never generate globalized names, all the time. CFLAGS_COMMON += -W0,-noglobal -# Arch specific settings (determines type of .o files and instruction set) -ifeq ($(ARCH_FAMILY), sparc) - ifdef VIS_NEEDED - XARCH_VALUE/32=v8plusa - XARCH_VALUE/64=v9a - else - # Someday this should change to improve optimization on UltraSPARC - # and abandon the old v8-only machines like the SPARCstation 10. - # Indications with Mustang is that alacrity runs do not show a - # big improvement using v8plus over v8, but other benchmarks might. - XARCH_VALUE/32=v8 - XARCH_VALUE/64=v9 - endif -endif -ifeq ($(ARCH_FAMILY), i586) - XARCH_VALUE/64=amd64 - XARCH_VALUE/32= -endif - -# Arch value based on current data model being built -XARCH_VALUE=$(XARCH_VALUE/$(ARCH_DATA_MODEL)) -ifneq ($(XARCH_VALUE), ) - # The actual compiler -xarch options to use - XARCH_OPTION/32 = -xarch=$(XARCH_VALUE/32) - XARCH_OPTION/64 = -xarch=$(XARCH_VALUE/64) - XARCH_OPTION = $(XARCH_OPTION/$(ARCH_DATA_MODEL)) -endif - -# If we have a specific -xarch value to use, add it -ifdef XARCH_OPTION - CFLAGS_COMMON += $(XARCH_OPTION) - CXXFLAGS_COMMON += $(XARCH_OPTION) - ASFLAGS_COMMON += $(XARCH_OPTION) - EXTRA_LIBS += $(XARCH_OPTION) - LINTFLAGS_COMMON += -Xarch=$(XARCH_VALUE) -endif +# If we have a specific arch value to use, add it +CFLAGS_COMMON += $(XARCH_OPTION) +CXXFLAGS_COMMON += $(XARCH_OPTION) +ASFLAGS_COMMON += $(AS_XARCH_OPTION) +EXTRA_LIBS += $(XARCH_OPTION) +LINTFLAGS_COMMON += $(LINT_XARCH_OPTION) # # uncomment the following to build with PERTURBALOT set @@ -267,8 +263,8 @@ endif # OTHER_CFLAGS += -DPERTURBALOT # -CPPFLAGS_COMMON = -D$(ARCH_FAMILY) -D__solaris__ -D_REENTRANT -CPPFLAGS_OPT = +CPPFLAGS_COMMON = -D__solaris__ -D$(ARCH_FAMILY) +CPPFLAGS_OPT = -DNDEBUG CPPFLAGS_DBG = -DDEBUG ifeq ($(ARCH_FAMILY), i586) diff --git a/jdk/make/common/Defs-windows.gmk b/jdk/make/common/Defs-windows.gmk index e9bdea85278..d7c11837e96 100644 --- a/jdk/make/common/Defs-windows.gmk +++ b/jdk/make/common/Defs-windows.gmk @@ -1,5 +1,5 @@ # -# Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -283,7 +283,7 @@ CPPFLAGS_COMMON = -DWIN32 -DIAL -D_LITTLE_ENDIAN ifeq ($(ARCH), amd64) CPPFLAGS_COMMON += -D_AMD64_ -Damd64 else - CPPFLAGS_COMMON += -DWIN32 -D_X86_ -Dx86 + CPPFLAGS_COMMON += -D_X86_ -Dx86 endif CPPFLAGS_COMMON += -DWIN32_LEAN_AND_MEAN @@ -292,17 +292,24 @@ CPPFLAGS_COMMON += -DWIN32_LEAN_AND_MEAN # CFLAGS_COMMON += -Fd$(OBJDIR)/$(basename $(@F)).pdb -Fm$(OBJDIR)/$(basename $(@F)).map +# +# Use -wdNNNN to disable warning NNNN. +# C4800 is a warning about bool performance casts (can't make go away) +# +COMPILER_WARNINGS_TO_IGNORE = 4800 +CFLAGS_COMMON += $(COMPILER_WARNINGS_TO_IGNORE:%=-wd%) + # # Add warnings and extra on 64bit issues # ifeq ($(ARCH_DATA_MODEL), 64) CFLAGS_COMMON += -Wp64 endif -CFLAGS_COMMON += -W$(COMPILER_WARNING_LEVEL) # # Treat compiler warnings as errors, if requested # +CFLAGS_COMMON += -W$(COMPILER_WARNING_LEVEL) ifeq ($(COMPILER_WARNINGS_FATAL),true) CFLAGS_COMMON += -WX endif @@ -352,17 +359,9 @@ else # BUILD_WIN_SA=1 # on the make command. ifdef BUILD_WIN_SA - ifeq ($(ARCH), amd64) - INCLUDE_SA = true - else - INCLUDE_SA = true - endif + INCLUDE_SA = true else - ifeq ($(ARCH), amd64) - INCLUDE_SA = false - else - INCLUDE_SA = false - endif + INCLUDE_SA = false endif endif @@ -404,7 +403,6 @@ ifdef JDK_UPDATE_VERSION else JDK_UPDATE_VER := 0 endif -JDK_VER = $(JDK_MINOR_VERSION),$(JDK_MICRO_VERSION),$(JDK_UPDATE_VER),$(COOKED_BUILD_NUMBER) RC_FLAGS = /l 0x409 /r @@ -414,15 +412,23 @@ else RC_FLAGS += $(MS_RC_DEBUG_OPTION) endif -ifndef COPYRIGHT_YEAR - COPYRIGHT_YEAR = 2007 -endif +# Values for the RC variables defined in RC_FLAGS +JDK_RC_BUILD_ID = $(FULL_VERSION) +JDK_RC_COMPANY = $(COMPANY_NAME) +JDK_RC_COMPONENT = $(PRODUCT_NAME) $(JDK_RC_PLATFORM_NAME) binary +JDK_RC_VER = \ + $(JDK_MINOR_VERSION).$(JDK_MICRO_VERSION).$(JDK_UPDATE_VER).$(COOKED_BUILD_NUMBER) +JDK_RC_COPYRIGHT = Copyright \xA9 $(COPYRIGHT_YEAR) +JDK_RC_NAME = \ + $(PRODUCT_NAME) $(JDK_RC_PLATFORM_NAME) $(JDK_MINOR_VERSION) $(JDK_UPDATE_META_TAG) +JDK_RC_FVER = \ + $(JDK_MINOR_VERSION),$(JDK_MICRO_VERSION),$(JDK_UPDATE_VER),$(COOKED_BUILD_NUMBER) # J2SE name required here -RC_FLAGS += -d "J2SE_BUILD_ID=$(FULL_VERSION)" \ - -d "J2SE_COMPANY=$(COMPANY_NAME)" \ - -d "J2SE_COMPONENT=$(PRODUCT_NAME) Platform SE binary" \ - -d "J2SE_VER=$(JDK_MINOR_VERSION).$(JDK_MICRO_VERSION).$(JDK_UPDATE_VER).$(COOKED_BUILD_NUMBER)" \ - -d "J2SE_COPYRIGHT=Copyright \xA9 $(COPYRIGHT_YEAR)" \ - -d "J2SE_NAME=$(PRODUCT_NAME) Platform SE $(JDK_MINOR_VERSION) $(JDK_UPDATE_META_TAG)" \ - -d "J2SE_FVER=$(JDK_VER)" +RC_FLAGS += -d "J2SE_BUILD_ID=$(JDK_RC_BUILD_ID)" \ + -d "J2SE_COMPANY=$(JDK_RC_COMPANY)" \ + -d "J2SE_COMPONENT=$(JDK_RC_COMPONENT)" \ + -d "J2SE_VER=$(JDK_RC_VER)" \ + -d "J2SE_COPYRIGHT=$(JDK_RC_COPYRIGHT)" \ + -d "J2SE_NAME=$(JDK_RC_NAME)" \ + -d "J2SE_FVER=$(JDK_RC_FVER)" diff --git a/jdk/make/common/Defs.gmk b/jdk/make/common/Defs.gmk index e83095ae917..16eb1e2258f 100644 --- a/jdk/make/common/Defs.gmk +++ b/jdk/make/common/Defs.gmk @@ -1,5 +1,5 @@ # -# Copyright 1995-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -703,7 +703,7 @@ endif ifdef ALT_COPYRIGHT_YEAR COPYRIGHT_YEAR = $(ALT_COPYRIGHT_YEAR) else - COPYRIGHT_YEAR = $(shell $(DATE) '+%Y') + COPYRIGHT_YEAR := $(shell $(DATE) '+%Y') endif # Install of imported file (JDK_IMPORT_PATH, or some other external location) diff --git a/jdk/make/common/Release.gmk b/jdk/make/common/Release.gmk index f3a6c626d3b..42de79f70d6 100644 --- a/jdk/make/common/Release.gmk +++ b/jdk/make/common/Release.gmk @@ -1,5 +1,5 @@ # -# Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -369,6 +369,7 @@ TOOLS = \ com/sun/jarsigner \ com/sun/mirror \ com/sun/source \ + com/sun/tools/classfile \ com/sun/tools/doclets \ com/sun/tools/example/debug/expr \ com/sun/tools/example/debug/tty \ @@ -378,6 +379,7 @@ TOOLS = \ com/sun/tools/javadoc \ com/sun/tools/apt \ com/sun/tools/javah \ + com/sun/tools/javap \ com/sun/tools/corba \ com/sun/tools/internal/xjc \ com/sun/tools/internal/ws \ @@ -568,6 +570,8 @@ $(NOT_RT_JAR_LIST): FRC $(ECHO) "sun/tools/java/" >> $@ $(ECHO) "sun/tools/javac/" >> $@ $(ECHO) "sun/tools/javap/" >> $@ + $(ECHO) "com/sun/tools/classfile/" >> $@ + $(ECHO) "com/sun/tools/javap/" >> $@ $(ECHO) "sun/tools/jconsole/" >> $@ $(ECHO) "sun/tools/jps/" >> $@ $(ECHO) "sun/tools/jstat/" >> $@ @@ -1236,7 +1240,6 @@ ifeq ($(PLATFORM), windows) $(RM) $(TEMPDIR)/rebase.input endif $(RM) -r $(JDK_IMAGE_DIR) - $(RM) -r $(JDK_DEBUG_IMAGE_DIR) $(RM) -r $(JRE_IMAGE_DIR) images images-clobber:: diff --git a/jdk/make/common/Rules.gmk b/jdk/make/common/Rules.gmk index 5325eeaedfe..251b31f53a2 100644 --- a/jdk/make/common/Rules.gmk +++ b/jdk/make/common/Rules.gmk @@ -1,5 +1,5 @@ # -# Copyright 1995-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/common/internal/BinaryPlugs.gmk b/jdk/make/common/internal/BinaryPlugs.gmk index 8eeb95d1284..a52b6175286 100644 --- a/jdk/make/common/internal/BinaryPlugs.gmk +++ b/jdk/make/common/internal/BinaryPlugs.gmk @@ -1,5 +1,5 @@ # -# Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/common/internal/Defs-langtools.gmk b/jdk/make/common/internal/Defs-langtools.gmk index 4a1444bc932..e90b00a061f 100644 --- a/jdk/make/common/internal/Defs-langtools.gmk +++ b/jdk/make/common/internal/Defs-langtools.gmk @@ -1,5 +1,5 @@ # -# Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -31,13 +31,15 @@ IMPORT_RT_PACKAGES += \ javax/tools IMPORT_TOOLS_PACKAGES += \ + com/sun/javadoc \ com/sun/mirror \ com/sun/source \ com/sun/tools/apt \ - com/sun/tools/javac \ - com/sun/tools/javah \ - com/sun/tools/javadoc \ + com/sun/tools/classfile \ com/sun/tools/doclets \ - com/sun/javadoc \ + com/sun/tools/javac \ + com/sun/tools/javadoc \ + com/sun/tools/javah \ + com/sun/tools/javap \ sun/tools/javap diff --git a/jdk/make/common/shared/Compiler-gcc.gmk b/jdk/make/common/shared/Compiler-gcc.gmk index d12adac959e..27501956368 100644 --- a/jdk/make/common/shared/Compiler-gcc.gmk +++ b/jdk/make/common/shared/Compiler-gcc.gmk @@ -1,5 +1,5 @@ # -# Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -73,23 +73,18 @@ ifeq ($(PLATFORM), linux) REQUIRED_CC_VER = 4.0 REQUIRED_GCC_VER = 4.0.* else - ifeq ($(ARCH_DATA_MODEL), 32) - # i586 REQUIRED_CC_VER = 3.2 - REQUIRED_GCC_VER = 3.2.1* - REQUIRED_GCC_VER_INT = 3.2.1-7a - else - ifeq ($(ARCH), amd64) - # amd64 - REQUIRED_CC_VER = 3.2 - REQUIRED_GCC_VER = 3.2.* - endif - ifeq ($(ARCH), ia64) - # ia64 - REQUIRED_CC_VER = 3.2 - REQUIRED_GCC_VER = 2.9[56789].* - endif - endif + ifeq ($(ARCH_DATA_MODEL), 32) + REQUIRED_GCC_VER = 3.2.1* + REQUIRED_GCC_VER_INT = 3.2.1-7a + else + ifeq ($(ARCH), amd64) + REQUIRED_GCC_VER = 3.2.* + endif + ifeq ($(ARCH), ia64) + REQUIRED_GCC_VER = 2.9[56789].* + endif + endif endif # Option used to create a shared library SHARED_LIBRARY_FLAG = -shared -mimpure-text diff --git a/jdk/make/common/shared/Compiler-msvc.gmk b/jdk/make/common/shared/Compiler-msvc.gmk index 41509e51b09..a4b62617810 100644 --- a/jdk/make/common/shared/Compiler-msvc.gmk +++ b/jdk/make/common/shared/Compiler-msvc.gmk @@ -1,5 +1,5 @@ # -# Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/common/shared/Compiler-sun.gmk b/jdk/make/common/shared/Compiler-sun.gmk index 8ce54825b7c..b4806bb4bc3 100644 --- a/jdk/make/common/shared/Compiler-sun.gmk +++ b/jdk/make/common/shared/Compiler-sun.gmk @@ -1,5 +1,5 @@ # -# Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -31,6 +31,9 @@ COMPILER_NAME=Sun Studio # Sun Studio Compiler settings specific to Solaris ifeq ($(PLATFORM), solaris) + # FIXUP: Change to SS12 when validated + #COMPILER_VERSION=SS12 + #REQUIRED_CC_VER=5.9 COMPILER_VERSION=SS11 REQUIRED_CC_VER=5.8 CC = $(COMPILER_PATH)cc @@ -51,8 +54,8 @@ endif # Sun Studio Compiler settings specific to Linux ifeq ($(PLATFORM), linux) # This has not been tested - COMPILER_VERSION=SS11 - REQUIRED_CC_VER=5.8 + COMPILER_VERSION=SS12 + REQUIRED_CC_VER=5.9 CC = $(COMPILER_PATH)cc CPP = $(COMPILER_PATH)cc -E CXX = $(COMPILER_PATH)CC @@ -74,3 +77,58 @@ endif _CC_VER :=$(shell $(CC) -V 2>&1 | $(HEAD) -n 1) CC_VER :=$(call GetVersion,"$(_CC_VER)") +# Arch specific settings (determines type of .o files and instruction set) +# Starting in SS12 (5.9), the arch options changed. +# The assembler /usr/ccs/bin/as wants older SS11 (5.8) style options. +# Note: We need to have both 32 and 64 values at all times for awt Makefiles. +# +XARCH_OPTION_OLD/32 = +XARCH_OPTION_OLD/64 = +XARCH_OPTION_NEW/32 = -m32 +XARCH_OPTION_NEW/64 = -m64 +# Lint options are slightly different +LINT_XARCH_OPTION_OLD/32 = +LINT_XARCH_OPTION_OLD/64 = +LINT_XARCH_OPTION_NEW/32 = -m32 +LINT_XARCH_OPTION_NEW/64 = -m64 +ifeq ($(ARCH_FAMILY), sparc) + ifdef VIS_NEEDED + XARCH_OPTION_OLD/32 += -xarch=v8plusa + XARCH_OPTION_OLD/64 += -xarch=v9a + XARCH_OPTION_NEW/32 += -xarch=sparcvis + XARCH_OPTION_NEW/64 += -xarch=sparcvis + else + # Someday this should change to improve optimization on UltraSPARC + # and abandon v8, even change to sparcvis or sparcvis2, this + # abandons machines like the SPARCstation 10. + # Indications with jdk6 is that alacrity runs do not show a + # big improvement using v8plus over v8, but other benchmarks might. + XARCH_OPTION_OLD/32 += -xarch=v8 + XARCH_OPTION_OLD/64 += -xarch=v9 + # Note that this new option (SS12+) effectively means v8plus + XARCH_OPTION_NEW/32 += -xarch=sparc + XARCH_OPTION_NEW/64 += -xarch=sparc + endif + LINT_XARCH_OPTION_OLD/64 += -Xarch=v9 +endif +ifeq ($(ARCH_FAMILY), i586) + XARCH_OPTION_OLD/64 += -xarch=amd64 + LINT_XARCH_OPTION_OLD/64 += -Xarch=amd64 +endif +# Pick the options we want based on the compiler being used. +ifeq ($(shell expr $(CC_VER) \>= 5.9), 1) + XARCH_OPTION/32 = $(XARCH_OPTION_NEW/32) + XARCH_OPTION/64 = $(XARCH_OPTION_NEW/64) + LINT_XARCH_OPTION/32 = $(LINT_XARCH_OPTION_NEW/32) + LINT_XARCH_OPTION/64 = $(LINT_XARCH_OPTION_NEW/64) +else + XARCH_OPTION/32 = $(XARCH_OPTION_OLD/32) + XARCH_OPTION/64 = $(XARCH_OPTION_OLD/64) + LINT_XARCH_OPTION/32 = $(LINT_XARCH_OPTION_OLD/32) + LINT_XARCH_OPTION/64 = $(LINT_XARCH_OPTION_OLD/64) +endif +XARCH_OPTION = $(XARCH_OPTION/$(ARCH_DATA_MODEL)) +LINT_XARCH_OPTION = $(LINT_XARCH_OPTION/$(ARCH_DATA_MODEL)) +# The /usr/ccs/bin/as assembler always wants the older SS11 (5.8) options. +AS_XARCH_OPTION = $(XARCH_OPTION_OLD/$(ARCH_DATA_MODEL)) + diff --git a/jdk/make/common/shared/Defs-control.gmk b/jdk/make/common/shared/Defs-control.gmk index ee319616172..592f26de13b 100644 --- a/jdk/make/common/shared/Defs-control.gmk +++ b/jdk/make/common/shared/Defs-control.gmk @@ -1,5 +1,5 @@ # -# Copyright 1995-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/common/shared/Defs-java.gmk b/jdk/make/common/shared/Defs-java.gmk index b3e02702783..179e53a01a9 100644 --- a/jdk/make/common/shared/Defs-java.gmk +++ b/jdk/make/common/shared/Defs-java.gmk @@ -107,7 +107,10 @@ JAVACFLAGS = ifeq ($(DEBUG_CLASSFILES),true) JAVACFLAGS += -g endif -ifeq ($(COMPILER_WARNINGS_FATAL), true) +ifeq ($(JAVAC_MAX_WARNINGS), true) + JAVACFLAGS += -Xlint:all +endif +ifeq ($(JAVAC_WARNINGS_FATAL), true) JAVACFLAGS += -Werror endif @@ -180,7 +183,10 @@ endif # The javac options supplied to the boot javac is limited. This compiler # should only be used to build the 'make/tools' sources, which are not # class files that end up in the classes directory. -ifeq ($(COMPILER_WARNINGS_FATAL), true) +ifeq ($(JAVAC_MAX_WARNINGS), true) + BOOT_JAVACFLAGS += -Xlint:all +endif +ifeq ($(JAVAC_WARNINGS_FATAL), true) BOOT_JAVACFLAGS += -Werror endif BOOT_JAVACFLAGS += -encoding ascii diff --git a/jdk/make/common/shared/Defs-utils.gmk b/jdk/make/common/shared/Defs-utils.gmk index fe0ab883169..dacb4080093 100644 --- a/jdk/make/common/shared/Defs-utils.gmk +++ b/jdk/make/common/shared/Defs-utils.gmk @@ -1,5 +1,5 @@ # -# Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/common/shared/Defs.gmk b/jdk/make/common/shared/Defs.gmk index 8fc28e239e0..af86be8085d 100644 --- a/jdk/make/common/shared/Defs.gmk +++ b/jdk/make/common/shared/Defs.gmk @@ -188,16 +188,18 @@ ifndef MILESTONE endif # Default names -LAUNCHER_NAME = java -PRODUCT_NAME = Java(TM) -PRODUCT_SUFFIX = SE Runtime Environment -COMPANY_NAME = Sun Microsystems, Inc. - ifdef OPENJDK LAUNCHER_NAME = openjdk PRODUCT_NAME = OpenJDK PRODUCT_SUFFIX = Runtime Environment - COMPANY_NAME = + JDK_RC_PLATFORM_NAME = Platform + COMPANY_NAME = N/A +else + LAUNCHER_NAME = java + PRODUCT_NAME = Java(TM) + PRODUCT_SUFFIX = SE Runtime Environment + JDK_RC_PLATFORM_NAME = Platform SE + COMPANY_NAME = Sun Microsystems, Inc. endif RUNTIME_NAME = $(PRODUCT_NAME) $(PRODUCT_SUFFIX) diff --git a/jdk/make/common/shared/Platform.gmk b/jdk/make/common/shared/Platform.gmk index 1a28ec0d2a9..8da23c83fc4 100644 --- a/jdk/make/common/shared/Platform.gmk +++ b/jdk/make/common/shared/Platform.gmk @@ -72,7 +72,6 @@ PLATFORM_SHARED=done # ISA_DIR solaris only: /sparcv9 or /amd64 # LIBARCH32 solaris only: sparc or i386 # LIBARCH64 solaris only: sparcv9 or amd64 -# 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 # WINDOWS_NT_VERSION_STRING windows only: long version name @@ -311,19 +310,11 @@ ifeq ($(PLATFORM), windows) endif endif export ARCH_DATA_MODEL - # LIBARCH is used to preserve the jre/lib/i386 directory name for 32-bit intel - ARCH=i586 - LIBARCH=i386 - # Value of Java os.arch property - ARCHPROP=x86 - REQUIRED_WINDOWS_NAME=Windows Professional 2000 - REQUIRED_WINDOWS_VERSION=5 0 Service Pack 4 ifeq ($(ARCH_DATA_MODEL), 64) # If the user wants to perform a cross compile build then they must # - set ARCH_DATA_MODEL=64 and either # + set ARCH to ia64 or amd64, or - REQUIRED_WINDOWS_NAME=Windows Server 2003 - REQUIRED_WINDOWS_VERSION=5 2 Service Pack 1 + REQUIRED_WINDOWS_VERSION=Server 2003 Enterprise x64 Edition ifeq ($(word 1, $(PROCESSOR_IDENTIFIER)), AMD64) ARCH=amd64 else @@ -332,6 +323,14 @@ ifeq ($(PLATFORM), windows) LIBARCH=$(ARCH) # Value of Java os.arch property ARCHPROP=$(LIBARCH) + else + REQUIRED_WINDOWS_VERSION=2000 or Unknown + #REQUIRED_WINDOWS_VERSION=XP Professional + # LIBARCH is used to preserve the jre/lib/i386 directory name for 32-bit intel + ARCH=i586 + LIBARCH=i386 + # Value of Java os.arch property + ARCHPROP=x86 endif ARCH_FAMILY = $(ARCH) # Where is unwanted output to be delivered? @@ -374,34 +373,40 @@ ifeq ($(PLATFORM), windows) REQUIRED_DXSDK_VER = 0x0900 OS_VENDOR = Microsoft # How much RAM does this machine have: - ifeq ($(USING_CYGWIN),true) - # CYGWIN has the 'free' utility - _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 + ifeq ($(JDK_HAS_MEM_INFO),) + ifeq ($(USING_CYGWIN),true) + # CYGWIN has the 'free' utility _MB_OF_MEMORY := \ - $(shell systeminfo 2> $(DEV_NULL) | grep 'Total Physical Memory:' | awk '{print $$4;}' | sed -e 's@,@@') + $(shell free -m | grep Mem: | awk '{print $$2;}' ) else - _MB_OF_MEMORY := $(shell expr $(_B_OF_MEMORY) '/' 1024 2> $(DEV_NULL)) + # 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 + endif + ifeq ($(shell expr $(_MB_OF_MEMORY) '+' 0 2> $(DEV_NULL)), $(_MB_OF_MEMORY)) + MB_OF_MEMORY := $(_MB_OF_MEMORY) + else + MB_OF_MEMORY := 512 endif - endif - ifeq ($(shell expr $(_MB_OF_MEMORY) '+' 0 2> $(DEV_NULL)), $(_MB_OF_MEMORY)) - MB_OF_MEMORY := $(_MB_OF_MEMORY) - else - MB_OF_MEMORY := 512 endif endif @@ -447,30 +452,38 @@ endif # system swapping during the build. # If we don't know, assume 512. Subtract 128 from MB for VM MAX. # Don't set VM max over 1024-128=896. -ifneq ($(MB_OF_MEMORY),) - LOW_MEMORY_MACHINE := $(shell \ - if [ $(MB_OF_MEMORY) -le 512 ] ; then \ - echo "true"; \ - else \ - echo "false"; \ - fi) - MAX_VM_MEMORY := $(shell \ - if [ $(MB_OF_MEMORY) -le 1024 ] ; then \ - expr $(MB_OF_MEMORY) '-' 128 2> $(DEV_NULL) ; \ - else \ - echo "896"; \ - fi) - MIN_VM_MEMORY := $(shell \ - if [ $(MAX_VM_MEMORY) -le 128 ] ; then \ - expr $(MAX_VM_MEMORY) '-' 8 2> $(DEV_NULL) ; \ - else \ - echo "128"; \ - fi) -else - MB_OF_MEMORY := unknown - LOW_MEMORY_MACHINE := true - MAX_VM_MEMORY := 384 - MIN_VM_MEMORY := 128 +ifeq ($(JDK_HAS_MEM_INFO),) + JDK_HAS_MEM_INFO=true + export JDK_HAS_MEM_INFO + ifneq ($(MB_OF_MEMORY),) + LOW_MEMORY_MACHINE := $(shell \ + if [ $(MB_OF_MEMORY) -le 512 ] ; then \ + echo "true"; \ + else \ + echo "false"; \ + fi) + MAX_VM_MEMORY := $(shell \ + if [ $(MB_OF_MEMORY) -le 1024 ] ; then \ + expr $(MB_OF_MEMORY) '-' 128 2> $(DEV_NULL) ; \ + else \ + echo "896"; \ + fi) + MIN_VM_MEMORY := $(shell \ + if [ $(MAX_VM_MEMORY) -le 128 ] ; then \ + expr $(MAX_VM_MEMORY) '-' 8 2> $(DEV_NULL) ; \ + else \ + echo "128"; \ + fi) + else + MB_OF_MEMORY := unknown + LOW_MEMORY_MACHINE := true + MAX_VM_MEMORY := 384 + MIN_VM_MEMORY := 128 + endif + export MB_OF_MEMORY + export LOW_MEMORY_MACHINE + export MAX_VM_MEMORY + export MIN_VM_MEMORY endif # If blanks in the username, use the first 4 words and pack them together diff --git a/jdk/make/common/shared/Sanity.gmk b/jdk/make/common/shared/Sanity.gmk index bc76e3636eb..3048281df91 100644 --- a/jdk/make/common/shared/Sanity.gmk +++ b/jdk/make/common/shared/Sanity.gmk @@ -82,15 +82,16 @@ ifeq ($(PLATFORM), linux) endif ifeq ($(PLATFORM), windows) - WINVER=$(JDK_TOPDIR)/make/tools/winver/bin/winver.exe FREE_SPACE := $(shell $(DF) -kP $(OUTPUTDIR) | $(TAIL) -1 | $(NAWK) '{print $$4;}') TEMP_FREE_SPACE := $(shell $(DF) -kP $(TEMP_DISK) | $(TAIL) -1 | $(NAWK) '{print $$4;}') - WINDOWS_VERSION := $(shell \ - if [ -x $(WINVER) ]; then \ - $(WINVER) ; \ - else \ - $(ECHO) "Unknown Windows Version"; \ - fi) + # Localized systeminfo has localized labels, but not localized values. + _WINDOWS_VERSION := \ + $(shell systeminfo 2> $(DEV_NULL) | grep 'Microsoft' | grep 'Windows' | \ + cut -d':' -f2) + ifeq ($(_WINDOWS_VERSION),) + _WINDOWS_VERSION := Windows 2000 or Unknown (no systeminfo utility) + endif + WINDOWS_VERSION := $(strip $(_WINDOWS_VERSION)) DXSDK_VER := $(shell $(EGREP) DIRECT3D_VERSION $(DXSDK_INCLUDE_PATH)/d3d9.h 2>&1 | \ $(EGREP) "\#define" | $(NAWK) '{print $$3}') endif @@ -264,9 +265,9 @@ ifndef OPENJDK "" >> $(WARNING_FILE) ; \ fi ifeq ($(PLATFORM), windows) - @if [ "$(WINDOWS_VERSION)" != "$(REQUIRED_WINDOWS_VERSION)" ]; then \ - $(ECHO) "WARNING: $(YOU_ARE_USING) an unsupported version of $(REQUIRED_WINDOWS_NAME). \n" \ - " The supported version is $(REQUIRED_WINDOWS_NAME) $(REQUIRED_WINDOWS_VERSION). \n" \ + @if [ "$(findstring $(REQUIRED_WINDOWS_VERSION),$(WINDOWS_VERSION))" = "" ]; then \ + $(ECHO) "WARNING: $(YOU_ARE_USING) an unknown version of Windows. \n" \ + " The required version is $(REQUIRED_WINDOWS_VERSION). \n" \ " $(YOU_ARE_USING) $(WINDOWS_VERSION) \n" \ "" >> $(WARNING_FILE) ; \ fi diff --git a/jdk/make/docs/CORE_PKGS.gmk b/jdk/make/docs/CORE_PKGS.gmk index 03d95a606aa..c768e7023db 100644 --- a/jdk/make/docs/CORE_PKGS.gmk +++ b/jdk/make/docs/CORE_PKGS.gmk @@ -1,5 +1,5 @@ # -# Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/docs/Makefile b/jdk/make/docs/Makefile index 5a5b496da51..21d7825d3a5 100644 --- a/jdk/make/docs/Makefile +++ b/jdk/make/docs/Makefile @@ -1,5 +1,5 @@ # -# Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/docs/NON_CORE_PKGS.gmk b/jdk/make/docs/NON_CORE_PKGS.gmk index 8c78c6ed78d..ccf7a0f79a8 100644 --- a/jdk/make/docs/NON_CORE_PKGS.gmk +++ b/jdk/make/docs/NON_CORE_PKGS.gmk @@ -1,5 +1,5 @@ # -# Copyright 2002-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/awt/Makefile b/jdk/make/java/awt/Makefile index 579aa58cff6..e019a309d9f 100644 --- a/jdk/make/java/awt/Makefile +++ b/jdk/make/java/awt/Makefile @@ -1,5 +1,5 @@ # -# Copyright 1995-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/fdlibm/Makefile b/jdk/make/java/fdlibm/Makefile index fd2442b0321..ab7a411579c 100644 --- a/jdk/make/java/fdlibm/Makefile +++ b/jdk/make/java/fdlibm/Makefile @@ -46,8 +46,6 @@ ifeq ($(PLATFORM),windows) _OPT = $(CC_NO_OPT) OTHER_CFLAGS = CPPFLAGS_DBG += -DLOGGING - # Files built here do not compile with warning level 3 if warnings are fatal - COMPILER_WARNINGS_FATAL=false endif # diff --git a/jdk/make/java/hpi/windows/Makefile b/jdk/make/java/hpi/windows/Makefile index da163368e21..fa04ec6a362 100644 --- a/jdk/make/java/hpi/windows/Makefile +++ b/jdk/make/java/hpi/windows/Makefile @@ -37,8 +37,6 @@ include $(BUILDDIR)/common/Defs.gmk # windows compiler flags ifeq ($(PLATFORM),windows) CPPFLAGS_DBG += -DLOGGING - # Files built here do not compile with warning level 3 if warnings are fatal - COMPILER_WARNINGS_FATAL=false endif FILES_c = \ diff --git a/jdk/make/java/java/Makefile b/jdk/make/java/java/Makefile index 863ee1a303b..8755a4c3a6e 100644 --- a/jdk/make/java/java/Makefile +++ b/jdk/make/java/java/Makefile @@ -1,5 +1,5 @@ # -# Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -37,8 +37,6 @@ include $(BUILDDIR)/common/Defs.gmk # windows compiler flags ifeq ($(PLATFORM),windows) OTHER_CFLAGS = - # Files built here do not compile with warning level 3 if warnings are fatal - COMPILER_WARNINGS_FATAL=false # build directly into BINDIR... LIB_LOCATION = $(BINDIR) # Exported functions diff --git a/jdk/make/java/java/genlocales.gmk b/jdk/make/java/java/genlocales.gmk index 8ea0a0f2559..bda003b9ce1 100644 --- a/jdk/make/java/java/genlocales.gmk +++ b/jdk/make/java/java/genlocales.gmk @@ -1,5 +1,5 @@ # -# Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/java/localegen.sh b/jdk/make/java/java/localegen.sh index b4506b97854..8f79eaebb88 100644 --- a/jdk/make/java/java/localegen.sh +++ b/jdk/make/java/java/localegen.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/java/mapfile-vers b/jdk/make/java/java/mapfile-vers index 38f9e126d82..ad0380979a9 100644 --- a/jdk/make/java/java/mapfile-vers +++ b/jdk/make/java/java/mapfile-vers @@ -1,5 +1,5 @@ # -# Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/java_crw_demo/Makefile b/jdk/make/java/java_crw_demo/Makefile index 2157e2f892c..c65a84df1e8 100644 --- a/jdk/make/java/java_crw_demo/Makefile +++ b/jdk/make/java/java_crw_demo/Makefile @@ -47,11 +47,6 @@ FILES_c = java_crw_demo.c OTHER_INCLUDES = -I$(SRCDIR) -# -# This removes all asserts in the optimized version -# -CPPFLAGS_OPT += -DNDEBUG - # # Library to compile. # diff --git a/jdk/make/java/java_hprof_demo/Makefile b/jdk/make/java/java_hprof_demo/Makefile index 71529433b14..9c97a6a24e5 100644 --- a/jdk/make/java/java_hprof_demo/Makefile +++ b/jdk/make/java/java_hprof_demo/Makefile @@ -91,11 +91,6 @@ endif # INIT += $(LIBDIR)/jvm.hprof.txt -# -# This removes all asserts in the optimized version -# -CPPFLAGS_OPT += -DNDEBUG - # # This puts logging code in # diff --git a/jdk/make/java/jli/Makefile b/jdk/make/java/jli/Makefile index 236654fd4a9..5a1c312d7ab 100644 --- a/jdk/make/java/jli/Makefile +++ b/jdk/make/java/jli/Makefile @@ -1,5 +1,5 @@ # -# Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -115,9 +115,6 @@ ifeq ($(PLATFORM), windows) -export:JLI_ManifestIterate \ -export:JLI_SetTraceLauncher - # Files from zlib built here do not compile with warning level 3 - # if warnings are fatal - COMPILER_WARNINGS_FATAL=false endif OTHER_INCLUDES += -I$(LAUNCHER_SHARE_SRC) diff --git a/jdk/make/java/main/java/Makefile b/jdk/make/java/main/java/Makefile index 5c876294c98..140a3001f80 100644 --- a/jdk/make/java/main/java/Makefile +++ b/jdk/make/java/main/java/Makefile @@ -1,5 +1,5 @@ # -# Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/main/javaw/Makefile b/jdk/make/java/main/javaw/Makefile index 1c03b23fab7..1ed70daa87e 100644 --- a/jdk/make/java/main/javaw/Makefile +++ b/jdk/make/java/main/javaw/Makefile @@ -1,5 +1,5 @@ # -# Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/net/Makefile b/jdk/make/java/net/Makefile index 6218c63776e..4141294c02c 100644 --- a/jdk/make/java/net/Makefile +++ b/jdk/make/java/net/Makefile @@ -94,8 +94,6 @@ include $(BUILDDIR)/common/Library.gmk ifeq ($(PLATFORM), windows) OTHER_LDLIBS = ws2_32.lib $(JVMLIB) - # Will not compile at warning level 3 if warnings are fatal - COMPILER_WARNINGS_FATAL=false else OTHER_LDLIBS = $(LIBSOCKET) -lnsl -ldl $(JVMLIB) endif diff --git a/jdk/make/java/nio/Makefile b/jdk/make/java/nio/Makefile index 635d80ce842..267a5745435 100644 --- a/jdk/make/java/nio/Makefile +++ b/jdk/make/java/nio/Makefile @@ -1,5 +1,5 @@ # -# Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -134,7 +134,6 @@ ifeq ($(PLATFORM),windows) $(OBJDIR)/../../../java.lang/java/$(OBJDIRNAME)/FileDescriptor_md.obj endif ifeq ($(PLATFORM), linux) -COMPILER_WARNINGS_FATAL=true OTHER_LDLIBS += -L$(LIBDIR)/$(LIBARCH) -ljava -lnet -lpthread -ldl endif ifeq ($(PLATFORM), solaris) diff --git a/jdk/make/java/nio/genCharsetProvider.sh b/jdk/make/java/nio/genCharsetProvider.sh index 574722fb4a9..58cfdf0dbd7 100644 --- a/jdk/make/java/nio/genCharsetProvider.sh +++ b/jdk/make/java/nio/genCharsetProvider.sh @@ -1,7 +1,7 @@ #! /bin/sh # -# Copyright 2004-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2004-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/nio/genExceptions.sh b/jdk/make/java/nio/genExceptions.sh index 2de5e9cd784..da72ef9a3bc 100644 --- a/jdk/make/java/nio/genExceptions.sh +++ b/jdk/make/java/nio/genExceptions.sh @@ -1,6 +1,6 @@ #! /bin/sh # -# Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/npt/Makefile b/jdk/make/java/npt/Makefile index 48cab86ae07..fe9eb0ad4e3 100644 --- a/jdk/make/java/npt/Makefile +++ b/jdk/make/java/npt/Makefile @@ -52,11 +52,6 @@ FILES_c = \ OTHER_INCLUDES = -I$(SRCDIR) -I$(PSRCDIR) -# -# This removes all asserts in the optimized version -# -CPPFLAGS_OPT += -DNDEBUG - # # Library to compile. # diff --git a/jdk/make/java/sun_nio/FILES_java.gmk b/jdk/make/java/sun_nio/FILES_java.gmk index 13f4fe88d27..91fc9efed28 100644 --- a/jdk/make/java/sun_nio/FILES_java.gmk +++ b/jdk/make/java/sun_nio/FILES_java.gmk @@ -1,5 +1,5 @@ # -# Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/verify/Makefile b/jdk/make/java/verify/Makefile index a90862d516a..c647d508569 100644 --- a/jdk/make/java/verify/Makefile +++ b/jdk/make/java/verify/Makefile @@ -43,8 +43,6 @@ ifeq ($(PLATFORM), windows) # JAVALIB = EXTRA_LIBS = - # Files built here do not compile with warning level 3 if warnings are fatal - COMPILER_WARNINGS_FATAL=false endif # diff --git a/jdk/make/java/zip/Makefile b/jdk/make/java/zip/Makefile index e25e46f1e4a..00b381d5085 100644 --- a/jdk/make/java/zip/Makefile +++ b/jdk/make/java/zip/Makefile @@ -49,9 +49,6 @@ FILES_export = \ ifneq ($(PLATFORM), windows) OTHER_CFLAGS += -DUSE_MMAP -else - # Files built here do not compile with warning level 3 if warnings are fatal - COMPILER_WARNINGS_FATAL=false endif # diff --git a/jdk/make/javax/Makefile b/jdk/make/javax/Makefile index 678fe8926f8..8ec72ade7e1 100644 --- a/jdk/make/javax/Makefile +++ b/jdk/make/javax/Makefile @@ -1,5 +1,5 @@ # -# Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/javax/others/Makefile b/jdk/make/javax/others/Makefile index f5ce890138a..cf8f30fd5e1 100644 --- a/jdk/make/javax/others/Makefile +++ b/jdk/make/javax/others/Makefile @@ -1,5 +1,5 @@ # -# Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/jdk_generic_profile.sh b/jdk/make/jdk_generic_profile.sh index 73801313b4f..32dd86197ef 100644 --- a/jdk/make/jdk_generic_profile.sh +++ b/jdk/make/jdk_generic_profile.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -119,7 +119,7 @@ if [ "${osname}" = SunOS ] ; then # System place where JDK installed images are stored? jdk_instances=/usr/jdk/instances - # Get the SS11 compilers (and latest patches for them too) + # Get the Sun Studio compilers (and latest patches for them too) if [ "${ALT_COMPILER_PATH}" = "" ] ; then ALT_COMPILER_PATH=/opt/SUNWspro/bin export ALT_COMPILER_PATH diff --git a/jdk/make/jpda/back/Makefile b/jdk/make/jpda/back/Makefile index a974bff608b..bd9818365e3 100644 --- a/jdk/make/jpda/back/Makefile +++ b/jdk/make/jpda/back/Makefile @@ -52,11 +52,6 @@ ifneq ($(PLATFORM), windows) OTHER_LDLIBS += -ldl endif # PLATFORM -# -# This turns off all assert() checking in the optimized library -# -CPPFLAGS_OPT += -DNDEBUG - # # This controls the ability to do logging in the library. # diff --git a/jdk/make/jpda/transport/shmem/Makefile b/jdk/make/jpda/transport/shmem/Makefile index ad5ff4b3729..a1e2382500a 100644 --- a/jdk/make/jpda/transport/shmem/Makefile +++ b/jdk/make/jpda/transport/shmem/Makefile @@ -36,13 +36,6 @@ FILES_m = mapfile-vers include $(BUILDDIR)/common/Defs.gmk -# 64-bit windows does not build at -W3 if warnings are fatal -ifeq ($(PLATFORM), windows) - ifeq ($(ARCH_DATA_MODEL), 64) - COMPILER_WARNINGS_FATAL=false - endif -endif - FILES_c = \ SharedMemoryTransport.c \ SharedMemoryConnection.c \ diff --git a/jdk/make/jpda/transport/socket/Makefile b/jdk/make/jpda/transport/socket/Makefile index 07c5642a2d3..828613d49ed 100644 --- a/jdk/make/jpda/transport/socket/Makefile +++ b/jdk/make/jpda/transport/socket/Makefile @@ -36,11 +36,6 @@ FILES_m = mapfile-vers include $(BUILDDIR)/common/Defs.gmk -ifeq ($(PLATFORM), windows) - # Files built here do not compile with warning level 3 if warnings are fatal - COMPILER_WARNINGS_FATAL=false -endif - ifeq ($(PLATFORM), linux) OTHER_LDLIBS += -lnsl $(LIBSOCKET) -lpthread endif diff --git a/jdk/make/jprt.config b/jdk/make/jprt.config index 0d18b274ca5..99ee4c4e793 100644 --- a/jdk/make/jprt.config +++ b/jdk/make/jprt.config @@ -1,7 +1,7 @@ #!echo "This is not a shell script" ############################################################################# # -# Copyright 2006-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -133,9 +133,15 @@ if [ "${osname}" = SunOS ] ; then solaris_arch=i386 fi - # Get the SS11 compilers into path (make sure it matches ALT setting) - compiler_path=${jdk_devtools}/${solaris_arch}/SUNWspro/SS11/bin - compiler_name=SS11 + # Get the compilers into path (make sure it matches ALT setting) + if [ "${JPRT_SOLARIS_COMPILER_NAME}" != "" ] ; then + compiler_name=${JPRT_SOLARIS_COMPILER_NAME} + else + # FIXUP: Change to SS12 when validated + #compiler_name=SS12 + compiler_name=SS11 + fi + compiler_path=${jdk_devtools}/${solaris_arch}/SUNWspro/${compiler_name}/bin ALT_COMPILER_PATH="${compiler_path}" export ALT_COMPILER_PATH dirMustExist "${compiler_path}" ALT_COMPILER_PATH diff --git a/jdk/make/sun/Makefile b/jdk/make/sun/Makefile index 0ce9014e7e1..8964d1db29f 100644 --- a/jdk/make/sun/Makefile +++ b/jdk/make/sun/Makefile @@ -1,5 +1,5 @@ # -# Copyright 1995-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/sun/cmm/Makefile b/jdk/make/sun/cmm/Makefile index 6aae4d1e326..bbed857654c 100644 --- a/jdk/make/sun/cmm/Makefile +++ b/jdk/make/sun/cmm/Makefile @@ -1,5 +1,5 @@ # -# Copyright 2006-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/sun/cmm/kcms/Makefile b/jdk/make/sun/cmm/kcms/Makefile index b430a140716..000f2527e5b 100644 --- a/jdk/make/sun/cmm/kcms/Makefile +++ b/jdk/make/sun/cmm/kcms/Makefile @@ -47,8 +47,6 @@ FILES_export = \ ifeq ($(PLATFORM), windows) # Override the default version info with our own resource file (see 5043594) VERSIONINFO_RESOURCE = $(CLOSED_SRC)/share/native/sun/java2d/cmm/kcms/cmm.rc - # Files built here do not compile with warning level 3 if warnings are fatal - COMPILER_WARNINGS_FATAL=false endif # Rules diff --git a/jdk/make/sun/font/Makefile b/jdk/make/sun/font/Makefile index a0179c1252b..ae06bbe8225 100644 --- a/jdk/make/sun/font/Makefile +++ b/jdk/make/sun/font/Makefile @@ -77,9 +77,6 @@ FILES_export = \ ifeq ($(PLATFORM), windows) - # Files built here do not compile with warning level 3 if warnings are fatal - COMPILER_WARNINGS_FATAL=false - LDLIBS += user32.lib gdi32.lib $(OBJDIR)/../../../sun.awt/awt/$(OBJDIRNAME)/awt.lib OTHER_CFLAGS += -DCC_NOEX diff --git a/jdk/make/sun/font/t2k/Makefile b/jdk/make/sun/font/t2k/Makefile index 93d2e59d29b..65f7f99a4dd 100644 --- a/jdk/make/sun/font/t2k/Makefile +++ b/jdk/make/sun/font/t2k/Makefile @@ -64,9 +64,6 @@ FILES_export = \ ifeq ($(PLATFORM), windows) - # Files built here do not compile with warning level 3 if warnings are fatal - COMPILER_WARNINGS_FATAL=false - # t2k imports several shared methods from fontmanager.dll LDLIBS += user32.lib $(OBJDIR)/../../../sun.font/fontmanager/$(OBJDIRNAME)/fontmanager.lib diff --git a/jdk/make/sun/jawt/Makefile b/jdk/make/sun/jawt/Makefile index 4f733e4cfd6..45d337258a4 100644 --- a/jdk/make/sun/jawt/Makefile +++ b/jdk/make/sun/jawt/Makefile @@ -1,5 +1,5 @@ # -# Copyright 1999-2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -93,7 +93,6 @@ else # PLATFORM # Other extra flags needed for compiling. # CPPFLAGS += -I$(OPENWIN_HOME)/include \ - -I$(MOTIF_DIR)/include \ -I$(SHARE_SRC)/native/$(PKGDIR)/debug \ -I$(SHARE_SRC)/native/$(PKGDIR)/image \ -I$(SHARE_SRC)/native/$(PKGDIR)/image/cvutils \ diff --git a/jdk/make/sun/jdbc/Makefile b/jdk/make/sun/jdbc/Makefile index d520b22cf85..818a89d0e8b 100644 --- a/jdk/make/sun/jdbc/Makefile +++ b/jdk/make/sun/jdbc/Makefile @@ -69,11 +69,6 @@ ifneq ($(PLATFORM), windows) INIT += $(ODBC_FAKE_LIBRARIES) endif -ifeq ($(PLATFORM),windows) - # Files built here do not compile with warning level 3 if warnings are fatal - COMPILER_WARNINGS_FATAL=false -endif - # # Rules # diff --git a/jdk/make/sun/jpeg/Makefile b/jdk/make/sun/jpeg/Makefile index 45bc70855dd..e3513763316 100644 --- a/jdk/make/sun/jpeg/Makefile +++ b/jdk/make/sun/jpeg/Makefile @@ -73,10 +73,5 @@ include $(BUILDDIR)/common/Library.gmk # vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/image/jpeg -ifeq ($(PLATFORM), windows) - # Files built here do not compile with warning level 3 if warnings are fatal - COMPILER_WARNINGS_FATAL=false -endif # PLATFORM - CLASSES.export += java.io.InputStream diff --git a/jdk/make/sun/splashscreen/Makefile b/jdk/make/sun/splashscreen/Makefile index 8a0dffe62c9..e65ab7ec181 100644 --- a/jdk/make/sun/splashscreen/Makefile +++ b/jdk/make/sun/splashscreen/Makefile @@ -1,5 +1,5 @@ # -# Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/tools/Makefile b/jdk/make/tools/Makefile index be1c59a7cfa..1b3c4063c8c 100644 --- a/jdk/make/tools/Makefile +++ b/jdk/make/tools/Makefile @@ -1,5 +1,5 @@ # -# Copyright 1998-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -51,7 +51,6 @@ SUBDIRS = \ jdwpgen \ makeclasslist \ strip_properties \ - winver \ CharsetMapping all build clean clobber:: diff --git a/jdk/make/tools/freetypecheck/Makefile b/jdk/make/tools/freetypecheck/Makefile index c96854309f2..94c983565ac 100644 --- a/jdk/make/tools/freetypecheck/Makefile +++ b/jdk/make/tools/freetypecheck/Makefile @@ -1,5 +1,5 @@ # -# Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/tools/freetypecheck/freetypecheck.c b/jdk/make/tools/freetypecheck/freetypecheck.c index 12b26f7e88b..3f900a840a9 100644 --- a/jdk/make/tools/freetypecheck/freetypecheck.c +++ b/jdk/make/tools/freetypecheck/freetypecheck.c @@ -1,5 +1,5 @@ /* - * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/tools/src/build/tools/jdwpgen/CommandNode.java b/jdk/make/tools/src/build/tools/jdwpgen/CommandNode.java index ec8666453ae..2e153061e16 100644 --- a/jdk/make/tools/src/build/tools/jdwpgen/CommandNode.java +++ b/jdk/make/tools/src/build/tools/jdwpgen/CommandNode.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2001 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/tools/src/build/tools/jdwpgen/ConstantSetNode.java b/jdk/make/tools/src/build/tools/jdwpgen/ConstantSetNode.java index 325ebc9ef46..56ca041c4ff 100644 --- a/jdk/make/tools/src/build/tools/jdwpgen/ConstantSetNode.java +++ b/jdk/make/tools/src/build/tools/jdwpgen/ConstantSetNode.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/tools/src/build/tools/jdwpgen/RepeatNode.java b/jdk/make/tools/src/build/tools/jdwpgen/RepeatNode.java index 4c8f20982f2..107072a52d3 100644 --- a/jdk/make/tools/src/build/tools/jdwpgen/RepeatNode.java +++ b/jdk/make/tools/src/build/tools/jdwpgen/RepeatNode.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/tools/winver/bin/winver.exe b/jdk/make/tools/winver/bin/winver.exe deleted file mode 100755 index cba45bef1a4..00000000000 Binary files a/jdk/make/tools/winver/bin/winver.exe and /dev/null differ diff --git a/jdk/src/share/back/eventFilter.c b/jdk/src/share/back/eventFilter.c index edddeba808c..955cf8813b4 100644 --- a/jdk/src/share/back/eventFilter.c +++ b/jdk/src/share/back/eventFilter.c @@ -492,14 +492,17 @@ eventFilterRestricted_passesFilter(JNIEnv *env, char *sourceName = 0; jvmtiError error = JVMTI_FUNC_PTR(gdata->jvmti,GetSourceFileName) (gdata->jvmti, clazz, &sourceName); - if (error == JVMTI_ERROR_NONE) { - if (sourceName == 0 || !patternStringMatch(sourceName, desiredNamePattern)) { - /* We have no match */ - jvmtiDeallocate(sourceName); - return JNI_FALSE; - } + if (error == JVMTI_ERROR_NONE && + sourceName != 0 && + patternStringMatch(sourceName, desiredNamePattern)) { + // got a hit - report the event + jvmtiDeallocate(sourceName); + break; } + // We have no match, we have no source file name, + // or we got a JVM TI error. Don't report the event. jvmtiDeallocate(sourceName); + return JNI_FALSE; } break; } diff --git a/jdk/src/share/bin/java.h b/jdk/src/share/bin/java.h index 291b6755690..e6a08f3cf00 100644 --- a/jdk/src/share/bin/java.h +++ b/jdk/src/share/bin/java.h @@ -1,5 +1,5 @@ /* - * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/bin/main.c b/jdk/src/share/bin/main.c index 88d9190a555..df90e1101eb 100644 --- a/jdk/src/share/bin/main.c +++ b/jdk/src/share/bin/main.c @@ -1,5 +1,5 @@ /* - * Copyright 1995-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java b/jdk/src/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java index ee5ed5a9229..2613a025e40 100644 --- a/jdk/src/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java +++ b/jdk/src/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFImageReader.java b/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFImageReader.java index ae2bcb56a20..4f957b7e78c 100644 --- a/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFImageReader.java +++ b/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFImageReader.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFWritableImageMetadata.java b/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFWritableImageMetadata.java index 58d819f11ea..7a8a21048ae 100644 --- a/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFWritableImageMetadata.java +++ b/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFWritableImageMetadata.java @@ -1,5 +1,5 @@ /* - * Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKColorChooserPanel.java b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKColorChooserPanel.java index ba1c8da7958..9ae2d940443 100644 --- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKColorChooserPanel.java +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKColorChooserPanel.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java index a640862c50c..8b786da73fb 100644 --- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java index 7fd7bde45a6..6934aa213d1 100644 --- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKStyle.java b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKStyle.java index 4f6e42c784c..4630bb13cc9 100644 --- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKStyle.java +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKStyle.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/Metacity.java b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/Metacity.java index e6117989134..14d974b0314 100644 --- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/Metacity.java +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/Metacity.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifGraphicsUtils.java b/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifGraphicsUtils.java index 31425407792..c17f76de943 100644 --- a/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifGraphicsUtils.java +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifGraphicsUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifInternalFrameTitlePane.java b/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifInternalFrameTitlePane.java index 737a36d2eb5..2e6c89c935b 100644 --- a/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifInternalFrameTitlePane.java +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifInternalFrameTitlePane.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifLookAndFeel.java b/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifLookAndFeel.java index e91dbb9e718..4ad3a409796 100644 --- a/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifLookAndFeel.java +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifLookAndFeel.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1222,9 +1222,7 @@ public class MotifLookAndFeel extends BasicLookAndFeel "FileChooser.enterFileNameLabelMnemonic", new Integer (KeyEvent.VK_N), // 'n' "FileChooser.ancestorInputMap", new UIDefaults.LazyInputMap(new Object[] { - "ESCAPE", "cancelSelection", - "ENTER", "approveSelection", - "ctrl ENTER", "approveSelection" + "ESCAPE", "cancelSelection" }), diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java index 9af41fc39c8..bb7842a0018 100644 --- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -825,9 +825,7 @@ public class WindowsLookAndFeel extends BasicLookAndFeel "ESCAPE", "cancelSelection", "F2", "editFileName", "F5", "refresh", - "BACK_SPACE", "Go Up", - "ENTER", "approveSelection", - "ctrl ENTER", "approveSelection" + "BACK_SPACE", "Go Up" }), "FileView.directoryIcon", SwingUtilities2.makeIcon(getClass(), diff --git a/jdk/src/share/classes/com/sun/jmx/interceptor/DefaultMBeanServerInterceptor.java b/jdk/src/share/classes/com/sun/jmx/interceptor/DefaultMBeanServerInterceptor.java index b968ba9aa1e..99b10ad1e8c 100644 --- a/jdk/src/share/classes/com/sun/jmx/interceptor/DefaultMBeanServerInterceptor.java +++ b/jdk/src/share/classes/com/sun/jmx/interceptor/DefaultMBeanServerInterceptor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -84,8 +84,13 @@ import com.sun.jmx.mbeanserver.MBeanInstantiator; import com.sun.jmx.mbeanserver.Repository; import com.sun.jmx.mbeanserver.NamedObject; import com.sun.jmx.mbeanserver.Introspector; +import com.sun.jmx.mbeanserver.MBeanInjector; +import com.sun.jmx.mbeanserver.NotifySupport; +import com.sun.jmx.mbeanserver.Repository.RegistrationContext; import com.sun.jmx.mbeanserver.Util; import com.sun.jmx.remote.util.EnvHelp; +import javax.management.DynamicWrapperMBean; +import javax.management.NotificationBroadcasterSupport; /** * This is the default class for MBean manipulation on the agent side. It @@ -433,36 +438,26 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor { if (instance instanceof MBeanRegistration) preDeregisterInvoke((MBeanRegistration) instance); - repository.remove(name); - // may throw InstanceNotFoundException + final Object resource = getResource(instance); - /** - * Checks if the unregistered MBean is a ClassLoader - * If so, it removes the MBean from the default loader repository. - */ + // Unregisters the MBean from the repository. + // Returns the resource context that was used. + // The returned context does nothing for regular MBeans. + // For ClassLoader MBeans and JMXNamespace (and JMXDomain) + // MBeans - the context makes it possible to unregister these + // objects from the appropriate framework artifacts, such as + // the CLR or the dispatcher, from within the repository lock. + // In case of success, we also need to call context.done() at the + // end of this method. + // + final ResourceContext context = + unregisterFromRepository(resource, instance, name); - Object resource = getResource(instance); - if (resource instanceof ClassLoader - && resource != server.getClass().getClassLoader()) { - final ModifiableClassLoaderRepository clr = - instantiator.getClassLoaderRepository(); - if (clr != null) clr.removeClassLoader(name); - } - - // --------------------- - // Send deletion event - // --------------------- - if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) { - MBEANSERVER_LOGGER.logp(Level.FINER, - DefaultMBeanServerInterceptor.class.getName(), - "unregisterMBean", "Send delete notification of object " + - name.getCanonicalName()); - } - sendNotification(MBeanServerNotification.UNREGISTRATION_NOTIFICATION, - name); if (instance instanceof MBeanRegistration) postDeregisterInvoke((MBeanRegistration) instance); + + context.done(); } public ObjectInstance getObjectInstance(ObjectName name) @@ -939,15 +934,22 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor { } ObjectName logicalName = name; + logicalName = preRegister(mbean, server, name); + + // preRegister returned successfully, so from this point on we + // must call postRegister(false) if there is any problem. + boolean registered = false; + boolean registerFailed = false; + ResourceContext context = null; + + try { + mbean = injectResources(mbean, server, logicalName); - if (mbean instanceof MBeanRegistration) { - MBeanRegistration reg = (MBeanRegistration) mbean; - logicalName = preRegisterInvoke(reg, name, server); if (mbean instanceof DynamicMBean2) { try { ((DynamicMBean2) mbean).preRegister2(server, logicalName); + registerFailed = true; // until we succeed } catch (Exception e) { - postRegisterInvoke(reg, false, false); if (e instanceof RuntimeException) throw (RuntimeException) e; if (e instanceof InstanceAlreadyExistsException) @@ -960,86 +962,102 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor { logicalName = ObjectName.getInstance(nonDefaultDomain(logicalName)); } - } - checkMBeanPermission(classname, null, logicalName, "registerMBean"); + checkMBeanPermission(classname, null, logicalName, "registerMBean"); - final ObjectInstance result; - if (logicalName!=null) { - result = new ObjectInstance(logicalName, classname); - internal_addObject(mbean, logicalName); - } else { - if (mbean instanceof MBeanRegistration) - postRegisterInvoke((MBeanRegistration) mbean, false, true); - final RuntimeException wrapped = - new IllegalArgumentException("No object name specified"); - throw new RuntimeOperationsException(wrapped, - "Exception occurred trying to register the MBean"); - } - - if (mbean instanceof MBeanRegistration) - postRegisterInvoke((MBeanRegistration) mbean, true, false); - - /** - * Checks if the newly registered MBean is a ClassLoader - * If so, tell the ClassLoaderRepository (CLR) about it. We do - * this even if the object is a PrivateClassLoader. In that - * case, the CLR remembers the loader for use when it is - * explicitly named (e.g. as the loader in createMBean) but - * does not add it to the list that is consulted by - * ClassLoaderRepository.loadClass. - */ - final Object resource = getResource(mbean); - if (resource instanceof ClassLoader) { - final ModifiableClassLoaderRepository clr = - instantiator.getClassLoaderRepository(); - if (clr == null) { + if (logicalName == null) { final RuntimeException wrapped = - new IllegalArgumentException( - "Dynamic addition of class loaders is not supported"); + new IllegalArgumentException("No object name specified"); throw new RuntimeOperationsException(wrapped, - "Exception occurred trying to register the MBean as a class loader"); + "Exception occurred trying to register the MBean"); } - clr.addClassLoader(logicalName, (ClassLoader) resource); + + final Object resource = getResource(mbean); + + // Register the MBean with the repository. + // Returns the resource context that was used. + // The returned context does nothing for regular MBeans. + // For ClassLoader MBeans and JMXNamespace (and JMXDomain) + // MBeans - the context makes it possible to register these + // objects with the appropriate framework artifacts, such as + // the CLR or the dispatcher, from within the repository lock. + // In case of success, we also need to call context.done() at the + // end of this method. + // + context = registerWithRepository(resource, mbean, logicalName); + + registerFailed = false; + registered = true; + } finally { + postRegister(mbean, registered, registerFailed); } - return result; + context.done(); + return new ObjectInstance(logicalName, classname); } - private static ObjectName preRegisterInvoke(MBeanRegistration moi, - ObjectName name, - MBeanServer mbs) - throws InstanceAlreadyExistsException, MBeanRegistrationException { - - final ObjectName newName; - + private static void throwMBeanRegistrationException(Throwable t, String where) + throws MBeanRegistrationException { try { - newName = moi.preRegister(mbs, name); + throw t; } catch (RuntimeException e) { - throw new RuntimeMBeanException(e, - "RuntimeException thrown in preRegister method"); + throw new RuntimeMBeanException( + e, "RuntimeException thrown " + where); } catch (Error er) { - throw new RuntimeErrorException(er, - "Error thrown in preRegister method"); + throw new RuntimeErrorException(er, "Error thrown " + where); } catch (MBeanRegistrationException r) { throw r; } catch (Exception ex) { - throw new MBeanRegistrationException(ex, - "Exception thrown in preRegister method"); + throw new MBeanRegistrationException(ex, "Exception thrown " + where); + } catch (Throwable t1) { + throw new RuntimeException(t); // neither Error nor Exception?? + } + } + + private static ObjectName preRegister( + DynamicMBean mbean, MBeanServer mbs, ObjectName name) + throws InstanceAlreadyExistsException, MBeanRegistrationException { + + ObjectName newName = null; + + try { + if (mbean instanceof MBeanRegistration) + newName = ((MBeanRegistration) mbean).preRegister(mbs, name); + } catch (Throwable t) { + throwMBeanRegistrationException(t, "in preRegister method"); } if (newName != null) return newName; else return name; } - private static void postRegisterInvoke(MBeanRegistration moi, - boolean registrationDone, - boolean registerFailed) { - - if (registerFailed && moi instanceof DynamicMBean2) - ((DynamicMBean2) moi).registerFailed(); + private static DynamicMBean injectResources( + DynamicMBean mbean, MBeanServer mbs, ObjectName name) + throws MBeanRegistrationException { try { - moi.postRegister(registrationDone); + Object resource = getResource(mbean); + MBeanInjector.inject(resource, mbs, name); + if (MBeanInjector.injectsSendNotification(resource)) { + NotificationBroadcasterSupport nbs = + new NotificationBroadcasterSupport(); + MBeanInjector.injectSendNotification(resource, nbs); + mbean = NotifySupport.wrap(mbean, nbs); + } + return mbean; + } catch (Throwable t) { + throwMBeanRegistrationException(t, "injecting @Resources"); + return null; // not reached + } + } + + private static void postRegister( + DynamicMBean mbean, boolean registrationDone, boolean registerFailed) { + + if (registerFailed && mbean instanceof DynamicMBean2) + ((DynamicMBean2) mbean).registerFailed(); + try { + if (mbean instanceof MBeanRegistration) + ((MBeanRegistration) mbean).postRegister(registrationDone); } catch (RuntimeException e) { throw new RuntimeMBeanException(e, "RuntimeException thrown in postRegister method"); @@ -1053,17 +1071,8 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor { throws MBeanRegistrationException { try { moi.preDeregister(); - } catch (RuntimeException e) { - throw new RuntimeMBeanException(e, - "RuntimeException thrown in preDeregister method"); - } catch (Error er) { - throw new RuntimeErrorException(er, - "Error thrown in preDeregister method"); - } catch (MBeanRegistrationException t) { - throw t; - } catch (Exception ex) { - throw new MBeanRegistrationException(ex, - "Exception thrown in preDeregister method"); + } catch (Throwable t) { + throwMBeanRegistrationException(t, "in preDeregister method"); } } @@ -1104,12 +1113,19 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor { } private static Object getResource(DynamicMBean mbean) { - if (mbean instanceof DynamicMBean2) - return ((DynamicMBean2) mbean).getResource(); + if (mbean instanceof DynamicWrapperMBean) + return ((DynamicWrapperMBean) mbean).getWrappedObject(); else return mbean; } + private static ClassLoader getResourceLoader(DynamicMBean mbean) { + if (mbean instanceof DynamicWrapperMBean) + return ((DynamicWrapperMBean) mbean).getWrappedClassLoader(); + else + return mbean.getClass().getClassLoader(); + } + private ObjectName nonDefaultDomain(ObjectName name) { if (name == null || name.getDomain().length() > 0) return name; @@ -1123,14 +1139,7 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor { if one is supplied where it shouldn't be). */ final String completeName = domain + name; - try { - return new ObjectName(completeName); - } catch (MalformedObjectNameException e) { - final String msg = - "Unexpected default domain problem: " + completeName + ": " + - e; - throw EnvHelp.initCause(new IllegalArgumentException(msg), e); - } + return Util.newObjectName(completeName); } public String getDefaultDomain() { @@ -1211,7 +1220,7 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor { } NotificationListener listenerWrapper = - getListenerWrapper(listener, name, broadcaster, true); + getListenerWrapper(listener, name, instance, true); broadcaster.addNotificationListener(listenerWrapper, filter, handback); } @@ -1335,7 +1344,6 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor { DynamicMBean instance = getMBean(name); checkMBeanPermission(instance, null, name, "removeNotificationListener"); - Object resource = getResource(instance); /* We could simplify the code by assigning broadcaster after assigning listenerWrapper, but that would change the error @@ -1348,7 +1356,7 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor { getNotificationBroadcaster(name, instance, reqClass); NotificationListener listenerWrapper = - getListenerWrapper(listener, name, resource, false); + getListenerWrapper(listener, name, instance, false); if (listenerWrapper == null) throw new ListenerNotFoundException("Unknown listener"); @@ -1366,8 +1374,10 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor { private static T getNotificationBroadcaster(ObjectName name, Object instance, Class reqClass) { - if (instance instanceof DynamicMBean2) - instance = ((DynamicMBean2) instance).getResource(); + if (reqClass.isInstance(instance)) + return reqClass.cast(instance); + if (instance instanceof DynamicWrapperMBean) + instance = ((DynamicWrapperMBean) instance).getWrappedObject(); if (reqClass.isInstance(instance)) return reqClass.cast(instance); final RuntimeException exc = @@ -1415,24 +1425,31 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor { checkMBeanPermission(instance, null, name, "isInstanceOf"); try { - if (instance instanceof DynamicMBean2) { - Object resource = ((DynamicMBean2) instance).getResource(); - ClassLoader loader = resource.getClass().getClassLoader(); - Class c = Class.forName(className, false, loader); - return c.isInstance(resource); - } + Object resource = getResource(instance); - final String cn = getClassName(instance); - if (cn.equals(className)) + final String resourceClassName = + (resource instanceof DynamicMBean) ? + getClassName((DynamicMBean) resource) : + resource.getClass().getName(); + + if (resourceClassName.equals(className)) return true; - final ClassLoader cl = instance.getClass().getClassLoader(); + final ClassLoader cl = getResourceLoader(instance); final Class classNameClass = Class.forName(className, false, cl); - if (classNameClass.isInstance(instance)) + if (classNameClass.isInstance(resource)) return true; - final Class instanceClass = Class.forName(cn, false, cl); - return classNameClass.isAssignableFrom(instanceClass); + // Ensure that isInstanceOf(NotificationEmitter) is true when + // the MBean is a NotificationEmitter by virtue of a @Resource + // annotation specifying a SendNotification resource. + // This is a hack. + if (instance instanceof NotificationBroadcaster && + classNameClass.isAssignableFrom(NotificationEmitter.class)) + return true; + + final Class resourceClass = Class.forName(resourceClassName, false, cl); + return classNameClass.isAssignableFrom(resourceClass); } catch (Exception x) { /* Could be SecurityException or ClassNotFoundException */ if (MBEANSERVER_LOGGER.isLoggable(Level.FINEST)) { @@ -1457,7 +1474,7 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor { DynamicMBean instance = getMBean(mbeanName); checkMBeanPermission(instance, null, mbeanName, "getClassLoaderFor"); - return getResource(instance).getClass().getClassLoader(); + return getResourceLoader(instance); } /** @@ -1488,40 +1505,6 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor { return (ClassLoader) resource; } - /** - * Adds a MBean in the repository - */ - private void internal_addObject(DynamicMBean object, ObjectName logicalName) - throws InstanceAlreadyExistsException { - - // ------------------------------ - // ------------------------------ - - // Let the repository do the work. - - try { - repository.addMBean(object, logicalName); - } catch (InstanceAlreadyExistsException e) { - if (object instanceof MBeanRegistration) { - postRegisterInvoke((MBeanRegistration) object, false, true); - } - throw e; - } - - // --------------------- - // Send create event - // --------------------- - if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) { - MBEANSERVER_LOGGER.logp(Level.FINER, - DefaultMBeanServerInterceptor.class.getName(), - "addObject", "Send create notification of object " + - logicalName.getCanonicalName()); - } - - sendNotification(MBeanServerNotification.REGISTRATION_NOTIFICATION, - logicalName ) ; - } - /** * Sends an MBeanServerNotifications with the specified type for the * MBean with the specified ObjectName @@ -1712,9 +1695,10 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor { */ private NotificationListener getListenerWrapper(NotificationListener l, ObjectName name, - Object mbean, + DynamicMBean mbean, boolean create) { - ListenerWrapper wrapper = new ListenerWrapper(l, name, mbean); + Object resource = getResource(mbean); + ListenerWrapper wrapper = new ListenerWrapper(l, name, resource); synchronized (listenerWrappers) { WeakReference ref = listenerWrappers.get(wrapper); if (ref != null) { @@ -1758,6 +1742,7 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor { listener.handleNotification(notification, handback); } + @Override public boolean equals(Object o) { if (!(o instanceof ListenerWrapper)) return false; @@ -1774,6 +1759,7 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor { */ } + @Override public int hashCode() { return (System.identityHashCode(listener) ^ System.identityHashCode(mbean)); @@ -1851,4 +1837,213 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor { } } + // ------------------------------------------------------------------ + // + // Dealing with registration of special MBeans in the repository. + // + // ------------------------------------------------------------------ + + /** + * A RegistrationContext that makes it possible to perform additional + * post registration actions (or post unregistration actions) outside + * of the repository lock, once postRegister (or postDeregister) has + * been called. + * The method {@code done()} will be called in registerMBean or + * unregisterMBean, at the end. + */ + private static interface ResourceContext extends RegistrationContext { + public void done(); + /** An empty ResourceContext which does nothing **/ + public static final ResourceContext NONE = new ResourceContext() { + public void done() {} + public void registering() {} + public void unregistered() {} + }; + } + + /** + * Adds a MBean in the repository, + * sends MBeanServerNotification.REGISTRATION_NOTIFICATION, + * returns ResourceContext for special resources such as ClassLoaders + * or JMXNamespaces. For regular MBean this method returns + * ResourceContext.NONE. + * @return a ResourceContext for special resources such as ClassLoaders + * or JMXNamespaces. + */ + private ResourceContext registerWithRepository( + final Object resource, + final DynamicMBean object, + final ObjectName logicalName) + throws InstanceAlreadyExistsException, + MBeanRegistrationException { + + // Creates a registration context, if needed. + // + final ResourceContext context = + makeResourceContextFor(resource, logicalName); + + + repository.addMBean(object, logicalName, context); + // May throw InstanceAlreadyExistsException + + // --------------------- + // Send create event + // --------------------- + if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) { + MBEANSERVER_LOGGER.logp(Level.FINER, + DefaultMBeanServerInterceptor.class.getName(), + "addObject", "Send create notification of object " + + logicalName.getCanonicalName()); + } + + sendNotification( + MBeanServerNotification.REGISTRATION_NOTIFICATION, + logicalName); + + return context; + } + + /** + * Removes a MBean in the repository, + * sends MBeanServerNotification.UNREGISTRATION_NOTIFICATION, + * returns ResourceContext for special resources such as ClassLoaders + * or JMXNamespaces, or null. For regular MBean this method returns + * ResourceContext.NONE. + * + * @return a ResourceContext for special resources such as ClassLoaders + * or JMXNamespaces. + */ + private ResourceContext unregisterFromRepository( + final Object resource, + final DynamicMBean object, + final ObjectName logicalName) + throws InstanceNotFoundException { + + // Creates a registration context, if needed. + // + final ResourceContext context = + makeResourceContextFor(resource, logicalName); + + + repository.remove(logicalName, context); + + // --------------------- + // Send deletion event + // --------------------- + if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) { + MBEANSERVER_LOGGER.logp(Level.FINER, + DefaultMBeanServerInterceptor.class.getName(), + "unregisterMBean", "Send delete notification of object " + + logicalName.getCanonicalName()); + } + + sendNotification(MBeanServerNotification.UNREGISTRATION_NOTIFICATION, + logicalName); + return context; + } + + /** + * Registers a ClassLoader with the CLR. + * This method is called by the ResourceContext from within the + * repository lock. + * @param loader The ClassLoader. + * @param logicalName The ClassLoader MBean ObjectName. + */ + private void addClassLoader(ClassLoader loader, + final ObjectName logicalName) { + /** + * Called when the newly registered MBean is a ClassLoader + * If so, tell the ClassLoaderRepository (CLR) about it. We do + * this even if the loader is a PrivateClassLoader. In that + * case, the CLR remembers the loader for use when it is + * explicitly named (e.g. as the loader in createMBean) but + * does not add it to the list that is consulted by + * ClassLoaderRepository.loadClass. + */ + final ModifiableClassLoaderRepository clr = + instantiator.getClassLoaderRepository(); + if (clr == null) { + final RuntimeException wrapped = + new IllegalArgumentException( + "Dynamic addition of class loaders" + + " is not supported"); + throw new RuntimeOperationsException(wrapped, + "Exception occurred trying to register" + + " the MBean as a class loader"); + } + clr.addClassLoader(logicalName, loader); + } + + /** + * Unregisters a ClassLoader from the CLR. + * This method is called by the ResourceContext from within the + * repository lock. + * @param loader The ClassLoader. + * @param logicalName The ClassLoader MBean ObjectName. + */ + private void removeClassLoader(ClassLoader loader, + final ObjectName logicalName) { + /** + * Removes the MBean from the default loader repository. + */ + if (loader != server.getClass().getClassLoader()) { + final ModifiableClassLoaderRepository clr = + instantiator.getClassLoaderRepository(); + if (clr != null) { + clr.removeClassLoader(logicalName); + } + } + } + + /** + * Creates a ResourceContext for a ClassLoader MBean. + * The resource context makes it possible to add the ClassLoader to + * (ResourceContext.registering) or resp. remove the ClassLoader from + * (ResourceContext.unregistered) the CLR + * when the associated MBean is added to or resp. removed from the + * repository. + * + * @param loader The ClassLoader MBean being registered or + * unregistered. + * @param logicalName The name of the ClassLoader MBean. + * @return a ResourceContext that takes in charge the addition or removal + * of the loader to or from the CLR. + */ + private ResourceContext createClassLoaderContext( + final ClassLoader loader, + final ObjectName logicalName) { + return new ResourceContext() { + + public void registering() { + addClassLoader(loader, logicalName); + } + + public void unregistered() { + removeClassLoader(loader, logicalName); + } + + public void done() { + } + }; + } + + /** + * Creates a ResourceContext for the given resource. + * If the resource does not need a ResourceContext, returns + * ResourceContext.NONE. + * At this time, only JMXNamespaces and ClassLoaders need a + * ResourceContext. + * + * @param resource The resource being registered or unregistered. + * @param logicalName The name of the associated MBean. + * @return + */ + private ResourceContext makeResourceContextFor(Object resource, + ObjectName logicalName) { + if (resource instanceof ClassLoader) { + return createClassLoaderContext((ClassLoader) resource, + logicalName); + } + return ResourceContext.NONE; + } } diff --git a/jdk/src/share/classes/com/sun/jmx/mbeanserver/ConvertingMethod.java b/jdk/src/share/classes/com/sun/jmx/mbeanserver/ConvertingMethod.java index c0032fdce2d..b8377cf4781 100644 --- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/ConvertingMethod.java +++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/ConvertingMethod.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,13 +31,15 @@ import java.lang.reflect.Type; import javax.management.Descriptor; import javax.management.MBeanException; +import javax.management.openmbean.MXBeanMapping; +import javax.management.openmbean.MXBeanMappingFactory; import javax.management.openmbean.OpenDataException; import javax.management.openmbean.OpenType; final class ConvertingMethod { - static ConvertingMethod from(Method m) { + static ConvertingMethod from(Method m, MXBeanMappingFactory mappingFactory) { try { - return new ConvertingMethod(m); + return new ConvertingMethod(m, mappingFactory); } catch (OpenDataException ode) { final String msg = "Method " + m.getDeclaringClass().getName() + "." + m.getName() + " has parameter or return type that " + @@ -67,13 +69,13 @@ final class ConvertingMethod { } OpenType getOpenReturnType() { - return returnConverter.getOpenType(); + return returnMapping.getOpenType(); } OpenType[] getOpenParameterTypes() { - final OpenType[] types = new OpenType[paramConverters.length]; - for (int i = 0; i < paramConverters.length; i++) - types[i] = paramConverters[i].getOpenType(); + final OpenType[] types = new OpenType[paramMappings.length]; + for (int i = 0; i < paramMappings.length; i++) + types[i] = paramMappings[i].getOpenType(); return types; } @@ -85,9 +87,9 @@ final class ConvertingMethod { * value will be converted to an Open Type, so if it is convertible * at all there is no further check needed. */ - void checkCallFromOpen() throws IllegalArgumentException { + void checkCallFromOpen() { try { - for (OpenConverter paramConverter : paramConverters) + for (MXBeanMapping paramConverter : paramMappings) paramConverter.checkReconstructible(); } catch (InvalidObjectException e) { throw new IllegalArgumentException(e); @@ -102,32 +104,32 @@ final class ConvertingMethod { * open types, so if it is convertible at all there is no further * check needed. */ - void checkCallToOpen() throws IllegalArgumentException { + void checkCallToOpen() { try { - returnConverter.checkReconstructible(); + returnMapping.checkReconstructible(); } catch (InvalidObjectException e) { throw new IllegalArgumentException(e); } } String[] getOpenSignature() { - if (paramConverters.length == 0) + if (paramMappings.length == 0) return noStrings; - String[] sig = new String[paramConverters.length]; - for (int i = 0; i < paramConverters.length; i++) - sig[i] = paramConverters[i].getOpenClass().getName(); + String[] sig = new String[paramMappings.length]; + for (int i = 0; i < paramMappings.length; i++) + sig[i] = paramMappings[i].getOpenClass().getName(); return sig; } final Object toOpenReturnValue(MXBeanLookup lookup, Object ret) throws OpenDataException { - return returnConverter.toOpenValue(lookup, ret); + return returnMapping.toOpenValue(ret); } final Object fromOpenReturnValue(MXBeanLookup lookup, Object ret) throws InvalidObjectException { - return returnConverter.fromOpenValue(lookup, ret); + return returnMapping.fromOpenValue(ret); } final Object[] toOpenParameters(MXBeanLookup lookup, Object[] params) @@ -136,17 +138,17 @@ final class ConvertingMethod { return params; final Object[] oparams = new Object[params.length]; for (int i = 0; i < params.length; i++) - oparams[i] = paramConverters[i].toOpenValue(lookup, params[i]); + oparams[i] = paramMappings[i].toOpenValue(params[i]); return oparams; } - final Object[] fromOpenParameters(MXBeanLookup lookup, Object[] params) + final Object[] fromOpenParameters(Object[] params) throws InvalidObjectException { if (paramConversionIsIdentity || params == null) return params; final Object[] jparams = new Object[params.length]; for (int i = 0; i < params.length; i++) - jparams[i] = paramConverters[i].fromOpenValue(lookup, params[i]); + jparams[i] = paramMappings[i].fromOpenValue(params[i]); return jparams; } @@ -154,23 +156,35 @@ final class ConvertingMethod { Object param, int paramNo) throws OpenDataException { - return paramConverters[paramNo].toOpenValue(lookup, param); + return paramMappings[paramNo].toOpenValue(param); } final Object fromOpenParameter(MXBeanLookup lookup, Object param, int paramNo) throws InvalidObjectException { - return paramConverters[paramNo].fromOpenValue(lookup, param); + return paramMappings[paramNo].fromOpenValue(param); } Object invokeWithOpenReturn(MXBeanLookup lookup, Object obj, Object[] params) throws MBeanException, IllegalAccessException, InvocationTargetException { + MXBeanLookup old = MXBeanLookup.getLookup(); + try { + MXBeanLookup.setLookup(lookup); + return invokeWithOpenReturn(obj, params); + } finally { + MXBeanLookup.setLookup(old); + } + } + + private Object invokeWithOpenReturn(Object obj, Object[] params) + throws MBeanException, IllegalAccessException, + InvocationTargetException { final Object[] javaParams; try { - javaParams = fromOpenParameters(lookup, params); + javaParams = fromOpenParameters(params); } catch (InvalidObjectException e) { // probably can't happen final String msg = methodName() + ": cannot convert parameters " + @@ -179,7 +193,7 @@ final class ConvertingMethod { } final Object javaReturn = method.invoke(obj, javaParams); try { - return returnConverter.toOpenValue(lookup, javaReturn); + return returnMapping.toOpenValue(javaReturn); } catch (OpenDataException e) { // probably can't happen final String msg = methodName() + ": cannot convert return " + @@ -192,15 +206,17 @@ final class ConvertingMethod { return method.getDeclaringClass() + "." + method.getName(); } - private ConvertingMethod(Method m) throws OpenDataException { + private ConvertingMethod(Method m, MXBeanMappingFactory mappingFactory) + throws OpenDataException { this.method = m; - returnConverter = OpenConverter.toConverter(m.getGenericReturnType()); + returnMapping = + mappingFactory.mappingForType(m.getGenericReturnType(), mappingFactory); Type[] params = m.getGenericParameterTypes(); - paramConverters = new OpenConverter[params.length]; + paramMappings = new MXBeanMapping[params.length]; boolean identity = true; for (int i = 0; i < params.length; i++) { - paramConverters[i] = OpenConverter.toConverter(params[i]); - identity &= paramConverters[i].isIdentity(); + paramMappings[i] = mappingFactory.mappingForType(params[i], mappingFactory); + identity &= DefaultMXBeanMappingFactory.isIdentity(paramMappings[i]); } paramConversionIsIdentity = identity; } @@ -208,7 +224,7 @@ final class ConvertingMethod { private static final String[] noStrings = new String[0]; private final Method method; - private final OpenConverter returnConverter; - private final OpenConverter[] paramConverters; + private final MXBeanMapping returnMapping; + private final MXBeanMapping[] paramMappings; private final boolean paramConversionIsIdentity; } diff --git a/jdk/src/share/classes/com/sun/jmx/mbeanserver/OpenConverter.java b/jdk/src/share/classes/com/sun/jmx/mbeanserver/DefaultMXBeanMappingFactory.java similarity index 68% rename from jdk/src/share/classes/com/sun/jmx/mbeanserver/OpenConverter.java rename to jdk/src/share/classes/com/sun/jmx/mbeanserver/DefaultMXBeanMappingFactory.java index 25ac0a28e10..2d97c97b944 100644 --- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/OpenConverter.java +++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/DefaultMXBeanMappingFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,6 +26,8 @@ package com.sun.jmx.mbeanserver; import static com.sun.jmx.mbeanserver.Util.*; +import java.lang.annotation.ElementType; +import javax.management.openmbean.MXBeanMappingClass; import static javax.management.openmbean.SimpleType.*; @@ -66,6 +68,8 @@ import javax.management.openmbean.CompositeDataInvocationHandler; import javax.management.openmbean.CompositeDataSupport; import javax.management.openmbean.CompositeDataView; import javax.management.openmbean.CompositeType; +import javax.management.openmbean.MXBeanMapping; +import javax.management.openmbean.MXBeanMappingFactory; import javax.management.openmbean.OpenDataException; import javax.management.openmbean.OpenType; import javax.management.openmbean.SimpleType; @@ -74,137 +78,118 @@ import javax.management.openmbean.TabularDataSupport; import javax.management.openmbean.TabularType; /** -

    A converter between Java types and the limited set of classes - defined by Open MBeans.

    - -

    A Java type is an instance of java.lang.reflect.Type. For our - purposes, it is either a Class, such as String.class or int.class; - or a ParameterizedType, such as List or Map. On J2SE 1.4 and earlier, it can only be a Class.

    - -

    Each Type is associated with an OpenConverter. The - OpenConverter defines an OpenType corresponding to the Type, plus a - Java class corresponding to the OpenType. For example:

    - -
    -   Type                     Open class     OpenType
    -   ----                     ----------     --------
    -   Integer                  Integer        SimpleType.INTEGER
    -   int                      int            SimpleType.INTEGER
    -   Integer[]                Integer[]      ArrayType(1, SimpleType.INTEGER)
    -   int[]                    Integer[]      ArrayType(SimpleType.INTEGER, true)
    -   String[][]               String[][]     ArrayType(2, SimpleType.STRING)
    -   List             String[]       ArrayType(1, SimpleType.STRING)
    -   ThreadState (an Enum)    String         SimpleType.STRING
    -   Map   TabularData    TabularType(
    -                                             CompositeType(
    -                                               {"key", SimpleType.INTEGER},
    -                                               {"value",
    -                                                 ArrayType(1,
    -                                                  SimpleType.STRING)}),
    -                                             indexNames={"key"})
    -   
    - -

    Apart from simple types, arrays, and collections, Java types are - converted through introspection into CompositeType. The Java type - must have at least one getter (method such as "int getSize()" or - "boolean isBig()"), and we must be able to deduce how to - reconstruct an instance of the Java class from the values of the - getters using one of various heuristics.

    - - @since 1.6 + *

    A converter between Java types and the limited set of classes + * defined by Open MBeans.

    + * + *

    A Java type is an instance of java.lang.reflect.Type. For our + * purposes, it is either a Class, such as String.class or int.class; + * or a ParameterizedType, such as List or Map. On J2SE 1.4 and earlier, it can only be a Class.

    + * + *

    Each Type is associated with an DefaultMXBeanMappingFactory. The + * DefaultMXBeanMappingFactory defines an OpenType corresponding to the Type, plus a + * Java class corresponding to the OpenType. For example:

    + * + *
    + *   Type                     Open class     OpenType
    + *   ----                     ----------     --------
    + *   Integer                Integer        SimpleType.INTEGER
    + *   int                            int            SimpleType.INTEGER
    + *   Integer[]              Integer[]      ArrayType(1, SimpleType.INTEGER)
    + *   int[]                  Integer[]      ArrayType(SimpleType.INTEGER, true)
    + *   String[][]             String[][]     ArrayType(2, SimpleType.STRING)
    + *   List                   String[]       ArrayType(1, SimpleType.STRING)
    + *   ThreadState (an Enum)    String         SimpleType.STRING
    + *   Map   TabularData          TabularType(
    + *                                           CompositeType(
    + *                                             {"key", SimpleType.INTEGER},
    + *                                             {"value",
    + *                                               ArrayType(1,
    + *                                                SimpleType.STRING)}),
    + *                                           indexNames={"key"})
    + *   
    + * + *

    Apart from simple types, arrays, and collections, Java types are + * converted through introspection into CompositeType. The Java type + * must have at least one getter (method such as "int getSize()" or + * "boolean isBig()"), and we must be able to deduce how to + * reconstruct an instance of the Java class from the values of the + * getters using one of various heuristics.

    + * + * @since 1.6 */ -public abstract class OpenConverter { - private OpenConverter(Type targetType, OpenType openType, - Class openClass) { - this.targetType = targetType; - this.openType = openType; - this.openClass = openClass; +public class DefaultMXBeanMappingFactory extends MXBeanMappingFactory { + static abstract class NonNullMXBeanMapping extends MXBeanMapping { + NonNullMXBeanMapping(Type javaType, OpenType openType) { + super(javaType, openType); + } + + @Override + public final Object fromOpenValue(Object openValue) + throws InvalidObjectException { + if (openValue == null) + return null; + else + return fromNonNullOpenValue(openValue); + } + + @Override + public final Object toOpenValue(Object javaValue) throws OpenDataException { + if (javaValue == null) + return null; + else + return toNonNullOpenValue(javaValue); + } + + abstract Object fromNonNullOpenValue(Object openValue) + throws InvalidObjectException; + + abstract Object toNonNullOpenValue(Object javaValue) + throws OpenDataException; + + /** + *

    True if and only if this MXBeanMapping's toOpenValue and + * fromOpenValue methods are the identity function.

    + */ + boolean isIdentity() { + return false; + } } - /**

    Convert an instance of openClass into an instance of targetType. */ - public final Object fromOpenValue(MXBeanLookup lookup, Object value) - throws InvalidObjectException { - if (value == null) - return null; - else - return fromNonNullOpenValue(lookup, value); + static boolean isIdentity(MXBeanMapping mapping) { + return (mapping instanceof NonNullMXBeanMapping && + ((NonNullMXBeanMapping) mapping).isIdentity()); } - abstract Object fromNonNullOpenValue(MXBeanLookup lookup, Object value) - throws InvalidObjectException; + private static final class Mappings + extends WeakHashMap> {} - /**

    Throw an appropriate InvalidObjectException if we will not be able - to convert back from the open data to the original Java object.

    */ - void checkReconstructible() throws InvalidObjectException { - // subclasses override if action necessary - } + private static final Map factoryMappings = + new WeakHashMap(); - /**

    Convert an instance of targetType into an instance of openClass. */ - final Object toOpenValue(MXBeanLookup lookup, Object value) - throws OpenDataException { - if (value == null) - return null; - else - return toNonNullOpenValue(lookup, value); - } + private static final Map permanentMappings = newMap(); - abstract Object toNonNullOpenValue(MXBeanLookup lookup, Object value) - throws OpenDataException; - - /**

    True if and only if this OpenConverter's toOpenValue and fromOpenValue - methods are the identity function.

    */ - boolean isIdentity() { - return false; - } - - /**

    True if and only if isIdentity() and even an array of the underlying type - is transformed as the identity. This is true for Integer and - ObjectName, for instance, but not for int.

    */ - final Type getTargetType() { - return targetType; - } - - final OpenType getOpenType() { - return openType; - } - - /* The Java class corresponding to getOpenType(). This is the class - named by getOpenType().getClassName(), except that it may be a - primitive type or an array of primitive type. */ - final Class getOpenClass() { - return openClass; - } - - private final Type targetType; - private final OpenType openType; - private final Class openClass; - - private static final class ConverterMap - extends WeakHashMap> {} - - private static final ConverterMap converterMap = new ConverterMap(); - - /** Following List simply serves to keep a reference to predefined - OpenConverters so they don't get garbage collected. */ - private static final List permanentConverters = newList(); - - private static synchronized OpenConverter getConverter(Type type) { - WeakReference wr = converterMap.get(type); + private static synchronized MXBeanMapping getMapping( + Type type, MXBeanMappingFactory factory) { + Mappings mappings = factoryMappings.get(factory); + if (mappings == null) { + mappings = new Mappings(); + factoryMappings.put(factory, mappings); + } + WeakReference wr = mappings.get(type); return (wr == null) ? null : wr.get(); } - private static synchronized void putConverter(Type type, - OpenConverter conv) { - WeakReference wr = - new WeakReference(conv); - converterMap.put(type, wr); - } - - private static synchronized void putPermanentConverter(Type type, - OpenConverter conv) { - putConverter(type, conv); - permanentConverters.add(conv); + private static synchronized void putMapping( + Type type, MXBeanMapping mapping, MXBeanMappingFactory factory) { + Mappings mappings = factoryMappings.get(factory); + if (mappings == null) { + mappings = new Mappings(); + factoryMappings.put(factory, mappings); + } + WeakReference wr = + new WeakReference(mapping); + mappings.put(type, wr); } static { @@ -226,28 +211,26 @@ public abstract class OpenConverter { // the classes that these predefined types declare must exist! throw new Error(e); } - final OpenConverter conv = new IdentityConverter(c, t, c); - putPermanentConverter(c, conv); + final MXBeanMapping mapping = new IdentityMapping(c, t); + permanentMappings.put(c, mapping); if (c.getName().startsWith("java.lang.")) { try { final Field typeField = c.getField("TYPE"); - final Class primitiveType = (Class) typeField.get(null); - final OpenConverter primitiveConv = - new IdentityConverter(primitiveType, t, primitiveType); - putPermanentConverter(primitiveType, - primitiveConv); + final Class primitiveType = (Class) typeField.get(null); + final MXBeanMapping primitiveMapping = + new IdentityMapping(primitiveType, t); + permanentMappings.put(primitiveType, primitiveMapping); if (primitiveType != void.class) { final Class primitiveArrayType = Array.newInstance(primitiveType, 0).getClass(); final OpenType primitiveArrayOpenType = ArrayType.getPrimitiveArrayType(primitiveArrayType); - final OpenConverter primitiveArrayConv = - new IdentityConverter(primitiveArrayType, - primitiveArrayOpenType, - primitiveArrayType); - putPermanentConverter(primitiveArrayType, - primitiveArrayConv); + final MXBeanMapping primitiveArrayMapping = + new IdentityMapping(primitiveArrayType, + primitiveArrayOpenType); + permanentMappings.put(primitiveArrayType, + primitiveArrayMapping); } } catch (NoSuchFieldException e) { // OK: must not be a primitive wrapper @@ -260,64 +243,119 @@ public abstract class OpenConverter { } /** Get the converter for the given Java type, creating it if necessary. */ - public static synchronized OpenConverter toConverter(Type objType) + @Override + public synchronized MXBeanMapping mappingForType(Type objType, + MXBeanMappingFactory factory) throws OpenDataException { - if (inProgress.containsKey(objType)) throw new OpenDataException("Recursive data structure"); - OpenConverter conv; + MXBeanMapping mapping; - conv = getConverter(objType); - if (conv != null) - return conv; + mapping = getMapping(objType, null); + if (mapping != null) + return mapping; inProgress.put(objType, objType); try { - conv = makeConverter(objType); + mapping = makeMapping(objType, factory); } finally { inProgress.remove(objType); } - putConverter(objType, conv); - return conv; + putMapping(objType, mapping, factory); + return mapping; } - private static OpenConverter makeConverter(Type objType) - throws OpenDataException { + private MXBeanMapping makeMapping(Type objType, MXBeanMappingFactory factory) + throws OpenDataException { /* It's not yet worth formalizing these tests by having for example an array of factory classes, each of which says whether it recognizes the Type (Chain of Responsibility pattern). */ + MXBeanMapping mapping = permanentMappings.get(objType); + if (mapping != null) + return mapping; + Class erasure = erasure(objType); + MXBeanMappingClass mappingClass = + erasure.getAnnotation(MXBeanMappingClass.class); + if (mappingClass != null) + return makeAnnotationMapping(mappingClass, objType, factory); if (objType instanceof GenericArrayType) { Type componentType = ((GenericArrayType) objType).getGenericComponentType(); - return makeArrayOrCollectionConverter(objType, componentType); + return makeArrayOrCollectionMapping(objType, componentType, factory); } else if (objType instanceof Class) { Class objClass = (Class) objType; if (objClass.isEnum()) { // Huge hack to avoid compiler warnings here. The ElementType // parameter is ignored but allows us to obtain a type variable // T that matches >. - return makeEnumConverter(objClass, ElementType.class); + return makeEnumMapping((Class) objClass, ElementType.class); } else if (objClass.isArray()) { Type componentType = objClass.getComponentType(); - return makeArrayOrCollectionConverter(objClass, componentType); + return makeArrayOrCollectionMapping(objClass, componentType, + factory); } else if (JMX.isMXBeanInterface(objClass)) { - return makeMXBeanConverter(objClass); + return makeMXBeanRefMapping(objClass); } else { - return makeCompositeConverter(objClass); + return makeCompositeMapping(objClass, factory); } } else if (objType instanceof ParameterizedType) { - return makeParameterizedConverter((ParameterizedType) objType); + return makeParameterizedTypeMapping((ParameterizedType) objType, + factory); } else throw new OpenDataException("Cannot map type: " + objType); } - private static > OpenConverter - makeEnumConverter(Class enumClass, Class fake) { - Class enumClassT = Util.cast(enumClass); - return new EnumConverter(enumClassT); + private static MXBeanMapping + makeAnnotationMapping(MXBeanMappingClass mappingClass, + Type objType, + MXBeanMappingFactory factory) + throws OpenDataException { + Class c = mappingClass.value(); + Constructor cons; + try { + cons = c.getConstructor(Type.class); + } catch (NoSuchMethodException e) { + final String msg = + "Annotation @" + MXBeanMappingClass.class.getName() + + " must name a class with a public constructor that has a " + + "single " + Type.class.getName() + " argument"; + OpenDataException ode = new OpenDataException(msg); + ode.initCause(e); + throw ode; + } + try { + return cons.newInstance(objType); + } catch (Exception e) { + final String msg = + "Could not construct a " + c.getName() + " for @" + + MXBeanMappingClass.class.getName(); + OpenDataException ode = new OpenDataException(msg); + ode.initCause(e); + throw ode; + } + } + + private static Class erasure(Type t) { + if (t instanceof Class) + return (Class) t; + if (t instanceof ParameterizedType) + return erasure(((ParameterizedType) t).getRawType()); + /* Other cases: GenericArrayType, TypeVariable, WildcardType. + * Returning the erasure of GenericArrayType is not necessary because + * anyway we will be recursing on the element type, and we'll erase + * then. Returning the erasure of the other two would mean returning + * the type bound (e.g. Foo in or ) + * and since we don't treat this as Foo elsewhere we shouldn't here. + */ + return Object.class; + } + + private static > MXBeanMapping + makeEnumMapping(Class enumClass, Class fake) { + return new EnumMapping(Util.>cast(enumClass)); } /* Make the converter for an array type, or a collection such as @@ -325,14 +363,15 @@ public abstract class OpenConverter { * primitive arrays (e.g. int[]) here because they use the identity * converter and are registered as such in the static initializer. */ - private static OpenConverter - makeArrayOrCollectionConverter(Type collectionType, Type elementType) + private MXBeanMapping + makeArrayOrCollectionMapping(Type collectionType, Type elementType, + MXBeanMappingFactory factory) throws OpenDataException { - final OpenConverter elementConverter = toConverter(elementType); - final OpenType elementOpenType = elementConverter.getOpenType(); + final MXBeanMapping elementMapping = factory.mappingForType(elementType, factory); + final OpenType elementOpenType = elementMapping.getOpenType(); final ArrayType openType = ArrayType.getArrayType(elementOpenType); - final Class elementOpenClass = elementConverter.getOpenClass(); + final Class elementOpenClass = elementMapping.getOpenClass(); final Class openArrayClass; final String openArrayClassName; @@ -347,19 +386,18 @@ public abstract class OpenConverter { } if (collectionType instanceof ParameterizedType) { - return new CollectionConverter(collectionType, - openType, openArrayClass, - elementConverter); + return new CollectionMapping(collectionType, + openType, openArrayClass, + elementMapping); } else { - if (elementConverter.isIdentity()) { - return new IdentityConverter(collectionType, - openType, - openArrayClass); + if (isIdentity(elementMapping)) { + return new IdentityMapping(collectionType, + openType); } else { - return new ArrayConverter(collectionType, + return new ArrayMapping(collectionType, openType, openArrayClass, - elementConverter); + elementMapping); } } } @@ -367,16 +405,17 @@ public abstract class OpenConverter { private static final String[] keyArray = {"key"}; private static final String[] keyValueArray = {"key", "value"}; - private static OpenConverter - makeTabularConverter(Type objType, boolean sortedMap, - Type keyType, Type valueType) + private MXBeanMapping + makeTabularMapping(Type objType, boolean sortedMap, + Type keyType, Type valueType, + MXBeanMappingFactory factory) throws OpenDataException { final String objTypeName = objType.toString(); - final OpenConverter keyConverter = toConverter(keyType); - final OpenConverter valueConverter = toConverter(valueType); - final OpenType keyOpenType = keyConverter.getOpenType(); - final OpenType valueOpenType = valueConverter.getOpenType(); + final MXBeanMapping keyMapping = factory.mappingForType(keyType, factory); + final MXBeanMapping valueMapping = factory.mappingForType(valueType, factory); + final OpenType keyOpenType = keyMapping.getOpenType(); + final OpenType valueOpenType = valueMapping.getOpenType(); final CompositeType rowType = new CompositeType(objTypeName, objTypeName, @@ -385,8 +424,8 @@ public abstract class OpenConverter { new OpenType[] {keyOpenType, valueOpenType}); final TabularType tabularType = new TabularType(objTypeName, objTypeName, rowType, keyArray); - return new TabularConverter(objType, sortedMap, tabularType, - keyConverter, valueConverter); + return new TabularMapping(objType, sortedMap, tabularType, + keyMapping, valueMapping); } /* We know how to translate List, Set, SortedSet, @@ -394,8 +433,10 @@ public abstract class OpenConverter { subtypes of those because we wouldn't know how to deserialize them. We don't accept Queue because it is unlikely people would use that as a parameter or return type in an MBean. */ - private static OpenConverter - makeParameterizedConverter(ParameterizedType objType) throws OpenDataException { + private MXBeanMapping + makeParameterizedTypeMapping(ParameterizedType objType, + MXBeanMappingFactory factory) + throws OpenDataException { final Type rawType = objType.getRawType(); @@ -406,7 +447,7 @@ public abstract class OpenConverter { assert(actuals.length == 1); if (c == SortedSet.class) mustBeComparable(c, actuals[0]); - return makeArrayOrCollectionConverter(objType, actuals[0]); + return makeArrayOrCollectionMapping(objType, actuals[0], factory); } else { boolean sortedMap = (c == SortedMap.class); if (c == Map.class || sortedMap) { @@ -414,20 +455,21 @@ public abstract class OpenConverter { assert(actuals.length == 2); if (sortedMap) mustBeComparable(c, actuals[0]); - return makeTabularConverter(objType, sortedMap, - actuals[0], actuals[1]); + return makeTabularMapping(objType, sortedMap, + actuals[0], actuals[1], factory); } } } throw new OpenDataException("Cannot convert type: " + objType); } - private static OpenConverter makeMXBeanConverter(Type t) + private static MXBeanMapping makeMXBeanRefMapping(Type t) throws OpenDataException { - return new MXBeanConverter(t); + return new MXBeanRefMapping(t); } - private static OpenConverter makeCompositeConverter(Class c) + private MXBeanMapping makeCompositeMapping(Class c, + MXBeanMappingFactory factory) throws OpenDataException { // For historical reasons GcInfo implements CompositeData but we @@ -479,7 +521,7 @@ public abstract class OpenConverter { final Method getter = entry.getValue(); getters[i] = getter; final Type retType = getter.getGenericReturnType(); - openTypes[i] = toConverter(retType).getOpenType(); + openTypes[i] = factory.mappingForType(retType, factory).getOpenType(); i++; } @@ -490,52 +532,55 @@ public abstract class OpenConverter { itemNames, // field descriptions openTypes); - return new CompositeConverter(c, - compositeType, - itemNames, - getters); + return new CompositeMapping(c, + compositeType, + itemNames, + getters, + factory); } /* Converter for classes where the open data is identical to the original data. This is true for any of the SimpleType types, and for an any-dimension array of those. It is also true for - primitive types as of JMX 1.3, since an int[] needs to + primitive types as of JMX 1.3, since an int[] can be directly represented by an ArrayType, and an int needs no mapping because reflection takes care of it. */ - private static final class IdentityConverter extends OpenConverter { - IdentityConverter(Type targetType, OpenType openType, - Class openClass) { - super(targetType, openType, openClass); + private static final class IdentityMapping extends NonNullMXBeanMapping { + IdentityMapping(Type targetType, OpenType openType) { + super(targetType, openType); } boolean isIdentity() { return true; } - final Object toNonNullOpenValue(MXBeanLookup lookup, Object value) { - return value; + @Override + Object fromNonNullOpenValue(Object openValue) + throws InvalidObjectException { + return openValue; } - public final Object fromNonNullOpenValue(MXBeanLookup lookup, Object value) { - return value; + @Override + Object toNonNullOpenValue(Object javaValue) throws OpenDataException { + return javaValue; } } - private static final class EnumConverter> - extends OpenConverter { + private static final class EnumMapping> + extends NonNullMXBeanMapping { - EnumConverter(Class enumClass) { - super(enumClass, SimpleType.STRING, String.class); + EnumMapping(Class enumClass) { + super(enumClass, SimpleType.STRING); this.enumClass = enumClass; } - final Object toNonNullOpenValue(MXBeanLookup lookup, Object value) { + @Override + final Object toNonNullOpenValue(Object value) { return ((Enum) value).name(); } - // return type could be T, but after erasure that would be - // java.lang.Enum, which doesn't exist on J2SE 1.4 - public final Object fromNonNullOpenValue(MXBeanLookup lookup, Object value) + @Override + final T fromNonNullOpenValue(Object value) throws InvalidObjectException { try { return Enum.valueOf(enumClass, (String) value); @@ -548,69 +593,69 @@ public abstract class OpenConverter { private final Class enumClass; } - private static final class ArrayConverter extends OpenConverter { - ArrayConverter(Type targetType, - ArrayType openArrayType, Class openArrayClass, - OpenConverter elementConverter) { - super(targetType, openArrayType, openArrayClass); - this.elementConverter = elementConverter; + private static final class ArrayMapping extends NonNullMXBeanMapping { + ArrayMapping(Type targetType, + ArrayType openArrayType, Class openArrayClass, + MXBeanMapping elementMapping) { + super(targetType, openArrayType); + this.elementMapping = elementMapping; } - final Object toNonNullOpenValue(MXBeanLookup lookup, Object value) + @Override + final Object toNonNullOpenValue(Object value) throws OpenDataException { Object[] valueArray = (Object[]) value; final int len = valueArray.length; final Object[] openArray = (Object[]) Array.newInstance(getOpenClass().getComponentType(), len); - for (int i = 0; i < len; i++) { - openArray[i] = - elementConverter.toOpenValue(lookup, valueArray[i]); - } + for (int i = 0; i < len; i++) + openArray[i] = elementMapping.toOpenValue(valueArray[i]); return openArray; } - public final Object fromNonNullOpenValue(MXBeanLookup lookup, Object openValue) + @Override + final Object fromNonNullOpenValue(Object openValue) throws InvalidObjectException { final Object[] openArray = (Object[]) openValue; - final Type targetType = getTargetType(); + final Type javaType = getJavaType(); final Object[] valueArray; final Type componentType; - if (targetType instanceof GenericArrayType) { + if (javaType instanceof GenericArrayType) { componentType = - ((GenericArrayType) targetType).getGenericComponentType(); - } else if (targetType instanceof Class && - ((Class) targetType).isArray()) { - componentType = ((Class) targetType).getComponentType(); + ((GenericArrayType) javaType).getGenericComponentType(); + } else if (javaType instanceof Class && + ((Class) javaType).isArray()) { + componentType = ((Class) javaType).getComponentType(); } else { throw new IllegalArgumentException("Not an array: " + - targetType); + javaType); } valueArray = (Object[]) Array.newInstance((Class) componentType, openArray.length); - for (int i = 0; i < openArray.length; i++) { - valueArray[i] = - elementConverter.fromOpenValue(lookup, openArray[i]); - } + for (int i = 0; i < openArray.length; i++) + valueArray[i] = elementMapping.fromOpenValue(openArray[i]); return valueArray; } - void checkReconstructible() throws InvalidObjectException { - elementConverter.checkReconstructible(); + public void checkReconstructible() throws InvalidObjectException { + elementMapping.checkReconstructible(); } - /** OpenConverter for the elements of this array. If this is an - array of arrays, the converter converts the second-level arrays, - not the deepest elements. */ - private final OpenConverter elementConverter; + /** + * DefaultMXBeanMappingFactory for the elements of this array. If this is an + * array of arrays, the converter converts the second-level arrays, + * not the deepest elements. + */ + private final MXBeanMapping elementMapping; } - private static final class CollectionConverter extends OpenConverter { - CollectionConverter(Type targetType, - ArrayType openArrayType, - Class openArrayClass, - OpenConverter elementConverter) { - super(targetType, openArrayType, openArrayClass); - this.elementConverter = elementConverter; + private static final class CollectionMapping extends NonNullMXBeanMapping { + CollectionMapping(Type targetType, + ArrayType openArrayType, + Class openArrayClass, + MXBeanMapping elementMapping) { + super(targetType, openArrayType); + this.elementMapping = elementMapping; /* Determine the concrete class to be used when converting back to this Java type. We convert all Lists to ArrayList @@ -630,7 +675,8 @@ public abstract class OpenConverter { } } - final Object toNonNullOpenValue(MXBeanLookup lookup, Object value) + @Override + final Object toNonNullOpenValue(Object value) throws OpenDataException { final Collection valueCollection = (Collection) value; if (valueCollection instanceof SortedSet) { @@ -640,7 +686,7 @@ public abstract class OpenConverter { final String msg = "Cannot convert SortedSet with non-null comparator: " + comparator; - throw new OpenDataException(msg); + throw openDataException(msg, new IllegalArgumentException(msg)); } } final Object[] openArray = (Object[]) @@ -648,21 +694,22 @@ public abstract class OpenConverter { valueCollection.size()); int i = 0; for (Object o : valueCollection) - openArray[i++] = elementConverter.toOpenValue(lookup, o); + openArray[i++] = elementMapping.toOpenValue(o); return openArray; } - public final Object fromNonNullOpenValue(MXBeanLookup lookup, Object openValue) + @Override + final Object fromNonNullOpenValue(Object openValue) throws InvalidObjectException { final Object[] openArray = (Object[]) openValue; final Collection valueCollection; try { - valueCollection = Util.cast(collectionClass.newInstance()); + valueCollection = cast(collectionClass.newInstance()); } catch (Exception e) { throw invalidObjectException("Cannot create collection", e); } for (Object o : openArray) { - Object value = elementConverter.fromOpenValue(lookup, o); + Object value = elementMapping.fromOpenValue(o); if (!valueCollection.add(value)) { final String msg = "Could not add " + o + " to " + @@ -674,34 +721,36 @@ public abstract class OpenConverter { return valueCollection; } - void checkReconstructible() throws InvalidObjectException { - elementConverter.checkReconstructible(); + public void checkReconstructible() throws InvalidObjectException { + elementMapping.checkReconstructible(); } private final Class collectionClass; - private final OpenConverter elementConverter; + private final MXBeanMapping elementMapping; } - private static final class MXBeanConverter extends OpenConverter { - MXBeanConverter(Type intf) { - super(intf, SimpleType.OBJECTNAME, ObjectName.class); + private static final class MXBeanRefMapping extends NonNullMXBeanMapping { + MXBeanRefMapping(Type intf) { + super(intf, SimpleType.OBJECTNAME); } - final Object toNonNullOpenValue(MXBeanLookup lookup, Object value) + @Override + final Object toNonNullOpenValue(Object javaValue) throws OpenDataException { - lookupNotNull(lookup, OpenDataException.class); - ObjectName name = lookup.mxbeanToObjectName(value); + MXBeanLookup lookup = lookupNotNull(OpenDataException.class); + ObjectName name = lookup.mxbeanToObjectName(javaValue); if (name == null) - throw new OpenDataException("No name for object: " + value); + throw new OpenDataException("No name for object: " + javaValue); return name; } - public final Object fromNonNullOpenValue(MXBeanLookup lookup, Object value) + @Override + final Object fromNonNullOpenValue(Object openValue) throws InvalidObjectException { - lookupNotNull(lookup, InvalidObjectException.class); - ObjectName name = (ObjectName) value; + MXBeanLookup lookup = lookupNotNull(InvalidObjectException.class); + ObjectName name = (ObjectName) openValue; Object mxbean = - lookup.objectNameToMXBean(name, (Class) getTargetType()); + lookup.objectNameToMXBean(name, (Class) getJavaType()); if (mxbean == null) { final String msg = "No MXBean for name: " + name; @@ -710,9 +759,10 @@ public abstract class OpenConverter { return mxbean; } - private void - lookupNotNull(MXBeanLookup lookup, Class excClass) + private MXBeanLookup + lookupNotNull(Class excClass) throws T { + MXBeanLookup lookup = MXBeanLookup.getLookup(); if (lookup == null) { final String msg = "Cannot convert MXBean interface in this context"; @@ -725,41 +775,40 @@ public abstract class OpenConverter { } throw exc; } + return lookup; } } - private static final class TabularConverter extends OpenConverter { - TabularConverter(Type targetType, - boolean sortedMap, - TabularType tabularType, - OpenConverter keyConverter, - OpenConverter valueConverter) { - super(targetType, tabularType, TabularData.class); + private static final class TabularMapping extends NonNullMXBeanMapping { + TabularMapping(Type targetType, + boolean sortedMap, + TabularType tabularType, + MXBeanMapping keyConverter, + MXBeanMapping valueConverter) { + super(targetType, tabularType); this.sortedMap = sortedMap; - this.keyConverter = keyConverter; - this.valueConverter = valueConverter; + this.keyMapping = keyConverter; + this.valueMapping = valueConverter; } - final Object toNonNullOpenValue(MXBeanLookup lookup, Object value) - throws OpenDataException { - final Map valueMap = Util.cast(value); + @Override + final Object toNonNullOpenValue(Object value) throws OpenDataException { + final Map valueMap = cast(value); if (valueMap instanceof SortedMap) { Comparator comparator = ((SortedMap) valueMap).comparator(); if (comparator != null) { final String msg = "Cannot convert SortedMap with non-null comparator: " + comparator; - throw new OpenDataException(msg); + throw openDataException(msg, new IllegalArgumentException(msg)); } } final TabularType tabularType = (TabularType) getOpenType(); final TabularData table = new TabularDataSupport(tabularType); final CompositeType rowType = tabularType.getRowType(); for (Map.Entry entry : valueMap.entrySet()) { - final Object openKey = - keyConverter.toOpenValue(lookup, entry.getKey()); - final Object openValue = - valueConverter.toOpenValue(lookup, entry.getValue()); + final Object openKey = keyMapping.toOpenValue(entry.getKey()); + final Object openValue = valueMapping.toOpenValue(entry.getValue()); final CompositeData row; row = new CompositeDataSupport(rowType, keyValueArray, @@ -770,17 +819,18 @@ public abstract class OpenConverter { return table; } - public final Object fromNonNullOpenValue(MXBeanLookup lookup, Object openValue) + @Override + final Object fromNonNullOpenValue(Object openValue) throws InvalidObjectException { final TabularData table = (TabularData) openValue; - final Collection rows = Util.cast(table.values()); + final Collection rows = cast(table.values()); final Map valueMap = sortedMap ? newSortedMap() : newMap(); for (CompositeData row : rows) { final Object key = - keyConverter.fromOpenValue(lookup, row.get("key")); + keyMapping.fromOpenValue(row.get("key")); final Object value = - valueConverter.fromOpenValue(lookup, row.get("value")); + valueMapping.fromOpenValue(row.get("value")); if (valueMap.put(key, value) != null) { final String msg = "Duplicate entry in TabularData: key=" + key; @@ -790,35 +840,38 @@ public abstract class OpenConverter { return valueMap; } - void checkReconstructible() throws InvalidObjectException { - keyConverter.checkReconstructible(); - valueConverter.checkReconstructible(); + @Override + public void checkReconstructible() throws InvalidObjectException { + keyMapping.checkReconstructible(); + valueMapping.checkReconstructible(); } private final boolean sortedMap; - private final OpenConverter keyConverter; - private final OpenConverter valueConverter; + private final MXBeanMapping keyMapping; + private final MXBeanMapping valueMapping; } - private static final class CompositeConverter extends OpenConverter { - CompositeConverter(Class targetClass, - CompositeType compositeType, - String[] itemNames, - Method[] getters) throws OpenDataException { - super(targetClass, compositeType, CompositeData.class); + private final class CompositeMapping extends NonNullMXBeanMapping { + CompositeMapping(Class targetClass, + CompositeType compositeType, + String[] itemNames, + Method[] getters, + MXBeanMappingFactory factory) throws OpenDataException { + super(targetClass, compositeType); assert(itemNames.length == getters.length); this.itemNames = itemNames; this.getters = getters; - this.getterConverters = new OpenConverter[getters.length]; + this.getterMappings = new MXBeanMapping[getters.length]; for (int i = 0; i < getters.length; i++) { Type retType = getters[i].getGenericReturnType(); - getterConverters[i] = OpenConverter.toConverter(retType); + getterMappings[i] = factory.mappingForType(retType, factory); } } - final Object toNonNullOpenValue(MXBeanLookup lookup, Object value) + @Override + final Object toNonNullOpenValue(Object value) throws OpenDataException { CompositeType ct = (CompositeType) getOpenType(); if (value instanceof CompositeDataView) @@ -830,7 +883,7 @@ public abstract class OpenConverter { for (int i = 0; i < getters.length; i++) { try { Object got = getters[i].invoke(value, (Object[]) null); - values[i] = getterConverters[i].toOpenValue(lookup, got); + values[i] = getterMappings[i].toOpenValue(got); } catch (Exception e) { throw openDataException("Error calling getter for " + itemNames[i] + ": " + e, e); @@ -848,7 +901,7 @@ public abstract class OpenConverter { if (compositeBuilder != null) return; - Class targetClass = (Class) getTargetType(); + Class targetClass = (Class) getJavaType(); /* In this 2D array, each subarray is a set of builders where there is no point in consulting the ones after the first if the first refuses. */ @@ -861,7 +914,7 @@ public abstract class OpenConverter { }, { new CompositeBuilderCheckGetters(targetClass, itemNames, - getterConverters), + getterMappings), new CompositeBuilderViaSetters(targetClass, itemNames), new CompositeBuilderViaProxy(targetClass, itemNames), }, @@ -898,22 +951,23 @@ public abstract class OpenConverter { compositeBuilder = foundBuilder; } - void checkReconstructible() throws InvalidObjectException { + @Override + public void checkReconstructible() throws InvalidObjectException { makeCompositeBuilder(); } - public final Object fromNonNullOpenValue(MXBeanLookup lookup, Object value) + @Override + final Object fromNonNullOpenValue(Object value) throws InvalidObjectException { makeCompositeBuilder(); - return compositeBuilder.fromCompositeData(lookup, - (CompositeData) value, + return compositeBuilder.fromCompositeData((CompositeData) value, itemNames, - getterConverters); + getterMappings); } private final String[] itemNames; private final Method[] getters; - private final OpenConverter[] getterConverters; + private final MXBeanMapping[] getterMappings; private CompositeBuilder compositeBuilder; } @@ -940,9 +994,9 @@ public abstract class OpenConverter { abstract String applicable(Method[] getters) throws InvalidObjectException; - abstract Object fromCompositeData(MXBeanLookup lookup, CompositeData cd, + abstract Object fromCompositeData(CompositeData cd, String[] itemNames, - OpenConverter[] converters) + MXBeanMapping[] converters) throws InvalidObjectException; private final Class targetClass; @@ -991,9 +1045,9 @@ public abstract class OpenConverter { } } - final Object fromCompositeData(MXBeanLookup lookup, CompositeData cd, - String[] itemNames, - OpenConverter[] converters) + final Object fromCompositeData(CompositeData cd, + String[] itemNames, + MXBeanMapping[] converters) throws InvalidObjectException { try { return fromMethod.invoke(null, cd); @@ -1018,7 +1072,7 @@ public abstract class OpenConverter { an empty string and the other builders will be tried. */ private static class CompositeBuilderCheckGetters extends CompositeBuilder { CompositeBuilderCheckGetters(Class targetClass, String[] itemNames, - OpenConverter[] getterConverters) { + MXBeanMapping[] getterConverters) { super(targetClass, itemNames); this.getterConverters = getterConverters; } @@ -1035,25 +1089,25 @@ public abstract class OpenConverter { return ""; } - final Object fromCompositeData(MXBeanLookup lookup, CompositeData cd, + final Object fromCompositeData(CompositeData cd, String[] itemNames, - OpenConverter[] converters) { + MXBeanMapping[] converters) { throw new Error(); } - private final OpenConverter[] getterConverters; + private final MXBeanMapping[] getterConverters; } /** Builder for when the target class has a setter for every getter. */ private static class CompositeBuilderViaSetters extends CompositeBuilder { - CompositeBuilderViaSetters(Class targetClass, String[] itemNames) { + CompositeBuilderViaSetters(Class targetClass, String[] itemNames) { super(targetClass, itemNames); } String applicable(Method[] getters) { try { - Constructor c = getTargetClass().getConstructor((Class[]) null); + Constructor c = getTargetClass().getConstructor(); } catch (Exception e) { return "does not have a public no-arg constructor"; } @@ -1079,9 +1133,9 @@ public abstract class OpenConverter { return null; } - Object fromCompositeData(MXBeanLookup lookup, CompositeData cd, + Object fromCompositeData(CompositeData cd, String[] itemNames, - OpenConverter[] converters) + MXBeanMapping[] converters) throws InvalidObjectException { Object o; try { @@ -1090,7 +1144,7 @@ public abstract class OpenConverter { if (cd.containsKey(itemNames[i])) { Object openItem = cd.get(itemNames[i]); Object javaItem = - converters[i].fromOpenValue(lookup, openItem); + converters[i].fromOpenValue(openItem); setters[i].invoke(o, javaItem); } } @@ -1118,10 +1172,10 @@ public abstract class OpenConverter { final Class propertyNamesClass = ConstructorProperties.class; Class targetClass = getTargetClass(); - Constructor[] constrs = targetClass.getConstructors(); + Constructor[] constrs = targetClass.getConstructors(); // Applicable if and only if there are any annotated constructors - List> annotatedConstrList = newList(); + List annotatedConstrList = newList(); for (Constructor constr : constrs) { if (Modifier.isPublic(constr.getModifiers()) && constr.getAnnotation(propertyNamesClass) != null) @@ -1152,7 +1206,7 @@ public abstract class OpenConverter { // Also remember the set of properties in that constructor // so we can test unambiguity. Set getterIndexSets = newSet(); - for (Constructor constr : annotatedConstrList) { + for (Constructor constr : annotatedConstrList) { String[] propertyNames = constr.getAnnotation(propertyNamesClass).value(); @@ -1251,9 +1305,9 @@ public abstract class OpenConverter { return null; // success! } - Object fromCompositeData(MXBeanLookup lookup, CompositeData cd, - String[] itemNames, - OpenConverter[] converters) + final Object fromCompositeData(CompositeData cd, + String[] itemNames, + MXBeanMapping[] mappings) throws InvalidObjectException { // The CompositeData might come from an earlier version where // not all the items were present. We look for a constructor @@ -1287,7 +1341,7 @@ public abstract class OpenConverter { if (!max.presentParams.get(i)) continue; Object openItem = cd.get(itemNames[i]); - Object javaItem = converters[i].fromOpenValue(lookup, openItem); + Object javaItem = mappings[i].fromOpenValue(openItem); int index = max.paramIndexes[i]; if (index >= 0) params[index] = javaItem; @@ -1309,10 +1363,10 @@ public abstract class OpenConverter { } private static class Constr { - final Constructor constructor; + final Constructor constructor; final int[] paramIndexes; final BitSet presentParams; - Constr(Constructor constructor, int[] paramIndexes, + Constr(Constructor constructor, int[] paramIndexes, BitSet presentParams) { this.constructor = constructor; this.paramIndexes = paramIndexes; @@ -1365,9 +1419,9 @@ public abstract class OpenConverter { return null; // success! } - final Object fromCompositeData(MXBeanLookup lookup, CompositeData cd, - String[] itemNames, - OpenConverter[] converters) { + final Object fromCompositeData(CompositeData cd, + String[] itemNames, + MXBeanMapping[] converters) { final Class targetClass = getTargetClass(); return Proxy.newProxyInstance(targetClass.getClassLoader(), diff --git a/jdk/src/share/classes/com/sun/jmx/mbeanserver/DynamicMBean2.java b/jdk/src/share/classes/com/sun/jmx/mbeanserver/DynamicMBean2.java index 49d49ce4c1f..270f7ad77a6 100644 --- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/DynamicMBean2.java +++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/DynamicMBean2.java @@ -25,7 +25,7 @@ package com.sun.jmx.mbeanserver; -import javax.management.DynamicMBean; +import javax.management.DynamicWrapperMBean; import javax.management.MBeanServer; import javax.management.ObjectName; @@ -35,17 +35,7 @@ import javax.management.ObjectName; * * @since 1.6 */ -public interface DynamicMBean2 extends DynamicMBean { - /** - * The resource corresponding to this MBean. This is the object whose - * class name should be reflected by the MBean's - * getMBeanInfo().getClassName() for example. For a "plain" - * DynamicMBean it will be "this". For an MBean that wraps another - * object, like javax.management.StandardMBean, it will be the wrapped - * object. - */ - public Object getResource(); - +public interface DynamicMBean2 extends DynamicWrapperMBean { /** * The name of this MBean's class, as used by permission checks. * This is typically equal to getResource().getClass().getName(). diff --git a/jdk/src/share/classes/com/sun/jmx/mbeanserver/Introspector.java b/jdk/src/share/classes/com/sun/jmx/mbeanserver/Introspector.java index 2a72f3d222f..1554444f508 100644 --- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/Introspector.java +++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/Introspector.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,23 +25,38 @@ package com.sun.jmx.mbeanserver; +import com.sun.jmx.remote.util.EnvHelp; +import java.beans.BeanInfo; +import java.beans.PropertyDescriptor; import java.lang.annotation.Annotation; import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Array; import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.lang.reflect.Proxy; import java.lang.reflect.UndeclaredThrowableException; import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import java.util.logging.Level; +import javax.management.AttributeNotFoundException; +import javax.management.Description; import javax.management.Descriptor; +import javax.management.DescriptorFields; import javax.management.DescriptorKey; import javax.management.DynamicMBean; import javax.management.ImmutableDescriptor; +import javax.management.MBean; import javax.management.MBeanInfo; +import javax.management.MXBean; import javax.management.NotCompliantMBeanException; +import javax.management.openmbean.CompositeData; +import javax.management.openmbean.MXBeanMappingFactory; +import static com.sun.jmx.defaults.JmxProperties.MBEANSERVER_LOGGER; import com.sun.jmx.mbeanserver.Util; import com.sun.jmx.remote.util.EnvHelp; import java.beans.BeanInfo; @@ -50,6 +65,7 @@ import java.lang.reflect.Array; import java.lang.reflect.InvocationTargetException; import javax.management.AttributeNotFoundException; import javax.management.openmbean.CompositeData; +import javax.management.openmbean.MXBeanMappingFactory; /** * This class contains the methods for performing all the tests needed to verify @@ -133,8 +149,12 @@ public class Introspector { } } - public static void checkCompliance(Class mbeanClass) - throws NotCompliantMBeanException { + public static void checkCompliance(Class mbeanClass) + throws NotCompliantMBeanException { + + // Check that @Resource is used correctly (if it used). + MBeanInjector.validate(mbeanClass); + // Is DynamicMBean? // if (DynamicMBean.class.isAssignableFrom(mbeanClass)) @@ -157,38 +177,60 @@ public class Introspector { } catch (NotCompliantMBeanException e) { mxbeanException = e; } + // Is @MBean or @MXBean class? + // In fact we find @MBean or @MXBean as a hacky variant of + // getStandardMBeanInterface or getMXBeanInterface. If we get here + // then nothing worked. final String msg = "MBean class " + mbeanClass.getName() + " does not implement " + - "DynamicMBean, neither follows the Standard MBean conventions (" + - mbeanException.toString() + ") nor the MXBean conventions (" + - mxbeanException.toString() + ")"; + "DynamicMBean; does not follow the Standard MBean conventions (" + + mbeanException.toString() + "); does not follow the MXBean conventions (" + + mxbeanException.toString() + "); and does not have or inherit the @" + + MBean.class.getSimpleName() + " or @" + MXBean.class.getSimpleName() + + " annotation"; throw new NotCompliantMBeanException(msg); } - public static DynamicMBean makeDynamicMBean(Object mbean) - throws NotCompliantMBeanException { + /** + *

    Make a DynamicMBean out of the existing MBean object. The object + * may already be a DynamicMBean, or it may be a Standard MBean or + * MXBean, possibly defined using {@code @MBean} or {@code @MXBean}.

    + * @param mbean the object to convert to a DynamicMBean. + * @param a type parameter defined for implementation convenience + * (which would have to be removed if this method were part of the public + * API). + * @return the converted DynamicMBean. + * @throws NotCompliantMBeanException if {@code mbean} is not a compliant + * MBean object, including the case where it is null. + */ + public static DynamicMBean makeDynamicMBean(T mbean) + throws NotCompliantMBeanException { + if (mbean == null) + throw new NotCompliantMBeanException("Null MBean object"); if (mbean instanceof DynamicMBean) return (DynamicMBean) mbean; - final Class mbeanClass = mbean.getClass(); - Class c = null; + final Class mbeanClass = mbean.getClass(); + Class c = null; try { - c = getStandardMBeanInterface(mbeanClass); + c = Util.cast(getStandardMBeanInterface(mbeanClass)); } catch (NotCompliantMBeanException e) { // Ignore exception - we need to check whether // mbean is an MXBean first. } if (c != null) - return new StandardMBeanSupport(mbean, Util.>cast(c)); + return new StandardMBeanSupport(mbean, c); try { - c = getMXBeanInterface(mbeanClass); + c = Util.cast(getMXBeanInterface(mbeanClass)); } catch (NotCompliantMBeanException e) { // Ignore exception - we cannot decide whether mbean was supposed // to be an MBean or an MXBean. We will call checkCompliance() // to generate the appropriate exception. } - if (c != null) - return new MXBeanSupport(mbean, Util.>cast(c)); + if (c != null) { + MXBeanMappingFactory factory = MXBeanMappingFactory.forInterface(c); + return new MXBeanSupport(mbean, c, factory); + } checkCompliance(mbeanClass); throw new NotCompliantMBeanException("Not compliant"); // not reached } @@ -217,9 +259,10 @@ public class Introspector { return testCompliance(baseClass, null); } - public static void testComplianceMXBeanInterface(Class interfaceClass) + public static void testComplianceMXBeanInterface(Class interfaceClass, + MXBeanMappingFactory factory) throws NotCompliantMBeanException { - MXBeanIntrospector.getInstance().getAnalyzer(interfaceClass); + MXBeanIntrospector.getInstance(factory).getAnalyzer(interfaceClass); } /** @@ -265,7 +308,7 @@ public class Introspector { * Return null if the MBean is a DynamicMBean, * or if no MBean interface is found. */ - public static Class getMBeanInterface(Class baseClass) { + public static Class getMBeanInterface(Class baseClass) { // Check if the given class implements the MBean interface // or the Dynamic MBean interface if (isDynamic(baseClass)) return null; @@ -286,10 +329,12 @@ public class Introspector { * @throws NotCompliantMBeanException The specified class is * not a JMX compliant Standard MBean. */ - public static Class getStandardMBeanInterface(Class baseClass) - throws NotCompliantMBeanException { - Class current = baseClass; - Class mbeanInterface = null; + public static Class getStandardMBeanInterface(Class baseClass) + throws NotCompliantMBeanException { + if (baseClass.isAnnotationPresent(MBean.class)) + return baseClass; + Class current = baseClass; + Class mbeanInterface = null; while (current != null) { mbeanInterface = findMBeanInterface(current, current.getName()); @@ -316,8 +361,10 @@ public class Introspector { * @throws NotCompliantMBeanException The specified class is * not a JMX compliant MXBean. */ - public static Class getMXBeanInterface(Class baseClass) + public static Class getMXBeanInterface(Class baseClass) throws NotCompliantMBeanException { + if (hasMXBeanAnnotation(baseClass)) + return baseClass; try { return MXBeanSupport.findMXBeanInterface(baseClass); } catch (Exception e) { @@ -325,25 +372,39 @@ public class Introspector { } } + public static Class getStandardOrMXBeanInterface( + Class baseClass, boolean mxbean) + throws NotCompliantMBeanException { + if (mxbean) + return getMXBeanInterface(baseClass); + else + return getStandardMBeanInterface(baseClass); + } + /* * ------------------------------------------ * PRIVATE METHODS * ------------------------------------------ */ + static boolean hasMXBeanAnnotation(Class c) { + MXBean m = c.getAnnotation(MXBean.class); + return (m != null && m.value()); + } /** * Try to find the MBean interface corresponding to the class aName * - i.e. aNameMBean, from within aClass and its superclasses. **/ - private static Class findMBeanInterface(Class aClass, String aName) { - Class current = aClass; + private static Class findMBeanInterface( + Class aClass, String aName) { + Class current = aClass; while (current != null) { - final Class[] interfaces = current.getInterfaces(); + final Class[] interfaces = current.getInterfaces(); final int len = interfaces.length; for (int i=0;i inter = Util.cast(interfaces[i]); + inter = implementsMBean(inter, aName); if (inter != null) return inter; } current = current.getSuperclass(); @@ -351,6 +412,48 @@ public class Introspector { return null; } + public static String descriptionForElement(AnnotatedElement elmt) { + if (elmt == null) + return null; + Description d = elmt.getAnnotation(Description.class); + if (d == null) + return null; + return d.value(); + } + + public static String descriptionForParameter( + Annotation[] parameterAnnotations) { + for (Annotation a : parameterAnnotations) { + if (a instanceof Description) + return ((Description) a).value(); + } + return null; + } + + public static String nameForParameter( + Annotation[] parameterAnnotations) { + for (Annotation a : parameterAnnotations) { + Class ac = a.annotationType(); + // You'd really have to go out of your way to have more than + // one @Name annotation, so we don't check for that. + if (ac.getSimpleName().equals("Name")) { + try { + Method value = ac.getMethod("value"); + if (value.getReturnType() == String.class && + value.getParameterTypes().length == 0) { + return (String) value.invoke(a); + } + } catch (Exception e) { + MBEANSERVER_LOGGER.log( + Level.WARNING, + "Unexpected exception getting @" + ac.getName(), + e); + } + } + } + return null; + } + public static Descriptor descriptorForElement(final AnnotatedElement elmt) { if (elmt == null) return ImmutableDescriptor.EMPTY_DESCRIPTOR; @@ -358,41 +461,18 @@ public class Introspector { return descriptorForAnnotations(annots); } + public static Descriptor descriptorForAnnotation(Annotation annot) { + return descriptorForAnnotations(new Annotation[] {annot}); + } + public static Descriptor descriptorForAnnotations(Annotation[] annots) { if (annots.length == 0) return ImmutableDescriptor.EMPTY_DESCRIPTOR; Map descriptorMap = new HashMap(); for (Annotation a : annots) { - Class c = a.annotationType(); - Method[] elements = c.getMethods(); - for (Method element : elements) { - DescriptorKey key = element.getAnnotation(DescriptorKey.class); - if (key != null) { - String name = key.value(); - Object value; - try { - value = element.invoke(a); - } catch (RuntimeException e) { - // we don't expect this - except for possibly - // security exceptions? - // RuntimeExceptions shouldn't be "UndeclaredThrowable". - // anyway... - // - throw e; - } catch (Exception e) { - // we don't expect this - throw new UndeclaredThrowableException(e); - } - value = annotationToField(value); - Object oldValue = descriptorMap.put(name, value); - if (oldValue != null && !equals(oldValue, value)) { - final String msg = - "Inconsistent values for descriptor field " + name + - " from annotations: " + value + " :: " + oldValue; - throw new IllegalArgumentException(msg); - } - } - } + if (a instanceof DescriptorFields) + addDescriptorFieldsToMap(descriptorMap, (DescriptorFields) a); + addAnnotationFieldsToMap(descriptorMap, a); } if (descriptorMap.isEmpty()) @@ -401,6 +481,62 @@ public class Introspector { return new ImmutableDescriptor(descriptorMap); } + private static void addDescriptorFieldsToMap( + Map descriptorMap, DescriptorFields df) { + for (String field : df.value()) { + int eq = field.indexOf('='); + if (eq < 0) { + throw new IllegalArgumentException( + "@DescriptorFields string must contain '=': " + + field); + } + String name = field.substring(0, eq); + String value = field.substring(eq + 1); + addToMap(descriptorMap, name, value); + } + } + + private static void addAnnotationFieldsToMap( + Map descriptorMap, Annotation a) { + Class c = a.annotationType(); + Method[] elements = c.getMethods(); + for (Method element : elements) { + DescriptorKey key = element.getAnnotation(DescriptorKey.class); + if (key != null) { + String name = key.value(); + Object value; + try { + value = element.invoke(a); + } catch (RuntimeException e) { + // we don't expect this - except for possibly + // security exceptions? + // RuntimeExceptions shouldn't be "UndeclaredThrowable". + // anyway... + throw e; + } catch (Exception e) { + // we don't expect this + throw new UndeclaredThrowableException(e); + } + if (!key.omitIfDefault() || + !equals(value, element.getDefaultValue())) { + value = annotationToField(value); + addToMap(descriptorMap, name, value); + } + } + } + } + + private static void addToMap( + Map descriptorMap, String name, Object value) { + Object oldValue = descriptorMap.put(name, value); + if (oldValue != null && !equals(oldValue, value)) { + final String msg = + "Inconsistent values for descriptor field " + name + + " from annotations: " + value + " :: " + oldValue; + throw new IllegalArgumentException(msg); + } + } + /** * Throws a NotCompliantMBeanException or a SecurityException. * @param notCompliant the class which was under examination @@ -459,8 +595,13 @@ public class Introspector { // The only other possibility is that the value is another // annotation, or that the language has evolved since this code // was written. We don't allow for either of those currently. + // If it is indeed another annotation, then x will be a proxy + // with an unhelpful name like $Proxy2. So we extract the + // proxy's interface to use that in the exception message. + if (Proxy.isProxyClass(c)) + c = c.getInterfaces()[0]; // array "can't be empty" throw new IllegalArgumentException("Illegal type for annotation " + - "element: " + x.getClass().getName()); + "element using @DescriptorKey: " + c.getName()); } // This must be consistent with the check for duplicate field values in @@ -476,15 +617,15 @@ public class Introspector { * @param c The interface to be tested * @param clName The name of the class implementing this interface */ - private static Class implementsMBean(Class c, String clName) { + private static Class implementsMBean(Class c, String clName) { String clMBeanName = clName + "MBean"; if (c.getName().equals(clMBeanName)) { return c; } - Class[] interfaces = c.getInterfaces(); + Class[] interfaces = c.getInterfaces(); for (int i = 0;i < interfaces.length; i++) { if (interfaces[i].getName().equals(clMBeanName)) - return interfaces[i]; + return Util.cast(interfaces[i]); } return null; diff --git a/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanAnalyzer.java b/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanAnalyzer.java index 5975f1a391b..e6f7e1f94b0 100644 --- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanAnalyzer.java +++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanAnalyzer.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,13 +29,14 @@ import static com.sun.jmx.mbeanserver.Util.*; import java.lang.reflect.Method; import java.util.Arrays; -import java.util.Collection; import java.util.Comparator; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; - +import javax.management.MBean; +import javax.management.MXBean; +import javax.management.ManagedAttribute; +import javax.management.ManagedOperation; import javax.management.NotCompliantMBeanException; /** @@ -54,15 +55,15 @@ import javax.management.NotCompliantMBeanException; */ class MBeanAnalyzer { - static interface MBeanVisitor { + static interface MBeanVisitor { public void visitAttribute(String attributeName, M getter, - M setter); + M setter) throws X; public void visitOperation(String operationName, - M operation); + M operation) throws X; } - void visit(MBeanVisitor visitor) { + void visit(MBeanVisitor visitor) throws X { // visit attributes for (Map.Entry> entry : attrMap.entrySet()) { String name = entry.getKey(); @@ -98,21 +99,21 @@ class MBeanAnalyzer { // cached PerInterface object for an MBean interface means that // an analyzer will not be recreated for a second MBean using the // same interface. - static MBeanAnalyzer analyzer(Class mbeanInterface, + static MBeanAnalyzer analyzer(Class mbeanType, MBeanIntrospector introspector) throws NotCompliantMBeanException { - return new MBeanAnalyzer(mbeanInterface, introspector); + return new MBeanAnalyzer(mbeanType, introspector); } - private MBeanAnalyzer(Class mbeanInterface, + private MBeanAnalyzer(Class mbeanType, MBeanIntrospector introspector) throws NotCompliantMBeanException { - introspector.checkCompliance(mbeanInterface); + introspector.checkCompliance(mbeanType); try { - initMaps(mbeanInterface, introspector); + initMaps(mbeanType, introspector); } catch (Exception x) { - throw Introspector.throwException(mbeanInterface,x); + throw Introspector.throwException(mbeanType,x); } } @@ -126,19 +127,28 @@ class MBeanAnalyzer { /* Run through the methods to detect inconsistencies and to enable us to give getter and setter together to visitAttribute. */ for (Method m : methods) { - String name = m.getName(); + final String name = m.getName(); + final int nParams = m.getParameterTypes().length; + final boolean managedOp = m.isAnnotationPresent(ManagedOperation.class); + final boolean managedAttr = m.isAnnotationPresent(ManagedAttribute.class); + if (managedOp && managedAttr) { + throw new NotCompliantMBeanException("Method " + name + + " has both @ManagedOperation and @ManagedAttribute"); + } final M cm = introspector.mFrom(m); String attrName = ""; - if (name.startsWith("get")) - attrName = name.substring(3); - else if (name.startsWith("is") - && m.getReturnType() == boolean.class) - attrName = name.substring(2); + if (!managedOp) { + if (name.startsWith("get")) + attrName = name.substring(3); + else if (name.startsWith("is") + && m.getReturnType() == boolean.class) + attrName = name.substring(2); + } - if (attrName.length() != 0 && m.getParameterTypes().length == 0 - && m.getReturnType() != void.class) { + if (attrName.length() != 0 && nParams == 0 + && m.getReturnType() != void.class && !managedOp) { // It's a getter // Check we don't have both isX and getX AttrMethods am = attrMap.get(attrName); @@ -154,8 +164,8 @@ class MBeanAnalyzer { am.getter = cm; attrMap.put(attrName, am); } else if (name.startsWith("set") && name.length() > 3 - && m.getParameterTypes().length == 1 && - m.getReturnType() == void.class) { + && nParams == 1 && + m.getReturnType() == void.class && !managedOp) { // It's a setter attrName = name.substring(3); AttrMethods am = attrMap.get(attrName); @@ -168,6 +178,9 @@ class MBeanAnalyzer { } am.setter = cm; attrMap.put(attrName, am); + } else if (managedAttr) { + throw new NotCompliantMBeanException("Method " + name + + " has @ManagedAttribute but is not a valid getter or setter"); } else { // It's an operation List cms = opMap.get(name); @@ -228,7 +241,11 @@ class MBeanAnalyzer { but only the overriding one is of interest. We return the methods in the same order they arrived in. This isn't required by the spec but existing code may depend on it and users may be used to seeing - operations or attributes appear in a particular order. */ + operations or attributes appear in a particular order. + + Because of the way this method works, if the same Method appears + more than once in the given List then it will be completely deleted! + So don't do that. */ static List eliminateCovariantMethods(List startMethods) { // We are assuming that you never have very many methods with the @@ -243,7 +260,7 @@ class MBeanAnalyzer { final Method m0 = sorted[i-1]; final Method m1 = sorted[i]; - // Methods that don't have the same name can't override each others + // Methods that don't have the same name can't override each other if (!m0.getName().equals(m1.getName())) continue; // Methods that have the same name and same signature override @@ -251,7 +268,8 @@ class MBeanAnalyzer { // due to the way we have sorted them in MethodOrder. if (Arrays.equals(m0.getParameterTypes(), m1.getParameterTypes())) { - overridden.add(m0); + if (!overridden.add(m0)) + throw new RuntimeException("Internal error: duplicate Method"); } } diff --git a/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanInjector.java b/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanInjector.java new file mode 100644 index 00000000000..4831134f6af --- /dev/null +++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanInjector.java @@ -0,0 +1,291 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package com.sun.jmx.mbeanserver; + +import java.lang.ref.WeakReference; +import java.security.PrivilegedAction; +import java.util.Map; +import java.util.WeakHashMap; +import javax.annotation.Resource; +import javax.management.MBeanServer; +import javax.management.NotCompliantMBeanException; +import javax.management.ObjectName; + +import static com.sun.jmx.mbeanserver.Util.newMap; +import java.lang.reflect.AccessibleObject; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.security.AccessController; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import javax.management.SendNotification; + +public class MBeanInjector { + private static Class[] injectedClasses = { + MBeanServer.class, ObjectName.class, SendNotification.class, + }; + + public static void inject(Object mbean, MBeanServer mbs, ObjectName name) + throws Exception { + ClassInjector injector = injectorForClass(mbean.getClass()); + injector.inject(mbean, MBeanServer.class, mbs); + injector.inject(mbean, ObjectName.class, name); + } + + public static boolean injectsSendNotification(Object mbean) + throws NotCompliantMBeanException { + ClassInjector injector = injectorForClass(mbean.getClass()); + return injector.injects(SendNotification.class); + } + + public static void injectSendNotification(Object mbean, SendNotification sn) + throws Exception { + ClassInjector injector = injectorForClass(mbean.getClass()); + injector.inject(mbean, SendNotification.class, sn); + } + + public static void validate(Class c) throws NotCompliantMBeanException { + injectorForClass(c); + } + + private static class ClassInjector { + private Map, List> fields; + private Map, List> methods; + + ClassInjector(Class c) throws NotCompliantMBeanException { + fields = newMap(); + methods = newMap(); + + Class sup = c.getSuperclass(); + ClassInjector supInjector; + if (sup == null) { + supInjector = null; + } else { + supInjector = injectorForClass(sup); + fields.putAll(supInjector.fields); + methods.putAll(supInjector.methods); + } + + addMembers(c); + eliminateOverriddenMethods(); + + // If we haven't added any new fields or methods to what we + // inherited, then we can share the parent's maps. + if (supInjector != null) { + if (fields.equals(supInjector.fields)) + fields = supInjector.fields; + if (methods.equals(supInjector.methods)) + methods = supInjector.methods; + } + } + + boolean injects(Class c) { + return (fields.get(c) != null || methods.get(c) != null); + } + + void inject(Object instance, Class type, T resource) + throws Exception { + List fs = fields.get(type); + if (fs != null) { + for (Field f : fs) + f.set(instance, resource); + } + List ms = methods.get(type); + if (ms != null) { + for (Method m : ms) { + try { + m.invoke(instance, resource); + } catch (InvocationTargetException e) { + Throwable cause = e.getCause(); + if (cause instanceof Error) + throw (Error) cause; + else + throw (Exception) cause; + } + } + } + } + + private void eliminateOverriddenMethods() { + /* Covariant overriding is unlikely, but it is possible that the + * parent has a @Resource method that we override with another + * @Resource method. We don't want to invoke both methods, + * because polymorphism means we would actually invoke the same + * method twice. + */ + for (Map.Entry, List> entry : methods.entrySet()) { + List list = entry.getValue(); + list = MBeanAnalyzer.eliminateCovariantMethods(list); + entry.setValue(list); + } + } + + /* + * Find Fields or Methods within the given Class that we can inject + * resource references into. Suppose we want to know if a Field can get + * a reference to an ObjectName. We'll accept fields like this: + * + * @Resource + * private transient ObjectName name; + * + * or like this: + * + * @Resource(type = ObjectName.class) + * private transient Object name; + * + * but not like this: + * + * @Resource + * private transient Object name; + * + * (Plain @Resource is equivalent to @Resource(type = Object.class).) + * + * We don't want to inject into everything that might possibly accept + * an ObjectName reference, because examples like the last one above + * could also accept an MBeanServer reference or any other sort of + * reference. + * + * So we accept a Field if it has a @Resource annotation and either + * (a) its type is ObjectName or a subclass and its @Resource type is + * compatible with ObjectName (e.g. it is Object); or + * (b) its type is compatible with ObjectName and its @Resource type + * is exactly ObjectName. Fields that meet these criteria will not + * meet the same criteria with respect to other types such as MBeanServer. + * + * The same logic applies mutatis mutandis to Methods such as this: + * + * @Resource + * private void setObjectName1(ObjectName name) + * @Resource(type = Object.class) + * private void setObjectName2(Object name) + */ + private void addMembers(final Class c) + throws NotCompliantMBeanException { + AccessibleObject[][] memberArrays = + AccessController.doPrivileged( + new PrivilegedAction() { + public AccessibleObject[][] run() { + return new AccessibleObject[][] { + c.getDeclaredFields(), c.getDeclaredMethods() + }; + } + }); + for (AccessibleObject[] members : memberArrays) { + for (final AccessibleObject member : members) { + Resource res = member.getAnnotation(Resource.class); + if (res == null) + continue; + + final Field field; + final Method method; + final Class memberType; + final int modifiers; + if (member instanceof Field) { + field = (Field) member; + memberType = field.getType(); + modifiers = field.getModifiers(); + method = null; + } else { + field = null; + method = (Method) member; + Class[] paramTypes = method.getParameterTypes(); + if (paramTypes.length != 1) { + throw new NotCompliantMBeanException( + "@Resource method must have exactly 1 " + + "parameter: " + method); + } + if (method.getReturnType() != void.class) { + throw new NotCompliantMBeanException( + "@Resource method must return void: " + + method); + } + memberType = paramTypes[0]; + modifiers = method.getModifiers(); + } + + if (Modifier.isStatic(modifiers)) { + throw new NotCompliantMBeanException( + "@Resource method or field cannot be static: " + + member); + } + + for (Class injectedClass : injectedClasses) { + Class[] types = {memberType, res.type()}; + boolean accept = false; + for (int i = 0; i < 2; i++) { + if (types[i] == injectedClass && + types[1 - i].isAssignableFrom(injectedClass)) { + accept = true; + break; + } + } + if (accept) { + AccessController.doPrivileged(new PrivilegedAction() { + public Void run() { + member.setAccessible(true); + return null; + } + }); + addToMap(fields, injectedClass, field); + addToMap(methods, injectedClass, method); + } + } + } + } + } + + private static void addToMap(Map> map, K key, V value) { + if (value == null) + return; + List list = map.get(key); + if (list == null) + list = Collections.singletonList(value); + else { + if (list.size() == 1) + list = new ArrayList(list); + list.add(value); + } + map.put(key, list); + } + } + + private static synchronized ClassInjector injectorForClass(Class c) + throws NotCompliantMBeanException { + WeakReference wr = injectorMap.get(c); + ClassInjector ci = (wr == null) ? null : wr.get(); + if (ci == null) { + ci = new ClassInjector(c); + injectorMap.put(c, new WeakReference(ci)); + } + return ci; + } + + private static Map, WeakReference> injectorMap = + new WeakHashMap, WeakReference>(); +} diff --git a/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanInstantiator.java b/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanInstantiator.java index 777383a1220..019793b8d85 100644 --- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanInstantiator.java +++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanInstantiator.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanIntrospector.java b/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanIntrospector.java index ea7dbdade33..725292bca36 100644 --- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanIntrospector.java +++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanIntrospector.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,25 +36,35 @@ import java.lang.reflect.Method; import java.lang.reflect.Type; import java.util.Arrays; import java.util.List; +import java.util.Map; import java.util.WeakHashMap; +import javax.management.Description; import javax.management.Descriptor; import javax.management.ImmutableDescriptor; +import javax.management.IntrospectionException; import javax.management.InvalidAttributeValueException; +import javax.management.MBean; import javax.management.MBeanAttributeInfo; import javax.management.MBeanConstructorInfo; import javax.management.MBeanException; import javax.management.MBeanInfo; import javax.management.MBeanNotificationInfo; import javax.management.MBeanOperationInfo; +import javax.management.MXBean; +import javax.management.ManagedAttribute; +import javax.management.ManagedOperation; import javax.management.NotCompliantMBeanException; import javax.management.NotificationBroadcaster; +import javax.management.NotificationInfo; +import javax.management.NotificationInfos; import javax.management.ReflectionException; /** * An introspector for MBeans of a certain type. There is one instance - * of this class for Standard MBeans and one for MXBeans, characterized - * by the two concrete subclasses of this abstract class. + * of this class for Standard MBeans, and one for every MXBeanMappingFactory; + * these two cases correspond to the two concrete subclasses of this abstract + * class. * * @param the representation of methods for this kind of MBean: * Method for Standard MBeans, ConvertingMethod for MXBeans. @@ -119,7 +129,7 @@ abstract class MBeanIntrospector { * MXBean interface is not valid if one of its parameters cannot be * mapped to an Open Type. */ - abstract void checkMethod(M m) throws IllegalArgumentException; + abstract void checkMethod(M m); /** * Invoke the method with the given target and arguments. @@ -149,7 +159,27 @@ abstract class MBeanIntrospector { * may be null. */ abstract MBeanAttributeInfo getMBeanAttributeInfo(String attributeName, - M getter, M setter); + M getter, M setter) throws IntrospectionException; + + final String getAttributeDescription( + String attributeName, String defaultDescription, + Method getter, Method setter) throws IntrospectionException { + String g = Introspector.descriptionForElement(getter); + String s = Introspector.descriptionForElement(setter); + if (g == null) { + if (s == null) + return defaultDescription; + else + return s; + } else if (s == null || g.equals(s)) { + return g; + } else { + throw new IntrospectionException( + "Inconsistent @Description on getter and setter for " + + "attribute " + attributeName); + } + } + /** * Construct an MBeanOperationInfo for the given operation based on * the M it was derived from. @@ -170,9 +200,23 @@ abstract class MBeanIntrospector { */ abstract Descriptor getMBeanDescriptor(Class resourceClass); + /** + * Get any additional Descriptor entries for this introspector instance. + * If there is a non-default MXBeanMappingFactory, it will appear in + * this Descriptor. + * @return Additional Descriptor entries, or an empty Descriptor if none. + */ + Descriptor getSpecificMBeanDescriptor() { + return ImmutableDescriptor.EMPTY_DESCRIPTOR; + } + void checkCompliance(Class mbeanType) throws NotCompliantMBeanException { - if (!mbeanType.isInterface()) { - throw new NotCompliantMBeanException("Not an interface: " + + if (!mbeanType.isInterface() && + !mbeanType.isAnnotationPresent(MBean.class) && + !Introspector.hasMXBeanAnnotation(mbeanType)) { + throw new NotCompliantMBeanException("Not an interface and " + + "does not have @" + MBean.class.getSimpleName() + + " or @" + MXBean.class.getSimpleName() + " annotation: " + mbeanType.getName()); } } @@ -181,7 +225,12 @@ abstract class MBeanIntrospector { * Get the methods to be analyzed to build the MBean interface. */ List getMethods(final Class mbeanType) throws Exception { - return Arrays.asList(mbeanType.getMethods()); + if (mbeanType.isInterface()) + return Arrays.asList(mbeanType.getMethods()); + + final List methods = newList(); + getAnnotatedMethods(mbeanType, methods); + return methods; } final PerInterface getPerInterface(Class mbeanInterface) @@ -216,11 +265,14 @@ abstract class MBeanIntrospector { * the MBeanInfo's Descriptor. */ private MBeanInfo makeInterfaceMBeanInfo(Class mbeanInterface, - MBeanAnalyzer analyzer) { + MBeanAnalyzer analyzer) throws IntrospectionException { final MBeanInfoMaker maker = new MBeanInfoMaker(); analyzer.visit(maker); - final String description = + final String defaultDescription = "Information on the management interface of the MBean"; + String description = Introspector.descriptionForElement(mbeanInterface); + if (description == null) + description = defaultDescription; return maker.makeMBeanInfo(mbeanInterface, description); } @@ -317,11 +369,12 @@ abstract class MBeanIntrospector { } /** A visitor that constructs the per-interface MBeanInfo. */ - private class MBeanInfoMaker implements MBeanAnalyzer.MBeanVisitor { + private class MBeanInfoMaker + implements MBeanAnalyzer.MBeanVisitor { public void visitAttribute(String attributeName, M getter, - M setter) { + M setter) throws IntrospectionException { MBeanAttributeInfo mbai = getMBeanAttributeInfo(attributeName, getter, setter); @@ -346,13 +399,14 @@ abstract class MBeanIntrospector { ops.toArray(new MBeanOperationInfo[0]); final String interfaceClassName = "interfaceClassName=" + mbeanInterface.getName(); - final Descriptor interfDescriptor = + final Descriptor classNameDescriptor = new ImmutableDescriptor(interfaceClassName); final Descriptor mbeanDescriptor = getBasicMBeanDescriptor(); final Descriptor annotatedDescriptor = Introspector.descriptorForElement(mbeanInterface); final Descriptor descriptor = - DescriptorCache.getInstance().union(interfDescriptor, + DescriptorCache.getInstance().union( + classNameDescriptor, mbeanDescriptor, annotatedDescriptor); @@ -388,20 +442,32 @@ abstract class MBeanIntrospector { * Return the MBeanInfo for the given resource, based on the given * per-interface data. */ - final MBeanInfo getMBeanInfo(Object resource, PerInterface perInterface) { + final MBeanInfo getMBeanInfo(Object resource, PerInterface perInterface) + throws NotCompliantMBeanException { MBeanInfo mbi = getClassMBeanInfo(resource.getClass(), perInterface); - MBeanNotificationInfo[] notifs = findNotifications(resource); - if (notifs == null || notifs.length == 0) + MBeanNotificationInfo[] notifs; + try { + notifs = findNotifications(resource); + } catch (RuntimeException e) { + NotCompliantMBeanException x = + new NotCompliantMBeanException(e.getMessage()); + x.initCause(e); + throw x; + } + Descriptor d = getSpecificMBeanDescriptor(); + boolean anyNotifs = (notifs != null && notifs.length > 0); + if (!anyNotifs && ImmutableDescriptor.EMPTY_DESCRIPTOR.equals(d)) return mbi; else { + d = ImmutableDescriptor.union(d, mbi.getDescriptor()); return new MBeanInfo(mbi.getClassName(), mbi.getDescription(), mbi.getAttributes(), mbi.getConstructors(), mbi.getOperations(), notifs, - mbi.getDescriptor()); + d); } } @@ -441,13 +507,43 @@ abstract class MBeanIntrospector { } } + /* + * Add to "methods" every public method that has the @ManagedAttribute + * or @ManagedOperation annotation, in the given class or any of + * its superclasses or superinterfaces. + * + * We always add superclass or superinterface methods first, so that + * the stable sort used by eliminateCovariantMethods will put the + * method from the most-derived class last. This means that we will + * see the version of the @ManagedAttribute (or ...Operation) annotation + * from that method, which might have a different description or whatever. + */ + private static void getAnnotatedMethods(Class c, List methods) + throws Exception { + Class sup = c.getSuperclass(); + if (sup != null) + getAnnotatedMethods(sup, methods); + Class[] intfs = c.getInterfaces(); + for (Class intf : intfs) + getAnnotatedMethods(intf, methods); + for (Method m : c.getMethods()) { + // We are careful not to add m if it is inherited from a parent + // class or interface, because duplicate methods lead to nasty + // behaviour in eliminateCovariantMethods. + if (m.getDeclaringClass() == c && + (m.isAnnotationPresent(ManagedAttribute.class) || + m.isAnnotationPresent(ManagedOperation.class))) + methods.add(m); + } + } + static MBeanNotificationInfo[] findNotifications(Object moi) { if (!(moi instanceof NotificationBroadcaster)) return null; MBeanNotificationInfo[] mbn = ((NotificationBroadcaster) moi).getNotificationInfo(); - if (mbn == null) - return null; + if (mbn == null || mbn.length == 0) + return findNotificationsFromAnnotations(moi.getClass()); MBeanNotificationInfo[] result = new MBeanNotificationInfo[mbn.length]; for (int i = 0; i < mbn.length; i++) { @@ -459,11 +555,81 @@ abstract class MBeanIntrospector { return result; } + private static MBeanNotificationInfo[] findNotificationsFromAnnotations( + Class mbeanClass) { + Class c = getAnnotatedNotificationInfoClass(mbeanClass); + if (c == null) + return null; + NotificationInfo ni = c.getAnnotation(NotificationInfo.class); + NotificationInfos nis = c.getAnnotation(NotificationInfos.class); + List list = newList(); + if (ni != null) + list.add(ni); + if (nis != null) + list.addAll(Arrays.asList(nis.value())); + if (list.isEmpty()) + return null; + List mbnis = newList(); + for (NotificationInfo x : list) { + // The Descriptor includes any fields explicitly specified by + // x.descriptorFields(), plus any fields from the contained + // @Description annotation. + Descriptor d = new ImmutableDescriptor(x.descriptorFields()); + d = ImmutableDescriptor.union( + d, Introspector.descriptorForAnnotation(x.description())); + MBeanNotificationInfo mbni = new MBeanNotificationInfo( + x.types(), x.notificationClass().getName(), + x.description().value(), d); + mbnis.add(mbni); + } + return mbnis.toArray(new MBeanNotificationInfo[mbnis.size()]); + } + + private static final Map, WeakReference>> + annotatedNotificationInfoClasses = newWeakHashMap(); + + private static Class getAnnotatedNotificationInfoClass(Class baseClass) { + synchronized (annotatedNotificationInfoClasses) { + WeakReference> wr = + annotatedNotificationInfoClasses.get(baseClass); + if (wr != null) + return wr.get(); + Class c = null; + if (baseClass.isAnnotationPresent(NotificationInfo.class) || + baseClass.isAnnotationPresent(NotificationInfos.class)) { + c = baseClass; + } else { + Class[] intfs = baseClass.getInterfaces(); + for (Class intf : intfs) { + Class c1 = getAnnotatedNotificationInfoClass(intf); + if (c1 != null) { + if (c != null) { + throw new IllegalArgumentException( + "Class " + baseClass.getName() + " inherits " + + "@NotificationInfo(s) from both " + + c.getName() + " and " + c1.getName()); + } + c = c1; + } + } + } + // Record the result of the search. If no @NotificationInfo(s) + // were found, c is null, and we store a WeakReference(null). + // This prevents us from having to search again and fail again. + annotatedNotificationInfoClasses.put(baseClass, + new WeakReference>(c)); + return c; + } + } + private static MBeanConstructorInfo[] findConstructors(Class c) { Constructor[] cons = c.getConstructors(); MBeanConstructorInfo[] mbc = new MBeanConstructorInfo[cons.length]; for (int i = 0; i < cons.length; i++) { - final String descr = "Public constructor of the MBean"; + String descr = "Public constructor of the MBean"; + Description d = cons[i].getAnnotation(Description.class); + if (d != null) + descr = d.value(); mbc[i] = new MBeanConstructorInfo(descr, cons[i]); } return mbc; diff --git a/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanSupport.java b/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanSupport.java index 187ca503d5e..d4f3123fbc5 100644 --- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanSupport.java +++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanSupport.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,6 +38,7 @@ import javax.management.MBeanServer; import javax.management.NotCompliantMBeanException; import javax.management.ObjectName; import javax.management.ReflectionException; +import javax.management.openmbean.MXBeanMappingFactory; /** * Base class for MBeans. There is one instance of this class for @@ -121,24 +122,26 @@ import javax.management.ReflectionException; public abstract class MBeanSupport implements DynamicMBean2, MBeanRegistration { - MBeanSupport(T resource, Class mbeanInterface) + MBeanSupport(T resource, Class mbeanInterfaceType, + MXBeanMappingFactory mappingFactory) throws NotCompliantMBeanException { - if (mbeanInterface == null) + if (mbeanInterfaceType == null) throw new NotCompliantMBeanException("Null MBean interface"); - if (!mbeanInterface.isInstance(resource)) { + if (!mbeanInterfaceType.isInstance(resource)) { final String msg = "Resource class " + resource.getClass().getName() + - " is not an instance of " + mbeanInterface.getName(); + " is not an instance of " + mbeanInterfaceType.getName(); throw new NotCompliantMBeanException(msg); } this.resource = resource; - MBeanIntrospector introspector = getMBeanIntrospector(); - this.perInterface = introspector.getPerInterface(mbeanInterface); + MBeanIntrospector introspector = getMBeanIntrospector(mappingFactory); + this.perInterface = introspector.getPerInterface(mbeanInterfaceType); this.mbeanInfo = introspector.getMBeanInfo(resource, perInterface); } /** Return the appropriate introspector for this type of MBean. */ - abstract MBeanIntrospector getMBeanIntrospector(); + abstract MBeanIntrospector + getMBeanIntrospector(MXBeanMappingFactory mappingFactory); /** * Return a cookie for this MBean. This cookie will be passed to @@ -162,9 +165,8 @@ public abstract class MBeanSupport public final ObjectName preRegister(MBeanServer server, ObjectName name) throws Exception { if (resource instanceof MBeanRegistration) - return ((MBeanRegistration) resource).preRegister(server, name); - else - return name; + name = ((MBeanRegistration) resource).preRegister(server, name); + return name; } public final void preRegister2(MBeanServer server, ObjectName name) @@ -261,10 +263,14 @@ public abstract class MBeanSupport return resource.getClass().getName(); } - public final Object getResource() { + public final Object getWrappedObject() { return resource; } + public final ClassLoader getWrappedClassLoader() { + return resource.getClass().getClassLoader(); + } + public final Class getMBeanInterface() { return perInterface.getMBeanInterface(); } diff --git a/jdk/src/share/classes/com/sun/jmx/mbeanserver/MXBeanIntrospector.java b/jdk/src/share/classes/com/sun/jmx/mbeanserver/MXBeanIntrospector.java index e93961a4ae9..8ff0a902dff 100644 --- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/MXBeanIntrospector.java +++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/MXBeanIntrospector.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,18 +25,28 @@ package com.sun.jmx.mbeanserver; +import com.sun.jmx.mbeanserver.MBeanIntrospector.MBeanInfoMap; +import com.sun.jmx.mbeanserver.MBeanIntrospector.PerInterfaceMap; import java.lang.annotation.Annotation; +import java.lang.ref.WeakReference; import java.lang.reflect.GenericArrayType; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Type; +import java.util.Map; +import java.util.WeakHashMap; +import javax.management.Description; import javax.management.Descriptor; import javax.management.ImmutableDescriptor; +import javax.management.IntrospectionException; +import javax.management.JMX; import javax.management.MBeanAttributeInfo; import javax.management.MBeanException; import javax.management.MBeanOperationInfo; import javax.management.MBeanParameterInfo; +import javax.management.ManagedOperation; import javax.management.NotCompliantMBeanException; +import javax.management.openmbean.MXBeanMappingFactory; import javax.management.openmbean.OpenMBeanAttributeInfoSupport; import javax.management.openmbean.OpenMBeanOperationInfoSupport; import javax.management.openmbean.OpenMBeanParameterInfo; @@ -49,10 +59,36 @@ import javax.management.openmbean.OpenType; * @since 1.6 */ class MXBeanIntrospector extends MBeanIntrospector { - private static final MXBeanIntrospector instance = new MXBeanIntrospector(); + /* We keep one MXBeanIntrospector per MXBeanMappingFactory, since the results + * of the introspection depend on the factory. The MXBeanIntrospector + * has a reference back to the factory, so we wrap it in a WeakReference. + * It will be strongly referenced by any MXBeanSupport instances using it; + * if there are none then it is OK to gc it. + */ + private static final + Map> map = + new WeakHashMap>(); - static MXBeanIntrospector getInstance() { - return instance; + static MXBeanIntrospector getInstance(MXBeanMappingFactory factory) { + if (factory == null) + factory = MXBeanMappingFactory.DEFAULT; + synchronized (map) { + MXBeanIntrospector intro; + WeakReference wr = map.get(factory); + if (wr != null) { + intro = wr.get(); + if (intro != null) + return intro; + } + intro = new MXBeanIntrospector(factory); + wr = new WeakReference(intro); + map.put(factory, wr); + return intro; + } + } + + private MXBeanIntrospector(MXBeanMappingFactory factory) { + this.mappingFactory = factory; } @Override @@ -78,7 +114,7 @@ class MXBeanIntrospector extends MBeanIntrospector { @Override ConvertingMethod mFrom(Method m) { - return ConvertingMethod.from(m); + return ConvertingMethod.from(m, mappingFactory); } @Override @@ -139,13 +175,17 @@ class MXBeanIntrospector extends MBeanIntrospector { @Override MBeanAttributeInfo getMBeanAttributeInfo(String attributeName, - ConvertingMethod getter, ConvertingMethod setter) { + ConvertingMethod getter, ConvertingMethod setter) + throws IntrospectionException { final boolean isReadable = (getter != null); final boolean isWritable = (setter != null); final boolean isIs = isReadable && getName(getter).startsWith("is"); - final String description = attributeName; + final String description = getAttributeDescription( + attributeName, attributeName, + getter == null ? null : getter.getMethod(), + setter == null ? null : setter.getMethod()); final OpenType openType; final Type originalType; @@ -194,13 +234,17 @@ class MXBeanIntrospector extends MBeanIntrospector { MBeanOperationInfo getMBeanOperationInfo(String operationName, ConvertingMethod operation) { final Method method = operation.getMethod(); - final String description = operationName; + String description = operationName; /* Ideally this would be an empty string, but - OMBOperationInfo constructor forbids that. Also, we - could consult an annotation to get a useful - description. */ + OMBOperationInfo constructor forbids that. */ + Description d = method.getAnnotation(Description.class); + if (d != null) + description = d.value(); - final int impact = MBeanOperationInfo.UNKNOWN; + int impact = MBeanOperationInfo.UNKNOWN; + ManagedOperation annot = method.getAnnotation(ManagedOperation.class); + if (annot != null) + impact = annot.impact().getCode(); final OpenType returnType = operation.getOpenReturnType(); final Type originalReturnType = operation.getGenericReturnType(); @@ -212,8 +256,15 @@ class MXBeanIntrospector extends MBeanIntrospector { boolean openParameterTypes = true; Annotation[][] annots = method.getParameterAnnotations(); for (int i = 0; i < paramTypes.length; i++) { - final String paramName = "p" + i; - final String paramDescription = paramName; + String paramName = Introspector.nameForParameter(annots[i]); + if (paramName == null) + paramName = "p" + i; + + String paramDescription = + Introspector.descriptionForParameter(annots[i]); + if (paramDescription == null) + paramDescription = paramName; + final OpenType openType = paramTypes[i]; final Type originalType = originalParamTypes[i]; Descriptor descriptor = @@ -222,14 +273,14 @@ class MXBeanIntrospector extends MBeanIntrospector { Introspector.descriptorForAnnotations(annots[i])); final MBeanParameterInfo pi; if (canUseOpenInfo(originalType)) { - pi = new OpenMBeanParameterInfoSupport("p" + i, + pi = new OpenMBeanParameterInfoSupport(paramName, paramDescription, openType, descriptor); } else { openParameterTypes = false; pi = new MBeanParameterInfo( - "p" + i, + paramName, originalTypeString(originalType), paramDescription, descriptor); @@ -291,6 +342,17 @@ class MXBeanIntrospector extends MBeanIntrospector { return ImmutableDescriptor.EMPTY_DESCRIPTOR; } + @Override + Descriptor getSpecificMBeanDescriptor() { + if (mappingFactory == MXBeanMappingFactory.DEFAULT) + return ImmutableDescriptor.EMPTY_DESCRIPTOR; + else { + return new ImmutableDescriptor( + JMX.MXBEAN_MAPPING_FACTORY_CLASS_FIELD + "=" + + mappingFactory.getClass().getName()); + } + } + private static Descriptor typeDescriptor(OpenType openType, Type originalType) { return new ImmutableDescriptor( @@ -331,8 +393,10 @@ class MXBeanIntrospector extends MBeanIntrospector { return type.toString(); } - private static final PerInterfaceMap + private final PerInterfaceMap perInterfaceMap = new PerInterfaceMap(); - private static final MBeanInfoMap mbeanInfoMap = new MBeanInfoMap(); + private final MBeanInfoMap mbeanInfoMap = new MBeanInfoMap(); + + private final MXBeanMappingFactory mappingFactory; } diff --git a/jdk/src/share/classes/com/sun/jmx/mbeanserver/MXBeanLookup.java b/jdk/src/share/classes/com/sun/jmx/mbeanserver/MXBeanLookup.java index ef712eaafd8..41b3b989160 100644 --- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/MXBeanLookup.java +++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/MXBeanLookup.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,15 +25,21 @@ package com.sun.jmx.mbeanserver; +import com.sun.jmx.remote.util.EnvHelp; +import java.io.InvalidObjectException; import static com.sun.jmx.mbeanserver.Util.*; import java.util.Map; import java.lang.ref.WeakReference; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; +import java.security.AccessController; +import javax.management.InstanceAlreadyExistsException; import javax.management.JMX; import javax.management.MBeanServerConnection; import javax.management.MBeanServerInvocationHandler; +import javax.management.MalformedObjectNameException; import javax.management.ObjectName; +import javax.management.openmbean.OpenDataException; /** * @since 1.6 @@ -80,71 +86,199 @@ import javax.management.ObjectName; * * From the above, it is clear that the logic for getX on an MXBean is * the same as for setX on a proxy, and vice versa. + * + * The above describes the logic for "plain" MXBeanLookup, represented + * by MXBeanLookup.Plain. When namespaces enter the picture, we see + * MXBeanLookup.Prefix. Here, the idea is that the name of the ModuleMXBean + * might be a//m:m=m. In this case, we don't accept a reference to + * an MXBean object, since that would require different namespaces to know + * each others' objects. We only accept proxies. Suppose you have a proxy + * for a//m:m=m, call it moduleProxy, and you call + * moduleProxy.setProduct(productProxy). Then if productProxy is for + * a//p:p=p we should convert this to just p:p=p. If productProxy is for + * a//b//p:p=p we should convert it to b//p:p=p. Conversely, if getProduct + * returns an ObjectName like b//p:p=p then we should convert it into a proxy + * for a//b//p:p=p. */ -public class MXBeanLookup { +public abstract class MXBeanLookup { private MXBeanLookup(MBeanServerConnection mbsc) { this.mbsc = mbsc; } - static MXBeanLookup lookupFor(MBeanServerConnection mbsc) { - synchronized (mbscToLookup) { - WeakReference weakLookup = mbscToLookup.get(mbsc); - MXBeanLookup lookup = (weakLookup == null) ? null : weakLookup.get(); - if (lookup == null) { - lookup = new MXBeanLookup(mbsc); - mbscToLookup.put(mbsc, new WeakReference(lookup)); + static MXBeanLookup lookupFor(MBeanServerConnection mbsc, String prefix) { + if (prefix == null) + return Plain.lookupFor(mbsc); + else + return new Prefix(mbsc, prefix); + } + + abstract T objectNameToMXBean(ObjectName name, Class type) + throws InvalidObjectException; + + abstract ObjectName mxbeanToObjectName(Object mxbean) + throws OpenDataException; + + static class Plain extends MXBeanLookup { + Plain(MBeanServerConnection mbsc) { + super(mbsc); + } + + static Plain lookupFor(MBeanServerConnection mbsc) { + synchronized (mbscToLookup) { + WeakReference weakLookup = mbscToLookup.get(mbsc); + Plain lookup = (weakLookup == null) ? null : weakLookup.get(); + if (lookup == null) { + lookup = new Plain(mbsc); + mbscToLookup.put(mbsc, new WeakReference(lookup)); + } + return lookup; } - return lookup; + } + + @Override + synchronized T objectNameToMXBean(ObjectName name, Class type) { + WeakReference wr = objectNameToProxy.get(name); + if (wr != null) { + Object proxy = wr.get(); + if (type.isInstance(proxy)) + return type.cast(proxy); + } + T proxy = JMX.newMXBeanProxy(mbsc, name, type); + objectNameToProxy.put(name, new WeakReference(proxy)); + return proxy; + } + + @Override + synchronized ObjectName mxbeanToObjectName(Object mxbean) + throws OpenDataException { + String wrong; + if (mxbean instanceof Proxy) { + InvocationHandler ih = Proxy.getInvocationHandler(mxbean); + if (ih instanceof MBeanServerInvocationHandler) { + MBeanServerInvocationHandler mbsih = + (MBeanServerInvocationHandler) ih; + if (mbsih.getMBeanServerConnection().equals(mbsc)) + return mbsih.getObjectName(); + else + wrong = "proxy for a different MBeanServer"; + } else + wrong = "not a JMX proxy"; + } else { + ObjectName name = mxbeanToObjectName.get(mxbean); + if (name != null) + return name; + wrong = "not an MXBean registered in this MBeanServer"; + } + String s = (mxbean == null) ? + "null" : "object of type " + mxbean.getClass().getName(); + throw new OpenDataException( + "Could not convert " + s + " to an ObjectName: " + wrong); + // Message will be strange if mxbean is null but it is not + // supposed to be. + } + + synchronized void addReference(ObjectName name, Object mxbean) + throws InstanceAlreadyExistsException { + ObjectName existing = mxbeanToObjectName.get(mxbean); + if (existing != null) { + String multiname = AccessController.doPrivileged( + new GetPropertyAction("jmx.mxbean.multiname")); + if (!"true".equalsIgnoreCase(multiname)) { + throw new InstanceAlreadyExistsException( + "MXBean already registered with name " + existing); + } + } + mxbeanToObjectName.put(mxbean, name); + } + + synchronized boolean removeReference(ObjectName name, Object mxbean) { + if (name.equals(mxbeanToObjectName.get(mxbean))) { + mxbeanToObjectName.remove(mxbean); + return true; + } else + return false; + /* removeReference can be called when the above condition fails, + * notably if you try to register the same MXBean twice. + */ + } + + private final WeakIdentityHashMap + mxbeanToObjectName = WeakIdentityHashMap.make(); + private final Map> + objectNameToProxy = newMap(); + private static WeakIdentityHashMap> + mbscToLookup = WeakIdentityHashMap.make(); + } + + private static class Prefix extends MXBeanLookup { + private final String prefix; + + Prefix(MBeanServerConnection mbsc, String prefix) { + super(mbsc); + this.prefix = prefix; + } + + @Override + T objectNameToMXBean(ObjectName name, Class type) + throws InvalidObjectException { + String domain = prefix + name.getDomain(); + try { + name = switchDomain(domain, name); + } catch (MalformedObjectNameException e) { + throw EnvHelp.initCause( + new InvalidObjectException(e.getMessage()), e); + } + return JMX.newMXBeanProxy(mbsc, name, type); + } + + @Override + ObjectName mxbeanToObjectName(Object mxbean) + throws OpenDataException { + ObjectName name = proxyToObjectName(mxbean); + String domain = name.getDomain(); + if (!domain.startsWith(prefix)) { + throw new OpenDataException( + "Proxy's name does not start with " + prefix + ": " + name); + } + try { + name = switchDomain(domain.substring(prefix.length()), name); + } catch (MalformedObjectNameException e) { + throw EnvHelp.initCause(new OpenDataException(e.getMessage()), e); + } + return name; } } - synchronized T objectNameToMXBean(ObjectName name, Class type) { - WeakReference wr = objectNameToProxy.get(name); - if (wr != null) { - Object proxy = wr.get(); - if (type.isInstance(proxy)) - return type.cast(proxy); + ObjectName proxyToObjectName(Object proxy) { + InvocationHandler ih = Proxy.getInvocationHandler(proxy); + if (ih instanceof MBeanServerInvocationHandler) { + MBeanServerInvocationHandler mbsih = + (MBeanServerInvocationHandler) ih; + if (mbsih.getMBeanServerConnection().equals(mbsc)) + return mbsih.getObjectName(); } - T proxy = JMX.newMXBeanProxy(mbsc, name, type); - objectNameToProxy.put(name, new WeakReference(proxy)); - return proxy; + return null; } - synchronized ObjectName mxbeanToObjectName(Object mxbean) { - if (mxbean instanceof Proxy) { - InvocationHandler ih = Proxy.getInvocationHandler(mxbean); - if (ih instanceof MBeanServerInvocationHandler) { - MBeanServerInvocationHandler mbsih = - (MBeanServerInvocationHandler) ih; - if (mbsih.getMBeanServerConnection().equals(mbsc)) - return mbsih.getObjectName(); - } - return null; - } else - return mxbeanToObjectName.get(mxbean); + static MXBeanLookup getLookup() { + return currentLookup.get(); } - synchronized void addReference(ObjectName name, Object mxbean) { - mxbeanToObjectName.put(mxbean, name); + static void setLookup(MXBeanLookup lookup) { + currentLookup.set(lookup); } - synchronized boolean removeReference(ObjectName name, Object mxbean) { - if (name.equals(mxbeanToObjectName.get(mxbean))) { - mxbeanToObjectName.remove(mxbean); - return true; - } else - return false; - /* removeReference can be called when the above condition fails, - * notably if you try to register the same MXBean twice. - */ + // Method temporarily added until we have ObjectName.switchDomain in the + // public API. Note that this method DOES NOT PRESERVE the order of + // keys in the ObjectName so it must not be used in the final release. + static ObjectName switchDomain(String domain, ObjectName name) + throws MalformedObjectNameException { + return new ObjectName(domain, name.getKeyPropertyList()); } - private final MBeanServerConnection mbsc; - private final WeakIdentityHashMap - mxbeanToObjectName = WeakIdentityHashMap.make(); - private final Map> - objectNameToProxy = newMap(); - private static WeakIdentityHashMap> - mbscToLookup = WeakIdentityHashMap.make(); + private static final ThreadLocal currentLookup = + new ThreadLocal(); + + final MBeanServerConnection mbsc; } diff --git a/jdk/src/share/classes/com/sun/jmx/mbeanserver/MXBeanProxy.java b/jdk/src/share/classes/com/sun/jmx/mbeanserver/MXBeanProxy.java index 6ecca2ce1d5..1ad7598f126 100644 --- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/MXBeanProxy.java +++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/MXBeanProxy.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,14 +27,15 @@ package com.sun.jmx.mbeanserver; import static com.sun.jmx.mbeanserver.Util.*; -import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.util.Map; import javax.management.Attribute; import javax.management.MBeanServerConnection; +import javax.management.MalformedObjectNameException; import javax.management.NotCompliantMBeanException; import javax.management.ObjectName; +import javax.management.openmbean.MXBeanMappingFactory; /**

    Helper class for an {@link InvocationHandler} that forwards methods from an @@ -46,8 +47,7 @@ import javax.management.ObjectName; @since 1.6 */ public class MXBeanProxy { - public MXBeanProxy(Class mxbeanInterface) - throws IllegalArgumentException { + public MXBeanProxy(Class mxbeanInterface, MXBeanMappingFactory factory) { if (mxbeanInterface == null) throw new IllegalArgumentException("Null parameter"); @@ -55,14 +55,15 @@ public class MXBeanProxy { final MBeanAnalyzer analyzer; try { analyzer = - MXBeanIntrospector.getInstance().getAnalyzer(mxbeanInterface); + MXBeanIntrospector.getInstance(factory).getAnalyzer(mxbeanInterface); } catch (NotCompliantMBeanException e) { throw new IllegalArgumentException(e); } analyzer.visit(new Visitor()); } - private class Visitor implements MBeanAnalyzer.MBeanVisitor { + private class Visitor + implements MBeanAnalyzer.MBeanVisitor { public void visitAttribute(String attributeName, ConvertingMethod getter, ConvertingMethod setter) { @@ -160,10 +161,29 @@ public class MXBeanProxy { Handler handler = handlerMap.get(method); ConvertingMethod cm = handler.getConvertingMethod(); - MXBeanLookup lookup = MXBeanLookup.lookupFor(mbsc); - Object[] openArgs = cm.toOpenParameters(lookup, args); - Object result = handler.invoke(mbsc, name, openArgs); - return cm.fromOpenReturnValue(lookup, result); + String prefix = extractPrefix(name); + MXBeanLookup lookup = MXBeanLookup.lookupFor(mbsc, prefix); + MXBeanLookup oldLookup = MXBeanLookup.getLookup(); + try { + MXBeanLookup.setLookup(lookup); + Object[] openArgs = cm.toOpenParameters(lookup, args); + Object result = handler.invoke(mbsc, name, openArgs); + return cm.fromOpenReturnValue(lookup, result); + } finally { + MXBeanLookup.setLookup(oldLookup); + } + } + + private static String extractPrefix(ObjectName name) + throws MalformedObjectNameException { + String domain = name.getDomain(); + int slashslash = domain.lastIndexOf("//"); + if (slashslash > 0 && domain.charAt(slashslash - 1) == '/') + slashslash--; + if (slashslash >= 0) + return domain.substring(0, slashslash + 2); + else + return null; } private final Map handlerMap = newMap(); diff --git a/jdk/src/share/classes/com/sun/jmx/mbeanserver/MXBeanSupport.java b/jdk/src/share/classes/com/sun/jmx/mbeanserver/MXBeanSupport.java index 977c74a3230..594a9733481 100644 --- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/MXBeanSupport.java +++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/MXBeanSupport.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,6 +35,8 @@ import javax.management.JMX; import javax.management.MBeanServer; import javax.management.NotCompliantMBeanException; import javax.management.ObjectName; +import javax.management.openmbean.MXBeanMappingFactory; +import javax.management.openmbean.MXBeanMappingFactoryClass; /** * Base class for MXBeans. @@ -61,14 +63,16 @@ public class MXBeanSupport extends MBeanSupport { if it does not implement the class {@code mxbeanInterface} or if that class is not a valid MXBean interface. */ - public MXBeanSupport(T resource, Class mxbeanInterface) + public MXBeanSupport(T resource, Class mxbeanInterface, + MXBeanMappingFactory mappingFactory) throws NotCompliantMBeanException { - super(resource, mxbeanInterface); + super(resource, mxbeanInterface, mappingFactory); } @Override - MBeanIntrospector getMBeanIntrospector() { - return MXBeanIntrospector.getInstance(); + MBeanIntrospector + getMBeanIntrospector(MXBeanMappingFactory mappingFactory) { + return MXBeanIntrospector.getInstance(mappingFactory); } @Override @@ -76,8 +80,7 @@ public class MXBeanSupport extends MBeanSupport { return mxbeanLookup; } - static Class findMXBeanInterface(Class resourceClass) - throws IllegalArgumentException { + static Class findMXBeanInterface(Class resourceClass) { if (resourceClass == null) throw new IllegalArgumentException("Null resource class"); final Set> intfs = transitiveInterfaces(resourceClass); @@ -104,7 +107,7 @@ public class MXBeanSupport extends MBeanSupport { throw new IllegalArgumentException(msg); } if (candidates.iterator().hasNext()) { - return candidates.iterator().next(); + return Util.cast(candidates.iterator().next()); } else { final String msg = "Class " + resourceClass.getName() + @@ -116,7 +119,7 @@ public class MXBeanSupport extends MBeanSupport { /* Return all interfaces inherited by this class, directly or * indirectly through the parent class and interfaces. */ - private static Set> transitiveInterfaces(Class c) { + private static Set> transitiveInterfaces(Class c) { Set> set = newSet(); transitiveInterfaces(c, set); return set; @@ -127,7 +130,7 @@ public class MXBeanSupport extends MBeanSupport { if (c.isInterface()) intfs.add(c); transitiveInterfaces(c.getSuperclass(), intfs); - for (Class sup : c.getInterfaces()) + for (Class sup : c.getInterfaces()) transitiveInterfaces(sup, intfs); } @@ -157,13 +160,8 @@ public class MXBeanSupport extends MBeanSupport { // eventually we could have some logic to supply a default name synchronized (lock) { - if (this.objectName != null) { - final String msg = - "MXBean already registered with name " + this.objectName; - throw new InstanceAlreadyExistsException(msg); - } - this.mxbeanLookup = MXBeanLookup.lookupFor(server); - this.mxbeanLookup.addReference(name, getResource()); + this.mxbeanLookup = MXBeanLookup.Plain.lookupFor(server); + this.mxbeanLookup.addReference(name, getWrappedObject()); this.objectName = name; } } @@ -171,12 +169,20 @@ public class MXBeanSupport extends MBeanSupport { @Override public void unregister() { synchronized (lock) { - if (mxbeanLookup.removeReference(objectName, getResource())) - objectName = null; + if (mxbeanLookup != null) { + if (mxbeanLookup.removeReference(objectName, getWrappedObject())) + objectName = null; + } + // XXX: need to revisit the whole register/unregister logic in + // the face of wrapping. The mxbeanLookup!=null test is a hack. + // If you wrap an MXBean in a MyWrapperMBean and register it, + // the lookup table should contain the wrapped object. But that + // implies that MyWrapperMBean calls register, which today it + // can't within the public API. } } + private final Object lock = new Object(); // for mxbeanLookup and objectName - private Object lock = new Object(); // for mxbeanLookup and objectName - private MXBeanLookup mxbeanLookup; + private MXBeanLookup.Plain mxbeanLookup; private ObjectName objectName; } diff --git a/jdk/src/share/classes/com/sun/jmx/mbeanserver/NotificationMBeanSupport.java b/jdk/src/share/classes/com/sun/jmx/mbeanserver/NotificationMBeanSupport.java index f1e3a13c891..08964f7dc2b 100644 --- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/NotificationMBeanSupport.java +++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/NotificationMBeanSupport.java @@ -1,5 +1,5 @@ /* - * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,6 +30,7 @@ import java.util.ArrayList; import java.util.List; import javax.management.NotCompliantMBeanException; import javax.management.Notification; +import javax.management.openmbean.MXBeanMappingFactory; /** *

    A variant of {@code StandardMBeanSupport} where the only @@ -48,7 +49,7 @@ public class NotificationMBeanSupport extends StandardMBeanSupport { } @Override - MBeanIntrospector getMBeanIntrospector() { + MBeanIntrospector getMBeanIntrospector(MXBeanMappingFactory ignored) { return introspector; } diff --git a/jdk/src/share/classes/com/sun/jmx/mbeanserver/NotifySupport.java b/jdk/src/share/classes/com/sun/jmx/mbeanserver/NotifySupport.java new file mode 100644 index 00000000000..94227370ba2 --- /dev/null +++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/NotifySupport.java @@ -0,0 +1,186 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package com.sun.jmx.mbeanserver; + +import javax.management.Attribute; +import javax.management.AttributeList; +import javax.management.AttributeNotFoundException; +import javax.management.DynamicMBean; +import javax.management.DynamicWrapperMBean; +import javax.management.InvalidAttributeValueException; +import javax.management.ListenerNotFoundException; +import javax.management.MBeanException; +import javax.management.MBeanInfo; +import javax.management.MBeanNotificationInfo; +import javax.management.MBeanRegistration; +import javax.management.MBeanServer; +import javax.management.NotificationBroadcasterSupport; +import javax.management.NotificationEmitter; +import javax.management.NotificationFilter; +import javax.management.NotificationListener; +import javax.management.ObjectName; +import javax.management.ReflectionException; + +/** + * Create wrappers for DynamicMBean that implement NotificationEmitter + * and SendNotification. + */ +public class NotifySupport + implements DynamicMBean2, NotificationEmitter, MBeanRegistration { + + private final DynamicMBean mbean; + private final NotificationBroadcasterSupport nbs; + + public static DynamicMBean wrap( + DynamicMBean mbean, NotificationBroadcasterSupport nbs) { + return new NotifySupport(mbean, nbs); + } + + private NotifySupport(DynamicMBean mbean, NotificationBroadcasterSupport nbs) { + this.mbean = mbean; + this.nbs = nbs; + } + + public static NotificationBroadcasterSupport getNB(DynamicMBean mbean) { + if (mbean instanceof NotifySupport) + return ((NotifySupport) mbean).nbs; + else + return null; + } + + public String getClassName() { + if (mbean instanceof DynamicMBean2) + return ((DynamicMBean2) mbean).getClassName(); + Object w = mbean; + if (w instanceof DynamicWrapperMBean) + w = ((DynamicWrapperMBean) w).getWrappedObject(); + return w.getClass().getName(); + } + + public void preRegister2(MBeanServer mbs, ObjectName name) throws Exception { + if (mbean instanceof DynamicMBean2) + ((DynamicMBean2) mbean).preRegister2(mbs, name); + } + + public void registerFailed() { + if (mbean instanceof DynamicMBean2) + ((DynamicMBean2) mbean).registerFailed(); + } + + public Object getWrappedObject() { + if (mbean instanceof DynamicWrapperMBean) + return ((DynamicWrapperMBean) mbean).getWrappedObject(); + else + return mbean; + } + + public ClassLoader getWrappedClassLoader() { + if (mbean instanceof DynamicWrapperMBean) + return ((DynamicWrapperMBean) mbean).getWrappedClassLoader(); + else + return mbean.getClass().getClassLoader(); + } + + public Object getAttribute(String attribute) throws AttributeNotFoundException, + MBeanException, + ReflectionException { + return mbean.getAttribute(attribute); + } + + public void setAttribute(Attribute attribute) throws AttributeNotFoundException, + InvalidAttributeValueException, + MBeanException, + ReflectionException { + mbean.setAttribute(attribute); + } + + public AttributeList setAttributes(AttributeList attributes) { + return mbean.setAttributes(attributes); + } + + public Object invoke(String actionName, Object[] params, String[] signature) + throws MBeanException, ReflectionException { + return mbean.invoke(actionName, params, signature); + } + + public MBeanInfo getMBeanInfo() { + return mbean.getMBeanInfo(); + } + + public AttributeList getAttributes(String[] attributes) { + return mbean.getAttributes(attributes); + } + + public void removeNotificationListener(NotificationListener listener, + NotificationFilter filter, + Object handback) throws ListenerNotFoundException { + nbs.removeNotificationListener(listener, filter, handback); + } + + public void removeNotificationListener(NotificationListener listener) + throws ListenerNotFoundException { + nbs.removeNotificationListener(listener); + } + + public MBeanNotificationInfo[] getNotificationInfo() { + return nbs.getNotificationInfo(); + } + + public void addNotificationListener(NotificationListener listener, + NotificationFilter filter, + Object handback) { + nbs.addNotificationListener(listener, filter, handback); + } + + public ObjectName preRegister(MBeanServer server, ObjectName name) throws Exception { + if (mbr() != null) + return mbr().preRegister(server, name); + else + return name; + } + + public void postRegister(Boolean registrationDone) { + if (mbr() != null) + mbr().postRegister(registrationDone); + } + + public void preDeregister() throws Exception { + if (mbr() != null) + mbr().preDeregister(); + } + + public void postDeregister() { + if (mbr() != null) + mbr().postDeregister(); + } + + private MBeanRegistration mbr() { + if (mbean instanceof MBeanRegistration) + return (MBeanRegistration) mbean; + else + return null; + } +} diff --git a/jdk/src/share/classes/com/sun/jmx/mbeanserver/PerInterface.java b/jdk/src/share/classes/com/sun/jmx/mbeanserver/PerInterface.java index d20fe5f5239..59fd71cdb98 100644 --- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/PerInterface.java +++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/PerInterface.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -231,7 +231,7 @@ final class PerInterface { /** * Visitor that sets up the method maps (operations, getters, setters). */ - private class InitMaps implements MBeanAnalyzer.MBeanVisitor { + private class InitMaps implements MBeanAnalyzer.MBeanVisitor { public void visitAttribute(String attributeName, M getter, M setter) { diff --git a/jdk/src/share/classes/com/sun/jmx/mbeanserver/Repository.java b/jdk/src/share/classes/com/sun/jmx/mbeanserver/Repository.java index 075ce819937..f41079912fb 100644 --- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/Repository.java +++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/Repository.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,6 +29,7 @@ import com.sun.jmx.defaults.ServiceName; import static com.sun.jmx.defaults.JmxProperties.MBEANSERVER_LOGGER; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -39,7 +40,6 @@ import java.util.Set; import javax.management.DynamicMBean; import javax.management.InstanceAlreadyExistsException; import javax.management.InstanceNotFoundException; -import javax.management.MalformedObjectNameException; import javax.management.ObjectName; import javax.management.QueryExp; import javax.management.RuntimeOperationsException; @@ -52,6 +52,27 @@ import javax.management.RuntimeOperationsException; */ public class Repository { + /** + * An interface that allows the caller to get some control + * over the registration. + * @see #addMBean + * @see #remove + */ + public interface RegistrationContext { + /** + * Called by {@link #addMBean}. + * Can throw a RuntimeOperationsException to cancel the + * registration. + */ + public void registering(); + + /** + * Called by {@link #remove}. + * Any exception thrown by this method will be ignored. + */ + public void unregistered(); + } + // Private fields --------------------------------------------> /** @@ -115,7 +136,6 @@ public class Repository { /** * Builds a new ObjectNamePattern object from an ObjectName pattern * constituents. - * @param domain pattern.getDomain(). * @param propertyListPattern pattern.isPropertyListPattern(). * @param propertyValuePattern pattern.isPropertyValuePattern(). * @param canonicalProps pattern.getCanonicalKeyPropertyListString(). @@ -216,16 +236,6 @@ public class Repository { } } - private void addNewDomMoi(final DynamicMBean object, final String dom, - final ObjectName name) { - final Map moiTb = - new HashMap(); - moiTb.put(name.getCanonicalKeyPropertyListString(), - new NamedObject(name, object)); - domainTb.put(dom, moiTb); - nbElements++; - } - /** Match a string against a shell-style pattern. The only pattern characters recognised are ?, standing for any one character, and *, standing for any string of @@ -306,6 +316,50 @@ public class Repository { } } + private void addNewDomMoi(final DynamicMBean object, + final String dom, + final ObjectName name, + final RegistrationContext context) { + final Map moiTb = + new HashMap(); + final String key = name.getCanonicalKeyPropertyListString(); + addMoiToTb(object,name,key,moiTb,context); + domainTb.put(dom, moiTb); + nbElements++; + } + + private void registering(RegistrationContext context) { + if (context == null) return; + try { + context.registering(); + } catch (RuntimeOperationsException x) { + throw x; + } catch (RuntimeException x) { + throw new RuntimeOperationsException(x); + } + } + + private void unregistering(RegistrationContext context, ObjectName name) { + if (context == null) return; + try { + context.unregistered(); + } catch (Exception x) { + // shouldn't come here... + MBEANSERVER_LOGGER.log(Level.FINE, + "Unexpected exception while unregistering "+name, + x); + } + } + + private void addMoiToTb(final DynamicMBean object, + final ObjectName name, + final String key, + final Map moiTb, + final RegistrationContext context) { + registering(context); + moiTb.put(key,new NamedObject(name, object)); + } + /** * Retrieves the named object contained in repository * from the given objectname. @@ -355,12 +409,12 @@ public class Repository { domainTb = new HashMap>(5); if (domain != null && domain.length() != 0) - this.domain = domain; + this.domain = domain.intern(); // we use == domain later on... else this.domain = ServiceName.DOMAIN; - // Creates an new hastable for the default domain - domainTb.put(this.domain.intern(), new HashMap()); + // Creates a new hashtable for the default domain + domainTb.put(this.domain, new HashMap()); } /** @@ -395,10 +449,21 @@ public class Repository { /** * Stores an MBean associated with its object name in the repository. * - * @param object MBean to be stored in the repository. - * @param name MBean object name. + * @param object MBean to be stored in the repository. + * @param name MBean object name. + * @param context A registration context. If non null, the repository + * will call {@link RegistrationContext#registering() + * context.registering()} from within the repository + * lock, when it has determined that the {@code object} + * can be stored in the repository with that {@code name}. + * If {@link RegistrationContext#registering() + * context.registering()} throws an exception, the + * operation is abandonned, the MBean is not added to the + * repository, and a {@link RuntimeOperationsException} + * is thrown. */ - public void addMBean(final DynamicMBean object, ObjectName name) + public void addMBean(final DynamicMBean object, ObjectName name, + final RegistrationContext context) throws InstanceAlreadyExistsException { if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) { @@ -431,7 +496,7 @@ public class Repository { lock.writeLock().lock(); try { - // Domain cannot be JMImplementation if entry does not exists + // Domain cannot be JMImplementation if entry does not exist if ( !to_default_domain && dom.equals("JMImplementation") && domainTb.containsKey("JMImplementation")) { @@ -440,21 +505,21 @@ public class Repository { "Repository: domain name cannot be JMImplementation")); } - // If domain not already exists, add it to the hash table + // If domain does not already exist, add it to the hash table final Map moiTb = domainTb.get(dom); if (moiTb == null) { - addNewDomMoi(object, dom, name); + addNewDomMoi(object, dom, name, context); return; - } - - // Add instance if not already present - String cstr = name.getCanonicalKeyPropertyListString(); - NamedObject elmt= moiTb.get(cstr); - if (elmt != null) { - throw new InstanceAlreadyExistsException(name.toString()); } else { - nbElements++; - moiTb.put(cstr, new NamedObject(name, object)); + // Add instance if not already present + String cstr = name.getCanonicalKeyPropertyListString(); + NamedObject elmt= moiTb.get(cstr); + if (elmt != null) { + throw new InstanceAlreadyExistsException(name.toString()); + } else { + nbElements++; + addMoiToTb(object,name,cstr,moiTb,context); + } } } finally { @@ -533,7 +598,7 @@ public class Repository { // ":*", ":[key=value],*" : names in defaultDomain // "domain:*", "domain:[key=value],*" : names in the specified domain - // Surely one of the most frequent case ... query on the whole world + // Surely one of the most frequent cases ... query on the whole world ObjectName name; if (pattern == null || pattern.getCanonicalName().length() == 0 || @@ -546,8 +611,7 @@ public class Repository { // If pattern is not a pattern, retrieve this mbean ! if (!name.isPattern()) { - final NamedObject no; - no = retrieveNamedObject(name); + final NamedObject no = retrieveNamedObject(name); if (no != null) result.add(no); return result; } @@ -577,12 +641,22 @@ public class Repository { return result; } + if (!name.isDomainPattern()) { + final Map moiTb = domainTb.get(name.getDomain()); + if (moiTb == null) return Collections.emptySet(); + if (allNames) + result.addAll(moiTb.values()); + else + addAllMatching(moiTb, result, namePattern); + return result; + } + // Pattern matching in the domain name (*, ?) char[] dom2Match = name.getDomain().toCharArray(); - for (String domain : domainTb.keySet()) { - char[] theDom = domain.toCharArray(); + for (String dom : domainTb.keySet()) { + char[] theDom = dom.toCharArray(); if (wildmatch(theDom, dom2Match)) { - final Map moiTb = domainTb.get(domain); + final Map moiTb = domainTb.get(dom); if (allNames) result.addAll(moiTb.values()); else @@ -599,11 +673,21 @@ public class Repository { * Removes an MBean from the repository. * * @param name name of the MBean to remove. + * @param context A registration context. If non null, the repository + * will call {@link RegistrationContext#unregistered() + * context.unregistered()} from within the repository + * lock, just after the mbean associated with + * {@code name} is removed from the repository. + * If {@link RegistrationContext#unregistered() + * context.unregistered()} is not expected to throw any + * exception. If it does, the exception is logged + * and swallowed. * * @exception InstanceNotFoundException The MBean does not exist in * the repository. */ - public void remove(final ObjectName name) + public void remove(final ObjectName name, + final RegistrationContext context) throws InstanceNotFoundException { // Debugging stuff @@ -645,6 +729,9 @@ public class Repository { if (dom == domain) domainTb.put(domain, new HashMap()); } + + unregistering(context,name); + } finally { lock.writeLock().unlock(); } diff --git a/jdk/src/share/classes/com/sun/jmx/mbeanserver/StandardMBeanIntrospector.java b/jdk/src/share/classes/com/sun/jmx/mbeanserver/StandardMBeanIntrospector.java index 2237a5192cd..aca58c32f11 100644 --- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/StandardMBeanIntrospector.java +++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/StandardMBeanIntrospector.java @@ -35,6 +35,7 @@ import javax.management.IntrospectionException; import javax.management.MBeanAttributeInfo; import javax.management.MBeanException; import javax.management.MBeanOperationInfo; +import javax.management.ManagedOperation; import javax.management.NotCompliantMBeanException; import javax.management.NotificationBroadcaster; import javax.management.NotificationBroadcasterSupport; @@ -118,22 +119,32 @@ class StandardMBeanIntrospector extends MBeanIntrospector { @Override MBeanAttributeInfo getMBeanAttributeInfo(String attributeName, - Method getter, Method setter) { + Method getter, Method setter) throws IntrospectionException { - final String description = "Attribute exposed for management"; - try { - return new MBeanAttributeInfo(attributeName, description, - getter, setter); - } catch (IntrospectionException e) { - throw new RuntimeException(e); // should not happen - } + String description = getAttributeDescription( + attributeName, "Attribute exposed for management", + getter, setter); + return new MBeanAttributeInfo(attributeName, description, + getter, setter); } @Override MBeanOperationInfo getMBeanOperationInfo(String operationName, Method operation) { - final String description = "Operation exposed for management"; - return new MBeanOperationInfo(description, operation); + final String defaultDescription = "Operation exposed for management"; + String description = Introspector.descriptionForElement(operation); + if (description == null) + description = defaultDescription; + + int impact = MBeanOperationInfo.UNKNOWN; + ManagedOperation annot = operation.getAnnotation(ManagedOperation.class); + if (annot != null) + impact = annot.impact().getCode(); + + MBeanOperationInfo mboi = new MBeanOperationInfo(description, operation); + return new MBeanOperationInfo( + mboi.getName(), mboi.getDescription(), mboi.getSignature(), + mboi.getReturnType(), impact, mboi.getDescriptor()); } @Override diff --git a/jdk/src/share/classes/com/sun/jmx/mbeanserver/StandardMBeanSupport.java b/jdk/src/share/classes/com/sun/jmx/mbeanserver/StandardMBeanSupport.java index fd99162f384..4b9963eee49 100644 --- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/StandardMBeanSupport.java +++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/StandardMBeanSupport.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,14 +25,13 @@ package com.sun.jmx.mbeanserver; -import static com.sun.jmx.mbeanserver.Util.*; - import java.lang.reflect.Method; import javax.management.MBeanInfo; import javax.management.MBeanServer; import javax.management.NotCompliantMBeanException; import javax.management.ObjectName; +import javax.management.openmbean.MXBeanMappingFactory; /** * Base class for Standard MBeans. @@ -42,30 +41,28 @@ import javax.management.ObjectName; public class StandardMBeanSupport extends MBeanSupport { /** -

    Construct a Standard MBean that wraps the given resource using the - given Standard MBean interface.

    - - @param resource the underlying resource for the new MBean. - - @param mbeanInterface the interface to be used to determine - the MBean's management interface. - - @param a type parameter that allows the compiler to check - that {@code resource} implements {@code mbeanInterface}, - provided that {@code mbeanInterface} is a class constant like - {@code SomeMBean.class}. - - @throws IllegalArgumentException if {@code resource} is null or - if it does not implement the class {@code mbeanInterface} or if - that class is not a valid Standard MBean interface. - */ - public StandardMBeanSupport(T resource, Class mbeanInterface) + *

    Construct a Standard MBean that wraps the given resource using the + * given Standard MBean interface.

    + * + * @param resource the underlying resource for the new MBean. + * @param mbeanInterfaceType the class or interface to be used to determine + * the MBean's management interface. An interface if this is a + * classic Standard MBean; a class if this is a {@code @ManagedResource}. + * @param a type parameter that allows the compiler to check + * that {@code resource} implements {@code mbeanInterfaceType}, + * provided that {@code mbeanInterfaceType} is a class constant like + * {@code SomeMBean.class}. + * @throws IllegalArgumentException if {@code resource} is null or + * if it does not implement the class {@code mbeanInterfaceType} or if + * that class is not a valid Standard MBean interface. + */ + public StandardMBeanSupport(T resource, Class mbeanInterfaceType) throws NotCompliantMBeanException { - super(resource, mbeanInterface); + super(resource, mbeanInterfaceType, (MXBeanMappingFactory) null); } @Override - MBeanIntrospector getMBeanIntrospector() { + MBeanIntrospector getMBeanIntrospector(MXBeanMappingFactory ignored) { return StandardMBeanIntrospector.getInstance(); } @@ -87,13 +84,14 @@ public class StandardMBeanSupport extends MBeanSupport { @Override public MBeanInfo getMBeanInfo() { MBeanInfo mbi = super.getMBeanInfo(); - Class resourceClass = getResource().getClass(); - if (StandardMBeanIntrospector.isDefinitelyImmutableInfo(resourceClass)) + Class resourceClass = getWrappedObject().getClass(); + if (!getMBeanInterface().isInterface() || + StandardMBeanIntrospector.isDefinitelyImmutableInfo(resourceClass)) return mbi; return new MBeanInfo(mbi.getClassName(), mbi.getDescription(), mbi.getAttributes(), mbi.getConstructors(), mbi.getOperations(), - MBeanIntrospector.findNotifications(getResource()), + MBeanIntrospector.findNotifications(getWrappedObject()), mbi.getDescriptor()); } } diff --git a/jdk/src/share/classes/com/sun/jmx/mbeanserver/Util.java b/jdk/src/share/classes/com/sun/jmx/mbeanserver/Util.java index f2dbe60bbdf..218070d30ad 100644 --- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/Util.java +++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/Util.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,6 +38,7 @@ import java.util.Map; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; +import java.util.WeakHashMap; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; @@ -71,6 +72,10 @@ public class Util { return new LinkedHashMap(); } + static WeakHashMap newWeakHashMap() { + return new WeakHashMap(); + } + static Set newSet() { return new HashSet(); } diff --git a/jdk/src/share/classes/com/sun/jmx/remote/internal/ClientNotifForwarder.java b/jdk/src/share/classes/com/sun/jmx/remote/internal/ClientNotifForwarder.java index 7af1e5f47bc..a37b75395f8 100644 --- a/jdk/src/share/classes/com/sun/jmx/remote/internal/ClientNotifForwarder.java +++ b/jdk/src/share/classes/com/sun/jmx/remote/internal/ClientNotifForwarder.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it 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 5cdbf7ea08a..ae84f4b9d2e 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/jmx/remote/security/FileLoginModule.java b/jdk/src/share/classes/com/sun/jmx/remote/security/FileLoginModule.java index 665557de5a2..47f3e07ab07 100644 --- a/jdk/src/share/classes/com/sun/jmx/remote/security/FileLoginModule.java +++ b/jdk/src/share/classes/com/sun/jmx/remote/security/FileLoginModule.java @@ -1,5 +1,5 @@ /* - * Copyright 2004-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2004-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/jmx/remote/security/JMXPluggableAuthenticator.java b/jdk/src/share/classes/com/sun/jmx/remote/security/JMXPluggableAuthenticator.java index 0fc555620f6..631ee3e3b7b 100644 --- a/jdk/src/share/classes/com/sun/jmx/remote/security/JMXPluggableAuthenticator.java +++ b/jdk/src/share/classes/com/sun/jmx/remote/security/JMXPluggableAuthenticator.java @@ -1,5 +1,5 @@ /* - * Copyright 2004-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2004-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/jmx/remote/security/MBeanServerFileAccessController.java b/jdk/src/share/classes/com/sun/jmx/remote/security/MBeanServerFileAccessController.java index 8bca71dbc62..2e90b11bf4b 100644 --- a/jdk/src/share/classes/com/sun/jmx/remote/security/MBeanServerFileAccessController.java +++ b/jdk/src/share/classes/com/sun/jmx/remote/security/MBeanServerFileAccessController.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/management/HotSpotDiagnosticMXBean.java b/jdk/src/share/classes/com/sun/management/HotSpotDiagnosticMXBean.java index f736dc500bd..d319e8f39e3 100644 --- a/jdk/src/share/classes/com/sun/management/HotSpotDiagnosticMXBean.java +++ b/jdk/src/share/classes/com/sun/management/HotSpotDiagnosticMXBean.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/security/auth/login/ConfigFile.java b/jdk/src/share/classes/com/sun/security/auth/login/ConfigFile.java index 014852ca6d0..99b5361f6aa 100644 --- a/jdk/src/share/classes/com/sun/security/auth/login/ConfigFile.java +++ b/jdk/src/share/classes/com/sun/security/auth/login/ConfigFile.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/security/auth/module/Krb5LoginModule.java b/jdk/src/share/classes/com/sun/security/auth/module/Krb5LoginModule.java index e883373b117..7562f584ada 100644 --- a/jdk/src/share/classes/com/sun/security/auth/module/Krb5LoginModule.java +++ b/jdk/src/share/classes/com/sun/security/auth/module/Krb5LoginModule.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1145,6 +1145,10 @@ public class Krb5LoginModule implements LoginModule { sharedState.put(NAME, username); sharedState.put(PWD, password); } + } else { + // remove temp results for the next try + encKeys = null; + principal = null; } username = null; password = null; diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/bdi/EventRequestSpec.java b/jdk/src/share/classes/com/sun/tools/example/debug/bdi/EventRequestSpec.java index 96a9ef5322b..8e683749ea8 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/bdi/EventRequestSpec.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/bdi/EventRequestSpec.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/bdi/EventRequestSpecList.java b/jdk/src/share/classes/com/sun/tools/example/debug/bdi/EventRequestSpecList.java index e04c851f186..118fb38cab9 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/bdi/EventRequestSpecList.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/bdi/EventRequestSpecList.java @@ -1,5 +1,5 @@ /* - * Copyright 1999 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/bdi/ExecutionManager.java b/jdk/src/share/classes/com/sun/tools/example/debug/bdi/ExecutionManager.java index 245590ec7fd..4229f5885cd 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/bdi/ExecutionManager.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/bdi/ExecutionManager.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2002 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/bdi/JDIEventSource.java b/jdk/src/share/classes/com/sun/tools/example/debug/bdi/JDIEventSource.java index 97fc6a7f2b0..bd024a9d14c 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/bdi/JDIEventSource.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/bdi/JDIEventSource.java @@ -1,5 +1,5 @@ /* - * Copyright 1999 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/bdi/LineBreakpointSpec.java b/jdk/src/share/classes/com/sun/tools/example/debug/bdi/LineBreakpointSpec.java index 29f05ced6b7..a6dc5017ca4 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/bdi/LineBreakpointSpec.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/bdi/LineBreakpointSpec.java @@ -1,5 +1,5 @@ /* - * Copyright 1999 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/bdi/MethodBreakpointSpec.java b/jdk/src/share/classes/com/sun/tools/example/debug/bdi/MethodBreakpointSpec.java index 0732ed9c2c1..87fad085521 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/bdi/MethodBreakpointSpec.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/bdi/MethodBreakpointSpec.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/bdi/ThreadGroupIterator.java b/jdk/src/share/classes/com/sun/tools/example/debug/bdi/ThreadGroupIterator.java index d41901320dd..a5271370b1f 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/bdi/ThreadGroupIterator.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/bdi/ThreadGroupIterator.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/bdi/ThreadIterator.java b/jdk/src/share/classes/com/sun/tools/example/debug/bdi/ThreadIterator.java index bfe57d14a92..806dbee25c5 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/bdi/ThreadIterator.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/bdi/ThreadIterator.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/expr/LValue.java b/jdk/src/share/classes/com/sun/tools/example/debug/expr/LValue.java index ae9711d9f09..40d368c5b0c 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/expr/LValue.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/expr/LValue.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/gui/ClassTreeTool.java b/jdk/src/share/classes/com/sun/tools/example/debug/gui/ClassTreeTool.java index bea3a2745e7..0687f902594 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/gui/ClassTreeTool.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/gui/ClassTreeTool.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/gui/CommandInterpreter.java b/jdk/src/share/classes/com/sun/tools/example/debug/gui/CommandInterpreter.java index 7b6aaf54695..42a7619a0a1 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/gui/CommandInterpreter.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/gui/CommandInterpreter.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2001 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/gui/JDBFileFilter.java b/jdk/src/share/classes/com/sun/tools/example/debug/gui/JDBFileFilter.java index 5963ef2e0df..3c5f50875f2 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/gui/JDBFileFilter.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/gui/JDBFileFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/gui/LaunchTool.java b/jdk/src/share/classes/com/sun/tools/example/debug/gui/LaunchTool.java index fc115b9078e..71ecb38ba92 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/gui/LaunchTool.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/gui/LaunchTool.java @@ -1,5 +1,5 @@ /* - * Copyright 1999 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/gui/SearchPath.java b/jdk/src/share/classes/com/sun/tools/example/debug/gui/SearchPath.java index 1d61c8fa068..b8d359a4410 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/gui/SearchPath.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/gui/SearchPath.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/gui/SourceManager.java b/jdk/src/share/classes/com/sun/tools/example/debug/gui/SourceManager.java index 7173b5f1014..e1973534f4a 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/gui/SourceManager.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/gui/SourceManager.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/gui/SourceModel.java b/jdk/src/share/classes/com/sun/tools/example/debug/gui/SourceModel.java index 75cdca6857d..b77fa29abe9 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/gui/SourceModel.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/gui/SourceModel.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/gui/StackTraceTool.java b/jdk/src/share/classes/com/sun/tools/example/debug/gui/StackTraceTool.java index 78476f0d98b..7c314191f18 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/gui/StackTraceTool.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/gui/StackTraceTool.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/gui/ThreadTreeTool.java b/jdk/src/share/classes/com/sun/tools/example/debug/gui/ThreadTreeTool.java index 955c5b6cbc1..84d4f617794 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/gui/ThreadTreeTool.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/gui/ThreadTreeTool.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/tty/BreakpointSpec.java b/jdk/src/share/classes/com/sun/tools/example/debug/tty/BreakpointSpec.java index c6d437d29e6..f15a1109544 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/tty/BreakpointSpec.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/tty/BreakpointSpec.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/tty/Commands.java b/jdk/src/share/classes/com/sun/tools/example/debug/tty/Commands.java index e607d7165d4..f3c64594fb4 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/tty/Commands.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/tty/Commands.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/tty/Env.java b/jdk/src/share/classes/com/sun/tools/example/debug/tty/Env.java index 9d848a0205b..35fa2935bd7 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/tty/Env.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/tty/Env.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/tty/EventHandler.java b/jdk/src/share/classes/com/sun/tools/example/debug/tty/EventHandler.java index ee80f9df538..760490078a0 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/tty/EventHandler.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/tty/EventHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/tty/EventRequestSpec.java b/jdk/src/share/classes/com/sun/tools/example/debug/tty/EventRequestSpec.java index 7169e33f6f0..3095525791b 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/tty/EventRequestSpec.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/tty/EventRequestSpec.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/tty/EventRequestSpecList.java b/jdk/src/share/classes/com/sun/tools/example/debug/tty/EventRequestSpecList.java index e5741efc706..116a3e779ce 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/tty/EventRequestSpecList.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/tty/EventRequestSpecList.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2002 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/tty/SourceMapper.java b/jdk/src/share/classes/com/sun/tools/example/debug/tty/SourceMapper.java index 618f41a622c..21078658d72 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/tty/SourceMapper.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/tty/SourceMapper.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2001 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/tty/TTY.java b/jdk/src/share/classes/com/sun/tools/example/debug/tty/TTY.java index ec1dc51c6da..6d8930cd850 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/tty/TTY.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/tty/TTY.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/tty/ThreadGroupIterator.java b/jdk/src/share/classes/com/sun/tools/example/debug/tty/ThreadGroupIterator.java index dc2dc118074..09b28d93b77 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/tty/ThreadGroupIterator.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/tty/ThreadGroupIterator.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/tty/ThreadInfo.java b/jdk/src/share/classes/com/sun/tools/example/debug/tty/ThreadInfo.java index e823821c04c..01547aced29 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/tty/ThreadInfo.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/tty/ThreadInfo.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2001 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/tty/ThreadIterator.java b/jdk/src/share/classes/com/sun/tools/example/debug/tty/ThreadIterator.java index 8baff8ebd48..917a4a2eb5b 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/tty/ThreadIterator.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/tty/ThreadIterator.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/tty/VMConnection.java b/jdk/src/share/classes/com/sun/tools/example/debug/tty/VMConnection.java index 7ab34280f89..bbced329f82 100644 --- a/jdk/src/share/classes/com/sun/tools/example/debug/tty/VMConnection.java +++ b/jdk/src/share/classes/com/sun/tools/example/debug/tty/VMConnection.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/hat/Main.java b/jdk/src/share/classes/com/sun/tools/hat/Main.java index d027904bdd4..a5c293ade3c 100644 --- a/jdk/src/share/classes/com/sun/tools/hat/Main.java +++ b/jdk/src/share/classes/com/sun/tools/hat/Main.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/com/sun/tools/hat/build.xml b/jdk/src/share/classes/com/sun/tools/hat/build.xml index 401cb77ae02..33e9472474f 100644 --- a/jdk/src/share/classes/com/sun/tools/hat/build.xml +++ b/jdk/src/share/classes/com/sun/tools/hat/build.xml @@ -1,7 +1,7 @@ {@code Descriptor} for the annotated item.

    + */ + @DescriptorKey( + value = "descriptionResourceBundleBaseName", omitIfDefault = true) + String bundleBaseName() default ""; + + /** + *

    A resource key for the description of this element. In + * conjunction with the {@link #bundleBaseName bundleBaseName}, + * this can be used to find a localized version of the description. + * If a non-default value + * is supplied for this element, it will appear in the + * {@code Descriptor} for the annotated item.

    + */ + @DescriptorKey(value = "descriptionResourceKey", omitIfDefault = true) + String key() default ""; +} diff --git a/jdk/src/share/classes/javax/management/Descriptor.java b/jdk/src/share/classes/javax/management/Descriptor.java index 64bb3eccb23..9aa992486a0 100644 --- a/jdk/src/share/classes/javax/management/Descriptor.java +++ b/jdk/src/share/classes/javax/management/Descriptor.java @@ -38,6 +38,7 @@ import java.util.Arrays; import java.util.ResourceBundle; import javax.management.openmbean.CompositeData; +import javax.management.openmbean.MXBeanMappingFactory; import javax.management.openmbean.OpenMBeanAttributeInfoSupport; import javax.management.openmbean.OpenMBeanOperationInfoSupport; import javax.management.openmbean.OpenMBeanParameterInfoSupport; @@ -117,21 +118,19 @@ import javax.management.openmbean.OpenType; * deprecation, for example {@code "1.3 Replaced by the Capacity * attribute"}. * - *
    + * + * * * + * {@code "com.example.myapp.MBeanResources"}. * - * + * + * * * + * this can be used to find a localized version of the description. * * * @@ -216,6 +215,14 @@ import javax.management.openmbean.OpenType; * StandardMBean} class will have this field in its MBeanInfo * Descriptor. * + * + * + * + * + * * * * diff --git a/jdk/src/share/classes/javax/management/DescriptorFields.java b/jdk/src/share/classes/javax/management/DescriptorFields.java new file mode 100644 index 00000000000..95a4b3a6df1 --- /dev/null +++ b/jdk/src/share/classes/javax/management/DescriptorFields.java @@ -0,0 +1,137 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package javax.management; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + *

    Annotation that adds fields to a {@link Descriptor}. This can be the + * Descriptor for an MBean, or for an attribute, operation, or constructor + * in an MBean, or for a parameter of an operation or constructor.

    + * + *

    Consider this Standard MBean interface, for example:

    + * + *
    + * public interface CacheControlMBean {
    + *     @DescriptorFields("units=bytes")
    + *     public long getCacheSize();
    + * }
    + * 
    + * + *

    When a Standard MBean is made using this interface, the usual rules + * mean that it will have an attribute called {@code CacheSize} of type + * {@code long}. The {@code DescriptorFields} annotation will ensure + * that the {@link MBeanAttributeInfo} for this attribute will have a + * {@code Descriptor} that has a field called {@code units} with + * corresponding value {@code bytes}.

    + * + *

    Similarly, if the interface looks like this:

    + * + *
    + * public interface CacheControlMBean {
    + *     @DescriptorFields({"units=bytes", "since=1.5"})
    + *     public long getCacheSize();
    + * }
    + * 
    + * + *

    then the resulting {@code Descriptor} will contain the following + * fields:

    + * + *
    - - OpenJDK - + OpenJDK
    make.exe Develmake: The GNU version of the 'make' utilitymake: The GNU version of the 'make' utility
    + NOTE: See the GNU make section
    m4.execpio: A program to manage archives of files
    awk.exegawk.exe Utils awk: Pattern-directed scanning and processing language
    zip.exeUtilsArchive zip: Package and compress (archive) files
    unzip.exeUtilsArchive unzip: Extract compressed files in a ZIP archive
    free.exeUtilsProcps free: Display amount of free and used memory in the system
    descriptionResource
    BundleBaseName
    StringAny
    descriptionResource
    BundleBaseName
    StringAnyThe base name for the {@link ResourceBundle} in which the key given in * the {@code descriptionResourceKey} field can be found, for example - * {@code "com.example.myapp.MBeanResources"}. The meaning of this - * field is defined by this specification but the field is not set or - * used by the JMX API itself.
    descriptionResourceKeyStringAny
    descriptionResourceKeyStringAnyA resource key for the description of this element. In * conjunction with the {@code descriptionResourceBundleBaseName}, - * this can be used to find a localized version of the description. - * The meaning of this field is defined by this specification but the - * field is not set or used by the JMX API itself.
    enabledStringMBeanAttributeInfo
    MBeanNotificationInfo
    MBeanOperationInfo
    mxbeanMappingFactoryClass + * StringMBeanInfoThe name of the {@link MXBeanMappingFactory} class that was used for this + * MXBean, if it was not the {@linkplain MXBeanMappingFactory#DEFAULT default} + * one.
    openType{@link OpenType}MBeanAttributeInfo
    MBeanOperationInfo
    MBeanParameterInfo
    + * + * + * + *
    NameValue
    units"bytes"
    since"1.5"
    + * + *

    The {@code @DescriptorFields} annotation can be applied to:

    + * + * + * + *

    Other uses of the annotation will either fail to compile or be + * ignored.

    + * + *

    Interface annotations are checked only on the exact interface + * that defines the management interface of a Standard MBean or an + * MXBean, not on its parent interfaces. Method annotations are + * checked only in the most specific interface in which the method + * appears; in other words, if a child interface overrides a method + * from a parent interface, only {@code @DescriptorFields} annotations in + * the method in the child interface are considered. + * + *

    The Descriptor fields contributed in this way must be consistent + * with each other and with any fields contributed by {@link + * DescriptorKey @DescriptorKey} annotations. That is, two + * different annotations, or two members of the same annotation, must + * not define a different value for the same Descriptor field. Fields + * from annotations on a getter method must also be consistent with + * fields from annotations on the corresponding setter method.

    + * + *

    The Descriptor resulting from these annotations will be merged + * with any Descriptor fields provided by the implementation, such as + * the {@code + * immutableInfo} field for an MBean. The fields from the annotations + * must be consistent with these fields provided by the implementation.

    + * + *

    {@literal @DescriptorFields and @DescriptorKey}

    + * + *

    The {@link DescriptorKey @DescriptorKey} annotation provides + * another way to use annotations to define Descriptor fields. + * @DescriptorKey requires more work but is also more + * robust, because there is less risk of mistakes such as misspelling + * the name of the field or giving an invalid value. + * @DescriptorFields is more convenient but includes + * those risks. @DescriptorFields is more + * appropriate for occasional use, but for a Descriptor field that you + * add in many places, you should consider a purpose-built annotation + * using @DescriptorKey. + * + * @since 1.7 + */ +@Documented +@Inherited // for @MBean and @MXBean classes +@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, + ElementType.PARAMETER, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +public @interface DescriptorFields { + /** + *

    The descriptor fields. Each element of the string looks like + * {@code "name=value"}.

    + */ + public String[] value(); +} diff --git a/jdk/src/share/classes/javax/management/DescriptorKey.java b/jdk/src/share/classes/javax/management/DescriptorKey.java index ad12612db18..9f919490512 100644 --- a/jdk/src/share/classes/javax/management/DescriptorKey.java +++ b/jdk/src/share/classes/javax/management/DescriptorKey.java @@ -33,6 +33,11 @@ import java.lang.annotation.*; * an MBean, or for an attribute, operation, or constructor in an * MBean, or for a parameter of an operation or constructor.

    * + *

    (The {@link DescriptorFields @DescriptorFields} annotation + * provides another way to add fields to a {@code Descriptor}. See + * the documentation for that annotation for a comparison of the + * two possibilities.)

    + * *

    Consider this annotation for example:

    * *
    @@ -57,7 +62,7 @@ import java.lang.annotation.*;
      * 

    When a Standard MBean is made from the {@code CacheControlMBean}, * the usual rules mean that it will have an attribute called * {@code CacheSize} of type {@code long}. The {@code @Units} - * attribute, given the above definition, will ensure that the + * annotation, given the above definition, will ensure that the * {@link MBeanAttributeInfo} for this attribute will have a * {@code Descriptor} that has a field called {@code units} with * corresponding value {@code bytes}.

    @@ -125,12 +130,13 @@ import java.lang.annotation.*; * the method in the child interface are considered. * *

    The Descriptor fields contributed in this way by different - * annotations on the same program element must be consistent. That - * is, two different annotations, or two members of the same - * annotation, must not define a different value for the same - * Descriptor field. Fields from annotations on a getter method must - * also be consistent with fields from annotations on the - * corresponding setter method.

    + * annotations on the same program element must be consistent with + * each other and with any fields contributed by a {@link + * DescriptorFields @DescriptorFields} annotation. That is, two + * different annotations, or two members of the same annotation, must + * not define a different value for the same Descriptor field. Fields + * from annotations on a getter method must also be consistent with + * fields from annotations on the corresponding setter method.

    * *

    The Descriptor resulting from these annotations will be merged * with any Descriptor fields provided by the implementation, such as @@ -169,4 +175,36 @@ import java.lang.annotation.*; @Target(ElementType.METHOD) public @interface DescriptorKey { String value(); + + /** + *

    Do not include this field in the Descriptor if the annotation + * element has its default value. For example, suppose {@code @Units} is + * defined like this:

    + * + *
    +     * @Documented
    +     * @Target(ElementType.METHOD)
    +     * @Retention(RetentionPolicy.RUNTIME)
    +     * public @interface Units {
    +     *     @DescriptorKey("units")
    +     *     String value();
    +     *
    +     *     @DescriptorKey(value = "descriptionResourceKey",
    +     *                    omitIfDefault = true)
    +     *     String resourceKey() default "";
    +     *
    +     *     @DescriptorKey(value = "descriptionResourceBundleBaseName",
    +     *                    omitIfDefault = true)
    +     *     String resourceBundleBaseName() default "";
    +     * }
    +     * 
    + * + *

    Then consider a usage such as {@code @Units("bytes")} or + * {@code @Units(value = "bytes", resourceKey = "")}, where the + * {@code resourceKey} and {@code resourceBundleBaseNames} elements + * have their default values. In this case the Descriptor resulting + * from these annotations will not include a {@code descriptionResourceKey} + * or {@code descriptionResourceBundleBaseName} field.

    + */ + boolean omitIfDefault() default false; } diff --git a/jdk/src/share/classes/javax/management/DynamicWrapperMBean.java b/jdk/src/share/classes/javax/management/DynamicWrapperMBean.java new file mode 100644 index 00000000000..4a67a96795a --- /dev/null +++ b/jdk/src/share/classes/javax/management/DynamicWrapperMBean.java @@ -0,0 +1,62 @@ +/* + * Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package javax.management; + +/** + *

    An MBean can implement this interface to affect how the MBeanServer's + * {@link MBeanServer#getClassLoaderFor getClassLoaderFor} and + * {@link MBeanServer#isInstanceOf isInstanceOf} methods behave. + * If these methods should refer to a wrapped object rather than the + * MBean object itself, then the {@link #getWrappedObject} method should + * return that wrapped object.

    + * + * @see MBeanServer#getClassLoaderFor + * @see MBeanServer#isInstanceOf + */ +public interface DynamicWrapperMBean extends DynamicMBean { + /** + *

    The resource corresponding to this MBean. This is the object whose + * class name should be reflected by the MBean's + * {@link MBeanServer#getMBeanInfo getMBeanInfo()}.{@link MBeanInfo#getClassName getClassName()} for example. For a "plain" + * DynamicMBean it will be "this". For an MBean that wraps another + * object, in the manner of {@link javax.management.StandardMBean}, it will be the + * wrapped object.

    + * + * @return The resource corresponding to this MBean. + */ + public Object getWrappedObject(); + + /** + *

    The {@code ClassLoader} for this MBean, which can be used to + * retrieve resources associated with the MBean for example. Usually, + * it will be + * {@link #getWrappedObject()}.{@code getClass().getClassLoader()}. + * + * @return The {@code ClassLoader} for this MBean. + */ + public ClassLoader getWrappedClassLoader(); +} diff --git a/jdk/src/share/classes/javax/management/Impact.java b/jdk/src/share/classes/javax/management/Impact.java new file mode 100644 index 00000000000..9416df6fac8 --- /dev/null +++ b/jdk/src/share/classes/javax/management/Impact.java @@ -0,0 +1,105 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package javax.management; + +/** + *

    Defines the impact of an MBean operation, in particular whether it + * has an effect on the MBean or simply returns information. This enum + * is used in the {@link ManagedOperation @ManagedOperation} annotation. + * Its {@link #getCode()} method can be used to get an {@code int} suitable + * for use as the {@code impact} parameter in an {@link MBeanOperationInfo} + * constructor.

    + */ +public enum Impact { + /** + * The operation is read-like: it returns information but does not change + * any state. + * @see MBeanOperationInfo#INFO + */ + INFO(MBeanOperationInfo.INFO), + + /** + * The operation is write-like: it has an effect but does not return + * any information from the MBean. + * @see MBeanOperationInfo#ACTION + */ + ACTION(MBeanOperationInfo.ACTION), + + /** + * The operation is both read-like and write-like: it has an effect, + * and it also returns information from the MBean. + * @see MBeanOperationInfo#ACTION_INFO + */ + ACTION_INFO(MBeanOperationInfo.ACTION_INFO), + + /** + * The impact of the operation is unknown or cannot be expressed + * using one of the other values. + * @see MBeanOperationInfo#UNKNOWN + */ + UNKNOWN(MBeanOperationInfo.UNKNOWN); + + private final int code; + + /** + * An instance of this enumeration, with the corresponding {@code int} + * code used by the {@link MBeanOperationInfo} constructors. + * + * @param code the code used by the {@code MBeanOperationInfo} constructors. + */ + Impact(int code) { + this.code = code; + } + + /** + * The equivalent {@code int} code used by the {@link MBeanOperationInfo} + * constructors. + * @return the {@code int} code. + */ + public int getCode() { + return code; + } + + /** + * Return the {@code Impact} value corresponding to the given {@code int} + * code. The {@code code} is the value that would be used in an + * {@code MBeanOperationInfo} constructor. + * + * @param code the {@code int} code. + * + * @return an {@code Impact} value {@code x} such that + * {@code code == x.}{@link #getCode()}, or {@code Impact.UNKNOWN} + * if there is no such value. + */ + public static Impact forCode(int code) { + switch (code) { + case MBeanOperationInfo.ACTION: return ACTION; + case MBeanOperationInfo.INFO: return INFO; + case MBeanOperationInfo.ACTION_INFO: return ACTION_INFO; + default: return UNKNOWN; + } + } +} diff --git a/jdk/src/share/classes/javax/management/InQueryExp.java b/jdk/src/share/classes/javax/management/InQueryExp.java index 103ba3b8633..c24e04569de 100644 --- a/jdk/src/share/classes/javax/management/InQueryExp.java +++ b/jdk/src/share/classes/javax/management/InQueryExp.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/JMX.java b/jdk/src/share/classes/javax/management/JMX.java index d2bc522afa1..87c7dd227ce 100644 --- a/jdk/src/share/classes/javax/management/JMX.java +++ b/jdk/src/share/classes/javax/management/JMX.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,8 +26,18 @@ package javax.management; import com.sun.jmx.mbeanserver.Introspector; +import com.sun.jmx.mbeanserver.MBeanInjector; +import com.sun.jmx.remote.util.ClassLogger; +import java.beans.BeanInfo; +import java.beans.PropertyDescriptor; +import java.io.Serializable; import java.lang.reflect.InvocationHandler; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.lang.reflect.Proxy; +import java.util.Map; +import java.util.TreeMap; +import javax.management.openmbean.MXBeanMappingFactory; /** * Static methods from the JMX API. There are no instances of this class. @@ -39,6 +49,8 @@ public class JMX { * this class. */ static final JMX proof = new JMX(); + private static final ClassLogger logger = + new ClassLogger("javax.management.misc", "JMX"); private JMX() {} @@ -84,6 +96,14 @@ public class JMX { */ public static final String MXBEAN_FIELD = "mxbean"; + /** + * The name of the + * {@code + * mxbeanMappingFactoryClass} field. + */ + public static final String MXBEAN_MAPPING_FACTORY_CLASS_FIELD = + "mxbeanMappingFactoryClass"; + /** * The name of the {@code * openType} field. @@ -96,6 +116,265 @@ public class JMX { */ public static final String ORIGINAL_TYPE_FIELD = "originalType"; + /** + *

    Options to apply to an MBean proxy or to an instance of {@link + * StandardMBean}.

    + * + *

    For example, to specify a custom {@link MXBeanMappingFactory} + * for a {@code StandardMBean}, you might write this:

    + * + *
    +     * MXBeanMappingFactory factory = new MyMXBeanMappingFactory();
    +     * JMX.MBeanOptions opts = new JMX.MBeanOptions();
    +     * opts.setMXBeanMappingFactory(factory);
    +     * StandardMBean mbean = new StandardMBean(impl, intf, opts);
    +     * 
    + * + * @see javax.management.JMX.ProxyOptions + * @see javax.management.StandardMBean.Options + */ + public static class MBeanOptions implements Serializable, Cloneable { + private static final long serialVersionUID = -6380842449318177843L; + + static final MBeanOptions MXBEAN = new MBeanOptions(); + static { + MXBEAN.setMXBeanMappingFactory(MXBeanMappingFactory.DEFAULT); + } + + private MXBeanMappingFactory mappingFactory; + + /** + *

    Construct an {@code MBeanOptions} object where all options have + * their default values.

    + */ + public MBeanOptions() {} + + @Override + public MBeanOptions clone() { + try { + return (MBeanOptions) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(e); + } + } + + /** + *

    True if this is an MXBean proxy or a StandardMBean instance + * that is an MXBean. The default value is false.

    + * + *

    This method is equivalent to {@link #getMXBeanMappingFactory() + * this.getMXBeanMappingFactory()}{@code != null}.

    + * + * @return true if this is an MXBean proxy or a StandardMBean instance + * that is an MXBean. + */ + public boolean isMXBean() { + return (this.mappingFactory != null); + } + + /** + *

    The mappings between Java types and Open Types to be used in + * an MXBean proxy or a StandardMBean instance that is an MXBean, + * or null if this instance is not for an MXBean. + * The default value is null.

    + * + * @return the mappings to be used in this proxy or StandardMBean, + * or null if this instance is not for an MXBean. + */ + public MXBeanMappingFactory getMXBeanMappingFactory() { + return mappingFactory; + } + + /** + *

    Set the {@link #getMXBeanMappingFactory() MXBeanMappingFactory} to + * the given value. The value should be null if this instance is not + * for an MXBean. If this instance is for an MXBean, the value should + * usually be either a custom mapping factory, or + * {@link MXBeanMappingFactory#forInterface + * MXBeanMappingFactory.forInterface}{@code (mxbeanInterface)} + * which signifies + * that the {@linkplain MXBeanMappingFactory#DEFAULT default} mapping + * factory should be used unless an {@code @}{@link + * javax.management.openmbean.MXBeanMappingFactoryClass + * MXBeanMappingFactoryClass} annotation on {@code mxbeanInterface} + * specifies otherwise.

    + * + *

    Examples:

    + *
    +         * MBeanOptions opts = new MBeanOptions();
    +         * opts.setMXBeanMappingFactory(myMappingFactory);
    +         * MyMXBean proxy = JMX.newMBeanProxy(
    +         *         mbeanServerConnection, objectName, MyMXBean.class, opts);
    +         *
    +         * // ...or...
    +         *
    +         * MBeanOptions opts = new MBeanOptions();
    +         * MXBeanMappingFactory defaultFactoryForMyMXBean =
    +         *         MXBeanMappingFactory.forInterface(MyMXBean.class);
    +         * opts.setMXBeanMappingFactory(defaultFactoryForMyMXBean);
    +         * MyMXBean proxy = JMX.newMBeanProxy(
    +         *         mbeanServerConnection, objectName, MyMXBean.class, opts);
    +         * 
    + * + * @param f the new value. If null, this instance is not for an + * MXBean. + */ + public void setMXBeanMappingFactory(MXBeanMappingFactory f) { + this.mappingFactory = f; + } + + /* To maximise object sharing, classes in this package can replace + * a private MBeanOptions with no MXBeanMappingFactory with one + * of these shared instances. But they must be EXTREMELY careful + * never to give out the shared instances to user code, which could + * modify them. + */ + private static final MBeanOptions[] CANONICALS = { + new MBeanOptions(), MXBEAN, + }; + // Overridden in local subclasses: + MBeanOptions[] canonicals() { + return CANONICALS; + } + + // This is only used by the logic for canonical instances. + // Overridden in local subclasses: + boolean same(MBeanOptions opt) { + return (opt.mappingFactory == mappingFactory); + } + + final MBeanOptions canonical() { + for (MBeanOptions opt : canonicals()) { + if (opt.getClass() == this.getClass() && same(opt)) + return opt; + } + return this; + } + + final MBeanOptions uncanonical() { + for (MBeanOptions opt : canonicals()) { + if (this == opt) + return clone(); + } + return this; + } + + private Map toMap() { + Map map = new TreeMap(); + try { + BeanInfo bi = java.beans.Introspector.getBeanInfo(getClass()); + PropertyDescriptor[] pds = bi.getPropertyDescriptors(); + for (PropertyDescriptor pd : pds) { + String name = pd.getName(); + if (name.equals("class")) + continue; + Method get = pd.getReadMethod(); + if (get != null) + map.put(name, get.invoke(this)); + } + } catch (Exception e) { + Throwable t = e; + if (t instanceof InvocationTargetException) + t = t.getCause(); + map.put("Exception", t); + } + return map; + } + + @Override + public String toString() { + return getClass().getSimpleName() + toMap(); + // For example "MBeanOptions{MXBean=true, }". + } + + /** + *

    Indicates whether some other object is "equal to" this one. The + * result is true if and only if the other object is also an instance + * of MBeanOptions or a subclass, and has the same properties with + * the same values.

    + * @return {@inheritDoc} + */ + @Override + public boolean equals(Object obj) { + if (obj == this) + return true; + if (obj == null || obj.getClass() != this.getClass()) + return false; + return toMap().equals(((MBeanOptions) obj).toMap()); + } + + @Override + public int hashCode() { + return toMap().hashCode(); + } + } + + /** + *

    Options to apply to an MBean proxy.

    + * + * @see #newMBeanProxy + */ + public static class ProxyOptions extends MBeanOptions { + private static final long serialVersionUID = 7238804866098386559L; + + private boolean notificationEmitter; + + /** + *

    Construct a {@code ProxyOptions} object where all options have + * their default values.

    + */ + public ProxyOptions() {} + + @Override + public ProxyOptions clone() { + return (ProxyOptions) super.clone(); + } + + /** + *

    Defines whether the returned proxy should + * implement {@link NotificationEmitter}. The default value is false.

    + * + * @return true if this proxy will be a NotificationEmitter. + * + * @see JMX#newMBeanProxy(MBeanServerConnection, ObjectName, Class, + * MBeanOptions) + */ + public boolean isNotificationEmitter() { + return this.notificationEmitter; + } + + /** + *

    Set the {@link #isNotificationEmitter NotificationEmitter} option to + * the given value.

    + * @param emitter the new value. + */ + public void setNotificationEmitter(boolean emitter) { + this.notificationEmitter = emitter; + } + + // Canonical objects for each of (MXBean,!MXBean) x (Emitter,!Emitter) + private static final ProxyOptions[] CANONICALS = { + new ProxyOptions(), new ProxyOptions(), + new ProxyOptions(), new ProxyOptions(), + }; + static { + CANONICALS[1].setMXBeanMappingFactory(MXBeanMappingFactory.DEFAULT); + CANONICALS[2].setNotificationEmitter(true); + CANONICALS[3].setMXBeanMappingFactory(MXBeanMappingFactory.DEFAULT); + CANONICALS[3].setNotificationEmitter(true); + } + @Override + MBeanOptions[] canonicals() { + return CANONICALS; + } + + @Override + boolean same(MBeanOptions opt) { + return (super.same(opt) && opt instanceof ProxyOptions && + ((ProxyOptions) opt).notificationEmitter == notificationEmitter); + } + } + /** *

    Make a proxy for a Standard MBean in a local or remote * MBean Server.

    @@ -172,7 +451,7 @@ public class JMX { * *

    This method behaves the same as {@link * #newMBeanProxy(MBeanServerConnection, ObjectName, Class)}, but - * additionally, if {@code notificationBroadcaster} is {@code + * additionally, if {@code notificationEmitter} is {@code * true}, then the MBean is assumed to be a {@link * NotificationBroadcaster} or {@link NotificationEmitter} and the * returned proxy will implement {@link NotificationEmitter} as @@ -189,25 +468,21 @@ public class JMX { * {@code connection} to forward to. * @param interfaceClass the management interface that the MBean * exports, which will also be implemented by the returned proxy. - * @param notificationBroadcaster make the returned proxy + * @param notificationEmitter make the returned proxy * implement {@link NotificationEmitter} by forwarding its methods * via {@code connection}. - * * @param allows the compiler to know that if the {@code * interfaceClass} parameter is {@code MyMBean.class}, for * example, then the return type is {@code MyMBean}. - * * @return the new proxy instance. */ public static T newMBeanProxy(MBeanServerConnection connection, ObjectName objectName, Class interfaceClass, - boolean notificationBroadcaster) { - return MBeanServerInvocationHandler.newProxyInstance( - connection, - objectName, - interfaceClass, - notificationBroadcaster); + boolean notificationEmitter) { + ProxyOptions opts = new ProxyOptions(); + opts.setNotificationEmitter(notificationEmitter); + return newMBeanProxy(connection, objectName, interfaceClass, opts); } /** @@ -314,7 +589,7 @@ public class JMX { * *

    This method behaves the same as {@link * #newMXBeanProxy(MBeanServerConnection, ObjectName, Class)}, but - * additionally, if {@code notificationBroadcaster} is {@code + * additionally, if {@code notificationEmitter} is {@code * true}, then the MXBean is assumed to be a {@link * NotificationBroadcaster} or {@link NotificationEmitter} and the * returned proxy will implement {@link NotificationEmitter} as @@ -331,31 +606,105 @@ public class JMX { * {@code connection} to forward to. * @param interfaceClass the MXBean interface, * which will also be implemented by the returned proxy. - * @param notificationBroadcaster make the returned proxy + * @param notificationEmitter make the returned proxy * implement {@link NotificationEmitter} by forwarding its methods * via {@code connection}. - * * @param allows the compiler to know that if the {@code * interfaceClass} parameter is {@code MyMXBean.class}, for * example, then the return type is {@code MyMXBean}. - * * @return the new proxy instance. */ public static T newMXBeanProxy(MBeanServerConnection connection, ObjectName objectName, Class interfaceClass, - boolean notificationBroadcaster) { - // Check interface for MXBean compliance - // + boolean notificationEmitter) { + ProxyOptions opts = new ProxyOptions(); + MXBeanMappingFactory f = MXBeanMappingFactory.forInterface(interfaceClass); + opts.setMXBeanMappingFactory(f); + opts.setNotificationEmitter(notificationEmitter); + return newMBeanProxy(connection, objectName, interfaceClass, opts); + } + + /** + *

    Make a proxy for a Standard MBean or MXBean in a local or remote MBean + * Server that may also support the methods of {@link + * NotificationEmitter} and (for an MXBean) that may define custom MXBean + * type mappings.

    + * + *

    This method behaves the same as + * {@link #newMBeanProxy(MBeanServerConnection, ObjectName, Class)} or + * {@link #newMXBeanProxy(MBeanServerConnection, ObjectName, Class)}, + * according as {@code opts.isMXBean()} is respectively false or true; but + * with the following changes based on {@code opts}.

    + * + *
      + *
    • If {@code opts.isNotificationEmitter()} is {@code + * true}, then the MBean is assumed to be a {@link + * NotificationBroadcaster} or {@link NotificationEmitter} and the + * returned proxy will implement {@link NotificationEmitter} as + * well as {@code interfaceClass}. A call to {@link + * NotificationBroadcaster#addNotificationListener} on the proxy + * will result in a call to {@link + * MBeanServerConnection#addNotificationListener(ObjectName, + * NotificationListener, NotificationFilter, Object)}, and + * likewise for the other methods of {@link + * NotificationBroadcaster} and {@link NotificationEmitter}.
    • + * + *
    • If {@code opts.getMXBeanMappingFactory()} is not null, + * then the mappings it defines will be applied to convert between + * arbitrary Java types and Open Types.
    • + *
    + * + * @param connection the MBean server to forward to. + * @param objectName the name of the MBean within + * {@code connection} to forward to. + * @param interfaceClass the Standard MBean or MXBean interface, + * which will also be implemented by the returned proxy. + * @param opts the options to apply for this proxy. Can be null, + * in which case default options are applied. + * @param allows the compiler to know that if the {@code + * interfaceClass} parameter is {@code MyMXBean.class}, for + * example, then the return type is {@code MyMXBean}. + * @return the new proxy instance. + * + * @throws IllegalArgumentException if {@code interfaceClass} is not a + * valid MXBean interface. + */ + public static T newMBeanProxy(MBeanServerConnection connection, + ObjectName objectName, + Class interfaceClass, + MBeanOptions opts) { try { - Introspector.testComplianceMXBeanInterface(interfaceClass); + return newMBeanProxy2(connection, objectName, interfaceClass, opts); } catch (NotCompliantMBeanException e) { throw new IllegalArgumentException(e); } + } + + private static T newMBeanProxy2(MBeanServerConnection connection, + ObjectName objectName, + Class interfaceClass, + MBeanOptions opts) + throws NotCompliantMBeanException { + + if (opts == null) + opts = new MBeanOptions(); + + boolean notificationEmitter = opts instanceof ProxyOptions && + ((ProxyOptions) opts).isNotificationEmitter(); + + MXBeanMappingFactory mappingFactory = opts.getMXBeanMappingFactory(); + + if (mappingFactory != null) { + // Check interface for MXBean compliance + Introspector.testComplianceMXBeanInterface(interfaceClass, + mappingFactory); + } + InvocationHandler handler = new MBeanServerInvocationHandler( - connection, objectName, true); + connection, objectName, opts); final Class[] interfaces; - if (notificationBroadcaster) { + if (notificationEmitter) { interfaces = new Class[] {interfaceClass, NotificationEmitter.class}; } else @@ -392,4 +741,28 @@ public class JMX { // exactly the string "MXBean" since that would mean there // was no package name, which is pretty unlikely in practice. } + + /** + *

    Test if an MBean can emit notifications. An MBean can emit + * notifications if either it implements {@link NotificationBroadcaster} + * (perhaps through its child interface {@link NotificationEmitter}), or + * it uses resource + * injection to obtain an instance of {@link SendNotification} + * through which it can send notifications.

    + * + * @param mbean an MBean object. + * @return true if the given object is a valid MBean that can emit + * notifications; false if the object is a valid MBean but that + * cannot emit notifications. + * @throws NotCompliantMBeanException if the given object is not + * a valid MBean. + */ + public static boolean isNotificationSource(Object mbean) + throws NotCompliantMBeanException { + if (mbean instanceof NotificationBroadcaster) + return true; + Object resource = (mbean instanceof DynamicWrapperMBean) ? + ((DynamicWrapperMBean) mbean).getWrappedObject() : mbean; + return (MBeanInjector.injectsSendNotification(resource)); + } } diff --git a/jdk/src/share/classes/javax/management/MBean.java b/jdk/src/share/classes/javax/management/MBean.java new file mode 100644 index 00000000000..6837740334c --- /dev/null +++ b/jdk/src/share/classes/javax/management/MBean.java @@ -0,0 +1,68 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package javax.management; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + *

    Indicates that the annotated class is a Standard MBean. A Standard + * MBean class can be defined as in this example:

    + * + *
    + * {@code @MBean}
    + * public class Configuration {
    + *     {@link ManagedAttribute @ManagedAttribute}
    + *     public int getCacheSize() {...}
    + *     {@code @ManagedAttribute}
    + *     public void setCacheSize(int size);
    + *
    + *     {@code @ManagedAttribute}
    + *     public long getLastChangedTime();
    + *
    + *     {@link ManagedOperation @ManagedOperation}
    + *     public void save();
    + * }
    + * 
    + * + *

    The class must be public. Public methods within the class can be + * annotated with {@code @ManagedOperation} to indicate that they are + * MBean operations. Public getter and setter methods within the class + * can be annotated with {@code @ManagedAttribute} to indicate that they define + * MBean attributes.

    + * + *

    If the MBean is to be an MXBean rather than a Standard MBean, then + * the {@link MXBean @MXBean} annotation must be used instead of + * {@code @MBean}.

    + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +@Inherited +public @interface MBean { +} diff --git a/jdk/src/share/classes/javax/management/MBeanOperationInfo.java b/jdk/src/share/classes/javax/management/MBeanOperationInfo.java index 9bda3ed5319..5863e96ef39 100644 --- a/jdk/src/share/classes/javax/management/MBeanOperationInfo.java +++ b/jdk/src/share/classes/javax/management/MBeanOperationInfo.java @@ -46,25 +46,30 @@ public class MBeanOperationInfo extends MBeanFeatureInfo implements Cloneable { new MBeanOperationInfo[0]; /** - * Indicates that the operation is read-like, - * it basically returns information. + * Indicates that the operation is read-like: + * it returns information but does not change any state. + * @see Impact#INFO */ public static final int INFO = 0; /** - * Indicates that the operation is a write-like, - * and would modify the MBean in some way, typically by writing some value - * or changing a configuration. + * Indicates that the operation is write-like: it has an effect but does + * not return any information from the MBean. + * @see Impact#ACTION */ public static final int ACTION = 1; /** - * Indicates that the operation is both read-like and write-like. + * Indicates that the operation is both read-like and write-like: + * it has an effect, and it also returns information from the MBean. + * @see Impact#ACTION_INFO */ public static final int ACTION_INFO = 2; /** - * Indicates that the operation has an "unknown" nature. + * Indicates that the impact of the operation is unknown or cannot be + * expressed using one of the other values. + * @see Impact#UNKNOWN */ public static final int UNKNOWN = 3; @@ -120,8 +125,9 @@ public class MBeanOperationInfo extends MBeanFeatureInfo implements Cloneable { * describing the parameters(arguments) of the method. This may be * null with the same effect as a zero-length array. * @param type The type of the method's return value. - * @param impact The impact of the method, one of INFO, - * ACTION, ACTION_INFO, UNKNOWN. + * @param impact The impact of the method, one of + * {@link #INFO}, {@link #ACTION}, {@link #ACTION_INFO}, + * {@link #UNKNOWN}. */ public MBeanOperationInfo(String name, String description, @@ -140,8 +146,9 @@ public class MBeanOperationInfo extends MBeanFeatureInfo implements Cloneable { * describing the parameters(arguments) of the method. This may be * null with the same effect as a zero-length array. * @param type The type of the method's return value. - * @param impact The impact of the method, one of INFO, - * ACTION, ACTION_INFO, UNKNOWN. + * @param impact The impact of the method, one of + * {@link #INFO}, {@link #ACTION}, {@link #ACTION_INFO}, + * {@link #UNKNOWN}. * @param descriptor The descriptor for the operation. This may be null * which is equivalent to an empty descriptor. * @@ -319,9 +326,14 @@ public class MBeanOperationInfo extends MBeanFeatureInfo implements Cloneable { for (int i = 0; i < classes.length; i++) { Descriptor d = Introspector.descriptorForAnnotations(annots[i]); - final String pn = "p" + (i + 1); - params[i] = - new MBeanParameterInfo(pn, classes[i].getName(), "", d); + String description = Introspector.descriptionForParameter(annots[i]); + if (description == null) + description = ""; + String name = Introspector.nameForParameter(annots[i]); + if (name == null) + name = "p" + (i + 1); + params[i] = new MBeanParameterInfo( + name, classes[i].getName(), description, d); } return params; diff --git a/jdk/src/share/classes/javax/management/MBeanRegistration.java b/jdk/src/share/classes/javax/management/MBeanRegistration.java index fbdedc183b7..1ba1c0d827f 100644 --- a/jdk/src/share/classes/javax/management/MBeanRegistration.java +++ b/jdk/src/share/classes/javax/management/MBeanRegistration.java @@ -27,9 +27,101 @@ package javax.management; /** - * Can be implemented by an MBean in order to + *

    Can be implemented by an MBean in order to * carry out operations before and after being registered or unregistered from - * the MBean server. + * the MBean Server. An MBean can also implement this interface in order + * to get a reference to the MBean Server and/or its name within that + * MBean Server.

    + * + *

    Resource injection

    + * + *

    As an alternative to implementing {@code MBeanRegistration}, if all that + * is needed is the MBean Server or ObjectName then an MBean can use + * resource injection.

    + * + *

    If a field in the MBean object has type {@link ObjectName} and has + * the {@link javax.annotation.Resource @Resource} annotation, + * then the {@code ObjectName} under which the MBean is registered is + * assigned to that field during registration. Likewise, if a field has type + * {@link MBeanServer} and the @Resource annotation, then it will + * be set to the {@code MBeanServer} in which the MBean is registered.

    + * + *

    For example:

    + * + *
    + * public Configuration implements ConfigurationMBean {
    + *     @Resource
    + *     private volatile MBeanServer mbeanServer;
    + *     @Resource
    + *     private volatile ObjectName objectName;
    + *     ...
    + *     void unregisterSelf() throws Exception {
    + *         mbeanServer.unregisterMBean(objectName);
    + *     }
    + * }
    + * 
    + * + *

    Resource injection can also be used on fields of type + * {@link SendNotification} to simplify notification sending. Such a field + * will get a reference to an object of type {@code SendNotification} when + * the MBean is registered, and it can use this reference to send notifications. + * For example:

    + * + *
    + * public Configuration implements ConfigurationMBean {
    + *     @Resource
    + *     private volatile SendNotification sender;
    + *     ...
    + *     private void updated() {
    + *         Notification n = new Notification(...);
    + *         sender.sendNotification(n);
    + *     }
    + * }
    + * 
    + * + *

    A field to be injected must not be static. It is recommended that + * such fields be declared {@code volatile}.

    + * + *

    It is also possible to use the @Resource annotation on + * methods. Such a method must have a {@code void} return type and a single + * argument of the appropriate type, for example {@code ObjectName}.

    + * + *

    Any number of fields and methods may have the @Resource + * annotation. All fields and methods with type {@code ObjectName} + * (for example) will receive the same {@code ObjectName} value.

    + * + *

    Resource injection is available for all types of MBeans, not just + * Standard MBeans.

    + * + *

    If an MBean implements the {@link DynamicWrapperMBean} interface then + * resource injection happens on the object returned by that interface's + * {@link DynamicWrapperMBean#getWrappedObject() getWrappedObject()} method + * rather than on the MBean object itself. + * + *

    Resource injection happens after the {@link #preRegister preRegister} + * method is called (if any), and before the MBean is actually registered + * in the MBean Server. If a @Resource method throws + * an exception, the effect is the same as if {@code preRegister} had + * thrown the exception. In particular it will prevent the MBean from being + * registered.

    + * + *

    Resource injection can be used on a field or method where the type + * is a parent of the injected type, if the injected type is explicitly + * specified in the @Resource annotation. For example:

    + * + *
    + *     @Resource(type = MBeanServer.class)
    + *     private volatile MBeanServerConnection mbsc;
    + * 
    + * + *

    Formally, suppose R is the type in the @Resource + * annotation and T is the type of the method parameter or field. + * Then one of R and T must be a subtype of the other + * (or they must be the same type). Injection happens if this subtype + * is {@code MBeanServer}, {@code ObjectName}, or {@code SendNotification}. + * Otherwise the @Resource annotation is ignored.

    + * + *

    Resource injection in MBeans is new in version 2.0 of the JMX API.

    * * @since 1.5 */ @@ -38,12 +130,12 @@ public interface MBeanRegistration { /** * Allows the MBean to perform any operations it needs before - * being registered in the MBean server. If the name of the MBean + * being registered in the MBean Server. If the name of the MBean * is not specified, the MBean can provide a name for its * registration. If any exception is raised, the MBean will not be - * registered in the MBean server. + * registered in the MBean Server. * - * @param server The MBean server in which the MBean will be registered. + * @param server The MBean Server in which the MBean will be registered. * * @param name The object name of the MBean. This name is null if * the name parameter to one of the createMBean or @@ -57,7 +149,7 @@ public interface MBeanRegistration { * the returned value. * * @exception java.lang.Exception This exception will be caught by - * the MBean server and re-thrown as an {@link + * the MBean Server and re-thrown as an {@link * MBeanRegistrationException}. */ public ObjectName preRegister(MBeanServer server, diff --git a/jdk/src/share/classes/javax/management/MBeanServer.java b/jdk/src/share/classes/javax/management/MBeanServer.java index 728f71340ba..f0d4d16c46f 100644 --- a/jdk/src/share/classes/javax/management/MBeanServer.java +++ b/jdk/src/share/classes/javax/management/MBeanServer.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -61,7 +61,7 @@ import javax.management.loading.ClassLoaderRepository; * ObjectName is:
    * JMImplementation:type=MBeanServerDelegate.

    * - *

    An object obtained from the {@link + *

    An object obtained from the {@link * MBeanServerFactory#createMBeanServer(String) createMBeanServer} or * {@link MBeanServerFactory#newMBeanServer(String) newMBeanServer} * methods of the {@link MBeanServerFactory} class applies security @@ -661,13 +661,16 @@ public interface MBeanServer extends MBeanServerConnection { ReflectionException; /** - *

    Return the {@link java.lang.ClassLoader} that was used for - * loading the class of the named MBean.

    + *

    Return the {@link java.lang.ClassLoader} that was used for loading + * the class of the named MBean. If the MBean implements the {@link + * DynamicWrapperMBean} interface, then the returned value is the + * result of the {@link DynamicWrapperMBean#getWrappedClassLoader()} + * method.

    * * @param mbeanName The ObjectName of the MBean. * * @return The ClassLoader used for that MBean. If l - * is the MBean's actual ClassLoader, and r is the + * is the value specified by the rules above, and r is the * returned value, then either: * *
      diff --git a/jdk/src/share/classes/javax/management/MBeanServerConnection.java b/jdk/src/share/classes/javax/management/MBeanServerConnection.java index 852ab83d890..4047373c261 100644 --- a/jdk/src/share/classes/javax/management/MBeanServerConnection.java +++ b/jdk/src/share/classes/javax/management/MBeanServerConnection.java @@ -839,6 +839,12 @@ public interface MBeanServerConnection { * *

      Otherwise, the result is false.

      * + *

      If the MBean implements the {@link DynamicWrapperMBean} + * interface, then in the above rules X is the result of the MBean's {@link + * DynamicWrapperMBean#getWrappedObject() getWrappedObject()} method and L + * is the result of its {@link DynamicWrapperMBean#getWrappedClassLoader() + * getWrappedClassLoader()} method. + * * @param name The ObjectName of the MBean. * @param className The name of the class. * diff --git a/jdk/src/share/classes/javax/management/MBeanServerInvocationHandler.java b/jdk/src/share/classes/javax/management/MBeanServerInvocationHandler.java index fb5d4bd25e0..f111e577bf1 100644 --- a/jdk/src/share/classes/javax/management/MBeanServerInvocationHandler.java +++ b/jdk/src/share/classes/javax/management/MBeanServerInvocationHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,6 +33,9 @@ import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Arrays; import java.util.WeakHashMap; +import javax.management.openmbean.MXBeanMappingFactory; + +import static javax.management.JMX.MBeanOptions; /** *

      {@link InvocationHandler} that forwards methods in an MBean's @@ -111,7 +114,7 @@ public class MBeanServerInvocationHandler implements InvocationHandler { public MBeanServerInvocationHandler(MBeanServerConnection connection, ObjectName objectName) { - this(connection, objectName, false); + this(connection, objectName, null); } /** @@ -138,6 +141,14 @@ public class MBeanServerInvocationHandler implements InvocationHandler { public MBeanServerInvocationHandler(MBeanServerConnection connection, ObjectName objectName, boolean isMXBean) { + this(connection, objectName, isMXBean ? MBeanOptions.MXBEAN : null); + } + + public MBeanServerInvocationHandler(MBeanServerConnection connection, + ObjectName objectName, + MBeanOptions options) { + if (options == null) + options = new MBeanOptions(); if (connection == null) { throw new IllegalArgumentException("Null connection"); } @@ -146,7 +157,7 @@ public class MBeanServerInvocationHandler implements InvocationHandler { } this.connection = connection; this.objectName = objectName; - this.isMXBean = isMXBean; + this.options = options.canonical(); } /** @@ -182,7 +193,16 @@ public class MBeanServerInvocationHandler implements InvocationHandler { * @since 1.6 */ public boolean isMXBean() { - return isMXBean; + return options.isMXBean(); + } + + /** + *

      Return the {@link MBeanOptions} used for this proxy.

      + * + * @return the MBeanOptions. + */ + public MBeanOptions getMBeanOptions() { + return options.uncanonical(); } /** @@ -260,7 +280,7 @@ public class MBeanServerInvocationHandler implements InvocationHandler { return doLocally(proxy, method, args); try { - if (isMXBean) { + if (isMXBean()) { MXBeanProxy p = findMXBeanProxy(methodClass); return p.invoke(connection, objectName, method, args); } else { @@ -326,21 +346,34 @@ public class MBeanServerInvocationHandler implements InvocationHandler { */ } - private static MXBeanProxy findMXBeanProxy(Class mxbeanInterface) { + private MXBeanProxy findMXBeanProxy(Class mxbeanInterface) { + MXBeanMappingFactory mappingFactory = options.getMXBeanMappingFactory(); synchronized (mxbeanProxies) { - WeakReference proxyRef = - mxbeanProxies.get(mxbeanInterface); - MXBeanProxy p = (proxyRef == null) ? null : proxyRef.get(); - if (p == null) { - p = new MXBeanProxy(mxbeanInterface); - mxbeanProxies.put(mxbeanInterface, - new WeakReference(p)); + ClassToProxy classToProxy = mxbeanProxies.get(mappingFactory); + if (classToProxy == null) { + classToProxy = new ClassToProxy(); + mxbeanProxies.put(mappingFactory, classToProxy); } + WeakReference wr = classToProxy.get(mxbeanInterface); + MXBeanProxy p; + if (wr != null) { + p = wr.get(); + if (p != null) + return p; + } + p = new MXBeanProxy(mxbeanInterface, mappingFactory); + classToProxy.put(mxbeanInterface, new WeakReference(p)); return p; } } - private static final WeakHashMap, WeakReference> - mxbeanProxies = new WeakHashMap, WeakReference>(); + private static final WeakHashMap + mxbeanProxies = newWeakHashMap(); + private static class ClassToProxy + extends WeakHashMap, WeakReference> {} + + private static WeakHashMap newWeakHashMap() { + return new WeakHashMap(); + } private Object invokeBroadcasterMethod(Object proxy, Method method, Object[] args) throws Exception { @@ -453,7 +486,7 @@ public class MBeanServerInvocationHandler implements InvocationHandler { objectName.equals(handler.objectName) && proxy.getClass().equals(args[0].getClass()); } else if (methodName.equals("toString")) { - return (isMXBean ? "MX" : "M") + "BeanProxy(" + + return (isMXBean() ? "MX" : "M") + "BeanProxy(" + connection + "[" + objectName + "])"; } else if (methodName.equals("hashCode")) { return objectName.hashCode()+connection.hashCode(); @@ -484,5 +517,5 @@ public class MBeanServerInvocationHandler implements InvocationHandler { private final MBeanServerConnection connection; private final ObjectName objectName; - private final boolean isMXBean; + private final MBeanOptions options; } diff --git a/jdk/src/share/classes/javax/management/MXBean.java b/jdk/src/share/classes/javax/management/MXBean.java index 166ea57a3d4..a577fd94ff5 100644 --- a/jdk/src/share/classes/javax/management/MXBean.java +++ b/jdk/src/share/classes/javax/management/MXBean.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,6 +27,7 @@ package javax.management; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @@ -44,6 +45,10 @@ import javax.management.openmbean.CompositeDataInvocationHandler; import javax.management.openmbean.CompositeDataSupport; import javax.management.openmbean.CompositeDataView; import javax.management.openmbean.CompositeType; +import javax.management.openmbean.MXBeanMapping; +import javax.management.openmbean.MXBeanMappingClass; +import javax.management.openmbean.MXBeanMappingFactory; +import javax.management.openmbean.MXBeanMappingFactoryClass; import javax.management.openmbean.OpenDataException; import javax.management.openmbean.OpenMBeanInfo; import javax.management.openmbean.OpenType; @@ -53,11 +58,13 @@ import javax.management.openmbean.TabularDataSupport; import javax.management.openmbean.TabularType; /** -

      Annotation to mark an interface explicitly as being an MXBean - interface, or as not being an MXBean interface. By default, an +

      Annotation to mark a class or interface explicitly as being an MXBean, + or as not being an MXBean. By default, an interface is an MXBean interface if its name ends with {@code - MXBean}, as in {@code SomethingMXBean}. The following interfaces - are MXBean interfaces:

      + MXBean}, as in {@code SomethingMXBean}. A class is never an MXBean by + default.

      + +

      The following interfaces are MXBean interfaces:

           public interface WhatsitMXBean {}
      @@ -78,7 +85,12 @@ import javax.management.openmbean.TabularType;
           public interface MisleadingMXBean {}
           
      -

      MXBean specification

      +

      A class can be annotated with {@code @MXBean} to indicate that it + is an MXBean. In this case, its methods should have @{@link + ManagedAttribute} or @{@link ManagedOperation} + annotations, as described for @{@link MBean}.

      + +

      MXBean specification

      The MXBean concept provides a simple way to code an MBean that only references a predefined set of types, the ones defined @@ -314,7 +326,7 @@ public class MemoryPool -

      Definition of an MXBean

      +

      Definition of an MXBean

      An MXBean is a kind of MBean. An MXBean object can be registered directly in the MBean Server, or it can be used as an @@ -367,7 +379,7 @@ public class MemoryPool above rules will produce an exception.

      -

      Naming conventions

      +

      Naming conventions

      The same naming conventions are applied to the methods in an MXBean as in a Standard MBean:

      @@ -413,7 +425,7 @@ public class MemoryPool read-only or write-only respectively.

      -

      Type mapping rules

      +

      Type mapping rules

      An MXBean is a kind of Open MBean, as defined by the {@link javax.management.openmbean} package. This means that the types of @@ -475,7 +487,11 @@ public class MemoryPool from type opendata(J) to type J, a null value is mapped to a null value.

      -

      The following table summarizes the type mapping rules.

      +

      In addition to the default type mapping rules, you can specify + custom type mappings, as described below.

      + +

      The following table summarizes the default type mapping rules.

      @@ -658,7 +674,7 @@ TabularType tabularType = TabularData} that serializes as {@code TabularDataSupport}.

      -

      Mappings for MXBean interfaces

      +

      Mappings for MXBean interfaces

      An MXBean interface, or a type referenced within an MXBean interface, can reference another MXBean interface, J. @@ -747,7 +763,7 @@ public interface ModuleMXBean { general, notably because it does not work well for MBeans that are {@link NotificationBroadcaster}s.

      -

      Mappings for other types

      +

      Mappings for other types

      Given a Java class or interface J that does not match the other rules in the table above, the MXBean framework will attempt to map @@ -1035,6 +1051,76 @@ public interface Node { } +

      Alternatively, you can define a custom mapping for your recursive + type; see the next section.

      + +

      Custom MXBean type mappings

      + +

      You can augment or replace the default type mappings described + above with custom mappings. An example appears in the + documentation for {@link MXBeanMapping}.

      + +

      If an MXBean uses custom mappings, then an MXBean proxy for + that MXBean must use the same mappings for correct behavior. + This requires more careful synchronization between client and + server than is necessary with the default mappings. For example + it typically requires the client to have the same implementation + of any {@link MXBeanMapping} subclasses as the server. For this + reason, custom mappings should be avoided if possible.

      + +

      Every MXBean has an associated {@link MXBeanMappingFactory}. + Call this f. Then every type that appears + in that MXBean has an associated {@link MXBeanMapping} + determined by f. If the type is + J, say, then the mapping is {@link + MXBeanMappingFactory#mappingForType + f.mappingForType}(J, + f).

      + +

      The {@code MXBeanMappingFactory} f for an + MXBean is determined as follows.

      + +
        +
      • If an {@link JMX.MBeanOptions} argument is supplied to + the {@link StandardMBean} constructor that makes an MXBean, + or to the {@link JMX#newMXBeanProxy JMX.newMXBeanProxy} + method, and the {@code MBeanOptions} object defines a non-null + {@code MXBeanMappingFactory}, then that is the value of + f.

      • + +
      • Otherwise, if the MXBean interface has an {@link + MXBeanMappingFactoryClass} annotation, then that annotation + must identify a subclass of {@code MXBeanMappingFactory} + with a no-argument constructor. Then + f is the result of calling this + constructor. If the class does not have a no-argument + constructor, or if calling the constructor produces an + exception, then the MXBean is invalid and an attempt to + register it in the MBean Server will produce a {@link + NotCompliantMBeanException}.

        + +

        This annotation is not inherited from any parent + interfaces. If an MXBean interface has this annotation, + then usually any MXBean subinterfaces must repeat the same + annotation for correct behavior.

      • + +
      • Otherwise, if the package in which the MXBean interface + appears has an {@code MXBeanMappingFactoryClass} annotation, + then f is determined as if that + annotation appeared on the MXBean interface.

      • + +
      • Otherwise, f is the default mapping + factory, {@link MXBeanMappingFactory#DEFAULT}.

      • +
      + +

      The default mapping factory recognizes the {@link + MXBeanMappingClass} annotation on a class or interface. If + J is a class or interface that has such an + annotation, then the {@code MXBeanMapping} for + J produced by the default mapping factory + will be determined by the value of the annotation as described + in its {@linkplain MXBeanMappingClass documentation}.

      +

      MBeanInfo contents for an MXBean

      An MXBean is a type of Open MBean. However, for compatibility @@ -1091,7 +1177,7 @@ public interface Node { {@code mxbean} whose value is the string "{@code true}".

      -

      Type Names

      +

      Type Names

      Sometimes the unmapped type T of a method parameter or return value in an MXBean must be represented as a string. If @@ -1163,12 +1249,29 @@ public interface Node { appropriate), or C is true of e.{@link Throwable#getCause() getCause()}".

      + @see MXBeanMapping + @since 1.6 */ +/* + * This annotation is @Inherited because if an MXBean is defined as a + * class using annotations, then its subclasses are also MXBeans. + * For example: + * @MXBean + * public class Super { + * @ManagedAttribute + * public String getName() {...} + * } + * public class Sub extends Super {} + * Here Sub is an MXBean. + * + * The @Inherited annotation has no effect when applied to an interface. + */ @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) +@Inherited public @interface MXBean { /** True if the annotated interface is an MXBean interface. diff --git a/jdk/src/share/classes/javax/management/ManagedAttribute.java b/jdk/src/share/classes/javax/management/ManagedAttribute.java new file mode 100644 index 00000000000..a8a7299d6f9 --- /dev/null +++ b/jdk/src/share/classes/javax/management/ManagedAttribute.java @@ -0,0 +1,64 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package javax.management; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + *

      Indicates that a method in an MBean class defines an MBean attribute. + * This annotation must be applied to a public method of a public class + * that is itself annotated with an {@link MBean @MBean} or + * {@link MXBean @MXBean} annotation, or inherits such an annotation from + * a superclass.

      + * + *

      The annotated method must be a getter or setter. In other words, + * it must look like one of the following...

      + * + *
      + * T getFoo()
      + * void setFoo(T param)
      + * 
      + * + *

      ...where {@code T} is any type and {@code Foo} is the + * name of the attribute. For any attribute {@code Foo}, if only + * a {@code get}{@code Foo} method has a {@code ManagedAttribute} + * annotation, then {@code Foo} is a read-only attribute. If only + * a {@code set}{@code Foo} method has a {@code ManagedAttribute} + * annotation, then {@code Foo} is a write-only attribute. If + * both {@code get}{@code Foo} and {@code set}{@code Foo} + * methods have the annotation, then {@code Foo} is a read-write + * attribute. In this last case, the type {@code T} must be the + * same in both methods.

      + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +@Documented +public @interface ManagedAttribute { +} diff --git a/jdk/src/share/classes/javax/management/ManagedOperation.java b/jdk/src/share/classes/javax/management/ManagedOperation.java new file mode 100644 index 00000000000..fa01ac2bff6 --- /dev/null +++ b/jdk/src/share/classes/javax/management/ManagedOperation.java @@ -0,0 +1,67 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package javax.management; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + *

      Indicates that a method in an MBean class defines an MBean operation. + * This annotation can be applied to:

      + * + *
        + *
      • A public method of a public class + * that is itself annotated with an {@link MBean @MBean} or + * {@link MXBean @MXBean} annotation, or inherits such an annotation from + * a superclass.
      • + *
      • A method of an MBean or MXBean interface. + *
      + * + *

      Every method in an MBean or MXBean interface defines an MBean + * operation even without this annotation, but the annotation allows + * you to specify the impact of the operation:

      + * + *
      + * public interface ConfigurationMBean {
      + *     {@code @ManagedOperation}(impact = {@link Impact#ACTION Impact.ACTION})
      + *     public void save();
      + *     ...
      + * }
      + * 
      + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +@Documented +public @interface ManagedOperation { + /** + *

      The impact of this operation, as shown by + * {@link MBeanOperationInfo#getImpact()}. + */ + Impact impact() default Impact.UNKNOWN; +} diff --git a/jdk/src/share/classes/javax/management/MatchQueryExp.java b/jdk/src/share/classes/javax/management/MatchQueryExp.java index 779fac1989f..61ae29bac2b 100644 --- a/jdk/src/share/classes/javax/management/MatchQueryExp.java +++ b/jdk/src/share/classes/javax/management/MatchQueryExp.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -109,36 +109,7 @@ class MatchQueryExp extends QueryEval implements QueryExp { * Returns the string representing the object */ public String toString() { - return exp + " like " + new StringValueExp(likeTranslate(pattern)); - } - - private static String likeTranslate(String s) { - StringBuilder sb = new StringBuilder(); - int c; - for (int i = 0; i < s.length(); i += Character.charCount(c)) { - c = s.codePointAt(i); - switch (c) { - case '\\': - i += Character.charCount(c); - sb.append('\\'); - if (i < s.length()) { - c = s.codePointAt(i); - sb.appendCodePoint(c); - } - break; - case '*': - sb.append('%'); break; - case '?': - sb.append('_'); break; - case '%': - sb.append("\\%"); break; - case '_': - sb.append("\\_"); break; - default: - sb.appendCodePoint(c); break; - } - } - return sb.toString(); + return exp + " like " + new StringValueExp(pattern); } /* diff --git a/jdk/src/share/classes/javax/management/NotQueryExp.java b/jdk/src/share/classes/javax/management/NotQueryExp.java index 25bdd5d60d1..bb39fbc95f7 100644 --- a/jdk/src/share/classes/javax/management/NotQueryExp.java +++ b/jdk/src/share/classes/javax/management/NotQueryExp.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -91,6 +91,7 @@ class NotQueryExp extends QueryEval implements QueryExp { return "not (" + exp + ")"; } + @Override String toQueryString() { return "not (" + Query.toString(exp) + ")"; } diff --git a/jdk/src/share/classes/javax/management/NotificationBroadcasterSupport.java b/jdk/src/share/classes/javax/management/NotificationBroadcasterSupport.java index 65064ab900e..a358a7012a2 100644 --- a/jdk/src/share/classes/javax/management/NotificationBroadcasterSupport.java +++ b/jdk/src/share/classes/javax/management/NotificationBroadcasterSupport.java @@ -58,7 +58,8 @@ import com.sun.jmx.remote.util.ClassLogger; * * @since 1.5 */ -public class NotificationBroadcasterSupport implements NotificationEmitter { +public class NotificationBroadcasterSupport + implements NotificationEmitter, SendNotification { /** * Constructs a NotificationBroadcasterSupport where each listener is invoked by the * thread sending the notification. This constructor is equivalent to diff --git a/jdk/src/share/classes/javax/management/NotificationInfo.java b/jdk/src/share/classes/javax/management/NotificationInfo.java new file mode 100644 index 00000000000..a899346c06b --- /dev/null +++ b/jdk/src/share/classes/javax/management/NotificationInfo.java @@ -0,0 +1,117 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package javax.management; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + *

      Specifies the kinds of notification an MBean can emit. In both the + * following examples, the MBean emits notifications of type + * {@code "com.example.notifs.create"} and of type + * {@code "com.example.notifs.destroy"}:

      + * + *
      + * // Example one: a Standard MBean
      + * {@code @NotificationInfo}(types={"com.example.notifs.create",
      + *                          "com.example.notifs.destroy"})
      + * public interface CacheMBean {...}
      + *
      + * public class Cache implements CacheMBean {...}
      + * 
      + * + *
      + * // Example two: an annotated MBean
      + * {@link MBean @MBean}
      + * {@code @NotificationInfo}(types={"com.example.notifs.create",
      + *                          "com.example.notifs.destroy"})
      + * public class Cache {...}
      + * 
      + * + *

      Each {@code @NotificationInfo} produces an {@link + * MBeanNotificationInfo} inside the {@link MBeanInfo} of each MBean + * to which the annotation applies.

      + * + *

      If you need to specify different notification classes, or different + * descriptions for different notification types, then you can group + * several {@code @NotificationInfo} annotations into a containing + * {@link NotificationInfos @NotificationInfos} annotation. + * + *

      The {@code NotificationInfo} and {@code NotificationInfos} + * annotations can be applied to the MBean implementation class, or to + * any parent class or interface. These annotations on a class take + * precedence over annotations on any superclass or superinterface. + * If an MBean does not have these annotations on its class or any + * superclass, then superinterfaces are examined. It is an error for + * more than one superinterface to have these annotations, unless one + * of them is a child of all the others.

      + */ +@Documented +@Inherited +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface NotificationInfo { + /** + *

      The {@linkplain Notification#getType() notification types} + * that this MBean can emit.

      + */ + String[] types(); + + /** + *

      The class that emitted notifications will have. It is recommended + * that this be {@link Notification}, or one of its standard subclasses + * in the JMX API.

      + */ + Class notificationClass() default Notification.class; + + /** + *

      The description of this notification. For example: + * + *

      +     * {@code @NotificationInfo}(
      +     *         types={"com.example.notifs.create"},
      +     *         description={@code @Description}("object created"))
      +     * 
      + */ + Description description() default @Description(""); + + /** + *

      Additional descriptor fields for the derived {@code + * MBeanNotificationInfo}. They are specified in the same way as + * for the {@link DescriptorFields @DescriptorFields} annotation, + * for example:

      + *
      +     * {@code @NotificationInfo}(
      +     *         types={"com.example.notifs.create"},
      +     *         descriptorFields={"severity=6"})
      +     * 
      + */ + String[] descriptorFields() default {}; +} diff --git a/jdk/src/share/classes/javax/management/NotificationInfos.java b/jdk/src/share/classes/javax/management/NotificationInfos.java new file mode 100644 index 00000000000..9d7c497a78d --- /dev/null +++ b/jdk/src/share/classes/javax/management/NotificationInfos.java @@ -0,0 +1,72 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package javax.management; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import javax.management.remote.JMXConnectionNotification; + +/** + *

      Specifies the kinds of notification an MBean can emit, when this + * cannot be represented by a single {@link NotificationInfo + * @NotificationInfo} annotation.

      + * + *

      For example, this annotation specifies that an MBean can emit + * {@link AttributeChangeNotification} and {@link + * JMXConnectionNotification}:

      + * + *
      + * {@code @NotificationInfos}(
      + *     {@code @NotificationInfo}(
      + *         types = {{@link AttributeChangeNotification#ATTRIBUTE_CHANGE}},
      + *         notificationClass = AttributeChangeNotification.class),
      + *     {@code @NotificationInfo}(
      + *         types = {{@link JMXConnectionNotification#OPENED},
      + *                  {@link JMXConnectionNotification#CLOSED}},
      + *         notificationClass = JMXConnectionNotification.class)
      + * )
      + * 
      + * + *

      If an MBean has both {@code NotificationInfo} and {@code + * NotificationInfos} on the same class or interface, the effect is + * the same as if the {@code NotificationInfo} were moved inside the + * {@code NotificationInfos}.

      + */ +@Documented +@Inherited +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface NotificationInfos { + /** + *

      The {@link NotificationInfo} annotations.

      + */ + NotificationInfo[] value(); +} diff --git a/jdk/src/share/classes/javax/management/NumericValueExp.java b/jdk/src/share/classes/javax/management/NumericValueExp.java index a4e6d340b5d..5f373725168 100644 --- a/jdk/src/share/classes/javax/management/NumericValueExp.java +++ b/jdk/src/share/classes/javax/management/NumericValueExp.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/ObjectName.java b/jdk/src/share/classes/javax/management/ObjectName.java index 2844f70e695..b45e9406e2b 100644 --- a/jdk/src/share/classes/javax/management/ObjectName.java +++ b/jdk/src/share/classes/javax/management/ObjectName.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1781,7 +1781,7 @@ public class ObjectName implements Comparable, QueryExp { } String toQueryString() { - return "LIKE " + Query.value(toString()); + return "like " + Query.value(toString()); } /** diff --git a/jdk/src/share/classes/javax/management/OrQueryExp.java b/jdk/src/share/classes/javax/management/OrQueryExp.java index f2123b8afcf..4eca43f8a97 100644 --- a/jdk/src/share/classes/javax/management/OrQueryExp.java +++ b/jdk/src/share/classes/javax/management/OrQueryExp.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/QualifiedAttributeValueExp.java b/jdk/src/share/classes/javax/management/QualifiedAttributeValueExp.java index 3934d27084f..9ed8e6dccc5 100644 --- a/jdk/src/share/classes/javax/management/QualifiedAttributeValueExp.java +++ b/jdk/src/share/classes/javax/management/QualifiedAttributeValueExp.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/Query.java b/jdk/src/share/classes/javax/management/Query.java index fbfae6c2015..e3a140e7d97 100644 --- a/jdk/src/share/classes/javax/management/Query.java +++ b/jdk/src/share/classes/javax/management/Query.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -108,13 +108,13 @@ package javax.management; *
      Selects MBeans that have a {@code Status} attribute whose value * is one of those three strings. * - *
      {@code Message like 'OK: %'} + *
      {@code Message like 'OK: *'} *
      Selects MBeans that have a {@code Message} attribute whose value * is a string beginning with {@code "OK: "}. Notice that the - * wildcard characters are SQL's ones. In the query language, + * wildcard characters are not the ones that SQL uses. In SQL, * {@code %} means "any sequence of characters" and {@code _} - * means "any single character". In the rest of the JMX API, these - * correspond to {@code *} and {@code %} respectively. + * means "any single character". Here, as in the rest of the JMX API, + * those are represented by {@code *} and {@code ?} respectively. * *
      {@code instanceof 'javax.management.NotificationBroadcaster'} *
      Selects MBeans that are instances of @@ -319,11 +319,11 @@ package javax.management; * *
      value LIKE stringLiteral * {@link Query#match Query.match}(q(value), - * translateWildcards(q(stringLiteral))) + * q(stringLiteral)) * *
      value NOT LIKE stringLiteral * {@link Query#not Query.not}({@link Query#match Query.match}(q(value), - * translateWildcards(q(stringLiteral)))) + * q(stringLiteral))) * *
      value1 + value2 * {@link Query#plus Query.plus}(q(value1), q(value2)) @@ -360,13 +360,6 @@ package javax.management; * -->floatingPointLiteral)) *
      * - *

      Here, translateWildcards is a function - * that translates from the SQL notation for wildcards, using {@code %} and - * {@code _}, to the JMX API notation, using {@code *} and {@code ?}. If the - * LIKE string already contains {@code *} or {@code ?}, these characters - * have their literal meanings, and will be quoted in the call to - * {@link Query#match Query.match}.

      - * * @since 1.5 */ public class Query extends Object { diff --git a/jdk/src/share/classes/javax/management/QueryEval.java b/jdk/src/share/classes/javax/management/QueryEval.java index 68e1a1e4893..ee781ab0c33 100644 --- a/jdk/src/share/classes/javax/management/QueryEval.java +++ b/jdk/src/share/classes/javax/management/QueryEval.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/QueryExp.java b/jdk/src/share/classes/javax/management/QueryExp.java index 217db104249..d44a5d9167f 100644 --- a/jdk/src/share/classes/javax/management/QueryExp.java +++ b/jdk/src/share/classes/javax/management/QueryExp.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/QueryNotificationFilter.java b/jdk/src/share/classes/javax/management/QueryNotificationFilter.java index c6c10393902..42451088f2e 100644 --- a/jdk/src/share/classes/javax/management/QueryNotificationFilter.java +++ b/jdk/src/share/classes/javax/management/QueryNotificationFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -43,12 +43,6 @@ import java.util.Set; * on both the client and the server in the remote case, so using this class * instead is recommended where possible.

      * - * - * *

      This class uses the {@linkplain Query Query API} to specify the * filtering logic. For example, to select only notifications where the * {@linkplain Notification#getType() type} is {@code "com.example.mytype"}, diff --git a/jdk/src/share/classes/javax/management/QueryParser.java b/jdk/src/share/classes/javax/management/QueryParser.java index 5e24e3bfbd3..babf05c7a20 100644 --- a/jdk/src/share/classes/javax/management/QueryParser.java +++ b/jdk/src/share/classes/javax/management/QueryParser.java @@ -490,8 +490,7 @@ class QueryParser { } AttributeValueExp alhs = (AttributeValueExp) lhs; StringValueExp sve = stringvalue(); - String s = sve.getValue(); - q = Query.match(alhs, patternValueExp(s)); + q = Query.match(alhs, sve); break; } @@ -624,40 +623,4 @@ class QueryParser { throw new IllegalArgumentException("Expected string: " + t); return Query.value(t.string); } - - // Convert the SQL pattern syntax, using % and _, to the Query.match - // syntax, using * and ?. The tricky part is recognizing \% and - // \_ as literal values, and also not replacing them inside []. - // But Query.match does not recognize \ inside [], which makes our - // job a tad easier. - private StringValueExp patternValueExp(String s) { - int c; - for (int i = 0; i < s.length(); i += Character.charCount(c)) { - c = s.codePointAt(i); - switch (c) { - case '\\': - i++; // i += Character.charCount(c), but we know it's 1! - if (i >= s.length()) - throw new IllegalArgumentException("\\ at end of pattern"); - break; - case '[': - i = s.indexOf(']', i); - if (i < 0) - throw new IllegalArgumentException("[ without ]"); - break; - case '%': - s = s.substring(0, i) + "*" + s.substring(i + 1); - break; - case '_': - s = s.substring(0, i) + "?" + s.substring(i + 1); - break; - case '*': - case '?': - s = s.substring(0, i) + '\\' + (char) c + s.substring(i + 1); - i++; - break; - } - } - return Query.value(s); - } } diff --git a/jdk/src/share/classes/javax/management/SendNotification.java b/jdk/src/share/classes/javax/management/SendNotification.java new file mode 100644 index 00000000000..e2875d4f121 --- /dev/null +++ b/jdk/src/share/classes/javax/management/SendNotification.java @@ -0,0 +1,38 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package javax.management; + +/** + * Interface implemented by objects that can be asked to send a notification. + */ +public interface SendNotification { + /** + * Sends a notification. + * + * @param notification The notification to send. + */ + public void sendNotification(Notification notification); +} diff --git a/jdk/src/share/classes/javax/management/StandardEmitterMBean.java b/jdk/src/share/classes/javax/management/StandardEmitterMBean.java index 6f2a9b57f82..c3faec374eb 100644 --- a/jdk/src/share/classes/javax/management/StandardEmitterMBean.java +++ b/jdk/src/share/classes/javax/management/StandardEmitterMBean.java @@ -25,6 +25,9 @@ package javax.management; +import com.sun.jmx.mbeanserver.MBeanInjector; +import static javax.management.JMX.MBeanOptions; + /** *

      An MBean whose management interface is determined by reflection * on a Java interface, and that emits notifications.

      @@ -62,7 +65,7 @@ package javax.management; * @since 1.6 */ public class StandardEmitterMBean extends StandardMBean - implements NotificationEmitter { + implements NotificationEmitter, SendNotification { private final NotificationEmitter emitter; private final MBeanNotificationInfo[] notificationInfo; @@ -76,9 +79,10 @@ public class StandardEmitterMBean extends StandardMBean * for {@code implementation} and {@code emitter} to be the same object.

      * *

      If {@code emitter} is an instance of {@code - * NotificationBroadcasterSupport} then the MBean's {@link #sendNotification + * SendNotification} (for example, a {@link NotificationBroadcasterSupport}), + * then the MBean's {@link #sendNotification * sendNotification} method will call {@code emitter.}{@link - * NotificationBroadcasterSupport#sendNotification sendNotification}.

      + * SendNotification#sendNotification sendNotification}.

      * *

      The array returned by {@link #getNotificationInfo()} on the * new MBean is a copy of the array returned by @@ -90,20 +94,18 @@ public class StandardEmitterMBean extends StandardMBean * * @param implementation the implementation of the MBean interface. * @param mbeanInterface a Standard MBean interface. - * @param emitter the object that will handle notifications. + * @param emitter the object that will handle notifications. If null, + * a new {@code NotificationEmitter} will be constructed that also + * implements {@link SendNotification}. * * @throws IllegalArgumentException if the {@code mbeanInterface} * does not follow JMX design patterns for Management Interfaces, or * if the given {@code implementation} does not implement the - * specified interface, or if {@code emitter} is null. + * specified interface. */ public StandardEmitterMBean(T implementation, Class mbeanInterface, NotificationEmitter emitter) { - super(implementation, mbeanInterface, false); - if (emitter == null) - throw new IllegalArgumentException("Null emitter"); - this.emitter = emitter; - this.notificationInfo = emitter.getNotificationInfo(); + this(implementation, mbeanInterface, false, emitter); } /** @@ -118,9 +120,10 @@ public class StandardEmitterMBean extends StandardMBean * same object.

      * *

      If {@code emitter} is an instance of {@code - * NotificationBroadcasterSupport} then the MBean's {@link #sendNotification + * SendNotification} (for example, a {@link NotificationBroadcasterSupport}), + * then the MBean's {@link #sendNotification * sendNotification} method will call {@code emitter.}{@link - * NotificationBroadcasterSupport#sendNotification sendNotification}.

      + * SendNotification#sendNotification sendNotification}.

      * *

      The array returned by {@link #getNotificationInfo()} on the * new MBean is a copy of the array returned by @@ -134,21 +137,69 @@ public class StandardEmitterMBean extends StandardMBean * @param mbeanInterface a Standard MBean interface. * @param isMXBean If true, the {@code mbeanInterface} parameter * names an MXBean interface and the resultant MBean is an MXBean. - * @param emitter the object that will handle notifications. + * @param emitter the object that will handle notifications. If null, + * a new {@code NotificationEmitter} will be constructed that also + * implements {@link SendNotification}. * * @throws IllegalArgumentException if the {@code mbeanInterface} * does not follow JMX design patterns for Management Interfaces, or * if the given {@code implementation} does not implement the - * specified interface, or if {@code emitter} is null. + * specified interface. */ public StandardEmitterMBean(T implementation, Class mbeanInterface, boolean isMXBean, NotificationEmitter emitter) { - super(implementation, mbeanInterface, isMXBean); + this(implementation, mbeanInterface, + isMXBean ? MBeanOptions.MXBEAN : null, emitter); + } + + /** + *

      Make an MBean whose management interface is specified by {@code + * mbeanInterface}, with the given implementation and options, and where + * notifications are handled by the given {@code NotificationEmitter}. + * Options select whether to make a Standard MBean or an MXBean, and + * whether the result of {@link #getWrappedObject()} is the {@code + * StandardEmitterMBean} object or the given implementation. The resultant + * MBean implements the {@code NotificationEmitter} interface by forwarding + * its methods to {@code emitter}. It is legal and useful for {@code + * implementation} and {@code emitter} to be the same object.

      + * + *

      If {@code emitter} is an instance of {@code + * SendNotification} (for example, a {@link NotificationBroadcasterSupport}), + * then the MBean's {@link #sendNotification + * sendNotification} method will call {@code emitter.}{@link + * SendNotification#sendNotification sendNotification}.

      + * + *

      The array returned by {@link #getNotificationInfo()} on the + * new MBean is a copy of the array returned by + * {@code emitter.}{@link NotificationBroadcaster#getNotificationInfo + * getNotificationInfo()} at the time of construction. If the array + * returned by {@code emitter.getNotificationInfo()} later changes, + * that will have no effect on this object's + * {@code getNotificationInfo()}.

      + * + * @param implementation the implementation of the MBean interface. + * @param mbeanInterface a Standard MBean interface. + * @param options MBeanOptions that control the operation of the resulting + * MBean. + * @param emitter the object that will handle notifications. If null, + * a new {@code NotificationEmitter} will be constructed that also + * implements {@link SendNotification}. + * + * @throws IllegalArgumentException if the {@code mbeanInterface} + * does not follow JMX design patterns for Management Interfaces, or + * if the given {@code implementation} does not implement the + * specified interface. + */ + public StandardEmitterMBean(T implementation, Class mbeanInterface, + MBeanOptions options, + NotificationEmitter emitter) { + super(implementation, mbeanInterface, options); if (emitter == null) - throw new IllegalArgumentException("Null emitter"); + emitter = defaultEmitter(); this.emitter = emitter; this.notificationInfo = emitter.getNotificationInfo(); + injectEmitter(); } /** @@ -159,9 +210,10 @@ public class StandardEmitterMBean extends StandardMBean * by forwarding its methods to {@code emitter}.

      * *

      If {@code emitter} is an instance of {@code - * NotificationBroadcasterSupport} then the MBean's {@link #sendNotification + * SendNotification} (for example, a {@link NotificationBroadcasterSupport}), + * then the MBean's {@link #sendNotification * sendNotification} method will call {@code emitter.}{@link - * NotificationBroadcasterSupport#sendNotification sendNotification}.

      + * SendNotification#sendNotification sendNotification}.

      * *

      The array returned by {@link #getNotificationInfo()} on the * new MBean is a copy of the array returned by @@ -175,20 +227,17 @@ public class StandardEmitterMBean extends StandardMBean * the given {@code mbeanInterface}.

      * * @param mbeanInterface a StandardMBean interface. - * @param emitter the object that will handle notifications. + * @param emitter the object that will handle notifications. If null, + * a new {@code NotificationEmitter} will be constructed that also + * implements {@link SendNotification}. * * @throws IllegalArgumentException if the {@code mbeanInterface} * does not follow JMX design patterns for Management Interfaces, or - * if {@code this} does not implement the specified interface, or - * if {@code emitter} is null. + * if {@code this} does not implement the specified interface. */ protected StandardEmitterMBean(Class mbeanInterface, NotificationEmitter emitter) { - super(mbeanInterface, false); - if (emitter == null) - throw new IllegalArgumentException("Null emitter"); - this.emitter = emitter; - this.notificationInfo = emitter.getNotificationInfo(); + this(mbeanInterface, false, emitter); } /** @@ -200,9 +249,10 @@ public class StandardEmitterMBean extends StandardMBean * forwarding its methods to {@code emitter}.

      * *

      If {@code emitter} is an instance of {@code - * NotificationBroadcasterSupport} then the MBean's {@link #sendNotification + * SendNotification} (for example, a {@link NotificationBroadcasterSupport}), + * then the MBean's {@link #sendNotification * sendNotification} method will call {@code emitter.}{@link - * NotificationBroadcasterSupport#sendNotification sendNotification}.

      + * SendNotification#sendNotification sendNotification}.

      * *

      The array returned by {@link #getNotificationInfo()} on the * new MBean is a copy of the array returned by @@ -218,20 +268,86 @@ public class StandardEmitterMBean extends StandardMBean * @param mbeanInterface a StandardMBean interface. * @param isMXBean If true, the {@code mbeanInterface} parameter * names an MXBean interface and the resultant MBean is an MXBean. - * @param emitter the object that will handle notifications. + * @param emitter the object that will handle notifications. If null, + * a new {@code NotificationEmitter} will be constructed that also + * implements {@link SendNotification}. * * @throws IllegalArgumentException if the {@code mbeanInterface} * does not follow JMX design patterns for Management Interfaces, or - * if {@code this} does not implement the specified interface, or - * if {@code emitter} is null. + * if {@code this} does not implement the specified interface. */ protected StandardEmitterMBean(Class mbeanInterface, boolean isMXBean, NotificationEmitter emitter) { - super(mbeanInterface, isMXBean); + this(mbeanInterface, isMXBean ? MBeanOptions.MXBEAN : null, emitter); + } + + /** + *

      Make an MBean whose management interface is specified by {@code + * mbeanInterface}, with the given options, and where notifications are + * handled by the given {@code NotificationEmitter}. This constructor can + * be used to make either Standard MBeans or MXBeans. The resultant MBean + * implements the {@code NotificationEmitter} interface by forwarding its + * methods to {@code emitter}.

      + * + *

      If {@code emitter} is an instance of {@code + * SendNotification} (for example, a {@link NotificationBroadcasterSupport}), + * then the MBean's {@link #sendNotification + * sendNotification} method will call {@code emitter.}{@link + * SendNotification#sendNotification sendNotification}.

      + * + *

      The array returned by {@link #getNotificationInfo()} on the + * new MBean is a copy of the array returned by + * {@code emitter.}{@link NotificationBroadcaster#getNotificationInfo + * getNotificationInfo()} at the time of construction. If the array + * returned by {@code emitter.getNotificationInfo()} later changes, + * that will have no effect on this object's + * {@code getNotificationInfo()}.

      + * + *

      This constructor must be called from a subclass that implements + * the given {@code mbeanInterface}.

      + * + * @param mbeanInterface a StandardMBean interface. + * @param options MBeanOptions that control the operation of the resulting + * MBean. + * @param emitter the object that will handle notifications. If null, + * a new {@code NotificationEmitter} will be constructed that also + * implements {@link SendNotification}. + * + * @throws IllegalArgumentException if the {@code mbeanInterface} + * does not follow JMX design patterns for Management Interfaces, or + * if {@code this} does not implement the specified interface. + */ + protected StandardEmitterMBean(Class mbeanInterface, MBeanOptions options, + NotificationEmitter emitter) { + super(mbeanInterface, options); if (emitter == null) - throw new IllegalArgumentException("Null emitter"); + emitter = defaultEmitter(); this.emitter = emitter; this.notificationInfo = emitter.getNotificationInfo(); + injectEmitter(); + } + + private NotificationEmitter defaultEmitter() { + MBeanNotificationInfo[] mbnis = getNotificationInfo(); + // Will be null unless getNotificationInfo() is overridden, + // since the notificationInfo field has not been set at this point. + if (mbnis == null) + mbnis = getMBeanInfo().getNotifications(); + return new NotificationBroadcasterSupport(mbnis); + } + + private void injectEmitter() { + if (emitter instanceof SendNotification) { + try { + Object resource = getImplementation(); + SendNotification send = (SendNotification) emitter; + MBeanInjector.injectSendNotification(resource, send); + } catch (RuntimeException e) { + throw e; + } catch (Exception e) { + throw new IllegalArgumentException(e); + } + } } public void removeNotificationListener(NotificationListener listener) @@ -259,10 +375,10 @@ public class StandardEmitterMBean extends StandardMBean /** *

      Sends a notification.

      * - *

      If the {@code emitter} parameter to the constructor was an - * instance of {@code NotificationBroadcasterSupport} then this - * method will call {@code emitter.}{@link - * NotificationBroadcasterSupport#sendNotification + *

      If the {@code emitter} parameter to the constructor was + * an instance of {@link SendNotification}, such as {@link + * NotificationBroadcasterSupport}, then this method will call {@code + * emitter.}{@link SendNotification#sendNotification * sendNotification}.

      * * @param n the notification to send. @@ -271,13 +387,12 @@ public class StandardEmitterMBean extends StandardMBean * constructor was not a {@code NotificationBroadcasterSupport}. */ public void sendNotification(Notification n) { - if (emitter instanceof NotificationBroadcasterSupport) - ((NotificationBroadcasterSupport) emitter).sendNotification(n); + if (emitter instanceof SendNotification) + ((SendNotification) emitter).sendNotification(n); else { final String msg = "Cannot sendNotification when emitter is not an " + - "instance of NotificationBroadcasterSupport: " + - emitter.getClass().getName(); + "instance of SendNotification: " + emitter.getClass().getName(); throw new ClassCastException(msg); } } @@ -292,6 +407,7 @@ public class StandardEmitterMBean extends StandardMBean * @param info The default MBeanInfo derived by reflection. * @return the MBeanNotificationInfo[] for the new MBeanInfo. */ + @Override MBeanNotificationInfo[] getNotifications(MBeanInfo info) { return getNotificationInfo(); } diff --git a/jdk/src/share/classes/javax/management/StandardMBean.java b/jdk/src/share/classes/javax/management/StandardMBean.java index fa722cb8d34..a779e8282bb 100644 --- a/jdk/src/share/classes/javax/management/StandardMBean.java +++ b/jdk/src/share/classes/javax/management/StandardMBean.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,22 +25,20 @@ package javax.management; -import static com.sun.jmx.defaults.JmxProperties.MISC_LOGGER; import com.sun.jmx.mbeanserver.DescriptorCache; import com.sun.jmx.mbeanserver.Introspector; +import com.sun.jmx.mbeanserver.MBeanInjector; import com.sun.jmx.mbeanserver.MBeanSupport; import com.sun.jmx.mbeanserver.MXBeanSupport; import com.sun.jmx.mbeanserver.StandardMBeanSupport; import com.sun.jmx.mbeanserver.Util; - -import java.io.PrintWriter; -import java.io.StringWriter; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.HashMap; import java.util.Map; import java.util.WeakHashMap; import java.util.logging.Level; +import javax.management.openmbean.MXBeanMappingFactory; import javax.management.openmbean.OpenMBeanAttributeInfo; import javax.management.openmbean.OpenMBeanAttributeInfoSupport; import javax.management.openmbean.OpenMBeanConstructorInfo; @@ -50,6 +48,9 @@ import javax.management.openmbean.OpenMBeanOperationInfoSupport; import javax.management.openmbean.OpenMBeanParameterInfo; import javax.management.openmbean.OpenMBeanParameterInfoSupport; +import static com.sun.jmx.defaults.JmxProperties.MISC_LOGGER; +import static javax.management.JMX.MBeanOptions; + /** *

      An MBean whose management interface is determined by reflection * on a Java interface.

      @@ -125,7 +126,78 @@ import javax.management.openmbean.OpenMBeanParameterInfoSupport; * * @since 1.5 */ -public class StandardMBean implements DynamicMBean, MBeanRegistration { +public class StandardMBean implements DynamicWrapperMBean, MBeanRegistration { + + /** + *

      Options controlling the behavior of {@code StandardMBean} instances.

      + */ + public static class Options extends JMX.MBeanOptions { + private static final long serialVersionUID = 5107355471177517164L; + + private boolean wrappedVisible; + + /** + *

      Construct an {@code Options} object where all options have + * their default values.

      + */ + public Options() {} + + @Override + public Options clone() { + return (Options) super.clone(); + } + + /** + *

      Defines whether the {@link StandardMBean#getWrappedObject() + * getWrappedObject} method returns the wrapped object.

      + * + *

      If this option is true, then {@code getWrappedObject()} will return + * the same object as {@link StandardMBean#getImplementation() + * getImplementation}. Otherwise, it will return the + * StandardMBean instance itself. The setting of this option + * affects the behavior of {@link MBeanServer#getClassLoaderFor + * MBeanServer.getClassLoaderFor} and {@link MBeanServer#isInstanceOf + * MBeanServer.isInstanceOf}. The default value is false for + * compatibility reasons, but true is a better value for most new code.

      + * + * @return true if this StandardMBean's {@link + * StandardMBean#getWrappedObject getWrappedObject} returns the wrapped + * object. + */ + public boolean isWrappedObjectVisible() { + return this.wrappedVisible; + } + + /** + *

      Set the {@link #isWrappedObjectVisible WrappedObjectVisible} option + * to the given value.

      + * @param visible the new value. + */ + public void setWrappedObjectVisible(boolean visible) { + this.wrappedVisible = visible; + } + + // Canonical objects for each of (MXBean,!MXBean) x (WVisible,!WVisible) + private static final Options[] CANONICALS = { + new Options(), new Options(), new Options(), new Options(), + }; + static { + CANONICALS[1].setMXBeanMappingFactory(MXBeanMappingFactory.DEFAULT); + CANONICALS[2].setWrappedObjectVisible(true); + CANONICALS[3].setMXBeanMappingFactory(MXBeanMappingFactory.DEFAULT); + CANONICALS[3].setWrappedObjectVisible(true); + } + @Override + MBeanOptions[] canonicals() { + return CANONICALS; + } + + @Override + boolean same(MBeanOptions opts) { + return (super.same(opts) && opts instanceof Options && + ((Options) opts).wrappedVisible == wrappedVisible); + } + } private final static DescriptorCache descriptors = DescriptorCache.getInstance(JMX.proof); @@ -140,6 +212,11 @@ public class StandardMBean implements DynamicMBean, MBeanRegistration { **/ private volatile MBeanInfo cachedMBeanInfo; + /** + * The MBeanOptions for this StandardMBean. + **/ + private MBeanOptions options; + /** * Make a DynamicMBean out of implementation, using the * specified mbeanInterface class. @@ -155,12 +232,14 @@ public class StandardMBean implements DynamicMBean, MBeanRegistration { * implementation is allowed. If null implementation is allowed, * and a null implementation is passed, then the implementation * is assumed to be this. + * @param options MBeanOptions to apply to this instance. * @exception IllegalArgumentException if the given * implementation is null, and null is not allowed. **/ + @SuppressWarnings("unchecked") // cast to T private void construct(T implementation, Class mbeanInterface, boolean nullImplementationAllowed, - boolean isMXBean) + MBeanOptions options) throws NotCompliantMBeanException { if (implementation == null) { // Have to use (T)this rather than mbeanInterface.cast(this) @@ -169,20 +248,23 @@ public class StandardMBean implements DynamicMBean, MBeanRegistration { implementation = Util.cast(this); else throw new IllegalArgumentException("implementation is null"); } - if (isMXBean) { - if (mbeanInterface == null) { - mbeanInterface = Util.cast(Introspector.getMXBeanInterface( - implementation.getClass())); - } - this.mbean = new MXBeanSupport(implementation, mbeanInterface); + if (options == null) + options = new MBeanOptions(); + MXBeanMappingFactory mappingFactory = options.getMXBeanMappingFactory(); + boolean mx = (mappingFactory != null); + if (mbeanInterface == null) { + mbeanInterface = Util.cast(Introspector.getStandardOrMXBeanInterface( + implementation.getClass(), mx)); + } + if (mx) { + this.mbean = + new MXBeanSupport(implementation, mbeanInterface, + mappingFactory); } else { - if (mbeanInterface == null) { - mbeanInterface = Util.cast(Introspector.getStandardMBeanInterface( - implementation.getClass())); - } this.mbean = new StandardMBeanSupport(implementation, mbeanInterface); } + this.options = options.canonical(); } /** @@ -211,14 +293,14 @@ public class StandardMBean implements DynamicMBean, MBeanRegistration { **/ public StandardMBean(T implementation, Class mbeanInterface) throws NotCompliantMBeanException { - construct(implementation, mbeanInterface, false, false); + construct(implementation, mbeanInterface, false, null); } /** *

      Make a DynamicMBean out of this, using the specified * mbeanInterface class.

      * - *

      Call {@link #StandardMBean(java.lang.Object, java.lang.Class) + *

      Calls {@link #StandardMBean(java.lang.Object, java.lang.Class) * this(this,mbeanInterface)}. * This constructor is reserved to subclasses.

      * @@ -231,13 +313,14 @@ public class StandardMBean implements DynamicMBean, MBeanRegistration { **/ protected StandardMBean(Class mbeanInterface) throws NotCompliantMBeanException { - construct(null, mbeanInterface, true, false); + construct(null, mbeanInterface, true, null); } /** *

      Make a DynamicMBean out of the object * implementation, using the specified - * mbeanInterface class. This constructor can be used + * mbeanInterface class, and choosing whether the + * resultant MBean is an MXBean. This constructor can be used * to make either Standard MBeans or MXBeans. Unlike the * constructor {@link #StandardMBean(Object, Class)}, it * does not throw NotCompliantMBeanException.

      @@ -267,7 +350,17 @@ public class StandardMBean implements DynamicMBean, MBeanRegistration { public StandardMBean(T implementation, Class mbeanInterface, boolean isMXBean) { try { - construct(implementation, mbeanInterface, false, isMXBean); + MBeanOptions opts = new MBeanOptions(); + if (mbeanInterface == null) { + mbeanInterface = Util.cast(Introspector.getStandardOrMXBeanInterface( + implementation.getClass(), isMXBean)); + } + if (isMXBean) { + MXBeanMappingFactory f = MXBeanMappingFactory.forInterface( + mbeanInterface); + opts.setMXBeanMappingFactory(f); + } + construct(implementation, mbeanInterface, false, opts); } catch (NotCompliantMBeanException e) { throw new IllegalArgumentException(e); } @@ -275,12 +368,13 @@ public class StandardMBean implements DynamicMBean, MBeanRegistration { /** *

      Make a DynamicMBean out of this, using the specified - * mbeanInterface class. This constructor can be used + * mbeanInterface class, and choosing whether the resulting + * MBean is an MXBean. This constructor can be used * to make either Standard MBeans or MXBeans. Unlike the * constructor {@link #StandardMBean(Object, Class)}, it * does not throw NotCompliantMBeanException.

      * - *

      Call {@link #StandardMBean(java.lang.Object, java.lang.Class, boolean) + *

      Calls {@link #StandardMBean(java.lang.Object, java.lang.Class, boolean) * this(this, mbeanInterface, isMXBean)}. * This constructor is reserved to subclasses.

      * @@ -297,7 +391,77 @@ public class StandardMBean implements DynamicMBean, MBeanRegistration { **/ protected StandardMBean(Class mbeanInterface, boolean isMXBean) { try { - construct(null, mbeanInterface, true, isMXBean); + MBeanOptions opts = new MBeanOptions(); + if (mbeanInterface == null) { + mbeanInterface = Introspector.getStandardOrMXBeanInterface( + getClass(), isMXBean); + } + if (isMXBean) { + MXBeanMappingFactory f = MXBeanMappingFactory.forInterface( + mbeanInterface); + opts.setMXBeanMappingFactory(f); + } + construct(null, mbeanInterface, true, opts); + } catch (NotCompliantMBeanException e) { + throw new IllegalArgumentException(e); + } + } + + /** + *

      Make a DynamicMBean out of the object + * implementation, using the specified + * mbeanInterface class and the specified options.

      + * + * @param implementation The implementation of this MBean. + * @param mbeanInterface The Management Interface exported by this + * MBean's implementation. If null, then this + * object will use standard JMX design pattern to determine + * the management interface associated with the given + * implementation. + * @param options MBeanOptions that control the operation of the resulting + * MBean. + * @param Allows the compiler to check + * that {@code implementation} does indeed implement the class + * described by {@code mbeanInterface}. The compiler can only + * check this if {@code mbeanInterface} is a class literal such + * as {@code MyMBean.class}. + * + * @exception IllegalArgumentException if the given + * implementation is null, or if the mbeanInterface + * does not follow JMX design patterns for Management Interfaces, or + * if the given implementation does not implement the + * specified interface. + **/ + public StandardMBean(T implementation, + Class mbeanInterface, + MBeanOptions options) { + try { + construct(implementation, mbeanInterface, false, options); + } catch (NotCompliantMBeanException e) { + throw new IllegalArgumentException(e); + } + } + + /** + *

      Make a DynamicMBean out of this, using the specified + * mbeanInterface class and the specified options.

      + * + *

      Calls {@link #StandardMBean(Object, Class, JMX.MBeanOptions) + * this(this,mbeanInterface,options)}. + * This constructor is reserved to subclasses.

      + * + * @param mbeanInterface The Management Interface exported by this + * MBean. + * @param options MBeanOptions that control the operation of the resulting + * MBean. + * + * @exception IllegalArgumentException if the mbeanInterface + * does not follow JMX design patterns for Management Interfaces, or + * if this does not implement the specified interface. + **/ + protected StandardMBean(Class mbeanInterface, MBeanOptions options) { + try { + construct(null, mbeanInterface, true, options); } catch (NotCompliantMBeanException e) { throw new IllegalArgumentException(e); } @@ -326,13 +490,19 @@ public class StandardMBean implements DynamicMBean, MBeanRegistration { if (implementation == null) throw new IllegalArgumentException("implementation is null"); + setImplementation2(implementation); + } - if (isMXBean()) { + private void setImplementation2(T implementation) + throws NotCompliantMBeanException { + Class intf = Util.cast(getMBeanInterface()); + + if (this.mbean.isMXBean()) { this.mbean = new MXBeanSupport(implementation, - Util.>cast(getMBeanInterface())); + intf, + options.getMXBeanMappingFactory()); } else { - this.mbean = new StandardMBeanSupport(implementation, - Util.>cast(getMBeanInterface())); + this.mbean = new StandardMBeanSupport(implementation, intf); } } @@ -343,7 +513,67 @@ public class StandardMBean implements DynamicMBean, MBeanRegistration { * @see #setImplementation **/ public Object getImplementation() { - return mbean.getResource(); + return mbean.getWrappedObject(); + } + + /** + *

      Get the wrapped implementation object or return this object.

      + * + *

      For compatibility reasons, this method only returns the wrapped + * implementation object if the {@link Options#isWrappedObjectVisible + * WrappedObjectVisible} option was specified when this StandardMBean + * was created. Otherwise it returns {@code this}.

      + * + *

      If you want the MBeanServer's {@link MBeanServer#getClassLoaderFor + * getClassLoaderFor} and {@link MBeanServer#isInstanceOf + * isInstanceOf} methods to refer to the wrapped implementation and + * not this StandardMBean object, then you must set the + * {@code WrappedObjectVisible} option, for example using:

      + * + *
      +     * StandardMBean.Options opts = new StandardMBean.Options();
      +     * opts.setWrappedObjectVisible(true);
      +     * StandardMBean mbean = new StandardMBean(impl, MyMBean.class, opts);
      +     * 
      + * + * @return The wrapped implementation object, or this StandardMBean + * instance. + */ + public Object getWrappedObject() { + if (options instanceof Options && + ((Options) options).isWrappedObjectVisible()) + return getImplementation(); + else + return this; + } + + /** + *

      Get the ClassLoader of the wrapped implementation object or of this + * object.

      + * + *

      For compatibility reasons, this method only returns the ClassLoader + * of the wrapped implementation object if the {@link + * Options#isWrappedObjectVisible WrappedObjectVisible} option was + * specified when this StandardMBean was created. Otherwise it returns + * {@code this.getClass().getClassLoader()}.

      + * + *

      If you want the MBeanServer's {@link MBeanServer#getClassLoaderFor + * getClassLoaderFor} and {@link MBeanServer#isInstanceOf + * isInstanceOf} methods to refer to the wrapped implementation and + * not this StandardMBean object, then you must set the + * {@code WrappedObjectVisible} option, for example using:

      + * + *
      +     * StandardMBean.Options opts = new StandardMBean.Options();
      +     * opts.setWrappedObjectVisible(true);
      +     * StandardMBean mbean = new StandardMBean(impl, MyMBean.class, opts);
      +     * 
      + * + * @return The ClassLoader of the wrapped Cimplementation object, or of + * this StandardMBean instance. + */ + public ClassLoader getWrappedClassLoader() { + return getWrappedObject().getClass().getClassLoader(); } /** @@ -359,7 +589,20 @@ public class StandardMBean implements DynamicMBean, MBeanRegistration { * @return The class of the implementation of this Standard MBean (or MXBean). **/ public Class getImplementationClass() { - return mbean.getResource().getClass(); + return mbean.getWrappedObject().getClass(); + } + + /** + * Return the MBeanOptions that were specified or implied for this StandardMBean + * instance. If an MBeanOptions object was supplied when this StandardMBean + * instance was constructed, and if that object has not been modified in the + * meantime, then the returned object will be equal to that object, although + * it might not be the same object. + * @return The MBeanOptions that were specified or implied for this StandardMBean + * instance. + */ + public MBeanOptions getOptions() { + return options.uncanonical(); } // ------------------------------------------------------------------ @@ -448,7 +691,7 @@ public class StandardMBean implements DynamicMBean, MBeanRegistration { MBeanSupport msupport = mbean; final MBeanInfo bi = msupport.getMBeanInfo(); - final Object impl = msupport.getResource(); + final Object impl = msupport.getWrappedObject(); final boolean immutableInfo = immutableInfo(this.getClass()); @@ -726,7 +969,7 @@ public class StandardMBean implements DynamicMBean, MBeanRegistration { * @return the MBeanNotificationInfo[] for the new MBeanInfo. **/ MBeanNotificationInfo[] getNotifications(MBeanInfo info) { - return null; + return info.getNotifications(); } /** @@ -1073,6 +1316,7 @@ public class StandardMBean implements DynamicMBean, MBeanRegistration { public ObjectName preRegister(MBeanServer server, ObjectName name) throws Exception { mbean.register(server, name); + MBeanInjector.inject(mbean.getWrappedObject(), server, name); return name; } @@ -1234,5 +1478,4 @@ public class StandardMBean implements DynamicMBean, MBeanRegistration { return true; } } - } diff --git a/jdk/src/share/classes/javax/management/StringValueExp.java b/jdk/src/share/classes/javax/management/StringValueExp.java index 40a9b2364d8..9f2ed4a3b45 100644 --- a/jdk/src/share/classes/javax/management/StringValueExp.java +++ b/jdk/src/share/classes/javax/management/StringValueExp.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/loading/MLet.java b/jdk/src/share/classes/javax/management/loading/MLet.java index cb180e8211c..ba27646df6a 100644 --- a/jdk/src/share/classes/javax/management/loading/MLet.java +++ b/jdk/src/share/classes/javax/management/loading/MLet.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/loading/MLetParser.java b/jdk/src/share/classes/javax/management/loading/MLetParser.java index a3040b4add6..88aa4794ab1 100644 --- a/jdk/src/share/classes/javax/management/loading/MLetParser.java +++ b/jdk/src/share/classes/javax/management/loading/MLetParser.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/modelmbean/DescriptorSupport.java b/jdk/src/share/classes/javax/management/modelmbean/DescriptorSupport.java index bd9eb23a0b8..1d2282192ef 100644 --- a/jdk/src/share/classes/javax/management/modelmbean/DescriptorSupport.java +++ b/jdk/src/share/classes/javax/management/modelmbean/DescriptorSupport.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/modelmbean/ModelMBeanAttributeInfo.java b/jdk/src/share/classes/javax/management/modelmbean/ModelMBeanAttributeInfo.java index c921de7b66b..cc2ec0b7a41 100644 --- a/jdk/src/share/classes/javax/management/modelmbean/ModelMBeanAttributeInfo.java +++ b/jdk/src/share/classes/javax/management/modelmbean/ModelMBeanAttributeInfo.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/modelmbean/ModelMBeanConstructorInfo.java b/jdk/src/share/classes/javax/management/modelmbean/ModelMBeanConstructorInfo.java index 1a1591de0d7..a6e7ceab737 100644 --- a/jdk/src/share/classes/javax/management/modelmbean/ModelMBeanConstructorInfo.java +++ b/jdk/src/share/classes/javax/management/modelmbean/ModelMBeanConstructorInfo.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/modelmbean/ModelMBeanInfoSupport.java b/jdk/src/share/classes/javax/management/modelmbean/ModelMBeanInfoSupport.java index 5dff6557a23..6e4a3ed6368 100644 --- a/jdk/src/share/classes/javax/management/modelmbean/ModelMBeanInfoSupport.java +++ b/jdk/src/share/classes/javax/management/modelmbean/ModelMBeanInfoSupport.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/modelmbean/ModelMBeanNotificationInfo.java b/jdk/src/share/classes/javax/management/modelmbean/ModelMBeanNotificationInfo.java index b603edb8298..52f1317db81 100644 --- a/jdk/src/share/classes/javax/management/modelmbean/ModelMBeanNotificationInfo.java +++ b/jdk/src/share/classes/javax/management/modelmbean/ModelMBeanNotificationInfo.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/modelmbean/ModelMBeanOperationInfo.java b/jdk/src/share/classes/javax/management/modelmbean/ModelMBeanOperationInfo.java index 9b75b8c0404..2ed99224067 100644 --- a/jdk/src/share/classes/javax/management/modelmbean/ModelMBeanOperationInfo.java +++ b/jdk/src/share/classes/javax/management/modelmbean/ModelMBeanOperationInfo.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/modelmbean/RequiredModelMBean.java b/jdk/src/share/classes/javax/management/modelmbean/RequiredModelMBean.java index 86ce9d904b0..3c09c3ff2cc 100644 --- a/jdk/src/share/classes/javax/management/modelmbean/RequiredModelMBean.java +++ b/jdk/src/share/classes/javax/management/modelmbean/RequiredModelMBean.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ * have any questions. */ /* - * @author IBM Corp. + * @(#)author IBM Corp. * * Copyright IBM Corp. 1999-2000. All rights reserved. */ @@ -55,6 +55,7 @@ import javax.management.AttributeChangeNotificationFilter; import javax.management.AttributeList; import javax.management.AttributeNotFoundException; import javax.management.Descriptor; +import javax.management.DynamicWrapperMBean; import javax.management.InstanceNotFoundException; import javax.management.InvalidAttributeValueException; import javax.management.ListenerNotFoundException; @@ -115,7 +116,7 @@ import sun.reflect.misc.ReflectUtil; */ public class RequiredModelMBean - implements ModelMBean, MBeanRegistration, NotificationEmitter { + implements ModelMBean, MBeanRegistration, NotificationEmitter, DynamicWrapperMBean { /*************************************/ /* attributes */ @@ -133,6 +134,9 @@ public class RequiredModelMBean * and operations will be executed */ private Object managedResource = null; + /* true if getWrappedObject returns the wrapped resource */ + private boolean visible; + /* records the registering in MBeanServer */ private boolean registered = false; private transient MBeanServer server = null; @@ -318,9 +322,13 @@ public class RequiredModelMBean * * @param mr Object that is the managed resource * @param mr_type The type of reference for the managed resource. - *
      Can be: "ObjectReference", "Handle", "IOR", "EJBHandle", - * or "RMIReference". - *
      In this implementation only "ObjectReference" is supported. + *
      Can be: "ObjectReference", "VisibleObjectReference", + * "Handle", "IOR", "EJBHandle", or "RMIReference". + *
      In this implementation only "ObjectReference" and + * "VisibleObjectReference" are supported. The two + * types are equivalent except for the behavior of the + * {@link #getWrappedObject()} and {@link #getWrappedClassLoader()} + * methods. * * @exception MBeanException The initializer of the object has * thrown an exception. @@ -340,10 +348,11 @@ public class RequiredModelMBean "setManagedResource(Object,String)","Entry"); } + visible = "visibleObjectReference".equalsIgnoreCase(mr_type); + // check that the mr_type is supported by this JMXAgent // only "objectReference" is supported - if ((mr_type == null) || - (! mr_type.equalsIgnoreCase("objectReference"))) { + if (!"objectReference".equalsIgnoreCase(mr_type) && !visible) { if (MODELMBEAN_LOGGER.isLoggable(Level.FINER)) { MODELMBEAN_LOGGER.logp(Level.FINER, RequiredModelMBean.class.getName(), @@ -368,6 +377,51 @@ public class RequiredModelMBean } } + /** + *

      Get the managed resource for this Model MBean. For compatibility + * reasons, the managed resource is only returned if the resource type + * specified to {@link #setManagedResource setManagedResource} was {@code + * "visibleObjectReference"}. Otherwise, {@code this} is returned.

      + * + * @return The value that was specified to {@link #setManagedResource + * setManagedResource}, if the resource type is {@code + * "visibleObjectReference"}. Otherwise, {@code this}. + */ + public Object getWrappedObject() { + if (visible) + return managedResource; + else + return this; + } + + /** + *

      Get the ClassLoader of the managed resource for this Model MBean. For + * compatibility reasons, the ClassLoader of the managed resource is only + * returned if the resource type specified to {@link #setManagedResource + * setManagedResource} was {@code "visibleObjectReference"}. Otherwise, + * {@code this.getClass().getClassLoader()} is returned.

      + * + * @return The ClassLoader of the value that was specified to + * {@link #setManagedResource setManagedResource}, if the resource + * type is {@code "visibleObjectReference"}. Otherwise, {@code + * this.getClass().getClassLoader()}. + */ + public ClassLoader getWrappedClassLoader() { + return getWrappedObject().getClass().getClassLoader(); + } + + private static boolean isTrue(Descriptor d, String field) { + if (d == null) + return false; + Object x = d.getFieldValue(field); + if (x instanceof Boolean) + return (Boolean) x; + if (!(x instanceof String)) + return false; + String s = (String) x; + return ("true".equalsIgnoreCase(s) || "T".equalsIgnoreCase(s)); + } + /** *

      Instantiates this MBean instance with the data found for * the MBean in the persistent store. The data loaded could include @@ -1696,8 +1750,8 @@ public class RequiredModelMBean } catch (Exception e) { // eat exceptions because interface doesn't have an // exception on it - if (MODELMBEAN_LOGGER.isLoggable(Level.WARNING)) { - MODELMBEAN_LOGGER.logp(Level.WARNING, + if (MODELMBEAN_LOGGER.isLoggable(Level.FINER)) { + MODELMBEAN_LOGGER.logp(Level.FINER, RequiredModelMBean.class.getName(), "getAttributes(String[])", "Failed to get \"" + attrNames[i] + "\": ", e); @@ -1857,8 +1911,8 @@ public class RequiredModelMBean attrValue.getClass().getName() + " received."); } catch (ClassNotFoundException x) { - if (MODELMBEAN_LOGGER.isLoggable(Level.WARNING)) { - MODELMBEAN_LOGGER.logp(Level.WARNING, + if (MODELMBEAN_LOGGER.isLoggable(Level.FINER)) { + MODELMBEAN_LOGGER.logp(Level.FINER, RequiredModelMBean.class.getName(), "setAttribute(Attribute)","Class " + attrType + " for attribute " @@ -2224,8 +2278,8 @@ public class RequiredModelMBean ntfyObj.getMessage() + " Severity = " + (String)ntfyDesc.getFieldValue("severity")); } catch (Exception e) { - if (MODELMBEAN_LOGGER.isLoggable(Level.WARNING)) { - MODELMBEAN_LOGGER.logp(Level.WARNING, + if (MODELMBEAN_LOGGER.isLoggable(Level.FINE)) { + MODELMBEAN_LOGGER.logp(Level.FINE, RequiredModelMBean.class.getName(), "sendNotification(Notification)", "Failed to log " + @@ -2618,8 +2672,8 @@ public class RequiredModelMBean " Old value = " + oldv + " New value = " + newv); } catch (Exception e) { - if (MODELMBEAN_LOGGER.isLoggable(Level.WARNING)) { - MODELMBEAN_LOGGER.logp(Level.WARNING, + if (MODELMBEAN_LOGGER.isLoggable(Level.FINE)) { + MODELMBEAN_LOGGER.logp(Level.FINE, RequiredModelMBean.class.getName(),mth, "Failed to log " + ntfyObj.getType() + " notification: ", e); @@ -2644,8 +2698,8 @@ public class RequiredModelMBean " Old value = " + oldv + " New value = " + newv); } catch (Exception e) { - if (MODELMBEAN_LOGGER.isLoggable(Level.WARNING)) { - MODELMBEAN_LOGGER.logp(Level.WARNING, + if (MODELMBEAN_LOGGER.isLoggable(Level.FINE)) { + MODELMBEAN_LOGGER.logp(Level.FINE, RequiredModelMBean.class.getName(),mth, "Failed to log " + ntfyObj.getType() + " notification: ", e); diff --git a/jdk/src/share/classes/javax/management/monitor/CounterMonitor.java b/jdk/src/share/classes/javax/management/monitor/CounterMonitor.java index f2f9887b4cd..b592b171b62 100644 --- a/jdk/src/share/classes/javax/management/monitor/CounterMonitor.java +++ b/jdk/src/share/classes/javax/management/monitor/CounterMonitor.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/monitor/GaugeMonitor.java b/jdk/src/share/classes/javax/management/monitor/GaugeMonitor.java index 5ce63fbe532..7077f38cee1 100644 --- a/jdk/src/share/classes/javax/management/monitor/GaugeMonitor.java +++ b/jdk/src/share/classes/javax/management/monitor/GaugeMonitor.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/monitor/Monitor.java b/jdk/src/share/classes/javax/management/monitor/Monitor.java index 1b057e1b4a6..081c5ede429 100644 --- a/jdk/src/share/classes/javax/management/monitor/Monitor.java +++ b/jdk/src/share/classes/javax/management/monitor/Monitor.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/monitor/package.html b/jdk/src/share/classes/javax/management/monitor/package.html index 5ccb72c9660..2e04b2422fc 100644 --- a/jdk/src/share/classes/javax/management/monitor/package.html +++ b/jdk/src/share/classes/javax/management/monitor/package.html @@ -38,14 +38,17 @@ have any questions. so within the access control context of the {@link javax.management.monitor.Monitor#start} caller.

      -

      The value being monitored can be a simple value contained within a - complex type. For example, the {@link java.lang.management.MemoryMXBean - MemoryMXBean} defined in java.lang.management has an attribute - HeapMemoryUsage of type {@link java.lang.management.MemoryUsage - MemoryUsage}. To monitor the amount of used memory, described by - the used property of MemoryUsage, you could monitor - "HeapMemoryUsage.used". That string would be the argument to - {@link javax.management.monitor.MonitorMBean#setObservedAttribute(String) +

      The value being monitored can be a simple value + contained within a complex type. For example, the {@link + java.lang.management.MemoryMXBean MemoryMXBean} defined in + java.lang.management has an attribute + HeapMemoryUsage of type {@link + java.lang.management.MemoryUsage MemoryUsage}. To monitor the + amount of used memory, described by the used + property of MemoryUsage, you could monitor + "HeapMemoryUsage.used". That string would be the + argument to {@link + javax.management.monitor.MonitorMBean#setObservedAttribute(String) setObservedAttribute}.

      The rules used to interpret an ObservedAttribute like diff --git a/jdk/src/share/classes/javax/management/openmbean/ArrayType.java b/jdk/src/share/classes/javax/management/openmbean/ArrayType.java index 92ecc604498..49c8bbf1f63 100644 --- a/jdk/src/share/classes/javax/management/openmbean/ArrayType.java +++ b/jdk/src/share/classes/javax/management/openmbean/ArrayType.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/openmbean/CompositeDataInvocationHandler.java b/jdk/src/share/classes/javax/management/openmbean/CompositeDataInvocationHandler.java index e0d95dfdccd..e0414e9d031 100644 --- a/jdk/src/share/classes/javax/management/openmbean/CompositeDataInvocationHandler.java +++ b/jdk/src/share/classes/javax/management/openmbean/CompositeDataInvocationHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,7 @@ package javax.management.openmbean; import com.sun.jmx.mbeanserver.MXBeanLookup; -import com.sun.jmx.mbeanserver.OpenConverter; +import com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; @@ -115,7 +115,12 @@ public class CompositeDataInvocationHandler implements InvocationHandler { is null. */ public CompositeDataInvocationHandler(CompositeData compositeData) { - this(compositeData, null); + this(compositeData, MXBeanMappingFactory.DEFAULT); + } + + public CompositeDataInvocationHandler(CompositeData compositeData, + MXBeanMappingFactory mappingFactory) { + this(compositeData, mappingFactory, null); } /** @@ -134,11 +139,13 @@ public class CompositeDataInvocationHandler implements InvocationHandler { is null. */ CompositeDataInvocationHandler(CompositeData compositeData, + MXBeanMappingFactory mappingFactory, MXBeanLookup lookup) { if (compositeData == null) throw new IllegalArgumentException("compositeData"); this.compositeData = compositeData; this.lookup = lookup; + this.mappingFactory = mappingFactory; } /** @@ -176,7 +183,7 @@ public class CompositeDataInvocationHandler implements InvocationHandler { } } - String propertyName = OpenConverter.propertyName(method); + String propertyName = DefaultMXBeanMappingFactory.propertyName(method); if (propertyName == null) { throw new IllegalArgumentException("Method is not getter: " + method.getName()); @@ -185,7 +192,7 @@ public class CompositeDataInvocationHandler implements InvocationHandler { if (compositeData.containsKey(propertyName)) openValue = compositeData.get(propertyName); else { - String decap = OpenConverter.decapitalize(propertyName); + String decap = DefaultMXBeanMappingFactory.decapitalize(propertyName); if (compositeData.containsKey(decap)) openValue = compositeData.get(decap); else { @@ -196,9 +203,10 @@ public class CompositeDataInvocationHandler implements InvocationHandler { throw new IllegalArgumentException(msg); } } - OpenConverter converter = - OpenConverter.toConverter(method.getGenericReturnType()); - return converter.fromOpenValue(lookup, openValue); + MXBeanMapping mapping = + mappingFactory.mappingForType(method.getGenericReturnType(), + MXBeanMappingFactory.DEFAULT); + return mapping.fromOpenValue(openValue); } /* This method is called when equals(Object) is @@ -242,4 +250,5 @@ public class CompositeDataInvocationHandler implements InvocationHandler { private final CompositeData compositeData; private final MXBeanLookup lookup; + private final MXBeanMappingFactory mappingFactory; } diff --git a/jdk/src/share/classes/javax/management/openmbean/CompositeType.java b/jdk/src/share/classes/javax/management/openmbean/CompositeType.java index 25f7b1dbb20..b513b0faa9a 100644 --- a/jdk/src/share/classes/javax/management/openmbean/CompositeType.java +++ b/jdk/src/share/classes/javax/management/openmbean/CompositeType.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -159,8 +159,8 @@ public class CompositeType extends OpenType { } private static void checkForNullElement(Object[] arg, String argName) { - if ( (arg == null) || (arg.length == 0) ) { - throw new IllegalArgumentException("Argument "+ argName +"[] cannot be null or empty."); + if (arg == null) { + throw new IllegalArgumentException("Argument "+ argName +"[] cannot be null."); } for (int i=0; iA custom mapping between Java types and Open types for use in MXBeans. + * To define such a mapping, subclass this class and define at least the + * {@link #fromOpenValue fromOpenValue} and {@link #toOpenValue toOpenValue} + * methods, and optionally the {@link #checkReconstructible} method. + * Then either use an {@link MXBeanMappingClass} annotation on your custom + * Java types, or include this MXBeanMapping in an + * {@link MXBeanMappingFactory}.

      + * + *

      For example, suppose we have a class {@code MyLinkedList}, which looks + * like this:

      + * + *
      + * public class MyLinkedList {
      + *     public MyLinkedList(String name, MyLinkedList next) {...}
      + *     public String getName() {...}
      + *     public MyLinkedList getNext() {...}
      + * }
      + * 
      + * + *

      This is not a valid type for MXBeans, because it contains a + * self-referential property "next" defined by the {@code getNext()} + * method. MXBeans do not support recursive types. So we would like + * to specify a mapping for {@code MyLinkedList} explicitly. When an + * MXBean interface contains {@code MyLinkedList}, that will be mapped + * into a {@code String[]}, which is a valid Open Type.

      + * + *

      To define this mapping, we first subclass {@code MXBeanMapping}:

      + * + *
      + * public class MyLinkedListMapping extends MXBeanMapping {
      + *     public MyLinkedListMapping(Type type) throws OpenDataException {
      + *         super(MyLinkedList.class, ArrayType.getArrayType(SimpleType.STRING));
      + *         if (type != MyLinkedList.class)
      + *             throw new OpenDataException("Mapping only valid for MyLinkedList");
      + *     }
      + *
      + *     {@literal @Override}
      + *     public Object fromOpenValue(Object openValue) throws InvalidObjectException {
      + *         String[] array = (String[]) openValue;
      + *         MyLinkedList list = null;
      + *         for (int i = array.length - 1; i >= 0; i--)
      + *             list = new MyLinkedList(array[i], list);
      + *         return list;
      + *     }
      + *
      + *     {@literal @Override}
      + *     public Object toOpenValue(Object javaValue) throws OpenDataException {
      + *         ArrayList<String> array = new ArrayList<String>();
      + *         for (MyLinkedList list = (MyLinkedList) javaValue; list != null;
      + *              list = list.getNext())
      + *             array.add(list.getName());
      + *         return array.toArray(new String[0]);
      + *     }
      + * }
      + * 
      + * + *

      The call to the superclass constructor specifies what the + * original Java type is ({@code MyLinkedList.class}) and what Open + * Type it is mapped to ({@code + * ArrayType.getArrayType(SimpleType.STRING)}). The {@code + * fromOpenValue} method says how we go from the Open Type ({@code + * String[]}) to the Java type ({@code MyLinkedList}), and the {@code + * toOpenValue} method says how we go from the Java type to the Open + * Type.

      + * + *

      With this mapping defined, we can annotate the {@code MyLinkedList} + * class appropriately:

      + * + *
      + * {@literal @MXBeanMappingClass}(MyLinkedListMapping.class)
      + * public class MyLinkedList {...}
      + * 
      + * + *

      Now we can use {@code MyLinkedList} in an MXBean interface and it + * will work.

      + * + *

      If we are unable to modify the {@code MyLinkedList} class, + * we can define an {@link MXBeanMappingFactory}. See the documentation + * of that class for further details.

      + */ +public abstract class MXBeanMapping { + private final Type javaType; + private final OpenType openType; + private final Class openClass; + + /** + *

      Construct a mapping between the given Java type and the given + * Open Type.

      + * + * @param javaType the Java type (for example, {@code MyLinkedList}). + * @param openType the Open Type (for example, {@code + * ArrayType.getArrayType(SimpleType.STRING)}) + * + * @throws NullPointerException if either argument is null. + */ + protected MXBeanMapping(Type javaType, OpenType openType) { + if (javaType == null || openType == null) + throw new NullPointerException("Null argument"); + this.javaType = javaType; + this.openType = openType; + this.openClass = makeOpenClass(javaType, openType); + } + + /** + *

      The Java type that was supplied to the constructor.

      + * @return the Java type that was supplied to the constructor. + */ + public final Type getJavaType() { + return javaType; + } + + /** + *

      The Open Type that was supplied to the constructor.

      + * @return the Open Type that was supplied to the constructor. + */ + public final OpenType getOpenType() { + return openType; + } + + /** + *

      The Java class that corresponds to instances of the + * {@linkplain #getOpenType() Open Type} for this mapping.

      + * @return the Java class that corresponds to instances of the + * Open Type for this mapping. + * @see OpenType#getClassName + */ + public final Class getOpenClass() { + return openClass; + } + + private static Class makeOpenClass(Type javaType, OpenType openType) { + if (javaType instanceof Class && ((Class) javaType).isPrimitive()) + return (Class) javaType; + try { + String className = OpenType.validClassName(openType.getClassName()); + return Class.forName(className, false, null); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); // should not happen + } catch (OpenDataException e) { + throw new IllegalArgumentException("Bad OpenType: " + openType, e); + } + } + + /** + *

      Convert an instance of the Open Type into the Java type. + * @param openValue the value to be converted. + * @return the converted value. + * @throws InvalidObjectException if the value cannot be converted. + */ + public abstract Object fromOpenValue(Object openValue) + throws InvalidObjectException; + + /** + *

      Convert an instance of the Java type into the Open Type. + * @param javaValue the value to be converted. + * @return the converted value. + * @throws OpenDataException if the value cannot be converted. + */ + public abstract Object toOpenValue(Object javaValue) + throws OpenDataException; + + + /** + *

      Throw an appropriate InvalidObjectException if we will not + * be able to convert back from the open data to the original Java + * object. The {@link #fromOpenValue fromOpenValue} throws an + * exception if a given open data value cannot be converted. This + * method throws an exception if no open data values can + * be converted. The default implementation of this method never + * throws an exception. Subclasses can override it as + * appropriate.

      + * @throws InvalidObjectException if {@code fromOpenValue} will throw + * an exception no matter what its argument is. + */ + public void checkReconstructible() throws InvalidObjectException {} +} diff --git a/jdk/src/share/classes/javax/management/openmbean/MXBeanMappingClass.java b/jdk/src/share/classes/javax/management/openmbean/MXBeanMappingClass.java new file mode 100644 index 00000000000..f3afbc1024b --- /dev/null +++ b/jdk/src/share/classes/javax/management/openmbean/MXBeanMappingClass.java @@ -0,0 +1,61 @@ +/* + * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package javax.management.openmbean; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import javax.management.NotCompliantMBeanException; + +/** + * Specifies the MXBean mapping to be used for this Java type. + * @see MXBeanMapping + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +@Documented @Inherited +public @interface MXBeanMappingClass { + /** + *

      The {@link MXBeanMapping} class to be used to map the + * annotated type. This class must have a public constructor with + * a single argument of type {@link java.lang.reflect.Type}. The + * constructor will be called with the annotated type as an + * argument. See the {@code MXBeanMapping} documentation + * for an example.

      + * + *

      If the {@code MXBeanMapping} cannot in fact handle that + * type, the constructor should throw an {@link + * OpenDataException}. If the constructor throws this or any other + * exception then an MXBean in which the annotated type appears is + * invalid, and registering it in the MBean Server will produce a + * {@link NotCompliantMBeanException}. + */ + public Class value(); +} diff --git a/jdk/src/share/classes/javax/management/openmbean/MXBeanMappingFactory.java b/jdk/src/share/classes/javax/management/openmbean/MXBeanMappingFactory.java new file mode 100644 index 00000000000..0820bf86a5d --- /dev/null +++ b/jdk/src/share/classes/javax/management/openmbean/MXBeanMappingFactory.java @@ -0,0 +1,162 @@ +/* + * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package javax.management.openmbean; + +import com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory; +import java.lang.reflect.Type; + +/** + *

      Defines how types are mapped for a given MXBean or set of MXBeans. + * An {@code MXBeanMappingFactory} can be specified either through the + * {@link MXBeanMappingFactoryClass} annotation, or through the + * {@link javax.management.JMX.MBeanOptions JMX.MBeanOptions} argument to a + * {@link javax.management.StandardMBean StandardMBean} constructor or MXBean + * proxy.

      + * + *

      An {@code MXBeanMappingFactory} must return an {@code MXBeanMapping} + * for any Java type that appears in the MXBeans that the factory is being + * used for. Usually it does that by handling any custom types, and + * forwarding everything else to the {@linkplain #DEFAULT default mapping + * factory}.

      + * + *

      Consider the {@code MyLinkedList} example from the {@link MXBeanMapping} + * documentation. If we are unable to change the {@code MyLinkedList} class + * to add an {@link MXBeanMappingClass} annotation, we could achieve the same + * effect by defining {@code MyLinkedListMappingFactory} as follows:

      + * + *
      + * public class MyLinkedListMappingFactory implements MXBeanMappingFactory {
      + *     public MyLinkedListMappingFactory() {}
      + *
      + *     public MXBeanMapping mappingForType(Type t, MXBeanMappingFactory f)
      + *     throws OpenDataException {
      + *         if (t == MyLinkedList.class)
      + *             return new MyLinkedListMapping(t);
      + *         else
      + *             return MXBeanMappingFactory.DEFAULT.mappingForType(t, f);
      + *     }
      + * }
      + * 
      + * + *

      The mapping factory handles only the {@code MyLinkedList} class. + * Every other type is forwarded to the default mapping factory. + * This includes types such as {@code MyLinkedList[]} and + * {@code List}; the default mapping factory will recursively + * invoke {@code MyLinkedListMappingFactory} to map the contained + * {@code MyLinkedList} type.

      + * + *

      Once we have defined {@code MyLinkedListMappingFactory}, we can use + * it in an MXBean interface like this:

      + * + *
      + * {@literal @MXBeanMappingFactoryClass}(MyLinkedListMappingFactory.class)
      + * public interface SomethingMXBean {
      + *     public MyLinkedList getSomething();
      + * }
      + * 
      + * + *

      Alternatively we can annotate the package that {@code SomethingMXBean} + * appears in, or we can supply the factory to a {@link + * javax.management.StandardMBean StandardMBean} constructor or MXBean + * proxy.

      + */ +public abstract class MXBeanMappingFactory { + /** + *

      Construct an instance of this class.

      + */ + protected MXBeanMappingFactory() {} + + /** + *

      Mapping factory that applies the default rules for MXBean + * mappings, as described in the MXBean specification.

      + */ + public static final MXBeanMappingFactory DEFAULT = + new DefaultMXBeanMappingFactory(); + + /** + *

      Determine the appropriate MXBeanMappingFactory to use for the given + * MXBean interface, based on its annotations. If the interface has an + * {@link MXBeanMappingFactoryClass @MXBeanMappingFactoryClass} annotation, + * that is used to determine the MXBeanMappingFactory. Otherwise, if the + * package containing the interface has such an annotation, that is used. + * Otherwise the MXBeanMappingFactory is the {@linkplain #DEFAULT default} + * one.

      + * + * @param intf the MXBean interface for which to determine the + * MXBeanMappingFactory. + * + * @return the MXBeanMappingFactory for the given MXBean interface. + * + * @throws IllegalArgumentException if {@code intf} is null, or if an + * exception occurs while trying constructing an MXBeanMappingFactory + * based on an annotation. In the second case, the exception will appear + * in the {@linkplain Throwable#getCause() cause chain} of the + * {@code IllegalArgumentException}. + */ + public static MXBeanMappingFactory forInterface(Class intf) { + if (intf == null) + throw new IllegalArgumentException("Null interface"); + MXBeanMappingFactoryClass annot = + intf.getAnnotation(MXBeanMappingFactoryClass.class); + if (annot == null) { + Package p = intf.getPackage(); + if (p != null) + annot = p.getAnnotation(MXBeanMappingFactoryClass.class); + } + if (annot == null) + return MXBeanMappingFactory.DEFAULT; + Class factoryClass = annot.value(); + try { + return annot.value().newInstance(); + } catch (Exception e) { + throw new IllegalArgumentException( + "Could not instantiate MXBeanMappingFactory " + + factoryClass.getName() + + " from @MXBeanMappingFactoryClass", e); + } + } + + /** + *

      Return the mapping for the given Java type. Typically, a + * mapping factory will return mappings for types it handles, and + * forward other types to another mapping factory, most often + * the {@linkplain #DEFAULT default one}.

      + * @param t the Java type to be mapped. + * @param f the original mapping factory that was consulted to do + * the mapping. A mapping factory should pass this parameter intact + * if it forwards a type to another mapping factory. In the example, + * this is how {@code MyLinkedListMappingFactory} works for types + * like {@code MyLinkedList[]} and {@code List}. + * @return the mapping for the given type. + * @throws OpenDataException if this type cannot be mapped. This + * exception is appropriate if the factory is supposed to handle + * all types of this sort (for example, all linked lists), but + * cannot handle this particular type. + */ + public abstract MXBeanMapping mappingForType(Type t, MXBeanMappingFactory f) + throws OpenDataException; +} diff --git a/jdk/src/share/classes/javax/management/openmbean/MXBeanMappingFactoryClass.java b/jdk/src/share/classes/javax/management/openmbean/MXBeanMappingFactoryClass.java new file mode 100644 index 00000000000..e707ef81ed9 --- /dev/null +++ b/jdk/src/share/classes/javax/management/openmbean/MXBeanMappingFactoryClass.java @@ -0,0 +1,72 @@ +/* + * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package javax.management.openmbean; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + *

      Specifies the MXBean mapping factory to be used for Java types + * in an MXBean interface, or in all MXBean interfaces in a package.

      + * + *

      Applying a mapping factory to all Java types in an MXBean interface + * looks like this:

      + * + *
      + * {@literal @MXBeanMappingFactoryClass}(MyLinkedListMappingFactory.class)
      + * public interface SomethingMXBean {
      + *     public MyLinkedList getSomething();
      + * }
      + * 
      + * + *

      Applying a mapping factory to all Java types in all MXBean interfaces + * in a package, say {@code com.example.mxbeans}, looks like this. In the + * package source directory, create a file called {@code package-info.java} + * with these contents:

      + * + *
      + * {@literal @MXBeanMappingFactoryClass}(MyLinkedListMappingFactory.class)
      + * package com.example.mxbeans;
      + * 
      + * + * @see MXBeanMappingFactory + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE, ElementType.PACKAGE}) +@Documented @Inherited +public @interface MXBeanMappingFactoryClass { + /** + *

      The {@link MXBeanMappingFactory} class to be used to map + * types in the annotated interface or package. This class must + * have a public constructor with no arguments. See the {@code + * MXBeanMappingFactory} documentation for an example.

      + */ + public Class value(); +} diff --git a/jdk/src/share/classes/javax/management/openmbean/OpenMBeanAttributeInfoSupport.java b/jdk/src/share/classes/javax/management/openmbean/OpenMBeanAttributeInfoSupport.java index 797a8787344..bcfa4c157ad 100644 --- a/jdk/src/share/classes/javax/management/openmbean/OpenMBeanAttributeInfoSupport.java +++ b/jdk/src/share/classes/javax/management/openmbean/OpenMBeanAttributeInfoSupport.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/openmbean/OpenMBeanConstructorInfoSupport.java b/jdk/src/share/classes/javax/management/openmbean/OpenMBeanConstructorInfoSupport.java index d416c49d0da..ef155b6fdcf 100644 --- a/jdk/src/share/classes/javax/management/openmbean/OpenMBeanConstructorInfoSupport.java +++ b/jdk/src/share/classes/javax/management/openmbean/OpenMBeanConstructorInfoSupport.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/openmbean/OpenMBeanInfoSupport.java b/jdk/src/share/classes/javax/management/openmbean/OpenMBeanInfoSupport.java index 6079ad62b76..78b06d7f83c 100644 --- a/jdk/src/share/classes/javax/management/openmbean/OpenMBeanInfoSupport.java +++ b/jdk/src/share/classes/javax/management/openmbean/OpenMBeanInfoSupport.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/openmbean/OpenMBeanOperationInfoSupport.java b/jdk/src/share/classes/javax/management/openmbean/OpenMBeanOperationInfoSupport.java index 61f182db9e6..2bfe931a98b 100644 --- a/jdk/src/share/classes/javax/management/openmbean/OpenMBeanOperationInfoSupport.java +++ b/jdk/src/share/classes/javax/management/openmbean/OpenMBeanOperationInfoSupport.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/openmbean/OpenType.java b/jdk/src/share/classes/javax/management/openmbean/OpenType.java index 34d8e925c8c..7aac2c0fd8f 100644 --- a/jdk/src/share/classes/javax/management/openmbean/OpenType.java +++ b/jdk/src/share/classes/javax/management/openmbean/OpenType.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -219,7 +219,7 @@ public abstract class OpenType implements Serializable { }); } - private static String validClassName(String className) throws OpenDataException { + static String validClassName(String className) throws OpenDataException { className = valid("className", className); // Check if className describes an array class, and determines its elements' class name. diff --git a/jdk/src/share/classes/javax/management/openmbean/SimpleType.java b/jdk/src/share/classes/javax/management/openmbean/SimpleType.java index 60bb3ff40bb..7837819c4c2 100644 --- a/jdk/src/share/classes/javax/management/openmbean/SimpleType.java +++ b/jdk/src/share/classes/javax/management/openmbean/SimpleType.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/openmbean/TabularType.java b/jdk/src/share/classes/javax/management/openmbean/TabularType.java index dfd621359ec..b45f2f661d5 100644 --- a/jdk/src/share/classes/javax/management/openmbean/TabularType.java +++ b/jdk/src/share/classes/javax/management/openmbean/TabularType.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/package.html b/jdk/src/share/classes/javax/management/package.html index 8d6205c2411..14027d648ea 100644 --- a/jdk/src/share/classes/javax/management/package.html +++ b/jdk/src/share/classes/javax/management/package.html @@ -56,41 +56,41 @@ have any questions. resource. It has a management interface consisting of:

      -
        -
      • named and typed attributes that can be read and/or - written
      • - -
      • named and typed operations that can be invoked
      • +
          +
        • named and typed attributes that can be read and/or + written
        • -
        • typed notifications that can be emitted by the MBean.
        • -
        +
      • named and typed operations that can be invoked
      • -

        For example, an MBean representing an application's - configuration could have attributes representing the different - configuration items. Reading the CacheSize - attribute would return the current value of that item. - Writing it would update the item, potentially changing the - behavior of the running application. An operation such as - save could store the current configuration - persistently. A notification such as - ConfigurationChangedNotification could be sent - every time the configuration is changed.

        +
      • typed notifications that can be emitted by the MBean.
      • +
      -

      In the standard usage of the JMX API, MBeans are implemented - as Java objects. However, as explained below, these objects are - not usually referenced directly.

      +

      For example, an MBean representing an application's + configuration could have attributes representing the different + configuration items. Reading the CacheSize + attribute would return the current value of that item. + Writing it would update the item, potentially changing the + behavior of the running application. An operation such as + save could store the current configuration + persistently. A notification such as + ConfigurationChangedNotification could be sent + every time the configuration is changed.

      + +

      In the standard usage of the JMX API, MBeans are implemented + as Java objects. However, as explained below, these objects are + not usually referenced directly.

      -

      Standard MBeans

      +

      Standard MBeans

      -

      To make MBean implementation simple, the JMX API includes the - notion of Standard MBeans. A Standard MBean is one - whose attributes and operations are deduced from a Java - interface using certain naming patterns, similar to those used - by JavaBeansTM. For - example, consider an interface like this:

      +

      To make MBean implementation simple, the JMX API includes the + notion of Standard MBeans. A Standard MBean is one + whose attributes and operations are deduced from a Java + interface using certain naming patterns, similar to those used + by JavaBeansTM. For + example, consider an interface like this:

      -
      +        
           public interface ConfigurationMBean {
       	public int getCacheSize();
       	public void setCacheSize(int size);
      @@ -128,107 +128,148 @@ have any questions.
       	class.

      -

      MXBeans

      - -

      An MXBean is a variant of Standard MBean where complex - types are mapped to a standard set of types defined in the - {@link javax.management.openmbean} package. MXBeans are appropriate - if you would otherwise need to reference application-specific - classes in your MBean interface. They are described in detail - in the specification for {@link javax.management.MXBean MXBean}. +

      Defining Standard MBeans with annotations

      + +

      As an alternative to creating an interface such as + ConfigurationMBean and a class that implements it, + you can write just the class, and use annotations to pick out the + public methods that will make up the management interface. For + example, the following class has the same management interface + as a Configuration class that implements the + ConfigurationMBean interface above.

      + +
      +    {@link javax.management.MBean @MBean}
      +    public class Configuration {
      +        {@link javax.management.ManagedAttribute @ManagedAttribute}
      +        public int getCacheSize() {...}
      +        @ManagedAttribute
      +        public void setCacheSize(int size) {...}
      +
      +        @ManagedAttribute
      +        public long getLastChangedTime() {...}
      +
      +        {@link javax.management.ManagedOperation @ManagedOperation}
      +        public void save() {...}
      +        ...
      +    }
      +        
      + +

      This approach simplifies development, but it does have two + potential drawbacks. First, if you run the Javadoc tool on + this class, the documentation of the management interface may + be mixed in with the documentation of non-management methods + in the class. Second, you cannot make a proxy + as described below if you do not have an + interface like ConfigurationMBean.

      -

      Dynamic MBeans

      +

      MXBeans

      -

      A Dynamic MBean is an MBean that defines its - management interface at run-time. For example, a configuration - MBean could determine the names and types of the attributes it - exposes by parsing an XML file.

      +

      An MXBean is a variant of Standard MBean where complex + types are mapped to a standard set of types defined in the + {@link javax.management.openmbean} package. MXBeans are appropriate + if you would otherwise need to reference application-specific + classes in your MBean interface. They are described in detail + in the specification for {@link javax.management.MXBean MXBean}.

      -

      Any Java object of a class that implements the {@link - javax.management.DynamicMBean DynamicMBean} interface is a - Dynamic MBean.

      +

      You can define MXBeans using annotations as described + in the previous section, but + using the @MXBean annotation instead of + @MBean.

      -

      Open MBeans

      +

      Dynamic MBeans

      -

      An Open MBean is a kind of Dynamic MBean where the - types of attributes and of operation parameters and return - values are built using a small set of predefined Java classes. - Open MBeans facilitate operation with remote management programs - that do not necessarily have access to application-specific - types, including non-Java programs. Open MBeans are defined by - the package - javax.management.openmbean.

      +

      A Dynamic MBean is an MBean that defines its + management interface at run-time. For example, a configuration + MBean could determine the names and types of the attributes it + exposes by parsing an XML file.

      + +

      Any Java object of a class that implements the {@link + javax.management.DynamicMBean DynamicMBean} interface is a + Dynamic MBean.

      -

      Model MBeans

      +

      Open MBeans

      -

      A Model MBean is a kind of Dynamic MBean that acts - as a bridge between the management interface and the - underlying managed resource. Both the management interface and - the managed resource are specified as Java objects. The same - Model MBean implementation can be reused many times with - different management interfaces and managed resources, and it can - provide common functionality such as persistence and caching. - Model MBeans are defined by the package - - javax.management.modelmbean.

      +

      An Open MBean is a kind of Dynamic MBean where the + types of attributes and of operation parameters and return + values are built using a small set of predefined Java classes. + Open MBeans facilitate operation with remote management programs + that do not necessarily have access to application-specific + types, including non-Java programs. Open MBeans are defined by + the package + javax.management.openmbean.

      -

      MBean Server

      - -

      To be useful, an MBean must be registered in an MBean - Server. An MBean Server is a repository of MBeans. - Usually the only access to the MBeans is through the MBean - Server. In other words, code no longer accesses the Java - object implementing the MBean directly, but instead accesses - the MBean by name through the MBean Server. Each MBean has a - unique name within the MBean Server, defined by the {@link - javax.management.ObjectName ObjectName} class.

      - -

      An MBean Server is an object implementing the interface - {@link javax.management.MBeanServer MBeanServer}. - The most convenient MBean Server to use is the - Platform MBean Server. This is a - single MBean Server that can be shared by different managed - components running within the same Java Virtual Machine. The - Platform MBean Server is accessed with the method {@link - java.lang.management.ManagementFactory#getPlatformMBeanServer()}.

      +

      Model MBeans

      -

      Application code can also create a new MBean Server, or - access already-created MBean Servers, using the {@link - javax.management.MBeanServerFactory MBeanServerFactory} class.

      +

      A Model MBean is a kind of Dynamic MBean that acts + as a bridge between the management interface and the + underlying managed resource. Both the management interface and + the managed resource are specified as Java objects. The same + Model MBean implementation can be reused many times with + different management interfaces and managed resources, and it can + provide common functionality such as persistence and caching. + Model MBeans are defined by the package + + javax.management.modelmbean.

      -

      Creating MBeans in the MBean Server

      +

      MBean Server

      -

      There are two ways to create an MBean. One is to construct a - Java object that will be the MBean, then use the {@link - javax.management.MBeanServer#registerMBean registerMBean} - method to register it in the MBean Server. The other is to - create and register the MBean in a single operation using one - of the {@link javax.management.MBeanServer#createMBean(String, - javax.management.ObjectName) createMBean} methods.

      +

      To be useful, an MBean must be registered in an MBean + Server. An MBean Server is a repository of MBeans. + Usually the only access to the MBeans is through the MBean + Server. In other words, code no longer accesses the Java + object implementing the MBean directly, but instead accesses + the MBean by name through the MBean Server. Each MBean has a + unique name within the MBean Server, defined by the {@link + javax.management.ObjectName ObjectName} class.

      -

      The registerMBean method is simpler for local - use, but cannot be used remotely. The - createMBean method can be used remotely, but - sometimes requires attention to class loading issues.

      +

      An MBean Server is an object implementing the interface + {@link javax.management.MBeanServer MBeanServer}. + The most convenient MBean Server to use is the + Platform MBean Server. This is a + single MBean Server that can be shared by different managed + components running within the same Java Virtual Machine. The + Platform MBean Server is accessed with the method {@link + java.lang.management.ManagementFactory#getPlatformMBeanServer()}.

      -

      An MBean can perform actions when it is registered in or - unregistered from an MBean Server if it implements the {@link - javax.management.MBeanRegistration MBeanRegistration} - interface.

      +

      Application code can also create a new MBean Server, or + access already-created MBean Servers, using the {@link + javax.management.MBeanServerFactory MBeanServerFactory} class.

      -

      Accessing MBeans in the MBean Server

      +

      Creating MBeans in the MBean Server

      -

      Given an ObjectName name and an - MBeanServer mbs, you can access - attributes and operations as in this example:

      +

      There are two ways to create an MBean. One is to construct a + Java object that will be the MBean, then use the {@link + javax.management.MBeanServer#registerMBean registerMBean} + method to register it in the MBean Server. The other is to + create and register the MBean in a single operation using one + of the {@link javax.management.MBeanServer#createMBean(String, + javax.management.ObjectName) createMBean} methods.

      -
      +        

      The registerMBean method is simpler for local + use, but cannot be used remotely. The + createMBean method can be used remotely, but + sometimes requires attention to class loading issues.

      + +

      An MBean can perform actions when it is registered in or + unregistered from an MBean Server if it implements the {@link + javax.management.MBeanRegistration MBeanRegistration} + interface.

      + + +

      Accessing MBeans in the MBean Server

      + +

      Given an ObjectName name and an + MBeanServer mbs, you can access + attributes and operations as in this example:

      + +
           int cacheSize = mbs.getAttribute(name, "CacheSize");
           {@link javax.management.Attribute Attribute} newCacheSize =
           	new Attribute("CacheSize", new Integer(2000));
      @@ -236,9 +277,9 @@ have any questions.
           mbs.invoke(name, "save", new Object[0], new Class[0]);
             
      -

      Alternatively, if you have a Java interface that corresponds - to the management interface for the MBean, you can use an - MBean proxy like this:

      +

      Alternatively, if you have a Java interface that + corresponds to the management interface for the MBean, you can use an + MBean proxy like this:

           ConfigurationMBean conf =
      @@ -264,66 +305,116 @@ have any questions.
       	perform the query.

      -

      Notifications

      +

      MBean lifecycle and resource injection

      -

      A notification is an instance of the {@link - javax.management.Notification Notification} class or a - subclass. In addition to its Java class, it has a - type string that can distinguish it from other - notifications of the same class.

      +

      An MBean can implement the {@link javax.management.MBeanRegistration + MBeanRegistration} interface in order to be told when it is registered + and unregistered in the MBean Server. Additionally, the {@link + javax.management.MBeanRegistration#preRegister preRegister} method + allows the MBean to get a reference to the MBeanServer + object and to get its ObjectName within the MBean + Server.

      -

      An MBean that will emit notifications must implement the - {@link javax.management.NotificationBroadcaster - NotificationBroadcaster} or {@link - javax.management.NotificationEmitter NotificationEmitter} - interface. Usually, it does this by subclassing {@link - javax.management.NotificationBroadcasterSupport - NotificationBroadcasterSupport} or by delegating to an instance - of that class.

      - -

      Notifications can be received by a listener, which - is an object that implements the {@link - javax.management.NotificationListener NotificationListener} - interface. You can add a listener to an MBean with the method - {@link - javax.management.MBeanServer#addNotificationListener(ObjectName, - NotificationListener, NotificationFilter, Object)}. - You can optionally supply a filter to this method, to - select only notifications of interest. A filter is an object - that implements the {@link javax.management.NotificationFilter - NotificationFilter} interface.

      - -

      An MBean can be a listener for notifications emitted by other - MBeans in the same MBean Server. In this case, it implements - {@link javax.management.NotificationListener - NotificationListener} and the method {@link - javax.management.MBeanServer#addNotificationListener(ObjectName, - ObjectName, NotificationFilter, Object)} is used to listen.

      +

      If the only reason to implement MBeanRegistration is to + discover the MBeanServer and ObjectName, resource injection may be + more convenient.

      -

      Remote Access to MBeans

      +

      Notifications

      -

      An MBean Server can be accessed remotely through a - connector. A connector allows a remote Java - application to access an MBean Server in essentially the same - way as a local one. The package - - javax.management.remote defines connectors.

      +

      A notification is an instance of the {@link + javax.management.Notification Notification} class or a + subclass. In addition to its Java class, it has a + type string that can distinguish it from other + notifications of the same class.

      -

      The JMX specification also defines the notion of an - adaptor. An adaptor translates between requests in a - protocol such as SNMP or HTML and accesses to an MBean Server. - So for example an SNMP GET operation might result in a - getAttribute on the MBean Server.

      +

      If an MBean is to emit notifications, it must do one of two things.

      -

      - @see - Java SE 6 Platform documentation on JMX technology - in particular the - - JMX Specification, version 1.4(pdf). +

        +
      • It can implement the interface {@link + javax.management.NotificationEmitter NotificationEmitter} (or + its parent {@link javax.management.NotificationBroadcaster + NotificationBroadcaster}), usually by subclassing + {@link javax.management.NotificationBroadcasterSupport + NotificationBroadcasterSupport} or delegating to an instance of + that class.
      • +
      • It can use resource + injection to obtain a {@link javax.management.SendNotification + SendNotification} object that it can use to send + notifications.
      • +
      - @since 1.5 +

      The two classes below illustrate these two techniques:

      + +
      +    // Implementing NotificationEmitter (via NotificationBroadcasterSupport)
      +    public class Configuration extends NotificationBroadcasterSupport
      +            implements ConfigurationMBean {
      +        ...
      +        private void updated() {
      +            Notification n = new Notification(...);
      +            {@link javax.management.NotificationBroadcasterSupport#sendNotification
      +            sendNotification}(n);
      +        }
      +    }
      +
      +    // Getting a SendNotification through resource injection
      +    public class Configuration implements ConfigurationMBean {
      +        @Resource
      +        private volatile SendNotification sender;
      +        ...
      +        private void updated() {
      +            Notification n = new Notification(...);
      +            sender.sendNotification(n);
      +        }
      +    }
      +        
      + + +

      Notifications can be received by a listener, which + is an object that implements the {@link + javax.management.NotificationListener NotificationListener} + interface. You can add a listener to an MBean with the method + {@link + javax.management.MBeanServer#addNotificationListener(ObjectName, + NotificationListener, NotificationFilter, Object)}. + You can optionally supply a filter to this method, to + select only notifications of interest. A filter is an object + that implements the {@link javax.management.NotificationFilter + NotificationFilter} interface.

      + +

      An MBean can be a listener for notifications emitted by other + MBeans in the same MBean Server. In this case, it implements + {@link javax.management.NotificationListener + NotificationListener} and the method {@link + javax.management.MBeanServer#addNotificationListener(ObjectName, + ObjectName, NotificationFilter, Object)} is used to listen.

      + + +

      Remote Access to MBeans

      + +

      An MBean Server can be accessed remotely through a + connector. A connector allows a remote Java + application to access an MBean Server in essentially the same + way as a local one. The package + + javax.management.remote defines connectors.

      + +

      The JMX specification also defines the notion of an + adaptor. An adaptor translates between requests in a + protocol such as SNMP or HTML and accesses to an MBean Server. + So for example an SNMP GET operation might result in a + getAttribute on the MBean Server.

      + +

      + @see + Java SE 6 Platform documentation on JMX technology + in particular the + + JMX Specification, version 1.4(pdf). + + @since 1.5 diff --git a/jdk/src/share/classes/javax/management/relation/RelationNotification.java b/jdk/src/share/classes/javax/management/relation/RelationNotification.java index 70d3ba7e791..54a8dfdff49 100644 --- a/jdk/src/share/classes/javax/management/relation/RelationNotification.java +++ b/jdk/src/share/classes/javax/management/relation/RelationNotification.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/relation/RelationService.java b/jdk/src/share/classes/javax/management/relation/RelationService.java index 79ed35a1977..5950aafa573 100644 --- a/jdk/src/share/classes/javax/management/relation/RelationService.java +++ b/jdk/src/share/classes/javax/management/relation/RelationService.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/relation/RelationSupport.java b/jdk/src/share/classes/javax/management/relation/RelationSupport.java index 24a40514ba4..ed0958e9b4a 100644 --- a/jdk/src/share/classes/javax/management/relation/RelationSupport.java +++ b/jdk/src/share/classes/javax/management/relation/RelationSupport.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/remote/JMXConnectorFactory.java b/jdk/src/share/classes/javax/management/remote/JMXConnectorFactory.java index 07b766741dd..23003f007c5 100644 --- a/jdk/src/share/classes/javax/management/remote/JMXConnectorFactory.java +++ b/jdk/src/share/classes/javax/management/remote/JMXConnectorFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/remote/JMXConnectorServerFactory.java b/jdk/src/share/classes/javax/management/remote/JMXConnectorServerFactory.java index 0ea7aa66251..a641f3c98d9 100644 --- a/jdk/src/share/classes/javax/management/remote/JMXConnectorServerFactory.java +++ b/jdk/src/share/classes/javax/management/remote/JMXConnectorServerFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/remote/JMXServiceURL.java b/jdk/src/share/classes/javax/management/remote/JMXServiceURL.java index 349f1752ad6..f2b19c5ef0b 100644 --- a/jdk/src/share/classes/javax/management/remote/JMXServiceURL.java +++ b/jdk/src/share/classes/javax/management/remote/JMXServiceURL.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it 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 e5bb512f231..2f5f234eac1 100644 --- a/jdk/src/share/classes/javax/management/remote/rmi/RMIConnector.java +++ b/jdk/src/share/classes/javax/management/remote/rmi/RMIConnector.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it 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 8ad0cfbb95e..28015461b2b 100644 --- a/jdk/src/share/classes/javax/management/remote/rmi/RMIConnectorServer.java +++ b/jdk/src/share/classes/javax/management/remote/rmi/RMIConnectorServer.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/management/timer/Timer.java b/jdk/src/share/classes/javax/management/timer/Timer.java index d0dfa4cdc15..ea4d0b24a2a 100644 --- a/jdk/src/share/classes/javax/management/timer/Timer.java +++ b/jdk/src/share/classes/javax/management/timer/Timer.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/print/attribute/standard/ReferenceUriSchemesSupported.java b/jdk/src/share/classes/javax/print/attribute/standard/ReferenceUriSchemesSupported.java index bb2e2d93fc3..4fdc34c3207 100644 --- a/jdk/src/share/classes/javax/print/attribute/standard/ReferenceUriSchemesSupported.java +++ b/jdk/src/share/classes/javax/print/attribute/standard/ReferenceUriSchemesSupported.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/rmi/ssl/SslRMIClientSocketFactory.java b/jdk/src/share/classes/javax/rmi/ssl/SslRMIClientSocketFactory.java index 9d266fac861..b21d8607106 100644 --- a/jdk/src/share/classes/javax/rmi/ssl/SslRMIClientSocketFactory.java +++ b/jdk/src/share/classes/javax/rmi/ssl/SslRMIClientSocketFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/rmi/ssl/SslRMIServerSocketFactory.java b/jdk/src/share/classes/javax/rmi/ssl/SslRMIServerSocketFactory.java index 802e1668b86..4ea12445010 100644 --- a/jdk/src/share/classes/javax/rmi/ssl/SslRMIServerSocketFactory.java +++ b/jdk/src/share/classes/javax/rmi/ssl/SslRMIServerSocketFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/security/auth/kerberos/KeyImpl.java b/jdk/src/share/classes/javax/security/auth/kerberos/KeyImpl.java index 6fcffbdeecc..a91f3925267 100644 --- a/jdk/src/share/classes/javax/security/auth/kerberos/KeyImpl.java +++ b/jdk/src/share/classes/javax/security/auth/kerberos/KeyImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/security/cert/X509Certificate.java b/jdk/src/share/classes/javax/security/cert/X509Certificate.java index 14ccaffaffd..c411d307577 100644 --- a/jdk/src/share/classes/javax/security/cert/X509Certificate.java +++ b/jdk/src/share/classes/javax/security/cert/X509Certificate.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/DebugGraphicsInfo.java b/jdk/src/share/classes/javax/swing/DebugGraphicsInfo.java index 635be42475e..f9e6c72a984 100644 --- a/jdk/src/share/classes/javax/swing/DebugGraphicsInfo.java +++ b/jdk/src/share/classes/javax/swing/DebugGraphicsInfo.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/JEditorPane.java b/jdk/src/share/classes/javax/swing/JEditorPane.java index c126fe70c01..4d70cacb7b2 100644 --- a/jdk/src/share/classes/javax/swing/JEditorPane.java +++ b/jdk/src/share/classes/javax/swing/JEditorPane.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/JFileChooser.java b/jdk/src/share/classes/javax/swing/JFileChooser.java index 8a2b2d5393f..4a213df6273 100644 --- a/jdk/src/share/classes/javax/swing/JFileChooser.java +++ b/jdk/src/share/classes/javax/swing/JFileChooser.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -770,7 +770,8 @@ public class JFileChooser extends JComponent implements Accessible { * @since 1.4 */ protected JDialog createDialog(Component parent) throws HeadlessException { - String title = getUI().getDialogTitle(this); + FileChooserUI ui = getUI(); + String title = ui.getDialogTitle(this); putClientProperty(AccessibleContext.ACCESSIBLE_DESCRIPTION_PROPERTY, title); @@ -794,6 +795,7 @@ public class JFileChooser extends JComponent implements Accessible { dialog.getRootPane().setWindowDecorationStyle(JRootPane.FILE_CHOOSER_DIALOG); } } + dialog.getRootPane().setDefaultButton(ui.getDefaultButton(this)); dialog.pack(); dialog.setLocationRelativeTo(parent); diff --git a/jdk/src/share/classes/javax/swing/JInternalFrame.java b/jdk/src/share/classes/javax/swing/JInternalFrame.java index 67d39b0cbb7..c3e3cad1c11 100644 --- a/jdk/src/share/classes/javax/swing/JInternalFrame.java +++ b/jdk/src/share/classes/javax/swing/JInternalFrame.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/JOptionPane.java b/jdk/src/share/classes/javax/swing/JOptionPane.java index 130d9f666a0..0e2f528470a 100644 --- a/jdk/src/share/classes/javax/swing/JOptionPane.java +++ b/jdk/src/share/classes/javax/swing/JOptionPane.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/JPopupMenu.java b/jdk/src/share/classes/javax/swing/JPopupMenu.java index b1cdd7db6af..83aec9a17b3 100644 --- a/jdk/src/share/classes/javax/swing/JPopupMenu.java +++ b/jdk/src/share/classes/javax/swing/JPopupMenu.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,6 +41,7 @@ import javax.swing.plaf.PopupMenuUI; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicComboPopup; import javax.swing.event.*; +import sun.security.util.SecurityConstants; import java.applet.Applet; @@ -320,17 +321,67 @@ public class JPopupMenu extends JComponent implements Accessible,MenuElement { * This adustment may be cancelled by invoking the application with * -Djavax.swing.adjustPopupLocationToFit=false */ - Point adjustPopupLocationToFitScreen(int xposition, int yposition) { - Point p = new Point(xposition, yposition); + Point adjustPopupLocationToFitScreen(int xPosition, int yPosition) { + Point popupLocation = new Point(xPosition, yPosition); - if(popupPostionFixDisabled == true || GraphicsEnvironment.isHeadless()) - return p; + if(popupPostionFixDisabled == true || GraphicsEnvironment.isHeadless()) { + return popupLocation; + } + // Get screen bounds + Rectangle scrBounds; + GraphicsConfiguration gc = getCurrentGraphicsConfiguration(popupLocation); Toolkit toolkit = Toolkit.getDefaultToolkit(); - Rectangle screenBounds; + if(gc != null) { + // If we have GraphicsConfiguration use it to get screen bounds + scrBounds = gc.getBounds(); + } else { + // If we don't have GraphicsConfiguration use primary screen + scrBounds = new Rectangle(toolkit.getScreenSize()); + } + + // Calculate the screen size that popup should fit + Dimension popupSize = JPopupMenu.this.getPreferredSize(); + int popupRightX = popupLocation.x + popupSize.width; + int popupBottomY = popupLocation.y + popupSize.height; + int scrWidth = scrBounds.width; + int scrHeight = scrBounds.height; + if (!canPopupOverlapTaskBar()) { + // Insets include the task bar. Take them into account. + Insets scrInsets = toolkit.getScreenInsets(gc); + scrBounds.x += scrInsets.left; + scrBounds.y += scrInsets.top; + scrWidth -= scrInsets.left + scrInsets.right; + scrHeight -= scrInsets.top + scrInsets.bottom; + } + int scrRightX = scrBounds.x + scrWidth; + int scrBottomY = scrBounds.y + scrHeight; + + // Ensure that popup menu fits the screen + if (popupRightX > scrRightX) { + popupLocation.x = scrRightX - popupSize.width; + if( popupLocation.x < scrBounds.x ) { + popupLocation.x = scrBounds.x ; + } + } + if (popupBottomY > scrBottomY) { + popupLocation.y = scrBottomY - popupSize.height; + if( popupLocation.y < scrBounds.y ) { + popupLocation.y = scrBounds.y; + } + } + + return popupLocation; + } + + /** + * Tries to find GraphicsConfiguration + * that contains the mouse cursor position. + * Can return null. + */ + private GraphicsConfiguration getCurrentGraphicsConfiguration( + Point popupLocation) { GraphicsConfiguration gc = null; - // Try to find GraphicsConfiguration, that includes mouse - // pointer position GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] gd = ge.getScreenDevices(); @@ -338,50 +389,36 @@ public class JPopupMenu extends JComponent implements Accessible,MenuElement { if(gd[i].getType() == GraphicsDevice.TYPE_RASTER_SCREEN) { GraphicsConfiguration dgc = gd[i].getDefaultConfiguration(); - if(dgc.getBounds().contains(p)) { + if(dgc.getBounds().contains(popupLocation)) { gc = dgc; break; } } } - // If not found and we have invoker, ask invoker about his gc if(gc == null && getInvoker() != null) { gc = getInvoker().getGraphicsConfiguration(); } + return gc; + } - if(gc != null) { - // If we have GraphicsConfiguration use it to get - // screen bounds - screenBounds = gc.getBounds(); - } else { - // If we don't have GraphicsConfiguration use primary screen - screenBounds = new Rectangle(toolkit.getScreenSize()); + /** + * Checks that there are enough security permissions + * to make popup "always on top", which allows to show it above the task bar. + */ + static boolean canPopupOverlapTaskBar() { + boolean result = true; + try { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) { + sm.checkPermission( + SecurityConstants.SET_WINDOW_ALWAYS_ON_TOP_PERMISSION); + } + } catch (SecurityException se) { + // There is no permission to show popups over the task bar + result = false; } - - Dimension size; - - size = JPopupMenu.this.getPreferredSize(); - - // Use long variables to prevent overflow - long pw = (long) p.x + (long) size.width; - long ph = (long) p.y + (long) size.height; - - if( pw > screenBounds.x + screenBounds.width ) - p.x = screenBounds.x + screenBounds.width - size.width; - - if( ph > screenBounds.y + screenBounds.height) - p.y = screenBounds.y + screenBounds.height - size.height; - - /* Change is made to the desired (X,Y) values, when the - PopupMenu is too tall OR too wide for the screen - */ - if( p.x < screenBounds.x ) - p.x = screenBounds.x ; - if( p.y < screenBounds.y ) - p.y = screenBounds.y; - - return p; + return result; } diff --git a/jdk/src/share/classes/javax/swing/JProgressBar.java b/jdk/src/share/classes/javax/swing/JProgressBar.java index 68a6322c39a..b1d27c8cd02 100644 --- a/jdk/src/share/classes/javax/swing/JProgressBar.java +++ b/jdk/src/share/classes/javax/swing/JProgressBar.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/JScrollBar.java b/jdk/src/share/classes/javax/swing/JScrollBar.java index 2136fe62975..5897fd6fad8 100644 --- a/jdk/src/share/classes/javax/swing/JScrollBar.java +++ b/jdk/src/share/classes/javax/swing/JScrollBar.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/JSlider.java b/jdk/src/share/classes/javax/swing/JSlider.java index e1a7909b073..ea2b510be1d 100644 --- a/jdk/src/share/classes/javax/swing/JSlider.java +++ b/jdk/src/share/classes/javax/swing/JSlider.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,18 +25,15 @@ package javax.swing; -import javax.swing.border.*; import javax.swing.event.*; import javax.swing.plaf.*; import javax.accessibility.*; import java.io.Serializable; import java.io.ObjectOutputStream; -import java.io.ObjectInputStream; import java.io.IOException; -import java.awt.Color; -import java.awt.Font; +import java.awt.*; import java.util.*; import java.beans.*; @@ -409,8 +406,7 @@ public class JSlider extends JComponent implements SwingConstants, Accessible { * @since 1.4 */ public ChangeListener[] getChangeListeners() { - return (ChangeListener[])listenerList.getListeners( - ChangeListener.class); + return listenerList.getListeners(ChangeListener.class); } @@ -642,9 +638,7 @@ public class JSlider extends JComponent implements SwingConstants, Accessible { /** * Sets the model's {@code valueIsAdjusting} property. Slider look and * feel implementations should set this property to {@code true} when - * a knob drag begins, and to {@code false} when the drag ends. The - * slider model will not generate {@code ChangeEvent}s while - * {@code valueIsAdjusting} is {@code true}. + * a knob drag begins, and to {@code false} when the drag ends. * * @param b the new value for the {@code valueIsAdjusting} property * @see #getValueIsAdjusting @@ -764,6 +758,33 @@ public class JSlider extends JComponent implements SwingConstants, Accessible { updateLabelSizes(); } + /** + * {@inheritDoc} + * @since 1.7 + */ + public boolean imageUpdate(Image img, int infoflags, int x, int y, int w, int h) { + if (!isShowing()) { + return false; + } + + // Check that there is a label with such image + Enumeration elements = labelTable.elements(); + + while (elements.hasMoreElements()) { + Component component = (Component) elements.nextElement(); + + if (component instanceof JLabel) { + JLabel label = (JLabel) component; + + if (SwingUtilities.doesIconReferenceImage(label.getIcon(), img) || + SwingUtilities.doesIconReferenceImage(label.getDisabledIcon(), img)) { + return super.imageUpdate(img, infoflags, x, y, w, h); + } + } + } + + return false; + } /** * Returns the dictionary of what labels to draw at which values. @@ -826,17 +847,16 @@ public class JSlider extends JComponent implements SwingConstants, Accessible { * @see JComponent#updateUI */ protected void updateLabelUIs() { - if ( getLabelTable() == null ) { + Dictionary labelTable = getLabelTable(); + + if (labelTable == null) { return; } - Enumeration labels = getLabelTable().keys(); + Enumeration labels = labelTable.keys(); while ( labels.hasMoreElements() ) { - Object value = getLabelTable().get( labels.nextElement() ); - if ( value instanceof JComponent ) { - JComponent component = (JComponent)value; - component.updateUI(); - component.setSize( component.getPreferredSize() ); - } + JComponent component = (JComponent) labelTable.get(labels.nextElement()); + component.updateUI(); + component.setSize(component.getPreferredSize()); } } @@ -845,11 +865,8 @@ public class JSlider extends JComponent implements SwingConstants, Accessible { if (labelTable != null) { Enumeration labels = labelTable.elements(); while (labels.hasMoreElements()) { - Object value = labels.nextElement(); - if (value instanceof JComponent) { - JComponent component = (JComponent)value; - component.setSize(component.getPreferredSize()); - } + JComponent component = (JComponent) labels.nextElement(); + component.setSize(component.getPreferredSize()); } } } @@ -960,14 +977,14 @@ public class JSlider extends JComponent implements SwingConstants, Accessible { if ( e.getPropertyName().equals( "minimum" ) || e.getPropertyName().equals( "maximum" ) ) { - Enumeration keys = getLabelTable().keys(); - Object key = null; + Dictionary labelTable = getLabelTable(); + Enumeration keys = labelTable.keys(); Hashtable hashtable = new Hashtable(); // Save the labels that were added by the developer while ( keys.hasMoreElements() ) { - key = keys.nextElement(); - Object value = getLabelTable().get( key ); + Object key = keys.nextElement(); + Object value = labelTable.get(key); if ( !(value instanceof LabelUIResource) ) { hashtable.put( key, value ); } @@ -979,7 +996,7 @@ public class JSlider extends JComponent implements SwingConstants, Accessible { // Add the saved labels keys = hashtable.keys(); while ( keys.hasMoreElements() ) { - key = keys.nextElement(); + Object key = keys.nextElement(); put( key, hashtable.get( key ) ); } @@ -996,8 +1013,10 @@ public class JSlider extends JComponent implements SwingConstants, Accessible { SmartHashtable table = new SmartHashtable( increment, start ); - if ( getLabelTable() != null && (getLabelTable() instanceof PropertyChangeListener) ) { - removePropertyChangeListener( (PropertyChangeListener)getLabelTable() ); + Dictionary labelTable = getLabelTable(); + + if (labelTable != null && (labelTable instanceof PropertyChangeListener)) { + removePropertyChangeListener((PropertyChangeListener) labelTable); } addPropertyChangeListener( table ); diff --git a/jdk/src/share/classes/javax/swing/JSplitPane.java b/jdk/src/share/classes/javax/swing/JSplitPane.java index d96a7ee7445..1e38b9f8b63 100644 --- a/jdk/src/share/classes/javax/swing/JSplitPane.java +++ b/jdk/src/share/classes/javax/swing/JSplitPane.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/JTable.java b/jdk/src/share/classes/javax/swing/JTable.java index 62485a1c925..976cb813093 100644 --- a/jdk/src/share/classes/javax/swing/JTable.java +++ b/jdk/src/share/classes/javax/swing/JTable.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/JTextArea.java b/jdk/src/share/classes/javax/swing/JTextArea.java index ad311900f74..539071c0ccc 100644 --- a/jdk/src/share/classes/javax/swing/JTextArea.java +++ b/jdk/src/share/classes/javax/swing/JTextArea.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/JTextPane.java b/jdk/src/share/classes/javax/swing/JTextPane.java index c820f512d7e..efb339bd59f 100644 --- a/jdk/src/share/classes/javax/swing/JTextPane.java +++ b/jdk/src/share/classes/javax/swing/JTextPane.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/MenuSelectionManager.java b/jdk/src/share/classes/javax/swing/MenuSelectionManager.java index aec83c9ab19..8e1f36a3aa0 100644 --- a/jdk/src/share/classes/javax/swing/MenuSelectionManager.java +++ b/jdk/src/share/classes/javax/swing/MenuSelectionManager.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/Popup.java b/jdk/src/share/classes/javax/swing/Popup.java index a6373f87b16..2b55aadcf62 100644 --- a/jdk/src/share/classes/javax/swing/Popup.java +++ b/jdk/src/share/classes/javax/swing/Popup.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/PopupFactory.java b/jdk/src/share/classes/javax/swing/PopupFactory.java index 86b737750dd..f9c3c0dd5d7 100644 --- a/jdk/src/share/classes/javax/swing/PopupFactory.java +++ b/jdk/src/share/classes/javax/swing/PopupFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -548,47 +548,46 @@ public class PopupFactory { } /** - * Returns true if the Popup can fit on the screen. + * Returns true if popup can fit the screen and the owner's top parent. + * It determines can popup be lightweight or mediumweight. */ boolean fitsOnScreen() { + boolean result = false; Component component = getComponent(); - if (owner != null && component != null) { - Container parent; - int width = component.getWidth(); - int height = component.getHeight(); - for(parent = owner.getParent(); parent != null ; - parent = parent.getParent()) { - if (parent instanceof JFrame || - parent instanceof JDialog || - parent instanceof JWindow) { + Container parent = (Container) SwingUtilities.getRoot(owner); + int popupWidth = component.getWidth(); + int popupHeight = component.getHeight(); + Rectangle parentBounds = parent.getBounds(); + if (parent instanceof JFrame || + parent instanceof JDialog || + parent instanceof JWindow) { - Rectangle r = parent.getBounds(); - Insets i = parent.getInsets(); - r.x += i.left; - r.y += i.top; - r.width -= (i.left + i.right); - r.height -= (i.top + i.bottom); + Insets i = parent.getInsets(); + parentBounds.x += i.left; + parentBounds.y += i.top; + parentBounds.width -= i.left + i.right; + parentBounds.height -= i.top + i.bottom; - GraphicsConfiguration gc = parent.getGraphicsConfiguration(); + if (JPopupMenu.canPopupOverlapTaskBar()) { + GraphicsConfiguration gc = + parent.getGraphicsConfiguration(); Rectangle popupArea = getContainerPopupArea(gc); - return r.intersection(popupArea).contains(x, y, width, height); - - } else if (parent instanceof JApplet) { - Rectangle r = parent.getBounds(); - Point p = parent.getLocationOnScreen(); - - r.x = p.x; - r.y = p.y; - return r.contains(x, y, width, height); - } else if (parent instanceof Window || - parent instanceof Applet) { - // No suitable swing component found - break; + result = parentBounds.intersection(popupArea) + .contains(x, y, popupWidth, popupHeight); + } else { + result = parentBounds + .contains(x, y, popupWidth, popupHeight); } + } else if (parent instanceof JApplet) { + Point p = parent.getLocationOnScreen(); + parentBounds.x = p.x; + parentBounds.y = p.y; + result = parentBounds + .contains(x, y, popupWidth, popupHeight); } } - return false; + return result; } Rectangle getContainerPopupArea(GraphicsConfiguration gc) { diff --git a/jdk/src/share/classes/javax/swing/ScrollPaneLayout.java b/jdk/src/share/classes/javax/swing/ScrollPaneLayout.java index ed769a92937..1106e339685 100644 --- a/jdk/src/share/classes/javax/swing/ScrollPaneLayout.java +++ b/jdk/src/share/classes/javax/swing/ScrollPaneLayout.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/SpinnerNumberModel.java b/jdk/src/share/classes/javax/swing/SpinnerNumberModel.java index fb8521b16f4..e8771dd11b6 100644 --- a/jdk/src/share/classes/javax/swing/SpinnerNumberModel.java +++ b/jdk/src/share/classes/javax/swing/SpinnerNumberModel.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/TablePrintable.java b/jdk/src/share/classes/javax/swing/TablePrintable.java index 864b550b3c8..c5831ea051a 100644 --- a/jdk/src/share/classes/javax/swing/TablePrintable.java +++ b/jdk/src/share/classes/javax/swing/TablePrintable.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/filechooser/FileSystemView.java b/jdk/src/share/classes/javax/swing/filechooser/FileSystemView.java index a3773ab09e1..855a357575e 100644 --- a/jdk/src/share/classes/javax/swing/filechooser/FileSystemView.java +++ b/jdk/src/share/classes/javax/swing/filechooser/FileSystemView.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/plaf/FileChooserUI.java b/jdk/src/share/classes/javax/swing/plaf/FileChooserUI.java index 78064e08efc..6910a8b671a 100644 --- a/jdk/src/share/classes/javax/swing/plaf/FileChooserUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/FileChooserUI.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,7 @@ package javax.swing.plaf; -import javax.swing.JFileChooser; +import javax.swing.*; import javax.swing.filechooser.FileFilter; import javax.swing.filechooser.FileView; import java.io.File; @@ -46,4 +46,15 @@ public abstract class FileChooserUI extends ComponentUI public abstract void rescanCurrentDirectory(JFileChooser fc); public abstract void ensureFileIsVisible(JFileChooser fc, File f); + + /** + * Returns default button for current LookAndFeel. + * JFileChooser will use this button as default button + * for dialog windows. + * + * @since 1.7 + */ + public JButton getDefaultButton(JFileChooser fc) { + return null; + } } diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicButtonUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicButtonUI.java index d6ad0643c1e..6802c9d81bf 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicButtonUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicButtonUI.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicDirectoryModel.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicDirectoryModel.java index 06b4dc5b6e4..52877839218 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicDirectoryModel.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicDirectoryModel.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -196,7 +196,7 @@ public class BasicDirectoryModel extends AbstractListModel implements PropertyCh } protected void sort(Vector v){ - ShellFolder.sortFiles(v); + ShellFolder.sort(v); } // Obsolete - not used diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java index 5a9daae328d..467db5a1bb7 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -384,6 +384,10 @@ public class BasicFileChooserUI extends FileChooserUI { return null; } + public JButton getDefaultButton(JFileChooser fc) { + return getApproveButton(fc); + } + public String getApproveButtonToolTipText(JFileChooser fc) { String tooltipText = fc.getApproveButtonToolTipText(); if(tooltipText != null) { diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicLookAndFeel.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicLookAndFeel.java index df078dbf606..e0d139f48ef 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicLookAndFeel.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicLookAndFeel.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicMenuItemUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicMenuItemUI.java index c56a1b49d39..85f56a52cd9 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicMenuItemUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicMenuItemUI.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicOptionPaneUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicOptionPaneUI.java index 5ad6c2b92df..4a226a282e9 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicOptionPaneUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicOptionPaneUI.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java index c1aada74441..1d16e1d8893 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,25 +25,12 @@ package javax.swing.plaf.basic; -import java.awt.Component; -import java.awt.Container; -import java.awt.Adjustable; import java.awt.event.*; -import java.awt.FontMetrics; -import java.awt.Graphics; -import java.awt.Dimension; -import java.awt.Rectangle; -import java.awt.Point; -import java.awt.Insets; -import java.awt.Color; -import java.awt.IllegalComponentStateException; -import java.awt.Polygon; +import java.awt.*; import java.beans.*; import java.util.Dictionary; import java.util.Enumeration; -import javax.swing.border.AbstractBorder; - import javax.swing.*; import javax.swing.event.*; import javax.swing.plaf.*; @@ -409,7 +396,7 @@ public class BasicSliderUI extends SliderUI{ Enumeration elements = dictionary.elements(); int baseline = -1; while (elements.hasMoreElements()) { - Component label = (Component)elements.nextElement(); + JComponent label = (JComponent) elements.nextElement(); Dimension pref = label.getPreferredSize(); int labelBaseline = label.getBaseline(pref.width, pref.height); @@ -634,7 +621,7 @@ public class BasicSliderUI extends SliderUI{ protected void calculateTrackRect() { - int centerSpacing = 0; // used to center sliders added using BorderLayout.CENTER (bug 4275631) + int centerSpacing; // used to center sliders added using BorderLayout.CENTER (bug 4275631) if ( slider.getOrientation() == JSlider.HORIZONTAL ) { centerSpacing = thumbRect.height; if ( slider.getPaintTicks() ) centerSpacing += getTickLength(); @@ -764,7 +751,7 @@ public class BasicSliderUI extends SliderUI{ if ( dictionary != null ) { Enumeration keys = dictionary.keys(); while ( keys.hasMoreElements() ) { - Component label = (Component)dictionary.get( keys.nextElement() ); + JComponent label = (JComponent) dictionary.get(keys.nextElement()); widest = Math.max( label.getPreferredSize().width, widest ); } } @@ -777,7 +764,7 @@ public class BasicSliderUI extends SliderUI{ if ( dictionary != null ) { Enumeration keys = dictionary.keys(); while ( keys.hasMoreElements() ) { - Component label = (Component)dictionary.get( keys.nextElement() ); + JComponent label = (JComponent) dictionary.get(keys.nextElement()); tallest = Math.max( label.getPreferredSize().height, tallest ); } } @@ -1001,22 +988,14 @@ public class BasicSliderUI extends SliderUI{ public void paintTicks(Graphics g) { Rectangle tickBounds = tickRect; - int i; - int maj, min, max; - int w = tickBounds.width; - int h = tickBounds.height; - int centerEffect, tickHeight; g.setColor(DefaultLookup.getColor(slider, this, "Slider.tickColor", Color.black)); - maj = slider.getMajorTickSpacing(); - min = slider.getMinorTickSpacing(); - if ( slider.getOrientation() == JSlider.HORIZONTAL ) { g.translate( 0, tickBounds.y); int value = slider.getMinimum(); - int xPos = 0; + int xPos; if ( slider.getMinorTickSpacing() > 0 ) { while ( value <= slider.getMaximum() ) { @@ -1042,7 +1021,7 @@ public class BasicSliderUI extends SliderUI{ g.translate(tickBounds.x, 0); int value = slider.getMinimum(); - int yPos = 0; + int yPos; if ( slider.getMinorTickSpacing() > 0 ) { int offset = 0; @@ -1111,10 +1090,19 @@ public class BasicSliderUI extends SliderUI{ Integer key = (Integer)keys.nextElement(); int value = key.intValue(); if (value >= minValue && value <= maxValue) { - Component label = (Component)dictionary.get( key ); - if (label instanceof JComponent) { - ((JComponent)label).setEnabled(enabled); + JComponent label = (JComponent) dictionary.get(key); + label.setEnabled(enabled); + + if (label instanceof JLabel) { + Icon icon = label.isEnabled() ? ((JLabel) label).getIcon() : ((JLabel) label).getDisabledIcon(); + + if (icon instanceof ImageIcon) { + // Register Slider as an image observer. It allows to catch notifications about + // image changes (e.g. gif animation) + Toolkit.getDefaultToolkit().checkImage(((ImageIcon) icon).getImage(), -1, -1, slider); + } } + if ( slider.getOrientation() == JSlider.HORIZONTAL ) { g.translate( 0, labelBounds.y ); paintHorizontalLabel( g, value, label ); @@ -1364,7 +1352,7 @@ public class BasicSliderUI extends SliderUI{ int min = slider.getMinimum(); int max = slider.getMaximum(); double valueRange = (double)max - (double)min; - double pixelsPerValue = (double)trackHeight / (double)valueRange; + double pixelsPerValue = (double)trackHeight / valueRange; int trackBottom = trackY + (trackHeight - 1); int yPosition; @@ -1715,7 +1703,7 @@ public class BasicSliderUI extends SliderUI{ * of the thumb relative to the origin of the track. */ public void mouseDragged(MouseEvent e) { - int thumbMiddle = 0; + int thumbMiddle; if (!slider.isEnabled()) { return; @@ -1841,7 +1829,7 @@ public class BasicSliderUI extends SliderUI{ public void componentResized(ComponentEvent e) { getHandler().componentResized(e); } - }; + } /** * Focus-change listener. @@ -1903,7 +1891,7 @@ public class BasicSliderUI extends SliderUI{ return b; } - }; + } /** diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicTabbedPaneUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTabbedPaneUI.java index 2d0873cfcd2..29919d50475 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicTabbedPaneUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTabbedPaneUI.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicToolBarUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicToolBarUI.java index e039d1b425b..061dd31b4ed 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicToolBarUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicToolBarUI.java @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/plaf/metal/MetalIconFactory.java b/jdk/src/share/classes/javax/swing/plaf/metal/MetalIconFactory.java index 72c2230d1e2..c7da086d466 100644 --- a/jdk/src/share/classes/javax/swing/plaf/metal/MetalIconFactory.java +++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalIconFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/plaf/metal/MetalLookAndFeel.java b/jdk/src/share/classes/javax/swing/plaf/metal/MetalLookAndFeel.java index d1f7c05935d..f0084d9f162 100644 --- a/jdk/src/share/classes/javax/swing/plaf/metal/MetalLookAndFeel.java +++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalLookAndFeel.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -853,9 +853,7 @@ public class MetalLookAndFeel extends BasicLookAndFeel "ESCAPE", "cancelSelection", "F2", "editFileName", "F5", "refresh", - "BACK_SPACE", "Go Up", - "ENTER", "approveSelection", - "ctrl ENTER", "approveSelection" + "BACK_SPACE", "Go Up" }), diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthArrowButton.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthArrowButton.java index dd703d0b517..33adfc53170 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthArrowButton.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthArrowButton.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopPaneUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopPaneUI.java index e41fead8add..b793f2b380f 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopPaneUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopPaneUI.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthSliderUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSliderUI.java index 0cf5ed22648..58fb5370977 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthSliderUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSliderUI.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,26 +25,17 @@ package javax.swing.plaf.synth; -import java.awt.Component; -import java.awt.Container; -import java.awt.Adjustable; import java.awt.event.*; import java.awt.Graphics; import java.awt.Dimension; -import java.awt.Font; import java.awt.FontMetrics; import java.awt.Rectangle; import java.awt.Point; import java.awt.Insets; -import java.awt.Color; -import java.awt.IllegalComponentStateException; -import java.awt.Polygon; import java.beans.*; import java.util.Dictionary; import java.util.Enumeration; -import javax.swing.border.AbstractBorder; import javax.swing.*; -import javax.swing.event.*; import javax.swing.plaf.*; import javax.swing.plaf.basic.BasicSliderUI; import sun.swing.plaf.synth.SynthUI; @@ -203,8 +194,7 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, centerY += valueHeight + 2; centerY += trackHeight + trackInsets.top + trackInsets.bottom; centerY += tickHeight + 2; - Component label = (Component)slider.getLabelTable(). - elements().nextElement(); + JComponent label = (JComponent) slider.getLabelTable().elements().nextElement(); Dimension pref = label.getPreferredSize(); return centerY + label.getBaseline(pref.width, pref.height); } @@ -226,8 +216,7 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, int trackHeight = contentHeight - valueHeight; int yPosition = yPositionForValue(value.intValue(), trackY, trackHeight); - Component label = (Component)slider.getLabelTable(). - get(value); + JComponent label = (JComponent) slider.getLabelTable().get(value); Dimension pref = label.getPreferredSize(); return yPosition - pref.height / 2 + label.getBaseline(pref.width, pref.height); @@ -434,16 +423,14 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, /** * Calculates the pad for the label at the specified index. * - * @param index index of the label to calculate pad for. + * @param i index of the label to calculate pad for. * @return padding required to keep label visible. */ private int getPadForLabel(int i) { - Dictionary dictionary = slider.getLabelTable(); int pad = 0; - Object o = dictionary.get(i); - if (o != null) { - Component c = (Component)o; + JComponent c = (JComponent) slider.getLabelTable().get(i); + if (c != null) { int centerX = xPositionForValue(i); int cHalfWidth = c.getPreferredSize().width / 2; if (centerX - cHalfWidth < insetCache.left) { @@ -500,8 +487,6 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, } } - private static Rectangle unionRect = new Rectangle(); - public void setThumbLocation(int x, int y) { super.setThumbLocation(x, y); // Value rect is tied to the thumb location. We need to repaint when @@ -544,7 +529,7 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, trackBorder; int trackLength = trackBottom - trackTop; double valueRange = (double)max - (double)min; - double pixelsPerValue = (double)trackLength / (double)valueRange; + double pixelsPerValue = (double)trackLength / valueRange; int yPosition; if (!drawInverted()) { @@ -802,8 +787,7 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, } public void mouseDragged(MouseEvent e) { - SynthScrollBarUI ui; - int thumbMiddle = 0; + int thumbMiddle; if (!slider.isEnabled()) { return; diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthSplitPaneUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSplitPaneUI.java index ddbc7ae7e69..00f5d955f97 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthSplitPaneUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSplitPaneUI.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/doc-files/synth.dtd b/jdk/src/share/classes/javax/swing/plaf/synth/doc-files/synth.dtd index 9188d43e2d4..0d5dee69720 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/doc-files/synth.dtd +++ b/jdk/src/share/classes/javax/swing/plaf/synth/doc-files/synth.dtd @@ -2,7 +2,7 @@ U+FF9F + // and their native equivalents in Code page 932 run + // sequentially from 0xa1 --> 0xdf + + for (int lsByte = 0x61 ; lsByte <= 0x9F; lsByte++, offset++) { + testChars[0] = (char) (lsByte | 0xFF00); + String s = new String(testChars); + testBytes = s.getBytes(encoding); + if ( testBytes[0] != (byte)(0xa1 + offset)) + throw new Exception("failed Test"); + } + } +} diff --git a/jdk/test/sun/nio/cs/ISCIITest.java b/jdk/test/sun/nio/cs/ISCIITest.java new file mode 100644 index 00000000000..48235cee39f --- /dev/null +++ b/jdk/test/sun/nio/cs/ISCIITest.java @@ -0,0 +1,350 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 4328178 + @summary Performs baseline and regression test on the ISCII91 charset + */ + +import java.io.*; + +public class ISCIITest { + + private static void failureReport() { + System.err.println ("Failed ISCII91 Regression Test"); + } + + private static void mapEquiv(int start, + int end, + String testName) + throws Exception + { + byte[] singleByte = new byte[1]; + byte[] encoded = new byte[1]; + + for (int i = start; i <= end; i++ ) { + singleByte[0] = (byte) i; + try { + String unicodeStr = + new String (singleByte,"ISCII91"); + + if (i != (int)unicodeStr.charAt(0)) { + System.err.println ("FAILED ISCII91 Regression test" + + "input byte is " + i ); + throw new Exception(""); + } + encoded = unicodeStr.getBytes("ISCII91"); + + if (encoded[0] != singleByte[0]) { + System.err.println("Encoding error " + testName); + throw new Exception("Failed ISCII91 Regression test"); + } + + } catch (UnsupportedEncodingException e) { + failureReport(); + } + } + return; + } + + private static void checkUnmapped(int start, + int end, + String testName) + throws Exception { + + byte[] singleByte = new byte[1]; + + for (int i = start; i <= end; i++ ) { + singleByte[0] = (byte) i; + try { + String unicodeStr = new String (singleByte, "ISCII91"); + + if (unicodeStr.charAt(0) != '\uFFFD') { + System.err.println("FAILED " + testName + + "input byte is " + i ); + throw new Exception ("Failed ISCII91 regression test"); + } + } catch (UnsupportedEncodingException e) { + System.err.println("Unsupported character encoding"); + } + } + return; + } + + /* + * + */ + private static void checkRange(int start, int end, + char[] expectChars, + String testName) + throws Exception { + byte[] singleByte = new byte[1]; + byte[] encoded = new byte[1]; + int lookupOffset = 0; + + for (int i=start; i <= end; i++ ) { + singleByte[0] = (byte) i; + String unicodeStr = new String (singleByte, "ISCII91"); + if (unicodeStr.charAt(0) != expectChars[lookupOffset++]) { + throw new Exception ("Failed ISCII91 Regression Test"); + } + encoded = unicodeStr.getBytes("ISCII"); + } + return; + } + + /* + * Tests the ISCII91 Indic character encoding + * as per IS 13194:1991 Bureau of Indian Standards. + */ + + private static void test () throws Exception { + + try { + + + // ISCII91 is an 8-byte encoding which retains the ASCII + // mappings in the lower half. + + mapEquiv(0, 0x7f, "7 bit ASCII range"); + + // Checks a range of characters which are unmappable according + // to the standards. + + checkUnmapped(0x81, 0x9f, "UNMAPPED"); + + // Vowel Modifier chars can be used to modify the vowel + // sound of the preceding consonant, vowel or matra character. + + byte[] testByte = new byte[1]; + char[] vowelModChars = { + '\u0901', // Vowel modifier Chandrabindu + '\u0902', // Vowel modifier Anuswar + '\u0903' // Vowel modifier Visarg + }; + + checkRange(0xa1, 0xa3, vowelModChars, "INDIC VOWEL MODIFIER CHARS"); + + char[] expectChars = { + '\u0905', // a4 -- Vowel A + '\u0906', // a5 -- Vowel AA + '\u0907', // a6 -- Vowel I + '\u0908', // a7 -- Vowel II + '\u0909', // a8 -- Vowel U + '\u090a', // a9 -- Vowel UU + '\u090b', // aa -- Vowel RI + '\u090e', // ab -- Vowel E ( Southern Scripts ) + '\u090f', // ac -- Vowel EY + '\u0910', // ad -- Vowel AI + '\u090d', // ae -- Vowel AYE ( Devanagari Script ) + '\u0912', // af -- Vowel O ( Southern Scripts ) + '\u0913', // b0 -- Vowel OW + '\u0914', // b1 -- Vowel AU + '\u0911', // b2 -- Vowel AWE ( Devanagari Script ) + }; + + checkRange(0xa4, 0xb2, expectChars, "INDIC VOWELS"); + + char[] expectConsChars = + { + '\u0915', // b3 -- Consonant KA + '\u0916', // b4 -- Consonant KHA + '\u0917', // b5 -- Consonant GA + '\u0918', // b6 -- Consonant GHA + '\u0919', // b7 -- Consonant NGA + '\u091a', // b8 -- Consonant CHA + '\u091b', // b9 -- Consonant CHHA + '\u091c', // ba -- Consonant JA + '\u091d', // bb -- Consonant JHA + '\u091e', // bc -- Consonant JNA + '\u091f', // bd -- Consonant Hard TA + '\u0920', // be -- Consonant Hard THA + '\u0921', // bf -- Consonant Hard DA + '\u0922', // c0 -- Consonant Hard DHA + '\u0923', // c1 -- Consonant Hard NA + '\u0924', // c2 -- Consonant Soft TA + '\u0925', // c3 -- Consonant Soft THA + '\u0926', // c4 -- Consonant Soft DA + '\u0927', // c5 -- Consonant Soft DHA + '\u0928', // c6 -- Consonant Soft NA + '\u0929', // c7 -- Consonant NA ( Tamil ) + '\u092a', // c8 -- Consonant PA + '\u092b', // c9 -- Consonant PHA + '\u092c', // ca -- Consonant BA + '\u092d', // cb -- Consonant BHA + '\u092e', // cc -- Consonant MA + '\u092f', // cd -- Consonant YA + '\u095f', // ce -- Consonant JYA ( Bengali, Assamese & Oriya ) + '\u0930', // cf -- Consonant RA + '\u0931', // d0 -- Consonant Hard RA ( Southern Scripts ) + '\u0932', // d1 -- Consonant LA + '\u0933', // d2 -- Consonant Hard LA + '\u0934', // d3 -- Consonant ZHA ( Tamil & Malayalam ) + '\u0935', // d4 -- Consonant VA + '\u0936', // d5 -- Consonant SHA + '\u0937', // d6 -- Consonant Hard SHA + '\u0938', // d7 -- Consonant SA + '\u0939', // d8 -- Consonant HA + }; + + checkRange(0xb3, 0xd8, expectConsChars, "INDIC CONSONANTS"); + + char[] matraChars = { + '\u093e', // da -- Vowel Sign AA + '\u093f', // db -- Vowel Sign I + '\u0940', // dc -- Vowel Sign II + '\u0941', // dd -- Vowel Sign U + '\u0942', // de -- Vowel Sign UU + '\u0943', // df -- Vowel Sign RI + '\u0946', // e0 -- Vowel Sign E ( Southern Scripts ) + '\u0947', // e1 -- Vowel Sign EY + '\u0948', // e2 -- Vowel Sign AI + '\u0945', // e3 -- Vowel Sign AYE ( Devanagari Script ) + '\u094a', // e4 -- Vowel Sign O ( Southern Scripts ) + '\u094b', // e5 -- Vowel Sign OW + '\u094c', // e6 -- Vowel Sign AU + '\u0949' // e7 -- Vowel Sign AWE ( Devanagari Script ) + }; + + // Matras or Vowel signs alter the implicit + // vowel sound associated with an Indic consonant. + + checkRange(0xda, 0xe7, matraChars, "INDIC MATRAS"); + + char[] loneContextModifierChars = { + '\u094d', // e8 -- Vowel Omission Sign ( Halant ) + '\u093c', // e9 -- Diacritic Sign ( Nukta ) + '\u0964' // ea -- Full Stop ( Viram, Northern Scripts ) + }; + + checkRange(0xe8, 0xea, + loneContextModifierChars, "LONE INDIC CONTEXT CHARS"); + + + // Test Indic script numeral chars + // (as opposed to international numerals) + + char[] expectNumeralChars = + { + '\u0966', // f1 -- Digit 0 + '\u0967', // f2 -- Digit 1 + '\u0968', // f3 -- Digit 2 + '\u0969', // f4 -- Digit 3 + '\u096a', // f5 -- Digit 4 + '\u096b', // f6 -- Digit 5 + '\u096c', // f7 -- Digit 6 + '\u096d', // f8 -- Digit 7 + '\u096e', // f9 -- Digit 8 + '\u096f' // fa -- Digit 9 + }; + + checkRange(0xf1, 0xfa, + expectNumeralChars, "NUMERAL/DIGIT CHARACTERS"); + int lookupOffset = 0; + + char[] expectNuktaSub = { + '\u0950', + '\u090c', + '\u0961', + '\u0960', + '\u0962', + '\u0963', + '\u0944', + '\u093d' + }; + + /* + * ISCII uses a number of code extension techniques + * to access a number of lesser used characters. + * The Nukta character which ordinarily signifies + * a diacritic is used in combination with existing + * characters to escape them to a different character. + * value. + */ + + byte[] codeExtensionBytes = { + (byte)0xa1 , (byte)0xe9, // Chandrabindu + Nukta + // =>DEVANAGARI OM SIGN + (byte)0xa6 , (byte)0xe9, // Vowel I + Nukta + // => DEVANAGARI VOCALIC L + (byte)0xa7 , (byte)0xe9, // Vowel II + Nukta + // => DEVANAGARI VOCALIC LL + (byte)0xaa , (byte)0xe9, // Vowel RI + Nukta + // => DEVANAGARI VOCALIC RR + (byte)0xdb , (byte)0xe9, // Vowel sign I + Nukta + // => DEVANAGARI VOWEL SIGN VOCALIC L + (byte)0xdc , (byte)0xe9, // Vowel sign II + Nukta + // => DEVANAGARI VOWEL SIGN VOCALIC LL + + (byte)0xdf , (byte)0xe9, // Vowel sign Vocalic R + Nukta + // => DEVANAGARI VOWEL SIGN VOCALIC RR + (byte)0xea , (byte)0xe9 // Full stop/Phrase separator + Nukta + // => DEVANAGARI SIGN AVAGRAHA + }; + + lookupOffset = 0; + byte[] bytePair = new byte[2]; + + for (int i=0; i < (codeExtensionBytes.length)/2; i++ ) { + bytePair[0] = (byte) codeExtensionBytes[lookupOffset++]; + bytePair[1] = (byte) codeExtensionBytes[lookupOffset++]; + + String unicodeStr = new String (bytePair,"ISCII91"); + if (unicodeStr.charAt(0) != expectNuktaSub[i]) { + throw new Exception("Failed Nukta Sub"); + } + } + + lookupOffset = 0; + byte[] comboBytes = { + (byte)0xe8 , (byte)0xe8, //HALANT + HALANT + (byte)0xe8 , (byte)0xe9 //HALANT + NUKTA aka. Soft Halant + }; + char[] expectCombChars = { + '\u094d', + '\u200c', + '\u094d', + '\u200d' + }; + + for (int i=0; i < (comboBytes.length)/2; i++ ) { + bytePair[0] = (byte) comboBytes[lookupOffset++]; + bytePair[1] = (byte) comboBytes[lookupOffset]; + String unicodeStr = new String (bytePair, "ISCII91"); + if (unicodeStr.charAt(0) != expectCombChars[lookupOffset-1] + && unicodeStr.charAt(1) != expectCombChars[lookupOffset]) { + throw new Exception("Failed ISCII91 Regression Test"); + } + lookupOffset++; + } + + } catch (UnsupportedEncodingException e) { + System.err.println ("ISCII91 encoding not supported"); + throw new Exception ("Failed ISCII91 Regression Test"); + } + } + + public static void main (String[] args) throws Exception { + test(); + } +} diff --git a/jdk/test/sun/nio/cs/ISO2022JP.trailEsc b/jdk/test/sun/nio/cs/ISO2022JP.trailEsc new file mode 100644 index 00000000000..0709a69194d --- /dev/null +++ b/jdk/test/sun/nio/cs/ISO2022JP.trailEsc @@ -0,0 +1,454 @@ +test0 + $B!!(B $B!"(B $B!#(B $B!$(B $B!%(B $B!&(B $B!'(B $B!((B $B!)(B $B!*(B $B!+(B $B!,(B $B!-(B $B!.(B $B!/(B +$B!0(B $B!1(B $B!2(B $B!3(B $B!4(B $B!5(B $B!6(B $B!7(B $B!8(B $B!9(B $B!:(B $B!;(B $B!<(B $B!=(B $B!>(B $B!?(B + $B!A(B $B!B(B $B!C(B $B!D(B $B!E(B $B!F(B $B!G(B $B!H(B $B!I(B $B!J(B $B!K(B $B!L(B $B!M(B $B!N(B $B!O(B +$B!P(B $B!Q(B $B!R(B $B!S(B $B!T(B $B!U(B $B!V(B $B!W(B $B!X(B $B!Y(B $B!Z(B $B![(B $B!\(B $B!](B $B!^(B $B!_(B +$B!`(B $B!a(B $B!b(B $B!c(B $B!d(B $B!e(B $B!f(B $B!g(B $B!h(B $B!i(B $B!j(B $B!k(B $B!l(B $B!m(B $B!n(B $B!o(B +$B!p(B $B!q(B $B!r(B $B!s(B $B!t(B $B!u(B $B!v(B $B!w(B $B!x(B $B!y(B $B!z(B $B!{(B $B!|(B $B!}(B $B!~(B + $B"!(B $B""(B $B"#(B $B"$(B $B"%(B $B"&(B $B"'(B $B"((B $B")(B $B"*(B $B"+(B $B",(B $B"-(B $B".(B + $B":(B $B";(B $B"<(B $B"=(B $B">(B $B"?(B +$B"@(B $B"A(B $B"J(B $B"K(B $B"L(B $B"M(B $B"N(B $B"O(B +$B"P(B $B"\(B $B"](B $B"^(B $B"_(B +$B"`(B $B"a(B $B"b(B $B"c(B $B"d(B $B"e(B $B"f(B $B"g(B $B"h(B $B"i(B $B"j(B + $B"r(B $B"s(B $B"t(B $B"u(B $B"v(B $B"w(B $B"x(B $B"y(B $B"~(B +$B#0(B $B#1(B $B#2(B $B#3(B $B#4(B $B#5(B $B#6(B $B#7(B $B#8(B $B#9(B + $B#A(B $B#B(B $B#C(B $B#D(B $B#E(B $B#F(B $B#G(B $B#H(B $B#I(B $B#J(B $B#K(B $B#L(B $B#M(B $B#N(B $B#O(B +$B#P(B $B#Q(B $B#R(B $B#S(B $B#T(B $B#U(B $B#V(B $B#W(B $B#X(B $B#Y(B $B#Z(B + $B#a(B $B#b(B $B#c(B $B#d(B $B#e(B $B#f(B $B#g(B $B#h(B $B#i(B $B#j(B $B#k(B $B#l(B $B#m(B $B#n(B $B#o(B +$B#p(B $B#q(B $B#r(B $B#s(B $B#t(B $B#u(B $B#v(B $B#w(B $B#x(B $B#y(B $B#z(B + $B$!(B $B$"(B $B$#(B $B$$(B $B$%(B $B$&(B $B$'(B $B$((B $B$)(B $B$*(B $B$+(B $B$,(B $B$-(B $B$.(B $B$/(B +$B$0(B $B$1(B $B$2(B $B$3(B $B$4(B $B$5(B $B$6(B $B$7(B $B$8(B $B$9(B $B$:(B $B$;(B $B$<(B $B$=(B $B$>(B $B$?(B +$B$@(B $B$A(B $B$B(B $B$C(B $B$D(B $B$E(B $B$F(B $B$G(B $B$H(B $B$I(B $B$J(B $B$K(B $B$L(B $B$M(B $B$N(B $B$O(B +$B$P(B $B$Q(B $B$R(B $B$S(B $B$T(B $B$U(B $B$V(B $B$W(B $B$X(B $B$Y(B $B$Z(B $B$[(B $B$\(B $B$](B $B$^(B $B$_(B +$B$`(B $B$a(B $B$b(B $B$c(B $B$d(B $B$e(B $B$f(B $B$g(B $B$h(B $B$i(B $B$j(B $B$k(B $B$l(B $B$m(B $B$n(B $B$o(B +$B$p(B $B$q(B $B$r(B $B$s(B + $B%!(B $B%"(B $B%#(B $B%$(B $B%%(B $B%&(B $B%'(B $B%((B $B%)(B $B%*(B $B%+(B $B%,(B $B%-(B $B%.(B $B%/(B +$B%0(B $B%1(B $B%2(B $B%3(B $B%4(B $B%5(B $B%6(B $B%7(B $B%8(B $B%9(B $B%:(B $B%;(B $B%<(B $B%=(B $B%>(B $B%?(B +$B%@(B $B%A(B $B%B(B $B%C(B $B%D(B $B%E(B $B%F(B $B%G(B $B%H(B $B%I(B $B%J(B $B%K(B $B%L(B $B%M(B $B%N(B $B%O(B +$B%P(B $B%Q(B $B%R(B $B%S(B $B%T(B $B%U(B $B%V(B $B%W(B $B%X(B $B%Y(B $B%Z(B $B%[(B $B%\(B $B%](B $B%^(B $B%_(B +$B%`(B $B%a(B $B%b(B $B%c(B $B%d(B $B%e(B $B%f(B $B%g(B $B%h(B $B%i(B $B%j(B $B%k(B $B%l(B $B%m(B $B%n(B $B%o(B +$B%p(B $B%q(B $B%r(B $B%s(B $B%t(B $B%u(B $B%v(B + $B&!(B $B&"(B $B&#(B $B&$(B $B&%(B $B&&(B $B&'(B $B&((B $B&)(B $B&*(B $B&+(B $B&,(B $B&-(B $B&.(B $B&/(B +$B&0(B $B&1(B $B&2(B $B&3(B $B&4(B $B&5(B $B&6(B $B&7(B $B&8(B + $B&A(B $B&B(B $B&C(B $B&D(B $B&E(B $B&F(B $B&G(B $B&H(B $B&I(B $B&J(B $B&K(B $B&L(B $B&M(B $B&N(B $B&O(B +$B&P(B $B&Q(B $B&R(B $B&S(B $B&T(B $B&U(B $B&V(B $B&W(B $B&X(B + $B'!(B $B'"(B $B'#(B $B'$(B $B'%(B $B'&(B $B''(B $B'((B $B')(B $B'*(B $B'+(B $B',(B $B'-(B $B'.(B $B'/(B +$B'0(B $B'1(B $B'2(B $B'3(B $B'4(B $B'5(B $B'6(B $B'7(B $B'8(B $B'9(B $B':(B $B';(B $B'<(B $B'=(B $B'>(B $B'?(B +$B'@(B $B'A(B + $B'Q(B $B'R(B $B'S(B $B'T(B $B'U(B $B'V(B $B'W(B $B'X(B $B'Y(B $B'Z(B $B'[(B $B'\(B $B'](B $B'^(B $B'_(B +$B'`(B $B'a(B $B'b(B $B'c(B $B'd(B $B'e(B $B'f(B $B'g(B $B'h(B $B'i(B $B'j(B $B'k(B $B'l(B $B'm(B $B'n(B $B'o(B +$B'p(B $B'q(B + $B(!(B $B("(B $B(#(B $B($(B $B(%(B $B(&(B $B('(B $B(((B $B()(B $B(*(B $B(+(B $B(,(B $B(-(B $B(.(B $B(/(B +$B(0(B $B(1(B $B(2(B $B(3(B $B(4(B $B(5(B $B(6(B $B(7(B $B(8(B $B(9(B $B(:(B $B(;(B $B(<(B $B(=(B $B(>(B $B(?(B +$B(@(B + $B0!(B $B0"(B $B0#(B $B0$(B $B0%(B $B0&(B $B0'(B $B0((B $B0)(B $B0*(B $B0+(B $B0,(B $B0-(B $B0.(B $B0/(B +$B00(B $B01(B $B02(B $B03(B $B04(B $B05(B $B06(B $B07(B $B08(B $B09(B $B0:(B $B0;(B $B0<(B $B0=(B $B0>(B $B0?(B +$B0@(B $B0A(B $B0B(B $B0C(B $B0D(B $B0E(B $B0F(B $B0G(B $B0H(B $B0I(B $B0J(B $B0K(B $B0L(B $B0M(B $B0N(B $B0O(B +$B0P(B $B0Q(B $B0R(B $B0S(B $B0T(B $B0U(B $B0V(B $B0W(B $B0X(B $B0Y(B $B0Z(B $B0[(B $B0\(B $B0](B $B0^(B $B0_(B +$B0`(B $B0a(B $B0b(B $B0c(B $B0d(B $B0e(B $B0f(B $B0g(B $B0h(B $B0i(B $B0j(B $B0k(B $B0l(B $B0m(B $B0n(B $B0o(B +$B0p(B $B0q(B $B0r(B $B0s(B $B0t(B $B0u(B $B0v(B $B0w(B $B0x(B $B0y(B $B0z(B $B0{(B $B0|(B $B0}(B $B0~(B + $B1!(B $B1"(B $B1#(B $B1$(B $B1%(B $B1&(B $B1'(B $B1((B $B1)(B $B1*(B $B1+(B $B1,(B $B1-(B $B1.(B $B1/(B +$B10(B $B11(B $B12(B $B13(B $B14(B $B15(B $B16(B $B17(B $B18(B $B19(B $B1:(B $B1;(B $B1<(B $B1=(B $B1>(B $B1?(B +$B1@(B $B1A(B $B1B(B $B1C(B $B1D(B $B1E(B $B1F(B $B1G(B $B1H(B $B1I(B $B1J(B $B1K(B $B1L(B $B1M(B $B1N(B $B1O(B +$B1P(B $B1Q(B $B1R(B $B1S(B $B1T(B $B1U(B $B1V(B $B1W(B $B1X(B $B1Y(B $B1Z(B $B1[(B $B1\(B $B1](B $B1^(B $B1_(B +$B1`(B $B1a(B $B1b(B $B1c(B $B1d(B $B1e(B $B1f(B $B1g(B $B1h(B $B1i(B $B1j(B $B1k(B $B1l(B $B1m(B $B1n(B $B1o(B +$B1p(B $B1q(B $B1r(B $B1s(B $B1t(B $B1u(B $B1v(B $B1w(B $B1x(B $B1y(B $B1z(B $B1{(B $B1|(B $B1}(B $B1~(B + $B2!(B $B2"(B $B2#(B $B2$(B $B2%(B $B2&(B $B2'(B $B2((B $B2)(B $B2*(B $B2+(B $B2,(B $B2-(B $B2.(B $B2/(B +$B20(B $B21(B $B22(B $B23(B $B24(B $B25(B $B26(B $B27(B $B28(B $B29(B $B2:(B $B2;(B $B2<(B $B2=(B $B2>(B $B2?(B +$B2@(B $B2A(B $B2B(B $B2C(B $B2D(B $B2E(B $B2F(B $B2G(B $B2H(B $B2I(B $B2J(B $B2K(B $B2L(B $B2M(B $B2N(B $B2O(B +$B2P(B $B2Q(B $B2R(B $B2S(B $B2T(B $B2U(B $B2V(B $B2W(B $B2X(B $B2Y(B $B2Z(B $B2[(B $B2\(B $B2](B $B2^(B $B2_(B +$B2`(B $B2a(B $B2b(B $B2c(B $B2d(B $B2e(B $B2f(B $B2g(B $B2h(B $B2i(B $B2j(B $B2k(B $B2l(B $B2m(B $B2n(B $B2o(B +$B2p(B $B2q(B $B2r(B $B2s(B $B2t(B $B2u(B $B2v(B $B2w(B $B2x(B $B2y(B $B2z(B $B2{(B $B2|(B $B2}(B $B2~(B + $B3!(B $B3"(B $B3#(B $B3$(B $B3%(B $B3&(B $B3'(B $B3((B $B3)(B $B3*(B $B3+(B $B3,(B $B3-(B $B3.(B $B3/(B +$B30(B $B31(B $B32(B $B33(B $B34(B $B35(B $B36(B $B37(B $B38(B $B39(B $B3:(B $B3;(B $B3<(B $B3=(B $B3>(B $B3?(B +$B3@(B $B3A(B $B3B(B $B3C(B $B3D(B $B3E(B $B3F(B $B3G(B $B3H(B $B3I(B $B3J(B $B3K(B $B3L(B $B3M(B $B3N(B $B3O(B +$B3P(B $B3Q(B $B3R(B $B3S(B $B3T(B $B3U(B $B3V(B $B3W(B $B3X(B $B3Y(B $B3Z(B $B3[(B $B3\(B $B3](B $B3^(B $B3_(B +$B3`(B $B3a(B $B3b(B $B3c(B $B3d(B $B3e(B $B3f(B $B3g(B $B3h(B $B3i(B $B3j(B $B3k(B $B3l(B $B3m(B $B3n(B $B3o(B +$B3p(B $B3q(B $B3r(B $B3s(B $B3t(B $B3u(B $B3v(B $B3w(B $B3x(B $B3y(B $B3z(B $B3{(B $B3|(B $B3}(B $B3~(B + $B4!(B $B4"(B $B4#(B $B4$(B $B4%(B $B4&(B $B4'(B $B4((B $B4)(B $B4*(B $B4+(B $B4,(B $B4-(B $B4.(B $B4/(B +$B40(B $B41(B $B42(B $B43(B $B44(B $B45(B $B46(B $B47(B $B48(B $B49(B $B4:(B $B4;(B $B4<(B $B4=(B $B4>(B $B4?(B +$B4@(B $B4A(B $B4B(B $B4C(B $B4D(B $B4E(B $B4F(B $B4G(B $B4H(B $B4I(B $B4J(B $B4K(B $B4L(B $B4M(B $B4N(B $B4O(B +$B4P(B $B4Q(B $B4R(B $B4S(B $B4T(B $B4U(B $B4V(B $B4W(B $B4X(B $B4Y(B $B4Z(B $B4[(B $B4\(B $B4](B $B4^(B $B4_(B +$B4`(B $B4a(B $B4b(B $B4c(B $B4d(B $B4e(B $B4f(B $B4g(B $B4h(B $B4i(B $B4j(B $B4k(B $B4l(B $B4m(B $B4n(B $B4o(B +$B4p(B $B4q(B $B4r(B $B4s(B $B4t(B $B4u(B $B4v(B $B4w(B $B4x(B $B4y(B $B4z(B $B4{(B $B4|(B $B4}(B $B4~(B + $B5!(B $B5"(B $B5#(B $B5$(B $B5%(B $B5&(B $B5'(B $B5((B $B5)(B $B5*(B $B5+(B $B5,(B $B5-(B $B5.(B $B5/(B +$B50(B $B51(B $B52(B $B53(B $B54(B $B55(B $B56(B $B57(B $B58(B $B59(B $B5:(B $B5;(B $B5<(B $B5=(B $B5>(B $B5?(B +$B5@(B $B5A(B $B5B(B $B5C(B $B5D(B $B5E(B $B5F(B $B5G(B $B5H(B $B5I(B $B5J(B $B5K(B $B5L(B $B5M(B $B5N(B $B5O(B +$B5P(B $B5Q(B $B5R(B $B5S(B $B5T(B $B5U(B $B5V(B $B5W(B $B5X(B $B5Y(B $B5Z(B $B5[(B $B5\(B $B5](B $B5^(B $B5_(B +$B5`(B $B5a(B $B5b(B $B5c(B $B5d(B $B5e(B $B5f(B $B5g(B $B5h(B $B5i(B $B5j(B $B5k(B $B5l(B $B5m(B $B5n(B $B5o(B +$B5p(B $B5q(B $B5r(B $B5s(B $B5t(B $B5u(B $B5v(B $B5w(B $B5x(B $B5y(B $B5z(B $B5{(B $B5|(B $B5}(B $B5~(B + $B6!(B $B6"(B $B6#(B $B6$(B $B6%(B $B6&(B $B6'(B $B6((B $B6)(B $B6*(B $B6+(B $B6,(B $B6-(B $B6.(B $B6/(B +$B60(B $B61(B $B62(B $B63(B $B64(B $B65(B $B66(B $B67(B $B68(B $B69(B $B6:(B $B6;(B $B6<(B $B6=(B $B6>(B $B6?(B +$B6@(B $B6A(B $B6B(B $B6C(B $B6D(B $B6E(B $B6F(B $B6G(B $B6H(B $B6I(B $B6J(B $B6K(B $B6L(B $B6M(B $B6N(B $B6O(B +$B6P(B $B6Q(B $B6R(B $B6S(B $B6T(B $B6U(B $B6V(B $B6W(B $B6X(B $B6Y(B $B6Z(B $B6[(B $B6\(B $B6](B $B6^(B $B6_(B +$B6`(B $B6a(B $B6b(B $B6c(B $B6d(B $B6e(B $B6f(B $B6g(B $B6h(B $B6i(B $B6j(B $B6k(B $B6l(B $B6m(B $B6n(B $B6o(B +$B6p(B $B6q(B $B6r(B $B6s(B $B6t(B $B6u(B $B6v(B $B6w(B $B6x(B $B6y(B $B6z(B $B6{(B $B6|(B $B6}(B $B6~(B + $B7!(B $B7"(B $B7#(B $B7$(B $B7%(B $B7&(B $B7'(B $B7((B $B7)(B $B7*(B $B7+(B $B7,(B $B7-(B $B7.(B $B7/(B +$B70(B $B71(B $B72(B $B73(B $B74(B $B75(B $B76(B $B77(B $B78(B $B79(B $B7:(B $B7;(B $B7<(B $B7=(B $B7>(B $B7?(B +$B7@(B $B7A(B $B7B(B $B7C(B $B7D(B $B7E(B $B7F(B $B7G(B $B7H(B $B7I(B $B7J(B $B7K(B $B7L(B $B7M(B $B7N(B $B7O(B +$B7P(B $B7Q(B $B7R(B $B7S(B $B7T(B $B7U(B $B7V(B $B7W(B $B7X(B $B7Y(B $B7Z(B $B7[(B $B7\(B $B7](B $B7^(B $B7_(B +$B7`(B $B7a(B $B7b(B $B7c(B $B7d(B $B7e(B $B7f(B $B7g(B $B7h(B $B7i(B $B7j(B $B7k(B $B7l(B $B7m(B $B7n(B $B7o(B +$B7p(B $B7q(B $B7r(B $B7s(B $B7t(B $B7u(B $B7v(B $B7w(B $B7x(B $B7y(B $B7z(B $B7{(B $B7|(B $B7}(B $B7~(B + $B8!(B $B8"(B $B8#(B $B8$(B $B8%(B $B8&(B $B8'(B $B8((B $B8)(B $B8*(B $B8+(B $B8,(B $B8-(B $B8.(B $B8/(B +$B80(B $B81(B $B82(B $B83(B $B84(B $B85(B $B86(B $B87(B $B88(B $B89(B $B8:(B $B8;(B $B8<(B $B8=(B $B8>(B $B8?(B +$B8@(B $B8A(B $B8B(B $B8C(B $B8D(B $B8E(B $B8F(B $B8G(B $B8H(B $B8I(B $B8J(B $B8K(B $B8L(B $B8M(B $B8N(B $B8O(B +$B8P(B $B8Q(B $B8R(B $B8S(B $B8T(B $B8U(B $B8V(B $B8W(B $B8X(B $B8Y(B $B8Z(B $B8[(B $B8\(B $B8](B $B8^(B $B8_(B +$B8`(B $B8a(B $B8b(B $B8c(B $B8d(B $B8e(B $B8f(B $B8g(B $B8h(B $B8i(B $B8j(B $B8k(B $B8l(B $B8m(B $B8n(B $B8o(B +$B8p(B $B8q(B $B8r(B $B8s(B $B8t(B $B8u(B $B8v(B $B8w(B $B8x(B $B8y(B $B8z(B $B8{(B $B8|(B $B8}(B $B8~(B + $B9!(B $B9"(B $B9#(B $B9$(B $B9%(B $B9&(B $B9'(B $B9((B $B9)(B $B9*(B $B9+(B $B9,(B $B9-(B $B9.(B $B9/(B +$B90(B $B91(B $B92(B $B93(B $B94(B $B95(B $B96(B $B97(B $B98(B $B99(B $B9:(B $B9;(B $B9<(B $B9=(B $B9>(B $B9?(B +$B9@(B $B9A(B $B9B(B $B9C(B $B9D(B $B9E(B $B9F(B $B9G(B $B9H(B $B9I(B $B9J(B $B9K(B $B9L(B $B9M(B $B9N(B $B9O(B +$B9P(B $B9Q(B $B9R(B $B9S(B $B9T(B $B9U(B $B9V(B $B9W(B $B9X(B $B9Y(B $B9Z(B $B9[(B $B9\(B $B9](B $B9^(B $B9_(B +$B9`(B $B9a(B $B9b(B $B9c(B $B9d(B $B9e(B $B9f(B $B9g(B $B9h(B $B9i(B $B9j(B $B9k(B $B9l(B $B9m(B $B9n(B $B9o(B +$B9p(B $B9q(B $B9r(B $B9s(B $B9t(B $B9u(B $B9v(B $B9w(B $B9x(B $B9y(B $B9z(B $B9{(B $B9|(B $B9}(B $B9~(B + $B:!(B $B:"(B $B:#(B $B:$(B $B:%(B $B:&(B $B:'(B $B:((B $B:)(B $B:*(B $B:+(B $B:,(B $B:-(B $B:.(B $B:/(B +$B:0(B $B:1(B $B:2(B $B:3(B $B:4(B $B:5(B $B:6(B $B:7(B $B:8(B $B:9(B $B::(B $B:;(B $B:<(B $B:=(B $B:>(B $B:?(B +$B:@(B $B:A(B $B:B(B $B:C(B $B:D(B $B:E(B $B:F(B $B:G(B $B:H(B $B:I(B $B:J(B $B:K(B $B:L(B $B:M(B $B:N(B $B:O(B +$B:P(B $B:Q(B $B:R(B $B:S(B $B:T(B $B:U(B $B:V(B $B:W(B $B:X(B $B:Y(B $B:Z(B $B:[(B $B:\(B $B:](B $B:^(B $B:_(B +$B:`(B $B:a(B $B:b(B $B:c(B $B:d(B $B:e(B $B:f(B $B:g(B $B:h(B $B:i(B $B:j(B $B:k(B $B:l(B $B:m(B $B:n(B $B:o(B +$B:p(B $B:q(B $B:r(B $B:s(B $B:t(B $B:u(B $B:v(B $B:w(B $B:x(B $B:y(B $B:z(B $B:{(B $B:|(B $B:}(B $B:~(B + $B;!(B $B;"(B $B;#(B $B;$(B $B;%(B $B;&(B $B;'(B $B;((B $B;)(B $B;*(B $B;+(B $B;,(B $B;-(B $B;.(B $B;/(B +$B;0(B $B;1(B $B;2(B $B;3(B $B;4(B $B;5(B $B;6(B $B;7(B $B;8(B $B;9(B $B;:(B $B;;(B $B;<(B $B;=(B $B;>(B $B;?(B +$B;@(B $B;A(B $B;B(B $B;C(B $B;D(B $B;E(B $B;F(B $B;G(B $B;H(B $B;I(B $B;J(B $B;K(B $B;L(B $B;M(B $B;N(B $B;O(B +$B;P(B $B;Q(B $B;R(B $B;S(B $B;T(B $B;U(B $B;V(B $B;W(B $B;X(B $B;Y(B $B;Z(B $B;[(B $B;\(B $B;](B $B;^(B $B;_(B +$B;`(B $B;a(B $B;b(B $B;c(B $B;d(B $B;e(B $B;f(B $B;g(B $B;h(B $B;i(B $B;j(B $B;k(B $B;l(B $B;m(B $B;n(B $B;o(B +$B;p(B $B;q(B $B;r(B $B;s(B $B;t(B $B;u(B $B;v(B $B;w(B $B;x(B $B;y(B $B;z(B $B;{(B $B;|(B $B;}(B $B;~(B + $B(B $B(B $B=?(B +$B=@(B $B=A(B $B=B(B $B=C(B $B=D(B $B=E(B $B=F(B $B=G(B $B=H(B $B=I(B $B=J(B $B=K(B $B=L(B $B=M(B $B=N(B $B=O(B +$B=P(B $B=Q(B $B=R(B $B=S(B $B=T(B $B=U(B $B=V(B $B=W(B $B=X(B $B=Y(B $B=Z(B $B=[(B $B=\(B $B=](B $B=^(B $B=_(B +$B=`(B $B=a(B $B=b(B $B=c(B $B=d(B $B=e(B $B=f(B $B=g(B $B=h(B $B=i(B $B=j(B $B=k(B $B=l(B $B=m(B $B=n(B $B=o(B +$B=p(B $B=q(B $B=r(B $B=s(B $B=t(B $B=u(B $B=v(B $B=w(B $B=x(B $B=y(B $B=z(B $B={(B $B=|(B $B=}(B $B=~(B + $B>!(B $B>"(B $B>#(B $B>$(B $B>%(B $B>&(B $B>'(B $B>((B $B>)(B $B>*(B $B>+(B $B>,(B $B>-(B $B>.(B $B>/(B +$B>0(B $B>1(B $B>2(B $B>3(B $B>4(B $B>5(B $B>6(B $B>7(B $B>8(B $B>9(B $B>:(B $B>;(B $B><(B $B>=(B $B>>(B $B>?(B +$B>@(B $B>A(B $B>B(B $B>C(B $B>D(B $B>E(B $B>F(B $B>G(B $B>H(B $B>I(B $B>J(B $B>K(B $B>L(B $B>M(B $B>N(B $B>O(B +$B>P(B $B>Q(B $B>R(B $B>S(B $B>T(B $B>U(B $B>V(B $B>W(B $B>X(B $B>Y(B $B>Z(B $B>[(B $B>\(B $B>](B $B>^(B $B>_(B +$B>`(B $B>a(B $B>b(B $B>c(B $B>d(B $B>e(B $B>f(B $B>g(B $B>h(B $B>i(B $B>j(B $B>k(B $B>l(B $B>m(B $B>n(B $B>o(B +$B>p(B $B>q(B $B>r(B $B>s(B $B>t(B $B>u(B $B>v(B $B>w(B $B>x(B $B>y(B $B>z(B $B>{(B $B>|(B $B>}(B $B>~(B + $B?!(B $B?"(B $B?#(B $B?$(B $B?%(B $B?&(B $B?'(B $B?((B $B?)(B $B?*(B $B?+(B $B?,(B $B?-(B $B?.(B $B?/(B +$B?0(B $B?1(B $B?2(B $B?3(B $B?4(B $B?5(B $B?6(B $B?7(B $B?8(B $B?9(B $B?:(B $B?;(B $B?<(B $B?=(B $B?>(B $B??(B +$B?@(B $B?A(B $B?B(B $B?C(B $B?D(B $B?E(B $B?F(B $B?G(B $B?H(B $B?I(B $B?J(B $B?K(B $B?L(B $B?M(B $B?N(B $B?O(B +$B?P(B $B?Q(B $B?R(B $B?S(B $B?T(B $B?U(B $B?V(B $B?W(B $B?X(B $B?Y(B $B?Z(B $B?[(B $B?\(B $B?](B $B?^(B $B?_(B +$B?`(B $B?a(B $B?b(B $B?c(B $B?d(B $B?e(B $B?f(B $B?g(B $B?h(B $B?i(B $B?j(B $B?k(B $B?l(B $B?m(B $B?n(B $B?o(B +$B?p(B $B?q(B $B?r(B $B?s(B $B?t(B $B?u(B $B?v(B $B?w(B $B?x(B $B?y(B $B?z(B $B?{(B $B?|(B $B?}(B $B?~(B + $B@!(B $B@"(B $B@#(B $B@$(B $B@%(B $B@&(B $B@'(B $B@((B $B@)(B $B@*(B $B@+(B $B@,(B $B@-(B $B@.(B $B@/(B +$B@0(B $B@1(B $B@2(B $B@3(B $B@4(B $B@5(B $B@6(B $B@7(B $B@8(B $B@9(B $B@:(B $B@;(B $B@<(B $B@=(B $B@>(B $B@?(B +$B@@(B $B@A(B $B@B(B $B@C(B $B@D(B $B@E(B $B@F(B $B@G(B $B@H(B $B@I(B $B@J(B $B@K(B $B@L(B $B@M(B $B@N(B $B@O(B +$B@P(B $B@Q(B $B@R(B $B@S(B $B@T(B $B@U(B $B@V(B $B@W(B $B@X(B $B@Y(B $B@Z(B $B@[(B $B@\(B $B@](B $B@^(B $B@_(B +$B@`(B $B@a(B $B@b(B $B@c(B $B@d(B $B@e(B $B@f(B $B@g(B $B@h(B $B@i(B $B@j(B $B@k(B $B@l(B $B@m(B $B@n(B $B@o(B +$B@p(B $B@q(B $B@r(B $B@s(B $B@t(B $B@u(B $B@v(B $B@w(B $B@x(B $B@y(B $B@z(B $B@{(B $B@|(B $B@}(B $B@~(B + $BA!(B $BA"(B $BA#(B $BA$(B $BA%(B $BA&(B $BA'(B $BA((B $BA)(B $BA*(B $BA+(B $BA,(B $BA-(B $BA.(B $BA/(B +$BA0(B $BA1(B $BA2(B $BA3(B $BA4(B $BA5(B $BA6(B $BA7(B $BA8(B $BA9(B $BA:(B $BA;(B $BA<(B $BA=(B $BA>(B $BA?(B +$BA@(B $BAA(B $BAB(B $BAC(B $BAD(B $BAE(B $BAF(B $BAG(B $BAH(B $BAI(B $BAJ(B $BAK(B $BAL(B $BAM(B $BAN(B $BAO(B +$BAP(B $BAQ(B $BAR(B $BAS(B $BAT(B $BAU(B $BAV(B $BAW(B $BAX(B $BAY(B $BAZ(B $BA[(B $BA\(B $BA](B $BA^(B $BA_(B +$BA`(B $BAa(B $BAb(B $BAc(B $BAd(B $BAe(B $BAf(B $BAg(B $BAh(B $BAi(B $BAj(B $BAk(B $BAl(B $BAm(B $BAn(B $BAo(B +$BAp(B $BAq(B $BAr(B $BAs(B $BAt(B $BAu(B $BAv(B $BAw(B $BAx(B $BAy(B $BAz(B $BA{(B $BA|(B $BA}(B $BA~(B + $BB!(B $BB"(B $BB#(B $BB$(B $BB%(B $BB&(B $BB'(B $BB((B $BB)(B $BB*(B $BB+(B $BB,(B $BB-(B $BB.(B $BB/(B +$BB0(B $BB1(B $BB2(B $BB3(B $BB4(B $BB5(B $BB6(B $BB7(B $BB8(B $BB9(B $BB:(B $BB;(B $BB<(B $BB=(B $BB>(B $BB?(B +$BB@(B $BBA(B $BBB(B $BBC(B $BBD(B $BBE(B $BBF(B $BBG(B $BBH(B $BBI(B $BBJ(B $BBK(B $BBL(B $BBM(B $BBN(B $BBO(B +$BBP(B $BBQ(B $BBR(B $BBS(B $BBT(B $BBU(B $BBV(B $BBW(B $BBX(B $BBY(B $BBZ(B $BB[(B $BB\(B $BB](B $BB^(B $BB_(B +$BB`(B $BBa(B $BBb(B $BBc(B $BBd(B $BBe(B $BBf(B $BBg(B $BBh(B $BBi(B $BBj(B $BBk(B $BBl(B $BBm(B $BBn(B $BBo(B +$BBp(B $BBq(B $BBr(B $BBs(B $BBt(B $BBu(B $BBv(B $BBw(B $BBx(B $BBy(B $BBz(B $BB{(B $BB|(B $BB}(B $BB~(B + $BC!(B $BC"(B $BC#(B $BC$(B $BC%(B $BC&(B $BC'(B $BC((B $BC)(B $BC*(B $BC+(B $BC,(B $BC-(B $BC.(B $BC/(B +$BC0(B $BC1(B $BC2(B $BC3(B $BC4(B $BC5(B $BC6(B $BC7(B $BC8(B $BC9(B $BC:(B $BC;(B $BC<(B $BC=(B $BC>(B $BC?(B +$BC@(B $BCA(B $BCB(B $BCC(B $BCD(B $BCE(B $BCF(B $BCG(B $BCH(B $BCI(B $BCJ(B $BCK(B $BCL(B $BCM(B $BCN(B $BCO(B +$BCP(B $BCQ(B $BCR(B $BCS(B $BCT(B $BCU(B $BCV(B $BCW(B $BCX(B $BCY(B $BCZ(B $BC[(B $BC\(B $BC](B $BC^(B $BC_(B +$BC`(B $BCa(B $BCb(B $BCc(B $BCd(B $BCe(B $BCf(B $BCg(B $BCh(B $BCi(B $BCj(B $BCk(B $BCl(B $BCm(B $BCn(B $BCo(B +$BCp(B $BCq(B $BCr(B $BCs(B $BCt(B $BCu(B $BCv(B $BCw(B $BCx(B $BCy(B $BCz(B $BC{(B $BC|(B $BC}(B $BC~(B + $BD!(B $BD"(B $BD#(B $BD$(B $BD%(B $BD&(B $BD'(B $BD((B $BD)(B $BD*(B $BD+(B $BD,(B $BD-(B $BD.(B $BD/(B +$BD0(B $BD1(B $BD2(B $BD3(B $BD4(B $BD5(B $BD6(B $BD7(B $BD8(B $BD9(B $BD:(B $BD;(B $BD<(B $BD=(B $BD>(B $BD?(B +$BD@(B $BDA(B $BDB(B $BDC(B $BDD(B $BDE(B $BDF(B $BDG(B $BDH(B $BDI(B $BDJ(B $BDK(B $BDL(B $BDM(B $BDN(B $BDO(B +$BDP(B $BDQ(B $BDR(B $BDS(B $BDT(B $BDU(B $BDV(B $BDW(B $BDX(B $BDY(B $BDZ(B $BD[(B $BD\(B $BD](B $BD^(B $BD_(B +$BD`(B $BDa(B $BDb(B $BDc(B $BDd(B $BDe(B $BDf(B $BDg(B $BDh(B $BDi(B $BDj(B $BDk(B $BDl(B $BDm(B $BDn(B $BDo(B +$BDp(B $BDq(B $BDr(B $BDs(B $BDt(B $BDu(B $BDv(B $BDw(B $BDx(B $BDy(B $BDz(B $BD{(B $BD|(B $BD}(B $BD~(B + $BE!(B $BE"(B $BE#(B $BE$(B $BE%(B $BE&(B $BE'(B $BE((B $BE)(B $BE*(B $BE+(B $BE,(B $BE-(B $BE.(B $BE/(B +$BE0(B $BE1(B $BE2(B $BE3(B $BE4(B $BE5(B $BE6(B $BE7(B $BE8(B $BE9(B $BE:(B $BE;(B $BE<(B $BE=(B $BE>(B $BE?(B +$BE@(B $BEA(B $BEB(B $BEC(B $BED(B $BEE(B $BEF(B $BEG(B $BEH(B $BEI(B $BEJ(B $BEK(B $BEL(B $BEM(B $BEN(B $BEO(B +$BEP(B $BEQ(B $BER(B $BES(B $BET(B $BEU(B $BEV(B $BEW(B $BEX(B $BEY(B $BEZ(B $BE[(B $BE\(B $BE](B $BE^(B $BE_(B +$BE`(B $BEa(B $BEb(B $BEc(B $BEd(B $BEe(B $BEf(B $BEg(B $BEh(B $BEi(B $BEj(B $BEk(B $BEl(B $BEm(B $BEn(B $BEo(B +$BEp(B $BEq(B $BEr(B $BEs(B $BEt(B $BEu(B $BEv(B $BEw(B $BEx(B $BEy(B $BEz(B $BE{(B $BE|(B $BE}(B $BE~(B + $BF!(B $BF"(B $BF#(B $BF$(B $BF%(B $BF&(B $BF'(B $BF((B $BF)(B $BF*(B $BF+(B $BF,(B $BF-(B $BF.(B $BF/(B +$BF0(B $BF1(B $BF2(B $BF3(B $BF4(B $BF5(B $BF6(B $BF7(B $BF8(B $BF9(B $BF:(B $BF;(B $BF<(B $BF=(B $BF>(B $BF?(B +$BF@(B $BFA(B $BFB(B $BFC(B $BFD(B $BFE(B $BFF(B $BFG(B $BFH(B $BFI(B $BFJ(B $BFK(B $BFL(B $BFM(B $BFN(B $BFO(B +$BFP(B $BFQ(B $BFR(B $BFS(B $BFT(B $BFU(B $BFV(B $BFW(B $BFX(B $BFY(B $BFZ(B $BF[(B $BF\(B $BF](B $BF^(B $BF_(B +$BF`(B $BFa(B $BFb(B $BFc(B $BFd(B $BFe(B $BFf(B $BFg(B $BFh(B $BFi(B $BFj(B $BFk(B $BFl(B $BFm(B $BFn(B $BFo(B +$BFp(B $BFq(B $BFr(B $BFs(B $BFt(B $BFu(B $BFv(B $BFw(B $BFx(B $BFy(B $BFz(B $BF{(B $BF|(B $BF}(B $BF~(B + $BG!(B $BG"(B $BG#(B $BG$(B $BG%(B $BG&(B $BG'(B $BG((B $BG)(B $BG*(B $BG+(B $BG,(B $BG-(B $BG.(B $BG/(B +$BG0(B $BG1(B $BG2(B $BG3(B $BG4(B $BG5(B $BG6(B $BG7(B $BG8(B $BG9(B $BG:(B $BG;(B $BG<(B $BG=(B $BG>(B $BG?(B +$BG@(B $BGA(B $BGB(B $BGC(B $BGD(B $BGE(B $BGF(B $BGG(B $BGH(B $BGI(B $BGJ(B $BGK(B $BGL(B $BGM(B $BGN(B $BGO(B +$BGP(B $BGQ(B $BGR(B $BGS(B $BGT(B $BGU(B $BGV(B $BGW(B $BGX(B $BGY(B $BGZ(B $BG[(B $BG\(B $BG](B $BG^(B $BG_(B +$BG`(B $BGa(B $BGb(B $BGc(B $BGd(B $BGe(B $BGf(B $BGg(B $BGh(B $BGi(B $BGj(B $BGk(B $BGl(B $BGm(B $BGn(B $BGo(B +$BGp(B $BGq(B $BGr(B $BGs(B $BGt(B $BGu(B $BGv(B $BGw(B $BGx(B $BGy(B $BGz(B $BG{(B $BG|(B $BG}(B $BG~(B + $BH!(B $BH"(B $BH#(B $BH$(B $BH%(B $BH&(B $BH'(B $BH((B $BH)(B $BH*(B $BH+(B $BH,(B $BH-(B $BH.(B $BH/(B +$BH0(B $BH1(B $BH2(B $BH3(B $BH4(B $BH5(B $BH6(B $BH7(B $BH8(B $BH9(B $BH:(B $BH;(B $BH<(B $BH=(B $BH>(B $BH?(B +$BH@(B $BHA(B $BHB(B $BHC(B $BHD(B $BHE(B $BHF(B $BHG(B $BHH(B $BHI(B $BHJ(B $BHK(B $BHL(B $BHM(B $BHN(B $BHO(B +$BHP(B $BHQ(B $BHR(B $BHS(B $BHT(B $BHU(B $BHV(B $BHW(B $BHX(B $BHY(B $BHZ(B $BH[(B $BH\(B $BH](B $BH^(B $BH_(B +$BH`(B $BHa(B $BHb(B $BHc(B $BHd(B $BHe(B $BHf(B $BHg(B $BHh(B $BHi(B $BHj(B $BHk(B $BHl(B $BHm(B $BHn(B $BHo(B +$BHp(B $BHq(B $BHr(B $BHs(B $BHt(B $BHu(B $BHv(B $BHw(B $BHx(B $BHy(B $BHz(B $BH{(B $BH|(B $BH}(B $BH~(B + $BI!(B $BI"(B $BI#(B $BI$(B $BI%(B $BI&(B $BI'(B $BI((B $BI)(B $BI*(B $BI+(B $BI,(B $BI-(B $BI.(B $BI/(B +$BI0(B $BI1(B $BI2(B $BI3(B $BI4(B $BI5(B $BI6(B $BI7(B $BI8(B $BI9(B $BI:(B $BI;(B $BI<(B $BI=(B $BI>(B $BI?(B +$BI@(B $BIA(B $BIB(B $BIC(B $BID(B $BIE(B $BIF(B $BIG(B $BIH(B $BII(B $BIJ(B $BIK(B $BIL(B $BIM(B $BIN(B $BIO(B +$BIP(B $BIQ(B $BIR(B $BIS(B $BIT(B $BIU(B $BIV(B $BIW(B $BIX(B $BIY(B $BIZ(B $BI[(B $BI\(B $BI](B $BI^(B $BI_(B +$BI`(B $BIa(B $BIb(B $BIc(B $BId(B $BIe(B $BIf(B $BIg(B $BIh(B $BIi(B $BIj(B $BIk(B $BIl(B $BIm(B $BIn(B $BIo(B +$BIp(B $BIq(B $BIr(B $BIs(B $BIt(B $BIu(B $BIv(B $BIw(B $BIx(B $BIy(B $BIz(B $BI{(B $BI|(B $BI}(B $BI~(B + $BJ!(B $BJ"(B $BJ#(B $BJ$(B $BJ%(B $BJ&(B $BJ'(B $BJ((B $BJ)(B $BJ*(B $BJ+(B $BJ,(B $BJ-(B $BJ.(B $BJ/(B +$BJ0(B $BJ1(B $BJ2(B $BJ3(B $BJ4(B $BJ5(B $BJ6(B $BJ7(B $BJ8(B $BJ9(B $BJ:(B $BJ;(B $BJ<(B $BJ=(B $BJ>(B $BJ?(B +$BJ@(B $BJA(B $BJB(B $BJC(B $BJD(B $BJE(B $BJF(B $BJG(B $BJH(B $BJI(B $BJJ(B $BJK(B $BJL(B $BJM(B $BJN(B $BJO(B +$BJP(B $BJQ(B $BJR(B $BJS(B $BJT(B $BJU(B $BJV(B $BJW(B $BJX(B $BJY(B $BJZ(B $BJ[(B $BJ\(B $BJ](B $BJ^(B $BJ_(B +$BJ`(B $BJa(B $BJb(B $BJc(B $BJd(B $BJe(B $BJf(B $BJg(B $BJh(B $BJi(B $BJj(B $BJk(B $BJl(B $BJm(B $BJn(B $BJo(B +$BJp(B $BJq(B $BJr(B $BJs(B $BJt(B $BJu(B $BJv(B $BJw(B $BJx(B $BJy(B $BJz(B $BJ{(B $BJ|(B $BJ}(B $BJ~(B + $BK!(B $BK"(B $BK#(B $BK$(B $BK%(B $BK&(B $BK'(B $BK((B $BK)(B $BK*(B $BK+(B $BK,(B $BK-(B $BK.(B $BK/(B +$BK0(B $BK1(B $BK2(B $BK3(B $BK4(B $BK5(B $BK6(B $BK7(B $BK8(B $BK9(B $BK:(B $BK;(B $BK<(B $BK=(B $BK>(B $BK?(B +$BK@(B $BKA(B $BKB(B $BKC(B $BKD(B $BKE(B $BKF(B $BKG(B $BKH(B $BKI(B $BKJ(B $BKK(B $BKL(B $BKM(B $BKN(B $BKO(B +$BKP(B $BKQ(B $BKR(B $BKS(B $BKT(B $BKU(B $BKV(B $BKW(B $BKX(B $BKY(B $BKZ(B $BK[(B $BK\(B $BK](B $BK^(B $BK_(B +$BK`(B $BKa(B $BKb(B $BKc(B $BKd(B $BKe(B $BKf(B $BKg(B $BKh(B $BKi(B $BKj(B $BKk(B $BKl(B $BKm(B $BKn(B $BKo(B +$BKp(B $BKq(B $BKr(B $BKs(B $BKt(B $BKu(B $BKv(B $BKw(B $BKx(B $BKy(B $BKz(B $BK{(B $BK|(B $BK}(B $BK~(B + $BL!(B $BL"(B $BL#(B $BL$(B $BL%(B $BL&(B $BL'(B $BL((B $BL)(B $BL*(B $BL+(B $BL,(B $BL-(B $BL.(B $BL/(B +$BL0(B $BL1(B $BL2(B $BL3(B $BL4(B $BL5(B $BL6(B $BL7(B $BL8(B $BL9(B $BL:(B $BL;(B $BL<(B $BL=(B $BL>(B $BL?(B +$BL@(B $BLA(B $BLB(B $BLC(B $BLD(B $BLE(B $BLF(B $BLG(B $BLH(B $BLI(B $BLJ(B $BLK(B $BLL(B $BLM(B $BLN(B $BLO(B +$BLP(B $BLQ(B $BLR(B $BLS(B $BLT(B $BLU(B $BLV(B $BLW(B $BLX(B $BLY(B $BLZ(B $BL[(B $BL\(B $BL](B $BL^(B $BL_(B +$BL`(B $BLa(B $BLb(B $BLc(B $BLd(B $BLe(B $BLf(B $BLg(B $BLh(B $BLi(B $BLj(B $BLk(B $BLl(B $BLm(B $BLn(B $BLo(B +$BLp(B $BLq(B $BLr(B $BLs(B $BLt(B $BLu(B $BLv(B $BLw(B $BLx(B $BLy(B $BLz(B $BL{(B $BL|(B $BL}(B $BL~(B + $BM!(B $BM"(B $BM#(B $BM$(B $BM%(B $BM&(B $BM'(B $BM((B $BM)(B $BM*(B $BM+(B $BM,(B $BM-(B $BM.(B $BM/(B +$BM0(B $BM1(B $BM2(B $BM3(B $BM4(B $BM5(B $BM6(B $BM7(B $BM8(B $BM9(B $BM:(B $BM;(B $BM<(B $BM=(B $BM>(B $BM?(B +$BM@(B $BMA(B $BMB(B $BMC(B $BMD(B $BME(B $BMF(B $BMG(B $BMH(B $BMI(B $BMJ(B $BMK(B $BML(B $BMM(B $BMN(B $BMO(B +$BMP(B $BMQ(B $BMR(B $BMS(B $BMT(B $BMU(B $BMV(B $BMW(B $BMX(B $BMY(B $BMZ(B $BM[(B $BM\(B $BM](B $BM^(B $BM_(B +$BM`(B $BMa(B $BMb(B $BMc(B $BMd(B $BMe(B $BMf(B $BMg(B $BMh(B $BMi(B $BMj(B $BMk(B $BMl(B $BMm(B $BMn(B $BMo(B +$BMp(B $BMq(B $BMr(B $BMs(B $BMt(B $BMu(B $BMv(B $BMw(B $BMx(B $BMy(B $BMz(B $BM{(B $BM|(B $BM}(B $BM~(B + $BN!(B $BN"(B $BN#(B $BN$(B $BN%(B $BN&(B $BN'(B $BN((B $BN)(B $BN*(B $BN+(B $BN,(B $BN-(B $BN.(B $BN/(B +$BN0(B $BN1(B $BN2(B $BN3(B $BN4(B $BN5(B $BN6(B $BN7(B $BN8(B $BN9(B $BN:(B $BN;(B $BN<(B $BN=(B $BN>(B $BN?(B +$BN@(B $BNA(B $BNB(B $BNC(B $BND(B $BNE(B $BNF(B $BNG(B $BNH(B $BNI(B $BNJ(B $BNK(B $BNL(B $BNM(B $BNN(B $BNO(B +$BNP(B $BNQ(B $BNR(B $BNS(B $BNT(B $BNU(B $BNV(B $BNW(B $BNX(B $BNY(B $BNZ(B $BN[(B $BN\(B $BN](B $BN^(B $BN_(B +$BN`(B $BNa(B $BNb(B $BNc(B $BNd(B $BNe(B $BNf(B $BNg(B $BNh(B $BNi(B $BNj(B $BNk(B $BNl(B $BNm(B $BNn(B $BNo(B +$BNp(B $BNq(B $BNr(B $BNs(B $BNt(B $BNu(B $BNv(B $BNw(B $BNx(B $BNy(B $BNz(B $BN{(B $BN|(B $BN}(B $BN~(B + $BO!(B $BO"(B $BO#(B $BO$(B $BO%(B $BO&(B $BO'(B $BO((B $BO)(B $BO*(B $BO+(B $BO,(B $BO-(B $BO.(B $BO/(B +$BO0(B $BO1(B $BO2(B $BO3(B $BO4(B $BO5(B $BO6(B $BO7(B $BO8(B $BO9(B $BO:(B $BO;(B $BO<(B $BO=(B $BO>(B $BO?(B +$BO@(B $BOA(B $BOB(B $BOC(B $BOD(B $BOE(B $BOF(B $BOG(B $BOH(B $BOI(B $BOJ(B $BOK(B $BOL(B $BOM(B $BON(B $BOO(B +$BOP(B $BOQ(B $BOR(B $BOS(B + $BP!(B $BP"(B $BP#(B $BP$(B $BP%(B $BP&(B $BP'(B $BP((B $BP)(B $BP*(B $BP+(B $BP,(B $BP-(B $BP.(B $BP/(B +$BP0(B $BP1(B $BP2(B $BP3(B $BP4(B $BP5(B $BP6(B $BP7(B $BP8(B $BP9(B $BP:(B $BP;(B $BP<(B $BP=(B $BP>(B $BP?(B +$BP@(B $BPA(B $BPB(B $BPC(B $BPD(B $BPE(B $BPF(B $BPG(B $BPH(B $BPI(B $BPJ(B $BPK(B $BPL(B $BPM(B $BPN(B $BPO(B +$BPP(B $BPQ(B $BPR(B $BPS(B $BPT(B $BPU(B $BPV(B $BPW(B $BPX(B $BPY(B $BPZ(B $BP[(B $BP\(B $BP](B $BP^(B $BP_(B +$BP`(B $BPa(B $BPb(B $BPc(B $BPd(B $BPe(B $BPf(B $BPg(B $BPh(B $BPi(B $BPj(B $BPk(B $BPl(B $BPm(B $BPn(B $BPo(B +$BPp(B $BPq(B $BPr(B $BPs(B $BPt(B $BPu(B $BPv(B $BPw(B $BPx(B $BPy(B $BPz(B $BP{(B $BP|(B $BP}(B $BP~(B + $BQ!(B $BQ"(B $BQ#(B $BQ$(B $BQ%(B $BQ&(B $BQ'(B $BQ((B $BQ)(B $BQ*(B $BQ+(B $BQ,(B $BQ-(B $BQ.(B $BQ/(B +$BQ0(B $BQ1(B $BQ2(B $BQ3(B $BQ4(B $BQ5(B $BQ6(B $BQ7(B $BQ8(B $BQ9(B $BQ:(B $BQ;(B $BQ<(B $BQ=(B $BQ>(B $BQ?(B +$BQ@(B $BQA(B $BQB(B $BQC(B $BQD(B $BQE(B $BQF(B $BQG(B $BQH(B $BQI(B $BQJ(B $BQK(B $BQL(B $BQM(B $BQN(B $BQO(B +$BQP(B $BQQ(B $BQR(B $BQS(B $BQT(B $BQU(B $BQV(B $BQW(B $BQX(B $BQY(B $BQZ(B $BQ[(B $BQ\(B $BQ](B $BQ^(B $BQ_(B +$BQ`(B $BQa(B $BQb(B $BQc(B $BQd(B $BQe(B $BQf(B $BQg(B $BQh(B $BQi(B $BQj(B $BQk(B $BQl(B $BQm(B $BQn(B $BQo(B +$BQp(B $BQq(B $BQr(B $BQs(B $BQt(B $BQu(B $BQv(B $BQw(B $BQx(B $BQy(B $BQz(B $BQ{(B $BQ|(B $BQ}(B $BQ~(B + $BR!(B $BR"(B $BR#(B $BR$(B $BR%(B $BR&(B $BR'(B $BR((B $BR)(B $BR*(B $BR+(B $BR,(B $BR-(B $BR.(B $BR/(B +$BR0(B $BR1(B $BR2(B $BR3(B $BR4(B $BR5(B $BR6(B $BR7(B $BR8(B $BR9(B $BR:(B $BR;(B $BR<(B $BR=(B $BR>(B $BR?(B +$BR@(B $BRA(B $BRB(B $BRC(B $BRD(B $BRE(B $BRF(B $BRG(B $BRH(B $BRI(B $BRJ(B $BRK(B $BRL(B $BRM(B $BRN(B $BRO(B +$BRP(B $BRQ(B $BRR(B $BRS(B $BRT(B $BRU(B $BRV(B $BRW(B $BRX(B $BRY(B $BRZ(B $BR[(B $BR\(B $BR](B $BR^(B $BR_(B +$BR`(B $BRa(B $BRb(B $BRc(B $BRd(B $BRe(B $BRf(B $BRg(B $BRh(B $BRi(B $BRj(B $BRk(B $BRl(B $BRm(B $BRn(B $BRo(B +$BRp(B $BRq(B $BRr(B $BRs(B $BRt(B $BRu(B $BRv(B $BRw(B $BRx(B $BRy(B $BRz(B $BR{(B $BR|(B $BR}(B $BR~(B + $BS!(B $BS"(B $BS#(B $BS$(B $BS%(B $BS&(B $BS'(B $BS((B $BS)(B $BS*(B $BS+(B $BS,(B $BS-(B $BS.(B $BS/(B +$BS0(B $BS1(B $BS2(B $BS3(B $BS4(B $BS5(B $BS6(B $BS7(B $BS8(B $BS9(B $BS:(B $BS;(B $BS<(B $BS=(B $BS>(B $BS?(B +$BS@(B $BSA(B $BSB(B $BSC(B $BSD(B $BSE(B $BSF(B $BSG(B $BSH(B $BSI(B $BSJ(B $BSK(B $BSL(B $BSM(B $BSN(B $BSO(B +$BSP(B $BSQ(B $BSR(B $BSS(B $BST(B $BSU(B $BSV(B $BSW(B $BSX(B $BSY(B $BSZ(B $BS[(B $BS\(B $BS](B $BS^(B $BS_(B +$BS`(B $BSa(B $BSb(B $BSc(B $BSd(B $BSe(B $BSf(B $BSg(B $BSh(B $BSi(B $BSj(B $BSk(B $BSl(B $BSm(B $BSn(B $BSo(B +$BSp(B $BSq(B $BSr(B $BSs(B $BSt(B $BSu(B $BSv(B $BSw(B $BSx(B $BSy(B $BSz(B $BS{(B $BS|(B $BS}(B $BS~(B + $BT!(B $BT"(B $BT#(B $BT$(B $BT%(B $BT&(B $BT'(B $BT((B $BT)(B $BT*(B $BT+(B $BT,(B $BT-(B $BT.(B $BT/(B +$BT0(B $BT1(B $BT2(B $BT3(B $BT4(B $BT5(B $BT6(B $BT7(B $BT8(B $BT9(B $BT:(B $BT;(B $BT<(B $BT=(B $BT>(B $BT?(B +$BT@(B $BTA(B $BTB(B $BTC(B $BTD(B $BTE(B $BTF(B $BTG(B $BTH(B $BTI(B $BTJ(B $BTK(B $BTL(B $BTM(B $BTN(B $BTO(B +$BTP(B $BTQ(B $BTR(B $BTS(B $BTT(B $BTU(B $BTV(B $BTW(B $BTX(B $BTY(B $BTZ(B $BT[(B $BT\(B $BT](B $BT^(B $BT_(B +$BT`(B $BTa(B $BTb(B $BTc(B $BTd(B $BTe(B $BTf(B $BTg(B $BTh(B $BTi(B $BTj(B $BTk(B $BTl(B $BTm(B $BTn(B $BTo(B +$BTp(B $BTq(B $BTr(B $BTs(B $BTt(B $BTu(B $BTv(B $BTw(B $BTx(B $BTy(B $BTz(B $BT{(B $BT|(B $BT}(B $BT~(B + $BU!(B $BU"(B $BU#(B $BU$(B $BU%(B $BU&(B $BU'(B $BU((B $BU)(B $BU*(B $BU+(B $BU,(B $BU-(B $BU.(B $BU/(B +$BU0(B $BU1(B $BU2(B $BU3(B $BU4(B $BU5(B $BU6(B $BU7(B $BU8(B $BU9(B $BU:(B $BU;(B $BU<(B $BU=(B $BU>(B $BU?(B +$BU@(B $BUA(B $BUB(B $BUC(B $BUD(B $BUE(B $BUF(B $BUG(B $BUH(B $BUI(B $BUJ(B $BUK(B $BUL(B $BUM(B $BUN(B $BUO(B +$BUP(B $BUQ(B $BUR(B $BUS(B $BUT(B $BUU(B $BUV(B $BUW(B $BUX(B $BUY(B $BUZ(B $BU[(B $BU\(B $BU](B $BU^(B $BU_(B +$BU`(B $BUa(B $BUb(B $BUc(B $BUd(B $BUe(B $BUf(B $BUg(B $BUh(B $BUi(B $BUj(B $BUk(B $BUl(B $BUm(B $BUn(B $BUo(B +$BUp(B $BUq(B $BUr(B $BUs(B $BUt(B $BUu(B $BUv(B $BUw(B $BUx(B $BUy(B $BUz(B $BU{(B $BU|(B $BU}(B $BU~(B + $BV!(B $BV"(B $BV#(B $BV$(B $BV%(B $BV&(B $BV'(B $BV((B $BV)(B $BV*(B $BV+(B $BV,(B $BV-(B $BV.(B $BV/(B +$BV0(B $BV1(B $BV2(B $BV3(B $BV4(B $BV5(B $BV6(B $BV7(B $BV8(B $BV9(B $BV:(B $BV;(B $BV<(B $BV=(B $BV>(B $BV?(B +$BV@(B $BVA(B $BVB(B $BVC(B $BVD(B $BVE(B $BVF(B $BVG(B $BVH(B $BVI(B $BVJ(B $BVK(B $BVL(B $BVM(B $BVN(B $BVO(B +$BVP(B $BVQ(B $BVR(B $BVS(B $BVT(B $BVU(B $BVV(B $BVW(B $BVX(B $BVY(B $BVZ(B $BV[(B $BV\(B $BV](B $BV^(B $BV_(B +$BV`(B $BVa(B $BVb(B $BVc(B $BVd(B $BVe(B $BVf(B $BVg(B $BVh(B $BVi(B $BVj(B $BVk(B $BVl(B $BVm(B $BVn(B $BVo(B +$BVp(B $BVq(B $BVr(B $BVs(B $BVt(B $BVu(B $BVv(B $BVw(B $BVx(B $BVy(B $BVz(B $BV{(B $BV|(B $BV}(B $BV~(B + $BW!(B $BW"(B $BW#(B $BW$(B $BW%(B $BW&(B $BW'(B $BW((B $BW)(B $BW*(B $BW+(B $BW,(B $BW-(B $BW.(B $BW/(B +$BW0(B $BW1(B $BW2(B $BW3(B $BW4(B $BW5(B $BW6(B $BW7(B $BW8(B $BW9(B $BW:(B $BW;(B $BW<(B $BW=(B $BW>(B $BW?(B +$BW@(B $BWA(B $BWB(B $BWC(B $BWD(B $BWE(B $BWF(B $BWG(B $BWH(B $BWI(B $BWJ(B $BWK(B $BWL(B $BWM(B $BWN(B $BWO(B +$BWP(B $BWQ(B $BWR(B $BWS(B $BWT(B $BWU(B $BWV(B $BWW(B $BWX(B $BWY(B $BWZ(B $BW[(B $BW\(B $BW](B $BW^(B $BW_(B +$BW`(B $BWa(B $BWb(B $BWc(B $BWd(B $BWe(B $BWf(B $BWg(B $BWh(B $BWi(B $BWj(B $BWk(B $BWl(B $BWm(B $BWn(B $BWo(B +$BWp(B $BWq(B $BWr(B $BWs(B $BWt(B $BWu(B $BWv(B $BWw(B $BWx(B $BWy(B $BWz(B $BW{(B $BW|(B $BW}(B $BW~(B + $BX!(B $BX"(B $BX#(B $BX$(B $BX%(B $BX&(B $BX'(B $BX((B $BX)(B $BX*(B $BX+(B $BX,(B $BX-(B $BX.(B $BX/(B +$BX0(B $BX1(B $BX2(B $BX3(B $BX4(B $BX5(B $BX6(B $BX7(B $BX8(B $BX9(B $BX:(B $BX;(B $BX<(B $BX=(B $BX>(B $BX?(B +$BX@(B $BXA(B $BXB(B $BXC(B $BXD(B $BXE(B $BXF(B $BXG(B $BXH(B $BXI(B $BXJ(B $BXK(B $BXL(B $BXM(B $BXN(B $BXO(B +$BXP(B $BXQ(B $BXR(B $BXS(B $BXT(B $BXU(B $BXV(B $BXW(B $BXX(B $BXY(B $BXZ(B $BX[(B $BX\(B $BX](B $BX^(B $BX_(B +$BX`(B $BXa(B $BXb(B $BXc(B $BXd(B $BXe(B $BXf(B $BXg(B $BXh(B $BXi(B $BXj(B $BXk(B $BXl(B $BXm(B $BXn(B $BXo(B +$BXp(B $BXq(B $BXr(B $BXs(B $BXt(B $BXu(B $BXv(B $BXw(B $BXx(B $BXy(B $BXz(B $BX{(B $BX|(B $BX}(B $BX~(B + $BY!(B $BY"(B $BY#(B $BY$(B $BY%(B $BY&(B $BY'(B $BY((B $BY)(B $BY*(B $BY+(B $BY,(B $BY-(B $BY.(B $BY/(B +$BY0(B $BY1(B $BY2(B $BY3(B $BY4(B $BY5(B $BY6(B $BY7(B $BY8(B $BY9(B $BY:(B $BY;(B $BY<(B $BY=(B $BY>(B $BY?(B +$BY@(B $BYA(B $BYB(B $BYC(B $BYD(B $BYE(B $BYF(B $BYG(B $BYH(B $BYI(B $BYJ(B $BYK(B $BYL(B $BYM(B $BYN(B $BYO(B +$BYP(B $BYQ(B $BYR(B $BYS(B $BYT(B $BYU(B $BYV(B $BYW(B $BYX(B $BYY(B $BYZ(B $BY[(B $BY\(B $BY](B $BY^(B $BY_(B +$BY`(B $BYa(B $BYb(B $BYc(B $BYd(B $BYe(B $BYf(B $BYg(B $BYh(B $BYi(B $BYj(B $BYk(B $BYl(B $BYm(B $BYn(B $BYo(B +$BYp(B $BYq(B $BYr(B $BYs(B $BYt(B $BYu(B $BYv(B $BYw(B $BYx(B $BYy(B $BYz(B $BY{(B $BY|(B $BY}(B $BY~(B + $BZ!(B $BZ"(B $BZ#(B $BZ$(B $BZ%(B $BZ&(B $BZ'(B $BZ((B $BZ)(B $BZ*(B $BZ+(B $BZ,(B $BZ-(B $BZ.(B $BZ/(B +$BZ0(B $BZ1(B $BZ2(B $BZ3(B $BZ4(B $BZ5(B $BZ6(B $BZ7(B $BZ8(B $BZ9(B $BZ:(B $BZ;(B $BZ<(B $BZ=(B $BZ>(B $BZ?(B +$BZ@(B $BZA(B $BZB(B $BZC(B $BZD(B $BZE(B $BZF(B $BZG(B $BZH(B $BZI(B $BZJ(B $BZK(B $BZL(B $BZM(B $BZN(B $BZO(B +$BZP(B $BZQ(B $BZR(B $BZS(B $BZT(B $BZU(B $BZV(B $BZW(B $BZX(B $BZY(B $BZZ(B $BZ[(B $BZ\(B $BZ](B $BZ^(B $BZ_(B +$BZ`(B $BZa(B $BZb(B $BZc(B $BZd(B $BZe(B $BZf(B $BZg(B $BZh(B $BZi(B $BZj(B $BZk(B $BZl(B $BZm(B $BZn(B $BZo(B +$BZp(B $BZq(B $BZr(B $BZs(B $BZt(B $BZu(B $BZv(B $BZw(B $BZx(B $BZy(B $BZz(B $BZ{(B $BZ|(B $BZ}(B $BZ~(B + $B[!(B $B["(B $B[#(B $B[$(B $B[%(B $B[&(B $B['(B $B[((B $B[)(B $B[*(B $B[+(B $B[,(B $B[-(B $B[.(B $B[/(B +$B[0(B $B[1(B $B[2(B $B[3(B $B[4(B $B[5(B $B[6(B $B[7(B $B[8(B $B[9(B $B[:(B $B[;(B $B[<(B $B[=(B $B[>(B $B[?(B +$B[@(B $B[A(B $B[B(B $B[C(B $B[D(B $B[E(B $B[F(B $B[G(B $B[H(B $B[I(B $B[J(B $B[K(B $B[L(B $B[M(B $B[N(B $B[O(B +$B[P(B $B[Q(B $B[R(B $B[S(B $B[T(B $B[U(B $B[V(B $B[W(B $B[X(B $B[Y(B $B[Z(B $B[[(B $B[\(B $B[](B $B[^(B $B[_(B +$B[`(B $B[a(B $B[b(B $B[c(B $B[d(B $B[e(B $B[f(B $B[g(B $B[h(B $B[i(B $B[j(B $B[k(B $B[l(B $B[m(B $B[n(B $B[o(B +$B[p(B $B[q(B $B[r(B $B[s(B $B[t(B $B[u(B $B[v(B $B[w(B $B[x(B $B[y(B $B[z(B $B[{(B $B[|(B $B[}(B $B[~(B + $B\!(B $B\"(B $B\#(B $B\$(B $B\%(B $B\&(B $B\'(B $B\((B $B\)(B $B\*(B $B\+(B $B\,(B $B\-(B $B\.(B $B\/(B +$B\0(B $B\1(B $B\2(B $B\3(B $B\4(B $B\5(B $B\6(B $B\7(B $B\8(B $B\9(B $B\:(B $B\;(B $B\<(B $B\=(B $B\>(B $B\?(B +$B\@(B $B\A(B $B\B(B $B\C(B $B\D(B $B\E(B $B\F(B $B\G(B $B\H(B $B\I(B $B\J(B $B\K(B $B\L(B $B\M(B $B\N(B $B\O(B +$B\P(B $B\Q(B $B\R(B $B\S(B $B\T(B $B\U(B $B\V(B $B\W(B $B\X(B $B\Y(B $B\Z(B $B\[(B $B\\(B $B\](B $B\^(B $B\_(B +$B\`(B $B\a(B $B\b(B $B\c(B $B\d(B $B\e(B $B\f(B $B\g(B $B\h(B $B\i(B $B\j(B $B\k(B $B\l(B $B\m(B $B\n(B $B\o(B +$B\p(B $B\q(B $B\r(B $B\s(B $B\t(B $B\u(B $B\v(B $B\w(B $B\x(B $B\y(B $B\z(B $B\{(B $B\|(B $B\}(B $B\~(B + $B]!(B $B]"(B $B]#(B $B]$(B $B]%(B $B]&(B $B]'(B $B]((B $B])(B $B]*(B $B]+(B $B],(B $B]-(B $B].(B $B]/(B +$B]0(B $B]1(B $B]2(B $B]3(B $B]4(B $B]5(B $B]6(B $B]7(B $B]8(B $B]9(B $B]:(B $B];(B $B]<(B $B]=(B $B]>(B $B]?(B +$B]@(B $B]A(B $B]B(B $B]C(B $B]D(B $B]E(B $B]F(B $B]G(B $B]H(B $B]I(B $B]J(B $B]K(B $B]L(B $B]M(B $B]N(B $B]O(B +$B]P(B $B]Q(B $B]R(B $B]S(B $B]T(B $B]U(B $B]V(B $B]W(B $B]X(B $B]Y(B $B]Z(B $B][(B $B]\(B $B]](B $B]^(B $B]_(B +$B]`(B $B]a(B $B]b(B $B]c(B $B]d(B $B]e(B $B]f(B $B]g(B $B]h(B $B]i(B $B]j(B $B]k(B $B]l(B $B]m(B $B]n(B $B]o(B +$B]p(B $B]q(B $B]r(B $B]s(B $B]t(B $B]u(B $B]v(B $B]w(B $B]x(B $B]y(B $B]z(B $B]{(B $B]|(B $B]}(B $B]~(B + $B^!(B $B^"(B $B^#(B $B^$(B $B^%(B $B^&(B $B^'(B $B^((B $B^)(B $B^*(B $B^+(B $B^,(B $B^-(B $B^.(B $B^/(B +$B^0(B $B^1(B $B^2(B $B^3(B $B^4(B $B^5(B $B^6(B $B^7(B $B^8(B $B^9(B $B^:(B $B^;(B $B^<(B $B^=(B $B^>(B $B^?(B +$B^@(B $B^A(B $B^B(B $B^C(B $B^D(B $B^E(B $B^F(B $B^G(B $B^H(B $B^I(B $B^J(B $B^K(B $B^L(B $B^M(B $B^N(B $B^O(B +$B^P(B $B^Q(B $B^R(B $B^S(B $B^T(B $B^U(B $B^V(B $B^W(B $B^X(B $B^Y(B $B^Z(B $B^[(B $B^\(B $B^](B $B^^(B $B^_(B +$B^`(B $B^a(B $B^b(B $B^c(B $B^d(B $B^e(B $B^f(B $B^g(B $B^h(B $B^i(B $B^j(B $B^k(B $B^l(B $B^m(B $B^n(B $B^o(B +$B^p(B $B^q(B $B^r(B $B^s(B $B^t(B $B^u(B $B^v(B $B^w(B $B^x(B $B^y(B $B^z(B $B^{(B $B^|(B $B^}(B $B^~(B + $B_!(B $B_"(B $B_#(B $B_$(B $B_%(B $B_&(B $B_'(B $B_((B $B_)(B $B_*(B $B_+(B $B_,(B $B_-(B $B_.(B $B_/(B +$B_0(B $B_1(B $B_2(B $B_3(B $B_4(B $B_5(B $B_6(B $B_7(B $B_8(B $B_9(B $B_:(B $B_;(B $B_<(B $B_=(B $B_>(B $B_?(B +$B_@(B $B_A(B $B_B(B $B_C(B $B_D(B $B_E(B $B_F(B $B_G(B $B_H(B $B_I(B $B_J(B $B_K(B $B_L(B $B_M(B $B_N(B $B_O(B +$B_P(B $B_Q(B $B_R(B $B_S(B $B_T(B $B_U(B $B_V(B $B_W(B $B_X(B $B_Y(B $B_Z(B $B_[(B $B_\(B $B_](B $B_^(B $B__(B +$B_`(B $B_a(B $B_b(B $B_c(B $B_d(B $B_e(B $B_f(B $B_g(B $B_h(B $B_i(B $B_j(B $B_k(B $B_l(B $B_m(B $B_n(B $B_o(B +$B_p(B $B_q(B $B_r(B $B_s(B $B_t(B $B_u(B $B_v(B $B_w(B $B_x(B $B_y(B $B_z(B $B_{(B $B_|(B $B_}(B $B_~(B + $B`!(B $B`"(B $B`#(B $B`$(B $B`%(B $B`&(B $B`'(B $B`((B $B`)(B $B`*(B $B`+(B $B`,(B $B`-(B $B`.(B $B`/(B +$B`0(B $B`1(B $B`2(B $B`3(B $B`4(B $B`5(B $B`6(B $B`7(B $B`8(B $B`9(B $B`:(B $B`;(B $B`<(B $B`=(B $B`>(B $B`?(B +$B`@(B $B`A(B $B`B(B $B`C(B $B`D(B $B`E(B $B`F(B $B`G(B $B`H(B $B`I(B $B`J(B $B`K(B $B`L(B $B`M(B $B`N(B $B`O(B +$B`P(B $B`Q(B $B`R(B $B`S(B $B`T(B $B`U(B $B`V(B $B`W(B $B`X(B $B`Y(B $B`Z(B $B`[(B $B`\(B $B`](B $B`^(B $B`_(B +$B``(B $B`a(B $B`b(B $B`c(B $B`d(B $B`e(B $B`f(B $B`g(B $B`h(B $B`i(B $B`j(B $B`k(B $B`l(B $B`m(B $B`n(B $B`o(B +$B`p(B $B`q(B $B`r(B $B`s(B $B`t(B $B`u(B $B`v(B $B`w(B $B`x(B $B`y(B $B`z(B $B`{(B $B`|(B $B`}(B $B`~(B + $Ba!(B $Ba"(B $Ba#(B $Ba$(B $Ba%(B $Ba&(B $Ba'(B $Ba((B $Ba)(B $Ba*(B $Ba+(B $Ba,(B $Ba-(B $Ba.(B $Ba/(B +$Ba0(B $Ba1(B $Ba2(B $Ba3(B $Ba4(B $Ba5(B $Ba6(B $Ba7(B $Ba8(B $Ba9(B $Ba:(B $Ba;(B $Ba<(B $Ba=(B $Ba>(B $Ba?(B +$Ba@(B $BaA(B $BaB(B $BaC(B $BaD(B $BaE(B $BaF(B $BaG(B $BaH(B $BaI(B $BaJ(B $BaK(B $BaL(B $BaM(B $BaN(B $BaO(B +$BaP(B $BaQ(B $BaR(B $BaS(B $BaT(B $BaU(B $BaV(B $BaW(B $BaX(B $BaY(B $BaZ(B $Ba[(B $Ba\(B $Ba](B $Ba^(B $Ba_(B +$Ba`(B $Baa(B $Bab(B $Bac(B $Bad(B $Bae(B $Baf(B $Bag(B $Bah(B $Bai(B $Baj(B $Bak(B $Bal(B $Bam(B $Ban(B $Bao(B +$Bap(B $Baq(B $Bar(B $Bas(B $Bat(B $Bau(B $Bav(B $Baw(B $Bax(B $Bay(B $Baz(B $Ba{(B $Ba|(B $Ba}(B $Ba~(B + $Bb!(B $Bb"(B $Bb#(B $Bb$(B $Bb%(B $Bb&(B $Bb'(B $Bb((B $Bb)(B $Bb*(B $Bb+(B $Bb,(B $Bb-(B $Bb.(B $Bb/(B +$Bb0(B $Bb1(B $Bb2(B $Bb3(B $Bb4(B $Bb5(B $Bb6(B $Bb7(B $Bb8(B $Bb9(B $Bb:(B $Bb;(B $Bb<(B $Bb=(B $Bb>(B $Bb?(B +$Bb@(B $BbA(B $BbB(B $BbC(B $BbD(B $BbE(B $BbF(B $BbG(B $BbH(B $BbI(B $BbJ(B $BbK(B $BbL(B $BbM(B $BbN(B $BbO(B +$BbP(B $BbQ(B $BbR(B $BbS(B $BbT(B $BbU(B $BbV(B $BbW(B $BbX(B $BbY(B $BbZ(B $Bb[(B $Bb\(B $Bb](B $Bb^(B $Bb_(B +$Bb`(B $Bba(B $Bbb(B $Bbc(B $Bbd(B $Bbe(B $Bbf(B $Bbg(B $Bbh(B $Bbi(B $Bbj(B $Bbk(B $Bbl(B $Bbm(B $Bbn(B $Bbo(B +$Bbp(B $Bbq(B $Bbr(B $Bbs(B $Bbt(B $Bbu(B $Bbv(B $Bbw(B $Bbx(B $Bby(B $Bbz(B $Bb{(B $Bb|(B $Bb}(B $Bb~(B + $Bc!(B $Bc"(B $Bc#(B $Bc$(B $Bc%(B $Bc&(B $Bc'(B $Bc((B $Bc)(B $Bc*(B $Bc+(B $Bc,(B $Bc-(B $Bc.(B $Bc/(B +$Bc0(B $Bc1(B $Bc2(B $Bc3(B $Bc4(B $Bc5(B $Bc6(B $Bc7(B $Bc8(B $Bc9(B $Bc:(B $Bc;(B $Bc<(B $Bc=(B $Bc>(B $Bc?(B +$Bc@(B $BcA(B $BcB(B $BcC(B $BcD(B $BcE(B $BcF(B $BcG(B $BcH(B $BcI(B $BcJ(B $BcK(B $BcL(B $BcM(B $BcN(B $BcO(B +$BcP(B $BcQ(B $BcR(B $BcS(B $BcT(B $BcU(B $BcV(B $BcW(B $BcX(B $BcY(B $BcZ(B $Bc[(B $Bc\(B $Bc](B $Bc^(B $Bc_(B +$Bc`(B $Bca(B $Bcb(B $Bcc(B $Bcd(B $Bce(B $Bcf(B $Bcg(B $Bch(B $Bci(B $Bcj(B $Bck(B $Bcl(B $Bcm(B $Bcn(B $Bco(B +$Bcp(B $Bcq(B $Bcr(B $Bcs(B $Bct(B $Bcu(B $Bcv(B $Bcw(B $Bcx(B $Bcy(B $Bcz(B $Bc{(B $Bc|(B $Bc}(B $Bc~(B + $Bd!(B $Bd"(B $Bd#(B $Bd$(B $Bd%(B $Bd&(B $Bd'(B $Bd((B $Bd)(B $Bd*(B $Bd+(B $Bd,(B $Bd-(B $Bd.(B $Bd/(B +$Bd0(B $Bd1(B $Bd2(B $Bd3(B $Bd4(B $Bd5(B $Bd6(B $Bd7(B $Bd8(B $Bd9(B $Bd:(B $Bd;(B $Bd<(B $Bd=(B $Bd>(B $Bd?(B +$Bd@(B $BdA(B $BdB(B $BdC(B $BdD(B $BdE(B $BdF(B $BdG(B $BdH(B $BdI(B $BdJ(B $BdK(B $BdL(B $BdM(B $BdN(B $BdO(B +$BdP(B $BdQ(B $BdR(B $BdS(B $BdT(B $BdU(B $BdV(B $BdW(B $BdX(B $BdY(B $BdZ(B $Bd[(B $Bd\(B $Bd](B $Bd^(B $Bd_(B +$Bd`(B $Bda(B $Bdb(B $Bdc(B $Bdd(B $Bde(B $Bdf(B $Bdg(B $Bdh(B $Bdi(B $Bdj(B $Bdk(B $Bdl(B $Bdm(B $Bdn(B $Bdo(B +$Bdp(B $Bdq(B $Bdr(B $Bds(B $Bdt(B $Bdu(B $Bdv(B $Bdw(B $Bdx(B $Bdy(B $Bdz(B $Bd{(B $Bd|(B $Bd}(B $Bd~(B + $Be!(B $Be"(B $Be#(B $Be$(B $Be%(B $Be&(B $Be'(B $Be((B $Be)(B $Be*(B $Be+(B $Be,(B $Be-(B $Be.(B $Be/(B +$Be0(B $Be1(B $Be2(B $Be3(B $Be4(B $Be5(B $Be6(B $Be7(B $Be8(B $Be9(B $Be:(B $Be;(B $Be<(B $Be=(B $Be>(B $Be?(B +$Be@(B $BeA(B $BeB(B $BeC(B $BeD(B $BeE(B $BeF(B $BeG(B $BeH(B $BeI(B $BeJ(B $BeK(B $BeL(B $BeM(B $BeN(B $BeO(B +$BeP(B $BeQ(B $BeR(B $BeS(B $BeT(B $BeU(B $BeV(B $BeW(B $BeX(B $BeY(B $BeZ(B $Be[(B $Be\(B $Be](B $Be^(B $Be_(B +$Be`(B $Bea(B $Beb(B $Bec(B $Bed(B $Bee(B $Bef(B $Beg(B $Beh(B $Bei(B $Bej(B $Bek(B $Bel(B $Bem(B $Ben(B $Beo(B +$Bep(B $Beq(B $Ber(B $Bes(B $Bet(B $Beu(B $Bev(B $Bew(B $Bex(B $Bey(B $Bez(B $Be{(B $Be|(B $Be}(B $Be~(B + $Bf!(B $Bf"(B $Bf#(B $Bf$(B $Bf%(B $Bf&(B $Bf'(B $Bf((B $Bf)(B $Bf*(B $Bf+(B $Bf,(B $Bf-(B $Bf.(B $Bf/(B +$Bf0(B $Bf1(B $Bf2(B $Bf3(B $Bf4(B $Bf5(B $Bf6(B $Bf7(B $Bf8(B $Bf9(B $Bf:(B $Bf;(B $Bf<(B $Bf=(B $Bf>(B $Bf?(B +$Bf@(B $BfA(B $BfB(B $BfC(B $BfD(B $BfE(B $BfF(B $BfG(B $BfH(B $BfI(B $BfJ(B $BfK(B $BfL(B $BfM(B $BfN(B $BfO(B +$BfP(B $BfQ(B $BfR(B $BfS(B $BfT(B $BfU(B $BfV(B $BfW(B $BfX(B $BfY(B $BfZ(B $Bf[(B $Bf\(B $Bf](B $Bf^(B $Bf_(B +$Bf`(B $Bfa(B $Bfb(B $Bfc(B $Bfd(B $Bfe(B $Bff(B $Bfg(B $Bfh(B $Bfi(B $Bfj(B $Bfk(B $Bfl(B $Bfm(B $Bfn(B $Bfo(B +$Bfp(B $Bfq(B $Bfr(B $Bfs(B $Bft(B $Bfu(B $Bfv(B $Bfw(B $Bfx(B $Bfy(B $Bfz(B $Bf{(B $Bf|(B $Bf}(B $Bf~(B + $Bg!(B $Bg"(B $Bg#(B $Bg$(B $Bg%(B $Bg&(B $Bg'(B $Bg((B $Bg)(B $Bg*(B $Bg+(B $Bg,(B $Bg-(B $Bg.(B $Bg/(B +$Bg0(B $Bg1(B $Bg2(B $Bg3(B $Bg4(B $Bg5(B $Bg6(B $Bg7(B $Bg8(B $Bg9(B $Bg:(B $Bg;(B $Bg<(B $Bg=(B $Bg>(B $Bg?(B +$Bg@(B $BgA(B $BgB(B $BgC(B $BgD(B $BgE(B $BgF(B $BgG(B $BgH(B $BgI(B $BgJ(B $BgK(B $BgL(B $BgM(B $BgN(B $BgO(B +$BgP(B $BgQ(B $BgR(B $BgS(B $BgT(B $BgU(B $BgV(B $BgW(B $BgX(B $BgY(B $BgZ(B $Bg[(B $Bg\(B $Bg](B $Bg^(B $Bg_(B +$Bg`(B $Bga(B $Bgb(B $Bgc(B $Bgd(B $Bge(B $Bgf(B $Bgg(B $Bgh(B $Bgi(B $Bgj(B $Bgk(B $Bgl(B $Bgm(B $Bgn(B $Bgo(B +$Bgp(B $Bgq(B $Bgr(B $Bgs(B $Bgt(B $Bgu(B $Bgv(B $Bgw(B $Bgx(B $Bgy(B $Bgz(B $Bg{(B $Bg|(B $Bg}(B $Bg~(B + $Bh!(B $Bh"(B $Bh#(B $Bh$(B $Bh%(B $Bh&(B $Bh'(B $Bh((B $Bh)(B $Bh*(B $Bh+(B $Bh,(B $Bh-(B $Bh.(B $Bh/(B +$Bh0(B $Bh1(B $Bh2(B $Bh3(B $Bh4(B $Bh5(B $Bh6(B $Bh7(B $Bh8(B $Bh9(B $Bh:(B $Bh;(B $Bh<(B $Bh=(B $Bh>(B $Bh?(B +$Bh@(B $BhA(B $BhB(B $BhC(B $BhD(B $BhE(B $BhF(B $BhG(B $BhH(B $BhI(B $BhJ(B $BhK(B $BhL(B $BhM(B $BhN(B $BhO(B +$BhP(B $BhQ(B $BhR(B $BhS(B $BhT(B $BhU(B $BhV(B $BhW(B $BhX(B $BhY(B $BhZ(B $Bh[(B $Bh\(B $Bh](B $Bh^(B $Bh_(B +$Bh`(B $Bha(B $Bhb(B $Bhc(B $Bhd(B $Bhe(B $Bhf(B $Bhg(B $Bhh(B $Bhi(B $Bhj(B $Bhk(B $Bhl(B $Bhm(B $Bhn(B $Bho(B +$Bhp(B $Bhq(B $Bhr(B $Bhs(B $Bht(B $Bhu(B $Bhv(B $Bhw(B $Bhx(B $Bhy(B $Bhz(B $Bh{(B $Bh|(B $Bh}(B $Bh~(B + $Bi!(B $Bi"(B $Bi#(B $Bi$(B $Bi%(B $Bi&(B $Bi'(B $Bi((B $Bi)(B $Bi*(B $Bi+(B $Bi,(B $Bi-(B $Bi.(B $Bi/(B +$Bi0(B $Bi1(B $Bi2(B $Bi3(B $Bi4(B $Bi5(B $Bi6(B $Bi7(B $Bi8(B $Bi9(B $Bi:(B $Bi;(B $Bi<(B $Bi=(B $Bi>(B $Bi?(B +$Bi@(B $BiA(B $BiB(B $BiC(B $BiD(B $BiE(B $BiF(B $BiG(B $BiH(B $BiI(B $BiJ(B $BiK(B $BiL(B $BiM(B $BiN(B $BiO(B +$BiP(B $BiQ(B $BiR(B $BiS(B $BiT(B $BiU(B $BiV(B $BiW(B $BiX(B $BiY(B $BiZ(B $Bi[(B $Bi\(B $Bi](B $Bi^(B $Bi_(B +$Bi`(B $Bia(B $Bib(B $Bic(B $Bid(B $Bie(B $Bif(B $Big(B $Bih(B $Bii(B $Bij(B $Bik(B $Bil(B $Bim(B $Bin(B $Bio(B +$Bip(B $Biq(B $Bir(B $Bis(B $Bit(B $Biu(B $Biv(B $Biw(B $Bix(B $Biy(B $Biz(B $Bi{(B $Bi|(B $Bi}(B $Bi~(B + $Bj!(B $Bj"(B $Bj#(B $Bj$(B $Bj%(B $Bj&(B $Bj'(B $Bj((B $Bj)(B $Bj*(B $Bj+(B $Bj,(B $Bj-(B $Bj.(B $Bj/(B +$Bj0(B $Bj1(B $Bj2(B $Bj3(B $Bj4(B $Bj5(B $Bj6(B $Bj7(B $Bj8(B $Bj9(B $Bj:(B $Bj;(B $Bj<(B $Bj=(B $Bj>(B $Bj?(B +$Bj@(B $BjA(B $BjB(B $BjC(B $BjD(B $BjE(B $BjF(B $BjG(B $BjH(B $BjI(B $BjJ(B $BjK(B $BjL(B $BjM(B $BjN(B $BjO(B +$BjP(B $BjQ(B $BjR(B $BjS(B $BjT(B $BjU(B $BjV(B $BjW(B $BjX(B $BjY(B $BjZ(B $Bj[(B $Bj\(B $Bj](B $Bj^(B $Bj_(B +$Bj`(B $Bja(B $Bjb(B $Bjc(B $Bjd(B $Bje(B $Bjf(B $Bjg(B $Bjh(B $Bji(B $Bjj(B $Bjk(B $Bjl(B $Bjm(B $Bjn(B $Bjo(B +$Bjp(B $Bjq(B $Bjr(B $Bjs(B $Bjt(B $Bju(B $Bjv(B $Bjw(B $Bjx(B $Bjy(B $Bjz(B $Bj{(B $Bj|(B $Bj}(B $Bj~(B + $Bk!(B $Bk"(B $Bk#(B $Bk$(B $Bk%(B $Bk&(B $Bk'(B $Bk((B $Bk)(B $Bk*(B $Bk+(B $Bk,(B $Bk-(B $Bk.(B $Bk/(B +$Bk0(B $Bk1(B $Bk2(B $Bk3(B $Bk4(B $Bk5(B $Bk6(B $Bk7(B $Bk8(B $Bk9(B $Bk:(B $Bk;(B $Bk<(B $Bk=(B $Bk>(B $Bk?(B +$Bk@(B $BkA(B $BkB(B $BkC(B $BkD(B $BkE(B $BkF(B $BkG(B $BkH(B $BkI(B $BkJ(B $BkK(B $BkL(B $BkM(B $BkN(B $BkO(B +$BkP(B $BkQ(B $BkR(B $BkS(B $BkT(B $BkU(B $BkV(B $BkW(B $BkX(B $BkY(B $BkZ(B $Bk[(B $Bk\(B $Bk](B $Bk^(B $Bk_(B +$Bk`(B $Bka(B $Bkb(B $Bkc(B $Bkd(B $Bke(B $Bkf(B $Bkg(B $Bkh(B $Bki(B $Bkj(B $Bkk(B $Bkl(B $Bkm(B $Bkn(B $Bko(B +$Bkp(B $Bkq(B $Bkr(B $Bks(B $Bkt(B $Bku(B $Bkv(B $Bkw(B $Bkx(B $Bky(B $Bkz(B $Bk{(B $Bk|(B $Bk}(B $Bk~(B + $Bl!(B $Bl"(B $Bl#(B $Bl$(B $Bl%(B $Bl&(B $Bl'(B $Bl((B $Bl)(B $Bl*(B $Bl+(B $Bl,(B $Bl-(B $Bl.(B $Bl/(B +$Bl0(B $Bl1(B $Bl2(B $Bl3(B $Bl4(B $Bl5(B $Bl6(B $Bl7(B $Bl8(B $Bl9(B $Bl:(B $Bl;(B $Bl<(B $Bl=(B $Bl>(B $Bl?(B +$Bl@(B $BlA(B $BlB(B $BlC(B $BlD(B $BlE(B $BlF(B $BlG(B $BlH(B $BlI(B $BlJ(B $BlK(B $BlL(B $BlM(B $BlN(B $BlO(B +$BlP(B $BlQ(B $BlR(B $BlS(B $BlT(B $BlU(B $BlV(B $BlW(B $BlX(B $BlY(B $BlZ(B $Bl[(B $Bl\(B $Bl](B $Bl^(B $Bl_(B +$Bl`(B $Bla(B $Blb(B $Blc(B $Bld(B $Ble(B $Blf(B $Blg(B $Blh(B $Bli(B $Blj(B $Blk(B $Bll(B $Blm(B $Bln(B $Blo(B +$Blp(B $Blq(B $Blr(B $Bls(B $Blt(B $Blu(B $Blv(B $Blw(B $Blx(B $Bly(B $Blz(B $Bl{(B $Bl|(B $Bl}(B $Bl~(B + $Bm!(B $Bm"(B $Bm#(B $Bm$(B $Bm%(B $Bm&(B $Bm'(B $Bm((B $Bm)(B $Bm*(B $Bm+(B $Bm,(B $Bm-(B $Bm.(B $Bm/(B +$Bm0(B $Bm1(B $Bm2(B $Bm3(B $Bm4(B $Bm5(B $Bm6(B $Bm7(B $Bm8(B $Bm9(B $Bm:(B $Bm;(B $Bm<(B $Bm=(B $Bm>(B $Bm?(B +$Bm@(B $BmA(B $BmB(B $BmC(B $BmD(B $BmE(B $BmF(B $BmG(B $BmH(B $BmI(B $BmJ(B $BmK(B $BmL(B $BmM(B $BmN(B $BmO(B +$BmP(B $BmQ(B $BmR(B $BmS(B $BmT(B $BmU(B $BmV(B $BmW(B $BmX(B $BmY(B $BmZ(B $Bm[(B $Bm\(B $Bm](B $Bm^(B $Bm_(B +$Bm`(B $Bma(B $Bmb(B $Bmc(B $Bmd(B $Bme(B $Bmf(B $Bmg(B $Bmh(B $Bmi(B $Bmj(B $Bmk(B $Bml(B $Bmm(B $Bmn(B $Bmo(B +$Bmp(B $Bmq(B $Bmr(B $Bms(B $Bmt(B $Bmu(B $Bmv(B $Bmw(B $Bmx(B $Bmy(B $Bmz(B $Bm{(B $Bm|(B $Bm}(B $Bm~(B + $Bn!(B $Bn"(B $Bn#(B $Bn$(B $Bn%(B $Bn&(B $Bn'(B $Bn((B $Bn)(B $Bn*(B $Bn+(B $Bn,(B $Bn-(B $Bn.(B $Bn/(B +$Bn0(B $Bn1(B $Bn2(B $Bn3(B $Bn4(B $Bn5(B $Bn6(B $Bn7(B $Bn8(B $Bn9(B $Bn:(B $Bn;(B $Bn<(B $Bn=(B $Bn>(B $Bn?(B +$Bn@(B $BnA(B $BnB(B $BnC(B $BnD(B $BnE(B $BnF(B $BnG(B $BnH(B $BnI(B $BnJ(B $BnK(B $BnL(B $BnM(B $BnN(B $BnO(B +$BnP(B $BnQ(B $BnR(B $BnS(B $BnT(B $BnU(B $BnV(B $BnW(B $BnX(B $BnY(B $BnZ(B $Bn[(B $Bn\(B $Bn](B $Bn^(B $Bn_(B +$Bn`(B $Bna(B $Bnb(B $Bnc(B $Bnd(B $Bne(B $Bnf(B $Bng(B $Bnh(B $Bni(B $Bnj(B $Bnk(B $Bnl(B $Bnm(B $Bnn(B $Bno(B +$Bnp(B $Bnq(B $Bnr(B $Bns(B $Bnt(B $Bnu(B $Bnv(B $Bnw(B $Bnx(B $Bny(B $Bnz(B $Bn{(B $Bn|(B $Bn}(B $Bn~(B + $Bo!(B $Bo"(B $Bo#(B $Bo$(B $Bo%(B $Bo&(B $Bo'(B $Bo((B $Bo)(B $Bo*(B $Bo+(B $Bo,(B $Bo-(B $Bo.(B $Bo/(B +$Bo0(B $Bo1(B $Bo2(B $Bo3(B $Bo4(B $Bo5(B $Bo6(B $Bo7(B $Bo8(B $Bo9(B $Bo:(B $Bo;(B $Bo<(B $Bo=(B $Bo>(B $Bo?(B +$Bo@(B $BoA(B $BoB(B $BoC(B $BoD(B $BoE(B $BoF(B $BoG(B $BoH(B $BoI(B $BoJ(B $BoK(B $BoL(B $BoM(B $BoN(B $BoO(B +$BoP(B $BoQ(B $BoR(B $BoS(B $BoT(B $BoU(B $BoV(B $BoW(B $BoX(B $BoY(B $BoZ(B $Bo[(B $Bo\(B $Bo](B $Bo^(B $Bo_(B +$Bo`(B $Boa(B $Bob(B $Boc(B $Bod(B $Boe(B $Bof(B $Bog(B $Boh(B $Boi(B $Boj(B $Bok(B $Bol(B $Bom(B $Bon(B $Boo(B +$Bop(B $Boq(B $Bor(B $Bos(B $Bot(B $Bou(B $Bov(B $Bow(B $Box(B $Boy(B $Boz(B $Bo{(B $Bo|(B $Bo}(B $Bo~(B + $Bp!(B $Bp"(B $Bp#(B $Bp$(B $Bp%(B $Bp&(B $Bp'(B $Bp((B $Bp)(B $Bp*(B $Bp+(B $Bp,(B $Bp-(B $Bp.(B $Bp/(B +$Bp0(B $Bp1(B $Bp2(B $Bp3(B $Bp4(B $Bp5(B $Bp6(B $Bp7(B $Bp8(B $Bp9(B $Bp:(B $Bp;(B $Bp<(B $Bp=(B $Bp>(B $Bp?(B +$Bp@(B $BpA(B $BpB(B $BpC(B $BpD(B $BpE(B $BpF(B $BpG(B $BpH(B $BpI(B $BpJ(B $BpK(B $BpL(B $BpM(B $BpN(B $BpO(B +$BpP(B $BpQ(B $BpR(B $BpS(B $BpT(B $BpU(B $BpV(B $BpW(B $BpX(B $BpY(B $BpZ(B $Bp[(B $Bp\(B $Bp](B $Bp^(B $Bp_(B +$Bp`(B $Bpa(B $Bpb(B $Bpc(B $Bpd(B $Bpe(B $Bpf(B $Bpg(B $Bph(B $Bpi(B $Bpj(B $Bpk(B $Bpl(B $Bpm(B $Bpn(B $Bpo(B +$Bpp(B $Bpq(B $Bpr(B $Bps(B $Bpt(B $Bpu(B $Bpv(B $Bpw(B $Bpx(B $Bpy(B $Bpz(B $Bp{(B $Bp|(B $Bp}(B $Bp~(B + $Bq!(B $Bq"(B $Bq#(B $Bq$(B $Bq%(B $Bq&(B $Bq'(B $Bq((B $Bq)(B $Bq*(B $Bq+(B $Bq,(B $Bq-(B $Bq.(B $Bq/(B +$Bq0(B $Bq1(B $Bq2(B $Bq3(B $Bq4(B $Bq5(B $Bq6(B $Bq7(B $Bq8(B $Bq9(B $Bq:(B $Bq;(B $Bq<(B $Bq=(B $Bq>(B $Bq?(B +$Bq@(B $BqA(B $BqB(B $BqC(B $BqD(B $BqE(B $BqF(B $BqG(B $BqH(B $BqI(B $BqJ(B $BqK(B $BqL(B $BqM(B $BqN(B $BqO(B +$BqP(B $BqQ(B $BqR(B $BqS(B $BqT(B $BqU(B $BqV(B $BqW(B $BqX(B $BqY(B $BqZ(B $Bq[(B $Bq\(B $Bq](B $Bq^(B $Bq_(B +$Bq`(B $Bqa(B $Bqb(B $Bqc(B $Bqd(B $Bqe(B $Bqf(B $Bqg(B $Bqh(B $Bqi(B $Bqj(B $Bqk(B $Bql(B $Bqm(B $Bqn(B $Bqo(B +$Bqp(B $Bqq(B $Bqr(B $Bqs(B $Bqt(B $Bqu(B $Bqv(B $Bqw(B $Bqx(B $Bqy(B $Bqz(B $Bq{(B $Bq|(B $Bq}(B $Bq~(B + $Br!(B $Br"(B $Br#(B $Br$(B $Br%(B $Br&(B $Br'(B $Br((B $Br)(B $Br*(B $Br+(B $Br,(B $Br-(B $Br.(B $Br/(B +$Br0(B $Br1(B $Br2(B $Br3(B $Br4(B $Br5(B $Br6(B $Br7(B $Br8(B $Br9(B $Br:(B $Br;(B $Br<(B $Br=(B $Br>(B $Br?(B +$Br@(B $BrA(B $BrB(B $BrC(B $BrD(B $BrE(B $BrF(B $BrG(B $BrH(B $BrI(B $BrJ(B $BrK(B $BrL(B $BrM(B $BrN(B $BrO(B +$BrP(B $BrQ(B $BrR(B $BrS(B $BrT(B $BrU(B $BrV(B $BrW(B $BrX(B $BrY(B $BrZ(B $Br[(B $Br\(B $Br](B $Br^(B $Br_(B +$Br`(B $Bra(B $Brb(B $Brc(B $Brd(B $Bre(B $Brf(B $Brg(B $Brh(B $Bri(B $Brj(B $Brk(B $Brl(B $Brm(B $Brn(B $Bro(B +$Brp(B $Brq(B $Brr(B $Brs(B $Brt(B $Bru(B $Brv(B $Brw(B $Brx(B $Bry(B $Brz(B $Br{(B $Br|(B $Br}(B $Br~(B + $Bs!(B $Bs"(B $Bs#(B $Bs$(B $Bs%(B $Bs&(B $Bs'(B $Bs((B $Bs)(B $Bs*(B $Bs+(B $Bs,(B $Bs-(B $Bs.(B $Bs/(B +$Bs0(B $Bs1(B $Bs2(B $Bs3(B $Bs4(B $Bs5(B $Bs6(B $Bs7(B $Bs8(B $Bs9(B $Bs:(B $Bs;(B $Bs<(B $Bs=(B $Bs>(B $Bs?(B +$Bs@(B $BsA(B $BsB(B $BsC(B $BsD(B $BsE(B $BsF(B $BsG(B $BsH(B $BsI(B $BsJ(B $BsK(B $BsL(B $BsM(B $BsN(B $BsO(B +$BsP(B $BsQ(B $BsR(B $BsS(B $BsT(B $BsU(B $BsV(B $BsW(B $BsX(B $BsY(B $BsZ(B $Bs[(B $Bs\(B $Bs](B $Bs^(B $Bs_(B +$Bs`(B $Bsa(B $Bsb(B $Bsc(B $Bsd(B $Bse(B $Bsf(B $Bsg(B $Bsh(B $Bsi(B $Bsj(B $Bsk(B $Bsl(B $Bsm(B $Bsn(B $Bso(B +$Bsp(B $Bsq(B $Bsr(B $Bss(B $Bst(B $Bsu(B $Bsv(B $Bsw(B $Bsx(B $Bsy(B $Bsz(B $Bs{(B $Bs|(B $Bs}(B $Bs~(B + $Bt!(B $Bt"(B $Bt#(B $Bt$(B $Bt%(B $Bt&(B + +JIS0123 ($BF|K\8l(B) $B$3$s$K$A$O(B + JIS -- $B855$(B $B3+H/(B + $B/export/Users/ianl/1.4.2/test/sun/nio/cs/SCCS/s.ISO2022JP.data0%G!<%?%Y!<%9$KAw$k$Y$-$G$J$$$3$H$KCmL\$7$F$/$@$5$$!#(B

      diff --git a/jdk/test/sun/nio/cs/ISO8859x.java b/jdk/test/sun/nio/cs/ISO8859x.java new file mode 100644 index 00000000000..7befa960e99 --- /dev/null +++ b/jdk/test/sun/nio/cs/ISO8859x.java @@ -0,0 +1,105 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6419791 + * @summary + * @author Martin Buchholz + */ + +import java.io.*; +import java.util.*; +import java.nio.charset.*; +import java.nio.*; + +public class ISO8859x { + final static byte[] lowBytes = new byte[0xa0]; + final static char[] lowChars = new char[0xa0]; + final static String lowString; + static { + for (int i = 0; i < 0xa0; i++) { + lowBytes[i] = (byte) i; + lowChars[i] = (char) i; + } + lowString = new String(lowChars); + } + + private static void testCharset(Charset cs) throws Throwable { + String csn = cs.name(); + System.out.println(csn); + + check(cs.canEncode()); + check(Arrays.equals(lowString.getBytes(csn), lowBytes)); + check(new String(lowBytes, csn).equals(lowString)); + + CharsetEncoder encoder = cs.newEncoder(); + CharsetDecoder decoder = cs.newDecoder(); + decoder.onUnmappableCharacter(CodingErrorAction.REPORT) + .onMalformedInput(CodingErrorAction.REPORT); + encoder.onUnmappableCharacter(CodingErrorAction.REPORT) + .onMalformedInput(CodingErrorAction.REPORT); + + byte[] bytes = new byte[1]; + for (int c = 0xa0; c < 0x100; c++) { + try { + bytes[0] = (byte) c; + char[] chars; + try { chars = decoder.decode(ByteBuffer.wrap(bytes)).array(); } + catch (UnmappableCharacterException x) { continue; } + equal(chars.length, 1); + byte[] bytes2 = encoder.encode(CharBuffer.wrap(chars)).array(); + check(Arrays.equals(bytes2, bytes)); + } catch (Throwable t) { + System.out.printf("cs=%s c=%02x%n", cs, c); + unexpected(t); + } + } + } + + private static void realMain(String[] args) throws Throwable { + for (Map.Entry e + : Charset.availableCharsets().entrySet()) { + String csn = e.getKey(); + Charset cs = e.getValue(); + if (csn.matches(".*(8859).*")) + try { testCharset(cs); } + catch (Throwable t) { unexpected(t); } + } + } + + //--------------------- 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.printf("%nPassed = %d, failed = %d%n%n", passed, failed); + if (failed > 0) throw new AssertionError("Some tests failed");} +} diff --git a/jdk/test/sun/nio/cs/JISAutoDetectTest.java b/jdk/test/sun/nio/cs/JISAutoDetectTest.java new file mode 100644 index 00000000000..eb3b75d05c7 --- /dev/null +++ b/jdk/test/sun/nio/cs/JISAutoDetectTest.java @@ -0,0 +1,158 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4087261 4184592 + * @summary Make sure to determine Japanese text encoding as correctly + * as possible. + */ + +import java.nio.charset.*; +import java.nio.*; + +public class JISAutoDetectTest { + + class TestData { + byte[] input; + byte[] input2; // for second call + String expectedCharset; + } + TestData[] data = new TestData[50]; + + public static void main(String[] argv) throws Exception { + JISAutoDetectTest test = new JISAutoDetectTest(); + test.execute(); + } + + void execute() throws Exception { + CharBuffer output = CharBuffer.allocate(128); + CharBuffer expectedOutput = CharBuffer.allocate(128); + + for (int i = 0; i < data.length; i++) { + if (data[i] == null) + break; + + CharsetDecoder autoDetect = Charset.forName("JISAutoDetect").newDecoder(); + CharsetDecoder dec = Charset.forName(data[i].expectedCharset).newDecoder(); + CoderResult ncr, mcr; + output.clear(); + expectedOutput.clear(); + ncr = autoDetect.decode(ByteBuffer.wrap(data[i].input), + output, + true); + mcr = dec.decode(ByteBuffer.wrap(data[i].input), + expectedOutput, + true); + + if (data[i].input2 != null) { + ncr = autoDetect.decode(ByteBuffer.wrap(data[i].input2), + output, + true); + mcr = dec.decode(ByteBuffer.wrap(data[i].input2), + expectedOutput, + true); + } + String testNumber = " (test#: " + i + ")"; + if (ncr != mcr) + throw new Exception("JISAutoDetect returned a wrong result"); + output.flip(); + expectedOutput.flip(); + if (output.limit() != expectedOutput.limit()) + throw new Exception("JISAutoDetect returned a wrong length"+testNumber); + + for (int x = 0; x < output.limit(); x++) { + if (expectedOutput.charAt(x) != output.charAt(x)) + throw new Exception("JISAutoDetect returned a wrong string"+testNumber); + } + } + } + + public JISAutoDetectTest() { + int i = 0; + + // 0 + data[i] = new TestData(); + data[i].input = new byte[] { (byte)'C', (byte)'o', (byte)'p', (byte)'y', + (byte)'r', (byte)'i', (byte)'g', (byte)'h', + (byte)'t', (byte)' ', (byte)0xa9, (byte)' ', + (byte)'1', (byte)'9', (byte)'9', (byte)'8' }; + data[i].expectedCharset = "SJIS"; + + // 1 + i++; + data[i] = new TestData(); + data[i].input = new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2, + (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd, + (byte)0xc3, (byte)0xd1, (byte)0xbd, (byte)0xde, + (byte)0x82, (byte)0xc5, (byte)0x82, (byte)0xb7 }; + data[i].expectedCharset = "SJIS"; + + // 2 + i++; + data[i] = new TestData(); + data[i].input = new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2, + (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd, + (byte)0xc3, (byte)0xd1, (byte)0xbd, (byte)0xde}; + data[i].expectedCharset = "SJIS"; + + // 3 + i++; + data[i] = new TestData(); + data[i].input = new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2, + (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd, + (byte)0xc3, (byte)0xd1, (byte)0xbd }; + data[i].expectedCharset = "SJIS"; + + // 4 + i++; + data[i] = new TestData(); + data[i].input = new byte[] { (byte)0x8f, (byte)0xa1, (byte)0xaa }; + data[i].expectedCharset = "SJIS"; + + // 5 + i++; + data[i] = new TestData(); + data[i].input = new byte[] { (byte)0xa4, (byte)0xd2, (byte)0xa4, (byte)0xe9, + (byte)0xa4, (byte)0xac, (byte)0xa4, (byte)0xca }; + data[i].expectedCharset = "EUC_JP"; + + // 6 + i++; + data[i] = new TestData(); + data[i].input = new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2, + (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd, + (byte)0xc3, (byte)0xd1, (byte)0xbd, (byte)0xde, + (byte)0xa4, (byte)0xc7, (byte)0xa4, (byte)0xb9 }; + data[i].expectedCharset = "EUC_JP"; + + // 7 (for 4184592) + i++; + data[i] = new TestData(); + data[i].input = new byte[] { (byte)'a', (byte)'b', (byte)'c' }; + data[i].input2 = new byte[] { (byte)0x1b, (byte)'$', (byte)'B', + (byte)'#', (byte)'4', (byte)'$', (byte)'5', + (byte)0x1b, (byte)'(', (byte)'B' }; + data[i].expectedCharset = "ISO2022JP"; + } +} diff --git a/jdk/test/sun/nio/cs/LatinCharReplacementTWTest.java b/jdk/test/sun/nio/cs/LatinCharReplacementTWTest.java new file mode 100644 index 00000000000..da2123d6974 --- /dev/null +++ b/jdk/test/sun/nio/cs/LatinCharReplacementTWTest.java @@ -0,0 +1,80 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 4658679 4879644 + @summary Checks replacement logic within EUC-TW decoder +*/ + +/* + * Tests goodness of fix for bugID 4658679: EUC-TW decoder should + * perform replacement when it encounters latin chars outside the + * normal US-ASCII range. For example: Isolated occurrences of + * French accented chars. See bugID: 4658679. + */ +import java.io.*; +public class LatinCharReplacementTWTest { + public static void main(String[] args) throws Exception { + final String bugID = "4658679"; + // Attempt to decode + byte[] input = { (byte)0xa1, + (byte)0xf0, + (byte)'r', + (byte)'e', + (byte)'s', + (byte)0xe9, // illegal within EUC-TW + (byte)'r', + (byte)'v', + (byte)0xe9, // illegal within EUC-TW + (byte)'s', + (byte)0xa2, + (byte)0xf8 + }; + + char[] expected = { (char) 0xa7, + (char) 'r', + (char) 'e', + (char) 's', + (char) 0xFFFD, // replacement for accented lowercase e + (char) 'r', + (char) 'v', + (char) 0xFFFD, // replacement for accented lowercase e + (char) 's', + (char) 0xb0 }; + + ByteArrayInputStream bais = new ByteArrayInputStream(input); + InputStreamReader isr = new InputStreamReader(bais, "x-EUC-TW"); + + char[] decoded = new char[128]; + int numChars = isr.read(decoded); + + if (numChars != expected.length) { + throw new Exception("failure of test for bug " + bugID); + } + + for (int i = 0 ; i < numChars; i++) { + if (decoded[i] != expected[i]) + throw new Exception("failure of test for bug " + bugID); + } + } +} diff --git a/jdk/test/sun/nio/cs/LeftOverSurrogate.java b/jdk/test/sun/nio/cs/LeftOverSurrogate.java new file mode 100644 index 00000000000..e23543845ea --- /dev/null +++ b/jdk/test/sun/nio/cs/LeftOverSurrogate.java @@ -0,0 +1,55 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 4160949 + @summary Verify that left over high surrogate does not + cause an UnknownCharacterException when substitutition mode is turned on. + */ + +import java.nio.*; +import java.nio.charset.*; + +public class LeftOverSurrogate { + + public static void main(String args[]) throws Exception { + String s = "abc\uD800\uDC00qrst"; // Valid surrogate + char[] c = s.toCharArray(); + CharsetEncoder enc = Charset.forName("ISO8859_1").newEncoder() + .onUnmappableCharacter(CodingErrorAction.REPLACE); + /* Process the first 4 characters, including the high surrogate + which should be stored */ + ByteBuffer bb = ByteBuffer.allocate(10); + CharBuffer cb = CharBuffer.wrap(c); + cb.limit(4); + enc.encode(cb, bb, false); + cb.limit(7); + enc.encode(cb, bb, true); + byte[] first = bb.array(); + for(int i = 0; i < 7; i++) + System.err.printf("[%d]=%d was %d\n", + i, + (int) first[i] &0xffff, + (int) c[i] & 0xffff); + } +} diff --git a/jdk/test/sun/nio/cs/MalformedSurrogates.java b/jdk/test/sun/nio/cs/MalformedSurrogates.java new file mode 100644 index 00000000000..c6d6713d7c0 --- /dev/null +++ b/jdk/test/sun/nio/cs/MalformedSurrogates.java @@ -0,0 +1,85 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 4153987 + @summary Malformed surrogates should be handled by the converter in + substitution mode. + */ + +import java.io.*; + +public class MalformedSurrogates { + + public static void main(String[] args) throws Exception { + + String fe = System.getProperty("file.encoding"); + if ( fe.equalsIgnoreCase("UTF8") + || fe.equalsIgnoreCase("UTF-8") + || fe.equalsIgnoreCase("UTF_8")) + // This test is meaningless if the default charset + // does handle surrogates + return; + + System.out.println("Testing string conversion..."); + /* Example with malformed surrogate, and an offset */ + String t = "abc\uD800\uDB00efgh"; + String t2 = t.substring(2); + byte[] b = t2.getBytes(); + System.err.println(b.length); + for (int i = 0; i < b.length; i++) + System.err.println("[" + i + "]" + "=" + (char) b[i] + + "=" + (int) b[i]); + if (b.length != 7) { + throw new Exception("Bad string conversion for bad surrogate"); + } + + /* Example with a proper surrogate, no offset. Always worked */ + String t3 = "abc\uD800\uDC00efgh"; + byte[] b2 = t3.getBytes(); + System.out.println(b2.length); + for(int i = 0; i < b2.length; i++) + System.err.println("[" + i + "]" + "=" + (char) b2[i]); + if (b2.length != 8) { + throw new Exception("Bad string conversion for good surrogate"); + } + + OutputStream os = new ByteArrayOutputStream(); + OutputStreamWriter osw = new OutputStreamWriter(os); + System.out.println("Testing flush...."); + /* Check for the case where the converter has a left over + high surrogate when flush is called on the converter */ + osw.flush(); + String s = "abc\uD800"; // High surrogate + char[] c = s.toCharArray(); + osw.write(s, 0, 4); + osw.flush(); + + System.out.println("Testing convert..."); + /* Verify that all other characters go through */ + for (int k = 1; k < 65535 ; k++) { + osw.write("Char[" + k + "]=\"" + ((char) k) + "\""); + } + + } +} diff --git a/jdk/test/sun/nio/cs/NIOJISAutoDetectTest.java b/jdk/test/sun/nio/cs/NIOJISAutoDetectTest.java new file mode 100644 index 00000000000..3e19aa1490a --- /dev/null +++ b/jdk/test/sun/nio/cs/NIOJISAutoDetectTest.java @@ -0,0 +1,282 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4831163 5053096 5056440 + * @summary NIO charset basic verification of JISAutodetect decoder + * @author Martin Buchholz + */ + +import java.io.*; +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.CoderResult; +import static java.lang.System.*; + +public class NIOJISAutoDetectTest { + private static int failures = 0; + + private static void fail(String failureMsg) { + System.out.println(failureMsg); + failures++; + } + + private static void check(boolean cond, String msg) { + if (!cond) { + fail("test failed: " + msg); + new Exception().printStackTrace(); + } + } + + private static String SJISName() throws Exception { + return detectingCharset(new byte[] {(byte)0xbb, (byte)0xdd, + (byte)0xcf, (byte)0xb2}); + } + + private static String EUCJName() throws Exception { + return detectingCharset(new byte[] {(byte)0xa4, (byte)0xd2, + (byte)0xa4, (byte)0xe9}); + } + + private static String detectingCharset(byte[] bytes) throws Exception { + //---------------------------------------------------------------- + // Test special public methods of CharsetDecoder while we're here + //---------------------------------------------------------------- + CharsetDecoder cd = Charset.forName("JISAutodetect").newDecoder(); + check(cd.isAutoDetecting(), "isAutodecting()"); + check(! cd.isCharsetDetected(), "isCharsetDetected"); + cd.decode(ByteBuffer.wrap(new byte[] {(byte)'A'})); + check(! cd.isCharsetDetected(), "isCharsetDetected"); + try { + cd.detectedCharset(); + fail("no IllegalStateException"); + } catch (IllegalStateException e) {} + cd.decode(ByteBuffer.wrap(bytes)); + check(cd.isCharsetDetected(), "isCharsetDetected"); + Charset cs = cd.detectedCharset(); + check(cs != null, "cs != null"); + check(! cs.newDecoder().isAutoDetecting(), "isAutodetecting()"); + return cs.name(); + } + + public static void main(String[] argv) throws Exception { + //---------------------------------------------------------------- + // Used to throw BufferOverflowException + //---------------------------------------------------------------- + out.println(new String(new byte[] {0x61}, "JISAutoDetect")); + + //---------------------------------------------------------------- + // InputStreamReader(...JISAutoDetect) used to infloop + //---------------------------------------------------------------- + { + byte[] bytes = "ABCD\n".getBytes(); + ByteArrayInputStream bais = new ByteArrayInputStream(bytes); + InputStreamReader isr = new InputStreamReader(bais, "JISAutoDetect"); + BufferedReader reader = new BufferedReader(isr); + check (reader.readLine().equals("ABCD"), "first read gets text"); + // used to return "ABCD" on second and subsequent reads + check (reader.readLine() == null, "second read gets null"); + } + + //---------------------------------------------------------------- + // Check all Japanese chars for sanity + //---------------------------------------------------------------- + String SJIS = SJISName(); + String EUCJ = EUCJName(); + out.printf("SJIS charset is %s%n", SJIS); + out.printf("EUCJ charset is %s%n", EUCJ); + + int cnt2022 = 0; + int cnteucj = 0; + int cntsjis = 0; + int cntBAD = 0; + for (char c = '\u0000'; c < '\uffff'; c++) { + if (c == '\u001b' || // ESC + c == '\u2014') // Em-Dash? + continue; + String s = new String (new char[] {c}); + + //---------------------------------------------------------------- + // JISAutoDetect can handle all chars that EUC-JP can, + // unless there is an ambiguity with SJIS. + //---------------------------------------------------------------- + byte[] beucj = s.getBytes(EUCJ); + String seucj = new String(beucj, EUCJ); + if (seucj.equals(s)) { + cnteucj++; + String sauto = new String(beucj, "JISAutoDetect"); + + if (! sauto.equals(seucj)) { + cntBAD++; + String ssjis = new String(beucj, SJIS); + if (! sauto.equals(ssjis)) { + fail("Autodetection agrees with neither EUC nor SJIS"); + } + } + } else + continue; // Optimization + + //---------------------------------------------------------------- + // JISAutoDetect can handle all chars that ISO-2022-JP can. + //---------------------------------------------------------------- + byte[] b2022 = s.getBytes("ISO-2022-JP"); + if (new String(b2022, "ISO-2022-JP").equals(s)) { + cnt2022++; + check(new String(b2022,"JISAutoDetect").equals(s), + "ISO2022 autodetection"); + } + + //---------------------------------------------------------------- + // JISAutoDetect can handle almost all chars that SJIS can. + //---------------------------------------------------------------- + byte[] bsjis = s.getBytes(SJIS); + if (new String(bsjis, SJIS).equals(s)) { + cntsjis++; + check(new String(bsjis,"JISAutoDetect").equals(s), + "SJIS autodetection"); + } + } + out.printf("There are %d ISO-2022-JP-encodable characters.%n", cnt2022); + out.printf("There are %d SJIS-encodable characters.%n", cntsjis); + out.printf("There are %d EUC-JP-encodable characters.%n", cnteucj); + out.printf("There are %d characters that are " + + "misdetected as SJIS after being EUC-encoded.%n", cntBAD); + + + //---------------------------------------------------------------- + // tests for specific byte sequences + //---------------------------------------------------------------- + test("ISO-2022-JP", new byte[] {'A', 'B', 'C'}); + test("EUC-JP", new byte[] {'A', 'B', 'C'}); + test("SJIS", new byte[] {'A', 'B', 'C'}); + + test("SJIS", + new byte[] { 'C', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't', + ' ', (byte)0xa9, ' ', '1', '9', '9', '8' }); + + test("SJIS", + new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2, + (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd, + (byte)0xc3, (byte)0xd1, (byte)0xbd, (byte)0xde, + (byte)0x82, (byte)0xc5, (byte)0x82, (byte)0xb7 }); + + test("EUC-JP", + new byte[] { (byte)0xa4, (byte)0xd2, (byte)0xa4, (byte)0xe9, + (byte)0xa4, (byte)0xac, (byte)0xa4, (byte)0xca }); + + test("SJIS", + new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2, + (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd, + (byte)0xc3, (byte)0xd1, (byte)0xbd, (byte)0xde}); + + test("SJIS", + new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2, + (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd, + (byte)0xc3, (byte)0xd1, (byte)0xbd }); + + test("SJIS", + new byte[] { (byte)0x8f, (byte)0xa1, (byte)0xaa }); + + test("EUC-JP", + new byte[] { (byte)0x8f, (byte)0xc5, (byte)0xe0, (byte)0x20}); + + test("EUC-JP", + new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2, + (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd, + (byte)0xc3, (byte)0xd1, (byte)0xbd, (byte)0xde, + (byte)0xa4, (byte)0xc7, (byte)0xa4, (byte)0xb9 }); + + test("ISO-2022-JP", + new byte[] { 0x1b, '$', 'B', '#', '4', '$', '5', 0x1b, '(', 'B' }); + + + //---------------------------------------------------------------- + // Check handling of ambiguous end-of-input in middle of first char + //---------------------------------------------------------------- + { + CharsetDecoder dc = Charset.forName("x-JISAutoDetect").newDecoder(); + ByteBuffer bb = ByteBuffer.allocate(128); + CharBuffer cb = CharBuffer.allocate(128); + bb.put((byte)'A').put((byte)0x8f); + bb.flip(); + CoderResult res = dc.decode(bb,cb,false); + check(res.isUnderflow(), "isUnderflow"); + check(bb.position() == 1, "bb.position()"); + check(cb.position() == 1, "cb.position()"); + res = dc.decode(bb,cb,false); + check(res.isUnderflow(), "isUnderflow"); + check(bb.position() == 1, "bb.position()"); + check(cb.position() == 1, "cb.position()"); + bb.compact(); + bb.put((byte)0xa1); + bb.flip(); + res = dc.decode(bb,cb,true); + check(res.isUnderflow(), "isUnderflow"); + check(bb.position() == 2, "bb.position()"); + check(cb.position() == 2, "cb.position()"); + } + + + if (failures > 0) + throw new RuntimeException(failures + " tests failed"); + } + + static void checkCoderResult(CoderResult result) { + check(result.isUnderflow(), + "Unexpected coder result: " + result); + } + + static void test(String expectedCharset, byte[] input) throws Exception { + Charset cs = Charset.forName("x-JISAutoDetect"); + CharsetDecoder autoDetect = cs.newDecoder(); + + Charset cs2 = Charset.forName(expectedCharset); + CharsetDecoder decoder = cs2.newDecoder(); + + ByteBuffer bb = ByteBuffer.allocate(128); + CharBuffer charOutput = CharBuffer.allocate(128); + CharBuffer charExpected = CharBuffer.allocate(128); + + bb.put(input); + bb.flip(); + bb.mark(); + + CoderResult result = autoDetect.decode(bb, charOutput, true); + checkCoderResult(result); + charOutput.flip(); + String actual = charOutput.toString(); + + bb.reset(); + + result = decoder.decode(bb, charExpected, true); + checkCoderResult(result); + charExpected.flip(); + String expected = charExpected.toString(); + + check(actual.equals(expected), + String.format("actual=%s expected=%s", actual, expected)); + } +} diff --git a/jdk/test/sun/nio/cs/ReadZero.java b/jdk/test/sun/nio/cs/ReadZero.java new file mode 100644 index 00000000000..d676b9ec2cd --- /dev/null +++ b/jdk/test/sun/nio/cs/ReadZero.java @@ -0,0 +1,58 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + * @summary Verify that if InputStream.read returns 0 we throw an exception. + * @bug 4684515 + */ + +import java.io.*; + +public class ReadZero { + + public static void main(String [] args) throws IOException { + ReadZero r = new ReadZero(); + r.testInputStream(); + } + + private void testInputStream() throws IOException { + File f = new File(System.getProperty("test.src", "."), "ReadZero.java"); + InputStream is = new FileInputStream(f) { + public int read(byte [] b, int off, int len) { + System.out.println("FileInputStream.read"); + return 0; + } + }; + + is.read(new byte[1], 0, 1); // ok + InputStreamReader isr = new InputStreamReader(is); + + try { + int res = isr.read(new char[1], 0, 1); + } catch (IOException x) { + System.out.println("IOException caught"); + return; + } + throw new RuntimeException("IOException not thrown"); + } +} diff --git a/jdk/test/sun/nio/cs/SJISCanEncode.java b/jdk/test/sun/nio/cs/SJISCanEncode.java new file mode 100644 index 00000000000..9e843bf9b30 --- /dev/null +++ b/jdk/test/sun/nio/cs/SJISCanEncode.java @@ -0,0 +1,73 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 4913702 + @summary validates canEncode(char c) method for sun.nio.cs.Shift_JIS + */ + + +import java.nio.*; +import java.nio.charset.*; + +public class SJISCanEncode { + private Charset cs; + private CharsetEncoder encoder; + + private void canEncodeTest(char inputChar, + boolean expectedResult) + throws Exception { + String msg = "err: Shift_JIS canEncode() return value "; + + if (encoder.canEncode(inputChar) != expectedResult) { + throw new Exception(msg + !(expectedResult) + + ": " + Integer.toHexString((int)inputChar)); + } + } + + public static void main(String[] args) throws Exception { + SJISCanEncode test = new SJISCanEncode(); + test.cs = Charset.forName("SJIS"); + test.encoder = test.cs.newEncoder(); + + // us-ascii (mappable by Shift_JIS) + test.canEncodeTest('\u0001', true); + + // Halfwidth Katakana + test.canEncodeTest('\uFF01', true); + + // CJK ideograph + test.canEncodeTest('\u4E9C', true); + + //Hiragana + test.canEncodeTest('\u3041', true); + // fullwidth Katakana + test.canEncodeTest('\u30A1', true); + + // U+0080 should be unmappable + // U+4000 is a BMP character not covered by Shift_JISe + + test.canEncodeTest('\u0080', false); + test.canEncodeTest('\u4000', false); + } +} diff --git a/jdk/test/sun/nio/cs/StreamEncoderClose.java b/jdk/test/sun/nio/cs/StreamEncoderClose.java new file mode 100644 index 00000000000..9c7d6b5c407 --- /dev/null +++ b/jdk/test/sun/nio/cs/StreamEncoderClose.java @@ -0,0 +1,76 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 5005426 + @summary Check if StreamEncoder close() method works correctly from + error recovery after the underneath OutputStream failed to + close the first time. + */ + +import java.io.*; +public class StreamEncoderClose { + public static void main( String arg[] ) throws Exception { + byte[] expected = {(byte)0x1b,(byte)0x24,(byte)0x42, + (byte)0x30,(byte)0x6c, + (byte)0x1b,(byte)0x28,(byte)0x42}; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + MyBufferedOutputStream mbos = new MyBufferedOutputStream(baos); + PrintWriter pw = new PrintWriter(new OutputStreamWriter(mbos, "ISO-2022-JP")); + mbos.dontClose(); + pw.write("\u4e00"); + pw.close(); // 1st PrintWriter Close + mbos.canClose(); + pw.close(); // 2nd PrintWriter Close + + //double check, probably not necessary + byte[] out = baos.toByteArray(); + if (out.length != expected.length) { + throw new IOException("Failed"); + } + for (int i = 0; i < out.length; i++) { + //System.out.printf("(byte)0x%x,", out[i] & 0xff); + if (out[i] != expected[i]) + throw new IOException("Failed"); + } + } + + static class MyBufferedOutputStream extends BufferedOutputStream { + MyBufferedOutputStream(OutputStream os) { + super(os); + } + private boolean status; + public void dontClose() { + status = false; + } + public void canClose() { + status = true; + } + public void close() throws IOException { + if ( status == false ) { + throw new IOException("Can't close "); + } + super.close(); + } + } +} diff --git a/jdk/test/sun/nio/cs/SurrogateGB18030Test.java b/jdk/test/sun/nio/cs/SurrogateGB18030Test.java new file mode 100644 index 00000000000..f104463b6e0 --- /dev/null +++ b/jdk/test/sun/nio/cs/SurrogateGB18030Test.java @@ -0,0 +1,121 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 4896454 + @summary Check GB18030 surrogate encoding/decoding handling + */ + +import java.nio.*; +import java.nio.charset.*; + +public class SurrogateGB18030Test { + public static void main(String[] args) throws Exception { + SurrogateGB18030Test test = new SurrogateGB18030Test(); + + test.roundtripTest(); + + /** + * Valid Surrogate pair and 4 byte GB18030 representation + */ + + String inputString = "\uD800\uDC00"; + + byte[] expectedBytes = { (byte)0x90, + (byte)0x30, + (byte)0x81, + (byte)0x30 + }; + test.encodeTest(inputString, expectedBytes); + + /** + * Vice-versa : check that 4 byte GB18030 value encodes correctly + */ + + String expectedStr = "\uDBFF\uDFFF"; + + byte[] inputBytes = { (byte)0xe3, + (byte)0x32, + (byte)0x9a, + (byte)0x35 + }; + + + test.decodeTest(inputBytes, expectedStr); + + } + + private void roundtripTest() throws Exception + { + byte[] ba; + char[] pair = new char[2]; + for (char high = '\ud800'; high <= '\udbff'; high++) { + for (char low = '\udc00'; low <= '\udfff'; low++) { + pair[0] = high; + pair[1] = low; + String s = new String(pair); + if (!s.equals(new String(s.getBytes("gb18030"), "gb18030"))) + throw new Exception ("GB18030 roundtrip failure"); + } + } + + } + + private void encodeTest(String inputString, byte[] expectedBytes) + throws Exception + { + byte[] encoded = inputString.getBytes("GB18030"); + + CharBuffer cb = CharBuffer.wrap(inputString.toCharArray()); + ByteBuffer bb = ByteBuffer.allocate(4); + + CharsetEncoder encoder = Charset.forName("GB18030").newEncoder(); + encoder.encode(cb, bb, true); + + bb.flip(); + for (int i = 0 ; i < expectedBytes.length; i++) { + if (encoded[i] != expectedBytes[i] + || bb.get() != expectedBytes[i]) + throw new Exception ("GB18030 encode failure"); + } + } + + private void decodeTest(byte[] inputBytes, String expectedStr) + throws Exception + { + String s2 = new String(inputBytes, "GB18030"); + + CharsetDecoder decoder = Charset.forName("GB18030").newDecoder(); + + ByteBuffer bb = ByteBuffer.wrap(inputBytes); + CharBuffer cb = CharBuffer.allocate(2); + decoder.decode(bb, cb, true); + + cb.flip(); + for (int i = 0 ; i < expectedStr.length(); i++) { + if (expectedStr.charAt(i) != cb.get() + || s2.charAt(i) != expectedStr.charAt(i)) + throw new Exception ("GB18030 encode failure"); + } + } +} diff --git a/jdk/test/sun/nio/cs/SurrogateTestEUCTW.java b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.java new file mode 100644 index 00000000000..25aa0c0d48f --- /dev/null +++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.java @@ -0,0 +1,95 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 4847097 + @summary Check surrogate coverage of EUC_TW + */ + +/* + * Tests the full surrogate mapping roundtrip fidelity of the + * EUC-TW charset coder updated to support the additional + * planes 4,5,6,7,15 + * + * byte->char mappings are contained in external files + * using plane{x}.surrogate as the convention for the input filenames + * + */ + +import java.io.*; +public class SurrogateTestEUCTW { + + private static final String testRootDir + = System.getProperty("test.src", "."); + + public static void main(String[] args) throws Exception { + char[] surrogatePair = new char[2]; + int[] expectBytes = new int[4]; + + // Iterate test over each supported CNS-11643 plane + // containing supplementary character mappings + + String[] testPlane = { "3", "4", "5", "6" ,"7", "15" }; + + for (int i = 0 ; i < testPlane.length; i++) { + FileReader f = new FileReader(testRootDir + + System.getProperty("file.separator") + + "SurrogateTestEUCTW.plane" + + testPlane[i] + + ".surrogates"); + BufferedReader r = new BufferedReader(f); + String line; + + while ((line = r.readLine()) != null) { + int charValue = Integer.parseInt(line.substring(9,14), 16); + surrogatePair[0] = (char) ((charValue - 0x10000) / 0x400 + + 0xd800); + surrogatePair[1] = (char) ((charValue - 0x10000) % 0x400 + + 0xdc00); + // Synthesize 4 byte expected byte values from CNS input values + expectBytes[0] = 0x8E; + expectBytes[1] = 0xA0 + Integer.parseInt(testPlane[i]); + expectBytes[2] = 0x80 | Integer.parseInt(line.substring(2,4), 16); + expectBytes[3] = 0x80 | Integer.parseInt(line.substring(4,6), 16); + + String testStr = new String(surrogatePair); + byte[] encodedBytes = testStr.getBytes("EUC-TW"); + + for (int x = 0 ; x < 4 ; x++) { + if (encodedBytes[x] != (byte)(expectBytes[x] & 0xff)) { + throw new Exception("EUC_TW Surrogate Encoder error"); + } + } + + // Next: test round-trip fidelity + String decoded = new String(encodedBytes, "EUC-TW"); + + if (!decoded.equals(testStr)) { + throw new Exception("EUCTW Decoder error"); + } + } + r.close(); + f.close(); + } + } +} diff --git a/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane15.surrogates b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane15.surrogates new file mode 100644 index 00000000000..24c1a00883e --- /dev/null +++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane15.surrogates @@ -0,0 +1,6476 @@ +0x2121 0x20002 +0x2122 0x2008C +0x2123 0x200D4 +0x2124 0x201A5 +0x2125 0x20092 +0x2126 0x20093 +0x2127 0x200D8 +0x2128 0x200D9 +0x2129 0x201A7 +0x212A 0x2062B +0x212B 0x2062C +0x212C 0x2062D +0x212D 0x20630 +0x212E 0x2062E +0x212F 0x206AB +0x2131 0x2092D +0x2132 0x2096D +0x2133 0x2F834 +0x2134 0x20A0F +0x2136 0x20B9D +0x2137 0x211A2 +0x2138 0x215D4 +0x2139 0x21B56 +0x213A 0x21BC3 +0x213B 0x22014 +0x213D 0x2471A +0x213E 0x2000F +0x213F 0x20010 +0x2140 0x2009A +0x2141 0x2009B +0x2143 0x201AC +0x2145 0x20097 +0x2146 0x20546 +0x2148 0x20576 +0x2149 0x20577 +0x214A 0x205AE +0x214B 0x2063A +0x214C 0x2067D +0x214D 0x21BC5 +0x214E 0x20BA8 +0x2151 0x21241 +0x2152 0x21242 +0x2153 0x215D8 +0x2154 0x215D9 +0x2155 0x216AA +0x2156 0x216AB +0x2157 0x21942 +0x2158 0x21941 +0x215A 0x21BC6 +0x215C 0x21D35 +0x215D 0x21D36 +0x215E 0x21D37 +0x215F 0x2F883 +0x2160 0x2634D +0x2162 0x221B5 +0x2163 0x22317 +0x2164 0x22482 +0x2165 0x233B6 +0x2167 0x23C72 +0x2168 0x2455C +0x2169 0x245A8 +0x216B 0x215E3 +0x216E 0x200E6 +0x216F 0x20144 +0x2170 0x20145 +0x2173 0x201C4 +0x2174 0x201C5 +0x2175 0x201C6 +0x2176 0x201C7 +0x2177 0x201C8 +0x2178 0x201C9 +0x2179 0x201CA +0x217A 0x201D4 +0x217B 0x2057D +0x217C 0x26272 +0x217D 0x205B2 +0x217E 0x205B4 +0x2221 0x20682 +0x2222 0x206C7 +0x2223 0x206C8 +0x2225 0x2083C +0x2226 0x2083D +0x2227 0x2083E +0x2228 0x2083F +0x2229 0x2F824 +0x222A 0x208D3 +0x222B 0x20147 +0x222D 0x20A3D +0x222E 0x20AE2 +0x222F 0x20BB8 +0x2230 0x20BB9 +0x2231 0x20BC2 +0x2232 0x20BBA +0x2233 0x20BC6 +0x2234 0x20BBB +0x2235 0x211AD +0x2236 0x2124C +0x2237 0x2124D +0x2239 0x216B2 +0x223A 0x216B3 +0x223B 0x216B4 +0x223C 0x216B5 +0x223D 0x219C3 +0x223E 0x219C4 +0x223F 0x219C5 +0x2240 0x219C6 +0x2241 0x219C7 +0x2243 0x21BCE +0x2244 0x21C30 +0x2245 0x21D47 +0x2246 0x21D48 +0x2248 0x2205C +0x224A 0x2205F +0x224B 0x22318 +0x224C 0x22319 +0x224D 0x2237E +0x224F 0x225B0 +0x2250 0x22A75 +0x2252 0x22A76 +0x2253 0x23041 +0x2254 0x23142 +0x2256 0x233BD +0x225A 0x23B1E +0x225B 0x23B1F +0x225C 0x23C87 +0x225E 0x23C78 +0x225F 0x24188 +0x2260 0x24189 +0x2261 0x2418A +0x2262 0x24617 +0x2263 0x24615 +0x2267 0x250E5 +0x2268 0x25609 +0x2269 0x2573B +0x226A 0x2574F +0x226C 0x2662E +0x226D 0x2662F +0x226E 0x26AFF +0x226F 0x26AFD +0x2270 0x26AFE +0x2274 0x20023 +0x2275 0x200EA +0x2276 0x2012A +0x2277 0x20149 +0x2278 0x2014A +0x2279 0x2014B +0x227A 0x201DF +0x227B 0x201E0 +0x227C 0x201E1 +0x227D 0x201E2 +0x227E 0x205C1 +0x2321 0x201E3 +0x2322 0x201E4 +0x2323 0x201E5 +0x2324 0x205C0 +0x2325 0x201E6 +0x2326 0x201F7 +0x2328 0x201E7 +0x2329 0x201E8 +0x232A 0x201E9 +0x232B 0x201EA +0x232C 0x201EB +0x232D 0x2050E +0x232E 0x20580 +0x232F 0x20581 +0x2330 0x205BA +0x2331 0x205BB +0x2332 0x205BC +0x2333 0x205BD +0x2334 0x2063F +0x2335 0x20640 +0x2336 0x20688 +0x2337 0x2F81F +0x2338 0x20846 +0x233A 0x20847 +0x233B 0x20848 +0x233C 0x20936 +0x233D 0x20972 +0x233E 0x20996 +0x233F 0x20A47 +0x2340 0x20AE7 +0x2341 0x20B34 +0x2342 0x20B35 +0x2343 0x20B36 +0x2344 0x20B37 +0x2345 0x20BE3 +0x2346 0x20BE4 +0x2347 0x20BE5 +0x2348 0x20BEB +0x234A 0x20BE6 +0x234B 0x20BE7 +0x234C 0x20BE8 +0x234F 0x211B9 +0x2351 0x211BA +0x2353 0x21263 +0x2354 0x21264 +0x2356 0x21265 +0x2358 0x21266 +0x2359 0x2127C +0x235A 0x21267 +0x235B 0x2F85A +0x235C 0x21559 +0x235D 0x215E9 +0x235E 0x215EA +0x235F 0x215EB +0x2360 0x215EC +0x2361 0x215ED +0x2362 0x215EE +0x2363 0x215EF +0x2364 0x216BF +0x2365 0x216CB +0x2366 0x216C3 +0x2367 0x216D5 +0x2368 0x216C4 +0x2369 0x216C5 +0x236A 0x216D3 +0x236B 0x216C6 +0x236C 0x216C7 +0x236D 0x216C8 +0x236E 0x216C9 +0x236F 0x216CA +0x2370 0x2194A +0x2372 0x219D1 +0x2373 0x21B61 +0x2374 0x21C37 +0x2376 0x21D64 +0x2377 0x21D66 +0x2379 0x21D67 +0x237A 0x21D68 +0x237B 0x21D69 +0x237D 0x21D73 +0x237E 0x21D6A +0x2421 0x21D6B +0x2424 0x22072 +0x2426 0x221B9 +0x2427 0x2231C +0x2428 0x22336 +0x2429 0x223BC +0x242A 0x223BE +0x242B 0x223BF +0x242C 0x223C0 +0x242D 0x22487 +0x242E 0x225DC +0x242F 0x225DD +0x2430 0x225F5 +0x2431 0x225DE +0x2432 0x225DF +0x2433 0x2F89E +0x2434 0x225E0 +0x2435 0x225E1 +0x2436 0x225E2 +0x2437 0x22A2C +0x2438 0x22A2D +0x243A 0x22AA9 +0x243B 0x22A9C +0x243C 0x22A9D +0x243D 0x22A9E +0x243E 0x22A9F +0x243F 0x22AA0 +0x2440 0x22AA1 +0x2441 0x22AA2 +0x2443 0x22AA3 +0x2444 0x22AA4 +0x2445 0x22AA7 +0x2446 0x23042 +0x2447 0x23093 +0x2448 0x23151 +0x244A 0x23152 +0x244B 0x23144 +0x244C 0x23153 +0x244D 0x23322 +0x244E 0x233C6 +0x244F 0x233C7 +0x2450 0x233C9 +0x2451 0x2F8DD +0x2452 0x233CA +0x2454 0x233C8 +0x2455 0x23B24 +0x2456 0x23B25 +0x2457 0x23B26 +0x2459 0x23B27 +0x245A 0x23B28 +0x245C 0x23C58 +0x245D 0x2F8FB +0x245E 0x23CA7 +0x245F 0x23C88 +0x2460 0x23C89 +0x2461 0x23CA5 +0x2462 0x23CA8 +0x2463 0x23CA9 +0x2464 0x23CAA +0x2465 0x23CAB +0x2466 0x23CAC +0x2467 0x23CAD +0x2469 0x23C79 +0x246B 0x24194 +0x246C 0x24195 +0x246D 0x24196 +0x2470 0x24197 +0x2472 0x24198 +0x2473 0x2454E +0x2474 0x2454F +0x2475 0x24619 +0x2477 0x24741 +0x2478 0x2F92A +0x2479 0x248F7 +0x247A 0x24C04 +0x247B 0x24C19 +0x247C 0x24C17 +0x247D 0x25040 +0x247E 0x250EC +0x2521 0x2541B +0x2522 0x2541C +0x2524 0x2560E +0x2525 0x25752 +0x2526 0x25AD8 +0x2527 0x25E26 +0x2528 0x26274 +0x252A 0x26275 +0x252B 0x269C6 +0x252C 0x26B0B +0x252D 0x26B0C +0x252E 0x26B0D +0x252F 0x26B0E +0x2530 0x26B0F +0x2531 0x26B10 +0x2533 0x28459 +0x2534 0x2845A +0x2535 0x28683 +0x2536 0x28684 +0x2537 0x28685 +0x253A 0x28E20 +0x253B 0x28E21 +0x253C 0x28E22 +0x253D 0x28E23 +0x253E 0x28E24 +0x253F 0x28E29 +0x2540 0x200F4 +0x2542 0x2158F +0x2543 0x20151 +0x2545 0x20217 +0x2546 0x20218 +0x2547 0x2025B +0x2548 0x20219 +0x2549 0x2021A +0x254B 0x2021B +0x254C 0x2021C +0x254D 0x2021D +0x254E 0x2021E +0x254F 0x2021F +0x2550 0x20220 +0x2551 0x20221 +0x2552 0x2048B +0x2553 0x20488 +0x2555 0x20585 +0x2556 0x26287 +0x2557 0x205C7 +0x2558 0x2064C +0x2559 0x2064D +0x255A 0x206FC +0x255B 0x206FD +0x255C 0x206FE +0x255D 0x206FF +0x2560 0x20856 +0x2561 0x20857 +0x2562 0x20858 +0x2563 0x20859 +0x2564 0x208DC +0x2565 0x208DD +0x2566 0x20973 +0x2567 0x2099D +0x2568 0x209A1 +0x2569 0x2099E +0x256A 0x2099F +0x256B 0x209A0 +0x256C 0x209E6 +0x256D 0x20A51 +0x256E 0x20A52 +0x256F 0x20B3D +0x2570 0x20C22 +0x2572 0x20C23 +0x2573 0x20C24 +0x2574 0x20C25 +0x2575 0x20C26 +0x2576 0x20C27 +0x2577 0x20C28 +0x2578 0x20C29 +0x2579 0x20C2A +0x257A 0x20C2B +0x257C 0x20C40 +0x257D 0x20C2C +0x257E 0x20C2D +0x2621 0x20C2E +0x2622 0x20C2F +0x2623 0x20C30 +0x2624 0x211D0 +0x2625 0x212A8 +0x2626 0x21294 +0x2627 0x21295 +0x2628 0x21296 +0x2629 0x21297 +0x262A 0x21298 +0x262B 0x2129C +0x262C 0x2129B +0x262E 0x212A1 +0x262F 0x212A0 +0x2630 0x21299 +0x2631 0x2129A +0x2632 0x212A7 +0x2634 0x21564 +0x2636 0x21600 +0x2637 0x21601 +0x263A 0x216E5 +0x263B 0x216E9 +0x263C 0x216FB +0x263D 0x216FC +0x263E 0x216EA +0x263F 0x216EB +0x2640 0x216EC +0x2641 0x216ED +0x2642 0x216EE +0x2643 0x216EF +0x2644 0x216FA +0x2645 0x216F0 +0x2646 0x216F1 +0x2647 0x216F2 +0x2648 0x216F3 +0x2649 0x216F4 +0x264A 0x21952 +0x264B 0x21953 +0x264C 0x21954 +0x264D 0x21955 +0x264E 0x21958 +0x264F 0x21956 +0x2651 0x219DD +0x2652 0x219DE +0x2653 0x219E3 +0x2654 0x219DF +0x2655 0x219E0 +0x2656 0x21B22 +0x2657 0x21B23 +0x2658 0x21B68 +0x2659 0x21BDF +0x265B 0x21C44 +0x265C 0x21D94 +0x265D 0x21D95 +0x265E 0x21D96 +0x265F 0x21D97 +0x2660 0x21D98 +0x2661 0x21D99 +0x2662 0x2F879 +0x2663 0x21D9A +0x2664 0x21D9B +0x2665 0x21D9D +0x2666 0x21D9E +0x2667 0x21D9F +0x2668 0x21DA0 +0x2669 0x21FF3 +0x266A 0x21FF2 +0x266B 0x2201F +0x266C 0x22088 +0x266D 0x2218F +0x266E 0x22190 +0x2670 0x221FD +0x2671 0x221FE +0x2672 0x221FF +0x2673 0x22200 +0x2674 0x22201 +0x2675 0x2261A +0x2677 0x225E3 +0x2678 0x225E4 +0x2679 0x225E5 +0x267A 0x225E6 +0x267B 0x225E7 +0x267C 0x225EB +0x267D 0x225E8 +0x267E 0x225E9 +0x2721 0x225EA +0x2722 0x2261D +0x2723 0x229A4 +0x2724 0x229A3 +0x2725 0x22AD4 +0x2726 0x22AC6 +0x2727 0x22AC7 +0x2728 0x22AC8 +0x2729 0x22AC9 +0x272A 0x22ACA +0x272B 0x22ACB +0x272C 0x22ACC +0x272D 0x22ACD +0x272F 0x22ACE +0x2731 0x22EB8 +0x2732 0x22EB9 +0x2733 0x22EBA +0x2734 0x2306E +0x2735 0x230DB +0x2736 0x230DC +0x2737 0x23168 +0x2738 0x23169 +0x2739 0x2316A +0x273A 0x2316B +0x273B 0x2316C +0x273C 0x2316D +0x273D 0x2316E +0x273F 0x23324 +0x2740 0x23325 +0x2742 0x23400 +0x2743 0x233E5 +0x2744 0x233F9 +0x2745 0x233E7 +0x2746 0x233E8 +0x2747 0x233E9 +0x2748 0x233FE +0x2749 0x233EA +0x274A 0x233EB +0x274B 0x233EC +0x274D 0x233ED +0x274F 0x233EE +0x2751 0x233EF +0x2753 0x23417 +0x2754 0x233F0 +0x2755 0x233F1 +0x2756 0x23894 +0x2757 0x2395B +0x2758 0x2395C +0x2759 0x2395D +0x275A 0x23B2F +0x275C 0x23B30 +0x275D 0x23B31 +0x275E 0x23B32 +0x275F 0x23B33 +0x2760 0x23CCC +0x2761 0x23CCD +0x2762 0x23CCE +0x2763 0x23CAE +0x2764 0x23CAF +0x2765 0x23CB0 +0x2767 0x23CCF +0x2768 0x23CD0 +0x2769 0x23CD1 +0x276A 0x23CD2 +0x276B 0x23CD3 +0x276D 0x23CD4 +0x276F 0x241A6 +0x2770 0x241A7 +0x2771 0x241A8 +0x2772 0x241B0 +0x2773 0x241A9 +0x2774 0x241AA +0x2775 0x241AB +0x2776 0x241AC +0x2777 0x241AD +0x2778 0x244FB +0x2779 0x244FC +0x277B 0x2462D +0x277C 0x2462E +0x277D 0x24650 +0x277E 0x2462F +0x2821 0x24630 +0x2822 0x24765 +0x2823 0x248E6 +0x2824 0x2490C +0x2825 0x24902 +0x2826 0x24903 +0x2827 0x24904 +0x2828 0x24905 +0x2829 0x24906 +0x282B 0x24BC0 +0x282C 0x24C24 +0x282D 0x24C25 +0x282E 0x24D16 +0x282F 0x24D32 +0x2830 0x25420 +0x2831 0x25421 +0x2832 0x25422 +0x2833 0x25423 +0x2835 0x25425 +0x2836 0x25619 +0x2837 0x25624 +0x2838 0x2561A +0x2839 0x2561B +0x283A 0x2561C +0x283B 0x2561D +0x283C 0x2F952 +0x283D 0x2561E +0x283E 0x2575A +0x283F 0x2575B +0x2840 0x2575C +0x2841 0x2575D +0x2842 0x2575E +0x2843 0x25931 +0x2845 0x25E29 +0x2847 0x25F88 +0x2848 0x25F89 +0x2849 0x26289 +0x284B 0x26356 +0x284C 0x264D1 +0x284D 0x264E6 +0x284E 0x26532 +0x284F 0x26533 +0x2850 0x26652 +0x2851 0x26653 +0x2853 0x26654 +0x2854 0x26655 +0x2857 0x26B29 +0x2858 0x26B2A +0x2859 0x26B2B +0x285A 0x26B2C +0x285B 0x26B2D +0x285C 0x2F992 +0x285D 0x26B2E +0x285E 0x26B2F +0x285F 0x26B30 +0x2860 0x26B31 +0x2861 0x26B32 +0x2862 0x26B33 +0x2864 0x26B34 +0x2865 0x2719B +0x2866 0x27223 +0x2867 0x27224 +0x2869 0x27225 +0x286A 0x27227 +0x286B 0x27616 +0x286C 0x27CA0 +0x286D 0x2846F +0x286F 0x28470 +0x2870 0x28471 +0x2873 0x28472 +0x2874 0x28473 +0x2875 0x28474 +0x2876 0x2869C +0x2877 0x286AA +0x2878 0x2869D +0x2879 0x2869E +0x287B 0x286AB +0x287C 0x2869F +0x287D 0x28E35 +0x287E 0x28E38 +0x2921 0x2A38D +0x2922 0x20035 +0x2923 0x20036 +0x2924 0x25AEE +0x2925 0x200B4 +0x2926 0x2A6C9 +0x2927 0x20132 +0x2928 0x20155 +0x2929 0x20244 +0x292A 0x20245 +0x292B 0x20246 +0x292C 0x20247 +0x292E 0x20248 +0x292F 0x20249 +0x2931 0x2024A +0x2932 0x2024B +0x2933 0x2024C +0x2934 0x2024D +0x2935 0x2024E +0x2936 0x2024F +0x2937 0x20250 +0x2938 0x20251 +0x2939 0x26299 +0x293A 0x205D1 +0x293C 0x205D2 +0x293D 0x205D3 +0x293E 0x205D4 +0x293F 0x205D5 +0x2940 0x20721 +0x2941 0x20722 +0x2942 0x20723 +0x2943 0x20868 +0x2944 0x20869 +0x2945 0x2086A +0x2946 0x208E2 +0x2947 0x20945 +0x2948 0x209EC +0x2949 0x209ED +0x294A 0x209EE +0x294B 0x209EF +0x294D 0x20A62 +0x294E 0x20A63 +0x294F 0x20AF4 +0x2950 0x2006F +0x2951 0x20B44 +0x2952 0x20B45 +0x2953 0x20C79 +0x2955 0x20C7A +0x2956 0x20C7B +0x2957 0x20C7C +0x2958 0x20C7D +0x2959 0x20C7E +0x295A 0x20C7F +0x295B 0x20C80 +0x295E 0x20C81 +0x295F 0x20C82 +0x2960 0x20C83 +0x2961 0x20C84 +0x2962 0x20C85 +0x2963 0x20C86 +0x2964 0x20C87 +0x2965 0x20C8F +0x2966 0x20C88 +0x2967 0x20C89 +0x2968 0x212C5 +0x2969 0x212C6 +0x296B 0x212C7 +0x296C 0x212C8 +0x296D 0x212C9 +0x296E 0x212CA +0x296F 0x212CB +0x2970 0x212CC +0x2972 0x212CD +0x2973 0x212CE +0x2974 0x212E3 +0x2975 0x212CF +0x2976 0x212D0 +0x2977 0x212D1 +0x2978 0x212D2 +0x2979 0x212D3 +0x297A 0x212C4 +0x297B 0x212D4 +0x297C 0x212D5 +0x297D 0x212D6 +0x297E 0x21520 +0x2A21 0x21521 +0x2A22 0x2161A +0x2A23 0x21612 +0x2A24 0x21614 +0x2A25 0x21615 +0x2A26 0x21616 +0x2A27 0x21619 +0x2A28 0x21617 +0x2A29 0x21618 +0x2A2B 0x2F861 +0x2A2D 0x21712 +0x2A2E 0x21713 +0x2A2F 0x21714 +0x2A30 0x21715 +0x2A31 0x21716 +0x2A32 0x21717 +0x2A33 0x21718 +0x2A34 0x21719 +0x2A35 0x21961 +0x2A36 0x21962 +0x2A37 0x21963 +0x2A38 0x219F5 +0x2A3A 0x219F6 +0x2A3B 0x219F7 +0x2A3C 0x219F8 +0x2A3D 0x21B29 +0x2A3F 0x21C5D +0x2A40 0x21C57 +0x2A41 0x21C58 +0x2A42 0x21C59 +0x2A43 0x21C5A +0x2A44 0x21C5B +0x2A45 0x21DBB +0x2A46 0x21DD1 +0x2A47 0x21DBC +0x2A48 0x21DBD +0x2A49 0x268DF +0x2A4A 0x21DD0 +0x2A4B 0x21DBE +0x2A4C 0x21DBF +0x2A4D 0x21DC0 +0x2A4E 0x21DC1 +0x2A4F 0x21DC2 +0x2A50 0x21DC3 +0x2A51 0x21DC4 +0x2A52 0x26B6C +0x2A53 0x220A1 +0x2A54 0x220A2 +0x2A55 0x220A3 +0x2A56 0x22193 +0x2A57 0x2220D +0x2A58 0x2220F +0x2A59 0x2220E +0x2A5A 0x22210 +0x2A5B 0x22211 +0x2A5C 0x22212 +0x2A5D 0x2F895 +0x2A5E 0x224E5 +0x2A5F 0x2262F +0x2A61 0x22657 +0x2A62 0x22630 +0x2A63 0x22668 +0x2A64 0x2262B +0x2A65 0x22631 +0x2A66 0x22658 +0x2A67 0x2F8A2 +0x2A68 0x22632 +0x2A69 0x22659 +0x2A6B 0x2265A +0x2A6C 0x22633 +0x2A6D 0x2265B +0x2A6E 0x2265C +0x2A6F 0x2265D +0x2A70 0x2261E +0x2A71 0x229AE +0x2A72 0x229AF +0x2A73 0x22A3B +0x2A74 0x22A3C +0x2A75 0x22A3D +0x2A76 0x22B07 +0x2A77 0x22B08 +0x2A78 0x22B09 +0x2A79 0x22B0A +0x2A7A 0x22B0B +0x2A7B 0x22B0C +0x2A7C 0x22B0D +0x2A7D 0x22B0E +0x2A7E 0x22B0F +0x2B21 0x22B10 +0x2B22 0x22B22 +0x2B23 0x22B11 +0x2B24 0x22B12 +0x2B25 0x22B13 +0x2B26 0x22B14 +0x2B27 0x22B15 +0x2B28 0x22B16 +0x2B29 0x22B17 +0x2B2A 0x22B18 +0x2B2B 0x2F8B8 +0x2B2D 0x23046 +0x2B2E 0x23047 +0x2B2F 0x23048 +0x2B30 0x230E1 +0x2B31 0x23181 +0x2B32 0x23183 +0x2B33 0x20C75 +0x2B35 0x23185 +0x2B36 0x23186 +0x2B37 0x2332A +0x2B38 0x2F8D1 +0x2B39 0x2332B +0x2B3A 0x2336B +0x2B3B 0x23418 +0x2B3C 0x23419 +0x2B3D 0x2341A +0x2B3F 0x2341B +0x2B40 0x2341C +0x2B41 0x2341D +0x2B42 0x2341E +0x2B43 0x2341F +0x2B44 0x23420 +0x2B45 0x23421 +0x2B46 0x23422 +0x2B47 0x23423 +0x2B49 0x23424 +0x2B4A 0x23425 +0x2B4B 0x23426 +0x2B4C 0x23427 +0x2B4D 0x23428 +0x2B4E 0x23429 +0x2B4F 0x2342A +0x2B50 0x239EF +0x2B51 0x23B49 +0x2B52 0x23B4A +0x2B53 0x23B4B +0x2B54 0x23B4C +0x2B55 0x23B4D +0x2B56 0x23B4E +0x2B57 0x23B4F +0x2B58 0x23B50 +0x2B59 0x23B51 +0x2B5A 0x23B52 +0x2B5B 0x23B53 +0x2B5C 0x23B54 +0x2B5D 0x23B5A +0x2B5E 0x23B55 +0x2B5F 0x23C5F +0x2B60 0x23D02 +0x2B61 0x23D03 +0x2B62 0x23D04 +0x2B63 0x23D05 +0x2B64 0x23CD5 +0x2B65 0x23D06 +0x2B66 0x23D07 +0x2B67 0x23CD6 +0x2B68 0x23D08 +0x2B69 0x23D09 +0x2B6A 0x23D0A +0x2B6B 0x23D0B +0x2B6C 0x23CD7 +0x2B6D 0x23D0C +0x2B6E 0x23D0D +0x2B6F 0x241C8 +0x2B70 0x241C9 +0x2B71 0x241CA +0x2B72 0x241CB +0x2B73 0x241CC +0x2B74 0x241CD +0x2B75 0x241CE +0x2B76 0x241CF +0x2B77 0x241D0 +0x2B78 0x241D1 +0x2B79 0x241D2 +0x2B7B 0x241D3 +0x2B7C 0x241D4 +0x2B7D 0x241D5 +0x2B7E 0x241D6 +0x2C21 0x241D7 +0x2C22 0x241E2 +0x2C23 0x241D8 +0x2C24 0x24504 +0x2C25 0x24505 +0x2C26 0x24506 +0x2C28 0x24643 +0x2C29 0x24644 +0x2C2A 0x24784 +0x2C2B 0x2478F +0x2C2C 0x24785 +0x2C2D 0x24786 +0x2C2E 0x2492F +0x2C2F 0x2491A +0x2C30 0x2491B +0x2C31 0x2491C +0x2C33 0x2491D +0x2C34 0x2491E +0x2C35 0x2491F +0x2C36 0x24920 +0x2C37 0x24921 +0x2C38 0x24922 +0x2C39 0x2F92C +0x2C3A 0x24923 +0x2C3B 0x24924 +0x2C3C 0x2490E +0x2C3D 0x24925 +0x2C3E 0x2492B +0x2C3F 0x2492C +0x2C40 0x2490B +0x2C41 0x24AEE +0x2C43 0x24BC3 +0x2C44 0x24BD8 +0x2C45 0x24BD9 +0x2C46 0x24C38 +0x2C47 0x24C39 +0x2C48 0x24C3A +0x2C49 0x24C3B +0x2C4B 0x24C3C +0x2C4C 0x24C3D +0x2C4D 0x24C3E +0x2C4E 0x24C3F +0x2C4F 0x24C40 +0x2C50 0x24D48 +0x2C51 0x24D4C +0x2C52 0x24F28 +0x2C53 0x24F51 +0x2C54 0x24F52 +0x2C55 0x2504C +0x2C56 0x25123 +0x2C57 0x2F945 +0x2C58 0x25124 +0x2C59 0x25431 +0x2C5A 0x25432 +0x2C5B 0x25433 +0x2C5D 0x25434 +0x2C5E 0x25435 +0x2C5F 0x25436 +0x2C60 0x25440 +0x2C61 0x25437 +0x2C63 0x25438 +0x2C64 0x2543D +0x2C65 0x25638 +0x2C66 0x25639 +0x2C67 0x2563A +0x2C68 0x2563B +0x2C69 0x2563C +0x2C6A 0x2564C +0x2C6B 0x25773 +0x2C6C 0x25774 +0x2C6E 0x25775 +0x2C6F 0x25776 +0x2C70 0x25779 +0x2C71 0x25941 +0x2C72 0x25942 +0x2C73 0x25943 +0x2C74 0x25A5B +0x2C77 0x238A6 +0x2C78 0x25A5C +0x2C79 0x25AE5 +0x2C7A 0x25AE6 +0x2C7B 0x25AE7 +0x2C7C 0x25AE8 +0x2C7D 0x25AED +0x2C7E 0x25E30 +0x2D22 0x25E31 +0x2D23 0x25F94 +0x2D24 0x26351 +0x2D25 0x263FD +0x2D26 0x263FE +0x2D27 0x264E9 +0x2D29 0x266B3 +0x2D2A 0x26684 +0x2D2B 0x26694 +0x2D2D 0x2669C +0x2D2F 0x26685 +0x2D30 0x26900 +0x2D31 0x26937 +0x2D32 0x26957 +0x2D33 0x26B54 +0x2D34 0x26B68 +0x2D35 0x26B55 +0x2D36 0x26B5C +0x2D37 0x26B56 +0x2D38 0x26B57 +0x2D39 0x26B58 +0x2D3A 0x26B59 +0x2D3B 0x26B5A +0x2D3C 0x26B5B +0x2D3D 0x27234 +0x2D3F 0x27235 +0x2D41 0x27239 +0x2D42 0x27236 +0x2D43 0x27237 +0x2D44 0x27238 +0x2D45 0x275E5 +0x2D46 0x27659 +0x2D48 0x2763A +0x2D49 0x2763B +0x2D4A 0x27D28 +0x2D4B 0x27E89 +0x2D4D 0x27E8A +0x2D4E 0x27E8B +0x2D4F 0x27E8C +0x2D50 0x27E8D +0x2D51 0x27FBC +0x2D52 0x282A3 +0x2D54 0x282A4 +0x2D55 0x28493 +0x2D56 0x28494 +0x2D57 0x28495 +0x2D58 0x28496 +0x2D59 0x28497 +0x2D5A 0x286B9 +0x2D5B 0x28E4F +0x2D5C 0x28E50 +0x2D5D 0x28E51 +0x2D5E 0x29076 +0x2D60 0x200FB +0x2D61 0x20083 +0x2D62 0x20138 +0x2D63 0x2015D +0x2D64 0x20271 +0x2D66 0x20277 +0x2D67 0x20278 +0x2D68 0x2F807 +0x2D69 0x202C3 +0x2D6A 0x20279 +0x2D6B 0x2027A +0x2D6C 0x2027B +0x2D6D 0x2027C +0x2D6E 0x20272 +0x2D6F 0x2027D +0x2D70 0x202A0 +0x2D71 0x2027E +0x2D72 0x2027F +0x2D73 0x20280 +0x2D74 0x20281 +0x2D75 0x20282 +0x2D76 0x20283 +0x2D77 0x2029E +0x2D78 0x20284 +0x2D79 0x20285 +0x2D7A 0x20286 +0x2D7B 0x20287 +0x2D7C 0x20288 +0x2D7D 0x20493 +0x2D7E 0x20494 +0x2E21 0x20495 +0x2E22 0x204EF +0x2E23 0x204F0 +0x2E25 0x2058D +0x2E26 0x2058F +0x2E27 0x20590 +0x2E28 0x20591 +0x2E29 0x20592 +0x2E2A 0x205DE +0x2E2B 0x205E1 +0x2E2C 0x20653 +0x2E2E 0x2074A +0x2E2F 0x2074B +0x2E30 0x2074C +0x2E31 0x20751 +0x2E32 0x2074D +0x2E33 0x20748 +0x2E34 0x20874 +0x2E35 0x20875 +0x2E36 0x20920 +0x2E37 0x20921 +0x2E38 0x209A5 +0x2E39 0x209A6 +0x2E3A 0x20A73 +0x2E3B 0x20A74 +0x2E3C 0x20B50 +0x2E3D 0x20B51 +0x2E3E 0x20B52 +0x2E3F 0x20B53 +0x2E40 0x20CDB +0x2E41 0x20CDC +0x2E43 0x20CDD +0x2E44 0x20CDE +0x2E45 0x20CFF +0x2E48 0x20CDF +0x2E49 0x20CE0 +0x2E4B 0x20CE1 +0x2E4C 0x20CE2 +0x2E4D 0x20CE3 +0x2E4E 0x20CE4 +0x2E4F 0x20CE5 +0x2E50 0x20CE6 +0x2E51 0x20CE7 +0x2E52 0x20CE8 +0x2E53 0x20CE9 +0x2E54 0x20CEA +0x2E55 0x21307 +0x2E56 0x21308 +0x2E57 0x21309 +0x2E58 0x2130A +0x2E59 0x2130B +0x2E5A 0x2130C +0x2E5B 0x2130D +0x2E5D 0x2131A +0x2E5E 0x2130E +0x2E5F 0x2130F +0x2E60 0x21310 +0x2E61 0x2131C +0x2E62 0x21527 +0x2E63 0x21566 +0x2E64 0x21598 +0x2E65 0x21599 +0x2E66 0x21633 +0x2E67 0x21624 +0x2E68 0x21625 +0x2E69 0x21626 +0x2E6C 0x2173E +0x2E6D 0x2F864 +0x2E6E 0x2173F +0x2E6F 0x21757 +0x2E70 0x21740 +0x2E71 0x21741 +0x2E72 0x21758 +0x2E73 0x21742 +0x2E74 0x21743 +0x2E75 0x21744 +0x2E76 0x21745 +0x2E77 0x21746 +0x2E79 0x21747 +0x2E7A 0x2196B +0x2E7B 0x2196C +0x2E7C 0x21A10 +0x2E7D 0x21A11 +0x2F21 0x21B75 +0x2F22 0x21BEF +0x2F23 0x21C6A +0x2F24 0x21C6B +0x2F26 0x21C6C +0x2F27 0x21C6D +0x2F28 0x21C6E +0x2F29 0x21DEF +0x2F2A 0x21DF0 +0x2F2B 0x21DF1 +0x2F2C 0x21DF2 +0x2F2D 0x21DF3 +0x2F2E 0x21DF4 +0x2F2F 0x21DF5 +0x2F30 0x21DFF +0x2F31 0x21DF6 +0x2F32 0x21E02 +0x2F33 0x21DF7 +0x2F34 0x22022 +0x2F35 0x220C4 +0x2F36 0x220C3 +0x2F37 0x22228 +0x2F39 0x22320 +0x2F3A 0x22325 +0x2F3B 0x22322 +0x2F3C 0x22323 +0x2F3D 0x223EB +0x2F3F 0x224F9 +0x2F40 0x224FA +0x2F41 0x22699 +0x2F42 0x2269A +0x2F43 0x2269B +0x2F44 0x22663 +0x2F46 0x2265E +0x2F47 0x2265F +0x2F48 0x22660 +0x2F49 0x2269C +0x2F4A 0x22661 +0x2F4B 0x2269D +0x2F4C 0x22B54 +0x2F4D 0x22B55 +0x2F4E 0x22B56 +0x2F4F 0x22B57 +0x2F50 0x22B58 +0x2F51 0x22B59 +0x2F52 0x22B5A +0x2F53 0x22B19 +0x2F54 0x22B6A +0x2F55 0x22B5B +0x2F56 0x22B5C +0x2F57 0x22B5D +0x2F58 0x22B66 +0x2F5A 0x22B5E +0x2F5B 0x22B5F +0x2F5C 0x22B1A +0x2F5D 0x22B60 +0x2F5E 0x22B61 +0x2F60 0x22B62 +0x2F61 0x22B1B +0x2F62 0x22B63 +0x2F63 0x26410 +0x2F64 0x26411 +0x2F65 0x2304C +0x2F66 0x2309B +0x2F67 0x230EB +0x2F68 0x230EC +0x2F69 0x230ED +0x2F6A 0x230EE +0x2F6B 0x231A3 +0x2F6C 0x231A8 +0x2F6D 0x231A6 +0x2F6F 0x2332F +0x2F70 0x23330 +0x2F71 0x23331 +0x2F72 0x23332 +0x2F73 0x23333 +0x2F74 0x2344F +0x2F75 0x23451 +0x2F76 0x23452 +0x2F77 0x2347D +0x2F78 0x23453 +0x2F79 0x23454 +0x2F7A 0x23455 +0x2F7B 0x23456 +0x2F7C 0x23457 +0x2F7D 0x23458 +0x2F7E 0x23459 +0x3021 0x2345A +0x3022 0x2345B +0x3023 0x2345C +0x3025 0x2345D +0x3026 0x2345E +0x3027 0x2345F +0x3028 0x2346F +0x3029 0x23460 +0x302A 0x23461 +0x302B 0x23462 +0x302C 0x23463 +0x302D 0x23472 +0x302E 0x23464 +0x3030 0x2346E +0x3031 0x238B5 +0x3032 0x23B65 +0x3033 0x23B66 +0x3034 0x23B67 +0x3035 0x23B68 +0x3036 0x23B69 +0x3037 0x23B6A +0x3038 0x23B6B +0x3039 0x23B6C +0x303A 0x23D0E +0x303B 0x23D43 +0x303D 0x23D0F +0x303E 0x23D44 +0x303F 0x23D45 +0x3040 0x23D46 +0x3041 0x23D47 +0x3042 0x23D48 +0x3043 0x23D49 +0x3044 0x23D10 +0x3045 0x23D4A +0x3046 0x23D4B +0x3047 0x23D4C +0x3048 0x23D4D +0x304A 0x23D4E +0x304B 0x23D4F +0x304C 0x23D50 +0x304D 0x23D51 +0x304E 0x23D52 +0x304F 0x23D53 +0x3050 0x23D54 +0x3051 0x23D55 +0x3052 0x23D56 +0x3053 0x23D57 +0x3054 0x23D58 +0x3055 0x23D59 +0x3056 0x23D5A +0x3057 0x23D1D +0x3058 0x23D5B +0x3059 0x23D5C +0x305A 0x23D5D +0x305B 0x2F906 +0x305D 0x241FE +0x305E 0x241FF +0x305F 0x24200 +0x3060 0x24201 +0x3061 0x24202 +0x3062 0x24203 +0x3063 0x24204 +0x3064 0x24205 +0x3065 0x24206 +0x3066 0x24207 +0x3067 0x24218 +0x3068 0x24208 +0x3069 0x24209 +0x306A 0x241F3 +0x306B 0x2420A +0x306C 0x2420B +0x306D 0x2421B +0x306E 0x2420C +0x306F 0x2420D +0x3070 0x2420E +0x3071 0x2420F +0x3072 0x24210 +0x3073 0x2450F +0x3074 0x24561 +0x3075 0x24579 +0x3076 0x247C1 +0x3077 0x247AC +0x3078 0x247AD +0x3079 0x24943 +0x307A 0x24944 +0x307B 0x24945 +0x307C 0x24946 +0x307D 0x24947 +0x307E 0x24948 +0x3121 0x24949 +0x3122 0x24964 +0x3123 0x2494A +0x3124 0x2494B +0x3125 0x2494C +0x3126 0x2494D +0x3128 0x2F92D +0x3129 0x24B39 +0x312A 0x24C57 +0x312B 0x24C58 +0x312C 0x24C59 +0x312D 0x24C5F +0x312E 0x24C5A +0x312F 0x24D6A +0x3130 0x24F2B +0x3131 0x24F5D +0x3132 0x24F5E +0x3133 0x24F5F +0x3135 0x24F60 +0x3136 0x24F61 +0x3137 0x25058 +0x3138 0x25059 +0x3139 0x2514A +0x313A 0x2514B +0x313B 0x2514C +0x313C 0x2514D +0x313D 0x2514E +0x313E 0x25457 +0x313F 0x253B3 +0x3140 0x253B4 +0x3141 0x2546E +0x3142 0x2545B +0x3143 0x2545C +0x3145 0x2545D +0x3146 0x2545E +0x3148 0x2546C +0x3149 0x2563D +0x314A 0x25654 +0x314B 0x2563E +0x314C 0x25655 +0x314D 0x25656 +0x314E 0x2563F +0x314F 0x25657 +0x3150 0x25658 +0x3151 0x25659 +0x3152 0x2565A +0x3153 0x2565B +0x3154 0x2565C +0x3155 0x25788 +0x3156 0x25789 +0x3158 0x25958 +0x3159 0x25959 +0x315A 0x2595A +0x315C 0x25A67 +0x315D 0x25A68 +0x315E 0x25A69 +0x315F 0x25A6A +0x3161 0x25A6B +0x3162 0x25A6C +0x3163 0x25AFE +0x3164 0x25AFF +0x3165 0x25B00 +0x3166 0x25B01 +0x3167 0x25B02 +0x3168 0x25B03 +0x3169 0x25B04 +0x316A 0x25B05 +0x316B 0x25E39 +0x316C 0x25E3A +0x316D 0x25E3B +0x316E 0x25E3C +0x3171 0x25FB2 +0x3172 0x25FB3 +0x3173 0x25FB4 +0x3174 0x25FB5 +0x3175 0x25FB6 +0x3176 0x25FB7 +0x3177 0x25FB8 +0x3179 0x262A2 +0x317A 0x26361 +0x317B 0x26362 +0x317C 0x26414 +0x317E 0x264EB +0x3221 0x26542 +0x3222 0x26548 +0x3224 0x26543 +0x3225 0x2654E +0x3226 0x26544 +0x3227 0x26545 +0x3228 0x266B4 +0x3229 0x266B5 +0x322D 0x266B6 +0x322F 0x268E1 +0x3230 0x26905 +0x3233 0x26B9A +0x3235 0x26B9B +0x3236 0x26B9C +0x3237 0x26B9D +0x3238 0x26B9E +0x3239 0x26B9F +0x323A 0x2F99A +0x323B 0x26BA0 +0x323C 0x26BA1 +0x323D 0x26BA2 +0x323E 0x26BB5 +0x323F 0x26BA3 +0x3240 0x26BA4 +0x3242 0x26BA5 +0x3243 0x26BA6 +0x3244 0x26BA7 +0x3245 0x26BA8 +0x3246 0x26BAF +0x3247 0x26BA9 +0x3248 0x26BAA +0x3249 0x26BAB +0x324A 0x26BAC +0x324B 0x26BAD +0x324C 0x26BB3 +0x324E 0x271A0 +0x324F 0x27256 +0x3250 0x27634 +0x3252 0x2763C +0x3253 0x2780C +0x3255 0x27C3E +0x3256 0x27CA3 +0x3257 0x27D30 +0x3258 0x27D31 +0x3259 0x27E97 +0x325A 0x27E98 +0x325B 0x27E99 +0x325C 0x27E9A +0x325D 0x27E9B +0x325E 0x282B2 +0x325F 0x282AB +0x3260 0x282AC +0x3261 0x286FC +0x3262 0x286E8 +0x3263 0x286E9 +0x3264 0x286EA +0x3265 0x287F1 +0x3266 0x2893F +0x3267 0x28CCE +0x3268 0x28E6D +0x3269 0x28E6E +0x326A 0x28E6F +0x326B 0x28E70 +0x326C 0x28E71 +0x326D 0x28E72 +0x326E 0x28E73 +0x3270 0x29078 +0x3271 0x2983A +0x3272 0x20167 +0x3274 0x20164 +0x3275 0x20165 +0x3276 0x20307 +0x3277 0x202C4 +0x3278 0x202C5 +0x3279 0x202C6 +0x327A 0x202C7 +0x327B 0x202C8 +0x327C 0x202C9 +0x327D 0x202E5 +0x327E 0x202CA +0x3321 0x202CB +0x3323 0x202CC +0x3324 0x202CD +0x3325 0x202CE +0x3326 0x202CF +0x3327 0x202D0 +0x3328 0x20497 +0x3329 0x2049A +0x332A 0x2049B +0x332B 0x205EA +0x332C 0x205EC +0x332D 0x205ED +0x332E 0x205F7 +0x332F 0x205EE +0x3330 0x205EF +0x3331 0x2065B +0x3332 0x2065C +0x3333 0x2065D +0x3334 0x2076D +0x3335 0x2076E +0x3337 0x2076F +0x3338 0x20881 +0x3339 0x20882 +0x333A 0x2094F +0x333B 0x209AD +0x333C 0x2870A +0x333D 0x20A7E +0x333E 0x20B69 +0x333F 0x20D54 +0x3340 0x20D55 +0x3341 0x20D56 +0x3342 0x20D57 +0x3344 0x20D58 +0x3345 0x20D59 +0x3346 0x20D5A +0x3347 0x20D5B +0x3348 0x20D5C +0x3349 0x20D5D +0x334C 0x20D5E +0x334D 0x20D5F +0x334E 0x2133B +0x334F 0x21336 +0x3350 0x2133C +0x3351 0x2133D +0x3352 0x2133E +0x3353 0x2133F +0x3354 0x21340 +0x3355 0x21341 +0x3356 0x21342 +0x3358 0x21343 +0x3359 0x21344 +0x335A 0x21345 +0x335B 0x21337 +0x335E 0x21346 +0x335F 0x21347 +0x3360 0x21348 +0x3361 0x21349 +0x3362 0x2152D +0x3363 0x215A5 +0x3364 0x2163D +0x3365 0x2163F +0x3366 0x2196E +0x3367 0x217E7 +0x3368 0x21775 +0x3369 0x21776 +0x336A 0x21777 +0x336B 0x21778 +0x336C 0x21779 +0x336D 0x2177A +0x336E 0x2177B +0x336F 0x2177C +0x3370 0x2178E +0x3371 0x2177D +0x3372 0x2177E +0x3374 0x2177F +0x3375 0x21780 +0x3376 0x21781 +0x3377 0x21782 +0x3378 0x21783 +0x3379 0x21784 +0x337A 0x21785 +0x337B 0x21786 +0x337C 0x21787 +0x337D 0x21788 +0x337E 0x21789 +0x3421 0x2178A +0x3422 0x2178B +0x3423 0x2178C +0x3424 0x2196F +0x3425 0x21970 +0x3426 0x21971 +0x3427 0x21972 +0x3428 0x21A2A +0x3429 0x21A2B +0x342A 0x21A2C +0x342B 0x21A2D +0x342C 0x21A2E +0x342D 0x21A2F +0x342E 0x21A30 +0x342F 0x21A31 +0x3430 0x21B83 +0x3431 0x21C84 +0x3432 0x21C85 +0x3433 0x21C93 +0x3435 0x21C86 +0x3436 0x21C87 +0x3437 0x21C88 +0x3438 0x21C89 +0x3439 0x21C8A +0x343A 0x21C8B +0x343B 0x21E36 +0x343C 0x21E38 +0x343D 0x21E39 +0x343E 0x21E3A +0x3440 0x21E3B +0x3441 0x21E3C +0x3442 0x21E3D +0x3443 0x21E3E +0x3444 0x21E3F +0x3446 0x21E40 +0x3447 0x21E41 +0x3448 0x21E42 +0x3449 0x220DE +0x344A 0x220DF +0x344B 0x220E0 +0x344C 0x220E1 +0x344D 0x2224A +0x344E 0x2224B +0x344F 0x2224C +0x3450 0x2224D +0x3451 0x2224E +0x3452 0x2224F +0x3453 0x22250 +0x3454 0x22327 +0x3455 0x223F9 +0x3456 0x223FA +0x3457 0x223FB +0x3458 0x22498 +0x3459 0x22499 +0x345A 0x2249A +0x345C 0x2251E +0x345D 0x2269E +0x345E 0x226F7 +0x345F 0x2269F +0x3460 0x226A0 +0x3461 0x226F0 +0x3462 0x226F8 +0x3463 0x226F9 +0x3464 0x226A1 +0x3465 0x226A2 +0x3466 0x226A3 +0x3467 0x226A4 +0x3468 0x226A5 +0x3469 0x226FA +0x346A 0x226FB +0x346B 0x226FC +0x346C 0x226FD +0x346D 0x226FE +0x346E 0x2271F +0x346F 0x226FF +0x3470 0x22700 +0x3471 0x2278C +0x3472 0x22701 +0x3473 0x229C2 +0x3474 0x229C3 +0x3476 0x229D3 +0x3477 0x22A4E +0x3478 0x22BAF +0x3479 0x22BB0 +0x347A 0x22BB1 +0x347B 0x22BB2 +0x347C 0x22BB3 +0x347D 0x22BC6 +0x347E 0x22BB4 +0x3522 0x22BB5 +0x3523 0x22BB6 +0x3524 0x22BB7 +0x3525 0x22BB8 +0x3526 0x22BB9 +0x3527 0x22BBA +0x3528 0x22BBB +0x3529 0x22BBC +0x352A 0x22BBD +0x352B 0x22BBE +0x352C 0x22BBF +0x352D 0x22BC1 +0x352E 0x22BC0 +0x352F 0x22BC2 +0x3530 0x22BC3 +0x3531 0x22F51 +0x3532 0x22F52 +0x3533 0x22F53 +0x3534 0x22F54 +0x3535 0x22F55 +0x3536 0x2305A +0x3537 0x23050 +0x3538 0x23051 +0x3539 0x23078 +0x353A 0x230F8 +0x353B 0x230F9 +0x353C 0x231C6 +0x353D 0x231CB +0x353E 0x231CC +0x353F 0x231CD +0x3540 0x231CE +0x3541 0x231CF +0x3542 0x231D0 +0x3543 0x231D1 +0x3544 0x231D2 +0x3545 0x231D3 +0x3546 0x231D4 +0x3547 0x231D5 +0x3549 0x23337 +0x354A 0x23338 +0x354B 0x23373 +0x354C 0x23490 +0x354D 0x23491 +0x354E 0x234BF +0x354F 0x23492 +0x3550 0x23493 +0x3551 0x23494 +0x3552 0x23495 +0x3553 0x23496 +0x3554 0x23497 +0x3555 0x23498 +0x3556 0x23499 +0x3558 0x2349A +0x3559 0x2349B +0x355A 0x2349C +0x355B 0x2349D +0x355C 0x2349E +0x355D 0x2349F +0x355E 0x234A0 +0x355F 0x234A1 +0x3560 0x234A2 +0x3561 0x234A3 +0x3562 0x234A4 +0x3563 0x234A5 +0x3565 0x234A6 +0x3566 0x234A7 +0x3567 0x238BF +0x3568 0x238C0 +0x3569 0x238C1 +0x356A 0x238C2 +0x356B 0x238C3 +0x356C 0x238C4 +0x356D 0x238C5 +0x356E 0x238C6 +0x356F 0x23975 +0x3570 0x23A43 +0x3571 0x23A12 +0x3572 0x23A9F +0x3573 0x23A91 +0x3574 0x2F8F6 +0x3575 0x23A92 +0x3576 0x23A93 +0x3577 0x23A94 +0x3578 0x23B7E +0x3579 0x23B7F +0x357A 0x23B80 +0x357B 0x23B81 +0x357C 0x23B82 +0x357D 0x23C4C +0x357E 0x23C63 +0x3621 0x23DC0 +0x3622 0x23DC1 +0x3623 0x23DC2 +0x3624 0x2423A +0x3625 0x23DC3 +0x3626 0x23DC4 +0x3627 0x23DC5 +0x3628 0x23DC6 +0x362A 0x23DC7 +0x362C 0x23DC8 +0x362D 0x23D73 +0x362E 0x23DC9 +0x362F 0x23DCA +0x3630 0x23DCB +0x3631 0x23DCC +0x3632 0x23DCD +0x3636 0x23DCE +0x3637 0x23DCF +0x3638 0x23DD0 +0x3639 0x23DD1 +0x363A 0x23DD2 +0x363B 0x23DD3 +0x363C 0x23DD4 +0x363D 0x23DD5 +0x363E 0x2423B +0x363F 0x2423C +0x3640 0x2423D +0x3641 0x2423E +0x3643 0x2423F +0x3644 0x24240 +0x3645 0x24241 +0x3646 0x24242 +0x3647 0x24243 +0x3649 0x24244 +0x364A 0x24245 +0x364B 0x24259 +0x364C 0x24246 +0x364D 0x24247 +0x364E 0x24248 +0x3650 0x24249 +0x3651 0x24513 +0x3652 0x24582 +0x3653 0x24583 +0x3654 0x24666 +0x3655 0x24667 +0x3656 0x24965 +0x3658 0x24966 +0x365A 0x24975 +0x365B 0x24974 +0x365C 0x24967 +0x365D 0x2496D +0x365E 0x24976 +0x365F 0x24968 +0x3660 0x24969 +0x3661 0x2496A +0x3662 0x2496B +0x3663 0x2494F +0x3664 0x2496C +0x3665 0x24AF8 +0x3666 0x24B45 +0x3668 0x24B46 +0x3669 0x24BE4 +0x366A 0x24C85 +0x366B 0x24C6F +0x366C 0x24C70 +0x366D 0x24D82 +0x366E 0x24D83 +0x366F 0x24D84 +0x3670 0x24D8B +0x3671 0x24F2D +0x3672 0x24F68 +0x3673 0x24F69 +0x3674 0x24F77 +0x3675 0x24F64 +0x3676 0x24F6A +0x3678 0x24FF2 +0x3679 0x24FE2 +0x367A 0x25063 +0x367B 0x25064 +0x367C 0x25065 +0x367D 0x25066 +0x3721 0x25067 +0x3722 0x25068 +0x3725 0x25172 +0x3726 0x2517D +0x3727 0x25369 +0x3728 0x25484 +0x3729 0x25486 +0x372A 0x25487 +0x372B 0x25488 +0x372C 0x2549E +0x372E 0x25489 +0x372F 0x2548A +0x3730 0x25496 +0x3731 0x2548B +0x3732 0x2548C +0x3733 0x2548D +0x3734 0x25679 +0x3735 0x25683 +0x3736 0x2567A +0x3737 0x2565D +0x3738 0x2567B +0x373A 0x2579F +0x373C 0x257A0 +0x373D 0x257A1 +0x373E 0x257A2 +0x3740 0x2596A +0x3741 0x2596B +0x3742 0x2596C +0x3743 0x2596D +0x3744 0x2596E +0x3745 0x25A78 +0x3747 0x25A79 +0x3748 0x25A7C +0x3749 0x25B21 +0x374A 0x25B22 +0x374B 0x25B23 +0x374C 0x25B24 +0x374E 0x25B25 +0x374F 0x25B26 +0x3750 0x25E51 +0x3751 0x25E52 +0x3752 0x25E56 +0x3755 0x25FE1 +0x3758 0x25FD6 +0x3759 0x25FD7 +0x375A 0x25FD8 +0x375B 0x25FD9 +0x375C 0x262B5 +0x375D 0x2636C +0x375E 0x2636F +0x375F 0x26370 +0x3760 0x264BC +0x3761 0x264BD +0x3762 0x264ED +0x3763 0x2655B +0x3764 0x2655C +0x3765 0x2655D +0x3766 0x2655E +0x3767 0x26686 +0x3768 0x26687 +0x3769 0x266ED +0x376B 0x266EE +0x376D 0x2690E +0x376E 0x2690F +0x3770 0x26A2D +0x3771 0x26A2A +0x3772 0x26A2E +0x3773 0x26ACC +0x3774 0x26BF9 +0x3775 0x26BFA +0x3776 0x26BFB +0x3777 0x26BFC +0x3779 0x26BFD +0x377A 0x26C1B +0x377B 0x26BFE +0x377C 0x26BFF +0x377D 0x26C00 +0x377E 0x26C01 +0x3821 0x26C02 +0x3822 0x26C03 +0x3823 0x26C21 +0x3824 0x26C04 +0x3825 0x26C05 +0x3826 0x26C06 +0x3827 0x26C07 +0x3828 0x26C08 +0x3829 0x26C09 +0x382A 0x26C0A +0x382B 0x26C0B +0x382C 0x26C0C +0x382D 0x26C0D +0x382E 0x26C0E +0x382F 0x26C0F +0x3830 0x26C10 +0x3831 0x26C11 +0x3832 0x26C12 +0x3833 0x26C13 +0x3834 0x26C14 +0x3835 0x26C15 +0x3836 0x2727B +0x3837 0x2727C +0x3838 0x2727D +0x3839 0x2727E +0x383B 0x2727F +0x383C 0x27280 +0x383D 0x27266 +0x383E 0x27281 +0x383F 0x27282 +0x3840 0x27283 +0x3841 0x275B2 +0x3843 0x2767F +0x3844 0x27672 +0x3845 0x2765A +0x3846 0x277EB +0x3847 0x27815 +0x3849 0x27816 +0x384A 0x2F9CA +0x384B 0x27817 +0x384D 0x278C5 +0x384E 0x278C6 +0x384F 0x278C7 +0x3850 0x27988 +0x3851 0x27989 +0x3853 0x2798A +0x3854 0x2798B +0x3855 0x2798C +0x3856 0x2798D +0x3857 0x27BDF +0x3859 0x27D3B +0x385A 0x27D3C +0x385B 0x27D3D +0x385C 0x27D3E +0x385D 0x27D3F +0x385E 0x27D40 +0x385F 0x27D41 +0x3860 0x27D42 +0x3861 0x27E5C +0x3862 0x27EAF +0x3863 0x27EA9 +0x3864 0x27EAA +0x3865 0x27EAB +0x3866 0x27EAC +0x3867 0x27EB5 +0x3868 0x27EAD +0x3869 0x27EAE +0x386A 0x27FE2 +0x386B 0x28224 +0x386D 0x282C4 +0x386F 0x284EA +0x3870 0x284D3 +0x3871 0x284D4 +0x3872 0x284D5 +0x3873 0x28686 +0x3875 0x28687 +0x3876 0x286FD +0x3877 0x28805 +0x3878 0x28949 +0x3879 0x28C5F +0x387A 0x28CD3 +0x387B 0x28CD5 +0x387C 0x28E8A +0x387D 0x28E8B +0x387E 0x28E8C +0x3921 0x28E8D +0x3922 0x28E8E +0x3923 0x28E8F +0x3924 0x28E90 +0x3925 0x28E91 +0x3926 0x28E92 +0x3927 0x28E93 +0x3928 0x2907D +0x3929 0x2907E +0x392D 0x291EC +0x392E 0x2925B +0x392F 0x29C87 +0x3930 0x29C86 +0x3932 0x20046 +0x3933 0x20047 +0x3934 0x20102 +0x3935 0x2016D +0x3936 0x2016E +0x3937 0x2016F +0x3938 0x2030D +0x3939 0x2030E +0x393A 0x2030F +0x393B 0x20310 +0x393C 0x20311 +0x393D 0x20312 +0x393E 0x20313 +0x393F 0x20314 +0x3940 0x2049F +0x3941 0x204A0 +0x3942 0x204A1 +0x3943 0x204A3 +0x3944 0x20521 +0x3945 0x20522 +0x3946 0x2337C +0x3947 0x20595 +0x3948 0x20596 +0x3949 0x20661 +0x394A 0x20667 +0x394B 0x20791 +0x394C 0x20792 +0x394D 0x20793 +0x394E 0x20794 +0x394F 0x2088A +0x3950 0x2088B +0x3951 0x208F7 +0x3952 0x20924 +0x3953 0x209B0 +0x3954 0x209B1 +0x3955 0x20A8E +0x3956 0x20B04 +0x3957 0x20B6A +0x3958 0x20B6B +0x3959 0x20B6C +0x395A 0x20B6D +0x395B 0x20DE8 +0x395C 0x20E0C +0x395D 0x20DE9 +0x395E 0x20DEA +0x395F 0x20E0D +0x3961 0x20DEB +0x3962 0x20DEC +0x3963 0x20DED +0x3964 0x20DEE +0x3965 0x20DEF +0x3966 0x20DF0 +0x3967 0x20DF1 +0x3968 0x20DF2 +0x3969 0x20E16 +0x396A 0x20DF3 +0x396B 0x20E04 +0x396C 0x20E1D +0x396D 0x20DF4 +0x396E 0x20DF5 +0x396F 0x20DF6 +0x3970 0x20DF7 +0x3972 0x21202 +0x3973 0x21203 +0x3974 0x21204 +0x3975 0x2139A +0x3976 0x2137C +0x3977 0x213C5 +0x3978 0x2137D +0x3979 0x2137E +0x397A 0x2137F +0x397B 0x21380 +0x397C 0x21381 +0x3A21 0x21382 +0x3A22 0x21383 +0x3A23 0x21384 +0x3A24 0x21385 +0x3A25 0x21386 +0x3A26 0x21387 +0x3A27 0x215AE +0x3A28 0x2164D +0x3A29 0x217B0 +0x3A2A 0x217DC +0x3A2B 0x217B6 +0x3A2C 0x217B7 +0x3A2D 0x217B8 +0x3A2E 0x217B9 +0x3A2F 0x217BA +0x3A30 0x217BB +0x3A31 0x217DB +0x3A32 0x217BC +0x3A33 0x217BD +0x3A34 0x217BE +0x3A36 0x217BF +0x3A37 0x217C0 +0x3A38 0x217C1 +0x3A39 0x217C2 +0x3A3A 0x217C3 +0x3A3B 0x217CE +0x3A3D 0x217D9 +0x3A3E 0x217C4 +0x3A3F 0x217C5 +0x3A40 0x217DA +0x3A41 0x217C6 +0x3A42 0x217C7 +0x3A43 0x217C8 +0x3A44 0x217C9 +0x3A45 0x217CA +0x3A46 0x2197E +0x3A47 0x2197B +0x3A48 0x21A4E +0x3A49 0x21A4F +0x3A4A 0x21A50 +0x3A4B 0x21A51 +0x3A4C 0x21A52 +0x3A4D 0x21A53 +0x3A4E 0x21A54 +0x3A4F 0x21A55 +0x3A50 0x21B8F +0x3A51 0x21BFC +0x3A52 0x21CA6 +0x3A53 0x21CA7 +0x3A54 0x21CA8 +0x3A55 0x21D23 +0x3A56 0x21E8B +0x3A58 0x21E8C +0x3A59 0x21E8D +0x3A5A 0x21E8E +0x3A5B 0x21E8F +0x3A5C 0x21EA4 +0x3A5D 0x20599 +0x3A5E 0x22024 +0x3A5F 0x22046 +0x3A60 0x22047 +0x3A61 0x22048 +0x3A62 0x220FD +0x3A63 0x220FE +0x3A65 0x2226E +0x3A66 0x2227C +0x3A67 0x2226F +0x3A68 0x22270 +0x3A69 0x22271 +0x3A6A 0x22272 +0x3A6B 0x22329 +0x3A6C 0x2232A +0x3A6D 0x2235F +0x3A6E 0x224A2 +0x3A6F 0x22530 +0x3A70 0x2252B +0x3A71 0x22761 +0x3A72 0x22702 +0x3A73 0x22703 +0x3A74 0x22704 +0x3A75 0x22705 +0x3A76 0x22706 +0x3A77 0x22707 +0x3A79 0x22708 +0x3A7A 0x22709 +0x3A7B 0x22762 +0x3A7C 0x2270A +0x3A7D 0x2270B +0x3A7E 0x2270C +0x3B21 0x2270D +0x3B22 0x2270E +0x3B23 0x22763 +0x3B24 0x22727 +0x3B25 0x2270F +0x3B27 0x2271B +0x3B28 0x22764 +0x3B29 0x22710 +0x3B2A 0x22711 +0x3B2B 0x22781 +0x3B2C 0x22712 +0x3B2D 0x22765 +0x3B2E 0x22713 +0x3B2F 0x229CE +0x3B30 0x22C29 +0x3B31 0x22BC4 +0x3B32 0x22C2A +0x3B34 0x22C2B +0x3B35 0x22C2C +0x3B36 0x22C2D +0x3B37 0x22C2E +0x3B38 0x22C2F +0x3B39 0x22C30 +0x3B3A 0x22C31 +0x3B3B 0x22C32 +0x3B3C 0x22C33 +0x3B3D 0x22C34 +0x3B3F 0x22C35 +0x3B40 0x22C36 +0x3B41 0x22BE3 +0x3B42 0x22C37 +0x3B43 0x22C38 +0x3B44 0x22C39 +0x3B45 0x22C3A +0x3B46 0x22C3B +0x3B47 0x22C4D +0x3B48 0x22C3C +0x3B49 0x22C3D +0x3B4A 0x22C3E +0x3B4C 0x22ED0 +0x3B4D 0x22ED1 +0x3B4E 0x23055 +0x3B4F 0x23102 +0x3B50 0x23104 +0x3B51 0x231FC +0x3B52 0x23207 +0x3B53 0x231FD +0x3B54 0x231FE +0x3B56 0x231FF +0x3B57 0x23200 +0x3B58 0x23208 +0x3B59 0x23201 +0x3B5A 0x23202 +0x3B5B 0x23235 +0x3B5C 0x23203 +0x3B5D 0x23204 +0x3B5F 0x2333B +0x3B60 0x23389 +0x3B61 0x23381 +0x3B62 0x23382 +0x3B63 0x26733 +0x3B64 0x234EB +0x3B65 0x234EC +0x3B67 0x234ED +0x3B68 0x234EE +0x3B69 0x234EF +0x3B6B 0x234F0 +0x3B6C 0x234F1 +0x3B6D 0x234F2 +0x3B6F 0x234F3 +0x3B71 0x234F4 +0x3B72 0x234F5 +0x3B73 0x2004B +0x3B74 0x234F6 +0x3B75 0x234F7 +0x3B76 0x234F8 +0x3B77 0x234F9 +0x3B78 0x234FA +0x3B79 0x234FB +0x3B7A 0x234FC +0x3B7B 0x234FD +0x3B7C 0x234FE +0x3B7D 0x234FF +0x3B7E 0x23500 +0x3C22 0x23501 +0x3C23 0x23502 +0x3C24 0x23503 +0x3C25 0x23504 +0x3C26 0x23505 +0x3C27 0x23506 +0x3C28 0x23507 +0x3C2A 0x23508 +0x3C2B 0x23509 +0x3C2C 0x2350A +0x3C2D 0x2350B +0x3C2E 0x2350C +0x3C2F 0x2350D +0x3C30 0x238D7 +0x3C31 0x238D8 +0x3C32 0x23A29 +0x3C33 0x23A9C +0x3C34 0x23AF8 +0x3C35 0x23B98 +0x3C36 0x23BA4 +0x3C37 0x23B99 +0x3C38 0x23B9A +0x3C39 0x23B9B +0x3C3A 0x23B97 +0x3C3B 0x23B9C +0x3C3D 0x23B9D +0x3C3F 0x23B9E +0x3C40 0x23B9F +0x3C41 0x23C65 +0x3C42 0x23DD6 +0x3C44 0x23E32 +0x3C45 0x23E33 +0x3C46 0x23E34 +0x3C48 0x23E35 +0x3C49 0x23E36 +0x3C4A 0x23E37 +0x3C4B 0x23DD7 +0x3C4D 0x23DD8 +0x3C4E 0x23E38 +0x3C4F 0x23E39 +0x3C50 0x23E3A +0x3C51 0x23E3B +0x3C52 0x23E3C +0x3C53 0x23E3D +0x3C54 0x23E3E +0x3C55 0x23E3F +0x3C56 0x23E40 +0x3C57 0x23DD9 +0x3C58 0x23E41 +0x3C59 0x23E42 +0x3C5B 0x23E43 +0x3C5C 0x23E44 +0x3C5E 0x2427C +0x3C5F 0x2427D +0x3C60 0x2427E +0x3C61 0x2427F +0x3C62 0x24280 +0x3C63 0x24281 +0x3C64 0x24282 +0x3C66 0x24283 +0x3C67 0x24284 +0x3C68 0x24285 +0x3C69 0x24286 +0x3C6A 0x242A5 +0x3C6B 0x24287 +0x3C6C 0x24288 +0x3C6D 0x24289 +0x3C6E 0x2428A +0x3C6F 0x2428B +0x3C70 0x2428C +0x3C71 0x2428D +0x3C72 0x2428E +0x3C75 0x2428F +0x3C77 0x24290 +0x3C78 0x24291 +0x3C79 0x24292 +0x3C7A 0x24293 +0x3C7B 0x24294 +0x3C7C 0x24295 +0x3D21 0x24296 +0x3D22 0x24556 +0x3D23 0x24557 +0x3D24 0x245E1 +0x3D25 0x2460E +0x3D26 0x2460F +0x3D27 0x2467A +0x3D28 0x2467B +0x3D29 0x2468B +0x3D2A 0x247F2 +0x3D2B 0x247F3 +0x3D2C 0x24993 +0x3D2D 0x24994 +0x3D2E 0x24995 +0x3D2F 0x24996 +0x3D30 0x24997 +0x3D31 0x249AD +0x3D32 0x24998 +0x3D33 0x249AB +0x3D34 0x2497B +0x3D35 0x24999 +0x3D36 0x2499A +0x3D37 0x2499B +0x3D38 0x24985 +0x3D39 0x2499C +0x3D3A 0x2499D +0x3D3D 0x249AC +0x3D3E 0x24979 +0x3D3F 0x2499E +0x3D40 0x249A4 +0x3D41 0x24AFD +0x3D42 0x24BEB +0x3D43 0x24BEA +0x3D44 0x24C8F +0x3D45 0x24C90 +0x3D46 0x24C86 +0x3D47 0x24C87 +0x3D48 0x24C88 +0x3D49 0x24DAC +0x3D4A 0x24DAD +0x3D4B 0x24FEC +0x3D4C 0x25073 +0x3D4D 0x25074 +0x3D4F 0x251AA +0x3D50 0x251AB +0x3D51 0x251AC +0x3D52 0x253D1 +0x3D53 0x253D7 +0x3D54 0x254B9 +0x3D55 0x254BA +0x3D56 0x254BB +0x3D57 0x254BC +0x3D58 0x2568E +0x3D59 0x2568F +0x3D5A 0x25690 +0x3D5B 0x2567C +0x3D5C 0x25691 +0x3D5D 0x25692 +0x3D5E 0x25693 +0x3D5F 0x25694 +0x3D60 0x2F954 +0x3D61 0x2569A +0x3D62 0x25695 +0x3D63 0x25696 +0x3D64 0x25697 +0x3D65 0x257BD +0x3D66 0x257C7 +0x3D67 0x257BE +0x3D69 0x257BF +0x3D6B 0x25993 +0x3D6C 0x21A5E +0x3D6D 0x25A86 +0x3D6E 0x25A87 +0x3D6F 0x25A88 +0x3D70 0x25A89 +0x3D71 0x25B41 +0x3D72 0x25B42 +0x3D73 0x25B43 +0x3D74 0x25B44 +0x3D75 0x25B45 +0x3D76 0x25B46 +0x3D77 0x25B4A +0x3D78 0x25B47 +0x3D79 0x25B48 +0x3D7A 0x25B49 +0x3D7B 0x25E6B +0x3D7C 0x25E66 +0x3D7E 0x25E67 +0x3E22 0x25E68 +0x3E25 0x25FFD +0x3E26 0x25FFE +0x3E27 0x25FFF +0x3E28 0x26000 +0x3E29 0x26001 +0x3E2A 0x26002 +0x3E2B 0x26003 +0x3E2C 0x26004 +0x3E2D 0x26005 +0x3E2E 0x26006 +0x3E2F 0x26233 +0x3E30 0x262C2 +0x3E31 0x262D0 +0x3E32 0x2F974 +0x3E33 0x26395 +0x3E34 0x26396 +0x3E35 0x26435 +0x3E36 0x26436 +0x3E37 0x26567 +0x3E38 0x26568 +0x3E39 0x26569 +0x3E3A 0x2656A +0x3E3B 0x26572 +0x3E3C 0x2656B +0x3E3D 0x2656C +0x3E3E 0x2656D +0x3E3F 0x2656E +0x3E40 0x2656F +0x3E41 0x26722 +0x3E44 0x26723 +0x3E45 0x26741 +0x3E46 0x26724 +0x3E47 0x26725 +0x3E48 0x26726 +0x3E49 0x26727 +0x3E4A 0x26728 +0x3E4B 0x26729 +0x3E4C 0x266B7 +0x3E50 0x269DA +0x3E51 0x26ACF +0x3E52 0x26ADA +0x3E53 0x26C89 +0x3E54 0x26CB7 +0x3E55 0x26C8A +0x3E56 0x26C8B +0x3E57 0x26D5E +0x3E58 0x26C8C +0x3E5A 0x26C8D +0x3E5B 0x26C8E +0x3E5C 0x26C8F +0x3E5D 0x26C90 +0x3E5E 0x26C91 +0x3E5F 0x26C92 +0x3E60 0x26C93 +0x3E61 0x26C94 +0x3E62 0x26CB6 +0x3E63 0x26C95 +0x3E64 0x26C96 +0x3E65 0x26C97 +0x3E68 0x26C98 +0x3E69 0x26C99 +0x3E6A 0x26C9A +0x3E6D 0x26C9B +0x3E6E 0x26CBD +0x3E6F 0x26C9C +0x3E70 0x26C9D +0x3E71 0x26C9E +0x3E72 0x26C9F +0x3E73 0x26CC0 +0x3E74 0x26CA0 +0x3E75 0x26CA1 +0x3E76 0x26CA2 +0x3E77 0x26CA3 +0x3E78 0x26CA4 +0x3E79 0x26CA5 +0x3E7A 0x26CA6 +0x3E7B 0x26CA7 +0x3E7C 0x26CA8 +0x3E7D 0x26CA9 +0x3E7E 0x26CAA +0x3F22 0x271B4 +0x3F23 0x271B5 +0x3F24 0x271B6 +0x3F25 0x272B9 +0x3F26 0x272BA +0x3F27 0x272BB +0x3F28 0x27291 +0x3F29 0x272BC +0x3F2A 0x275EE +0x3F2B 0x275EF +0x3F2C 0x27696 +0x3F2D 0x27697 +0x3F2E 0x27673 +0x3F2F 0x27698 +0x3F30 0x27699 +0x3F31 0x277ED +0x3F32 0x277EE +0x3F33 0x278DE +0x3F34 0x279B0 +0x3F35 0x279B1 +0x3F36 0x279B2 +0x3F37 0x279B3 +0x3F38 0x279B4 +0x3F39 0x279B5 +0x3F3A 0x279B6 +0x3F3B 0x2F9CE +0x3F3C 0x279B7 +0x3F3D 0x27BE3 +0x3F3E 0x27CB9 +0x3F3F 0x27D55 +0x3F40 0x27D7E +0x3F41 0x27D56 +0x3F42 0x27D57 +0x3F43 0x27D58 +0x3F44 0x27D59 +0x3F45 0x27D5A +0x3F47 0x27EC4 +0x3F48 0x27EC5 +0x3F49 0x27EC6 +0x3F4A 0x27EC7 +0x3F4B 0x27EC8 +0x3F4C 0x27EC9 +0x3F4D 0x27EEE +0x3F4E 0x27ECF +0x3F4F 0x27ECA +0x3F50 0x27ECB +0x3F51 0x27ECC +0x3F52 0x28009 +0x3F53 0x2F9DA +0x3F54 0x28003 +0x3F55 0x2822F +0x3F56 0x28230 +0x3F57 0x28231 +0x3F58 0x28232 +0x3F59 0x2850E +0x3F5A 0x2850F +0x3F5B 0x28510 +0x3F5C 0x28511 +0x3F5D 0x28512 +0x3F5F 0x28513 +0x3F60 0x28514 +0x3F61 0x28515 +0x3F62 0x284FF +0x3F63 0x2871F +0x3F64 0x28720 +0x3F65 0x28721 +0x3F66 0x2872D +0x3F68 0x2881B +0x3F69 0x2881C +0x3F6A 0x2881D +0x3F6B 0x2881E +0x3F6C 0x28953 +0x3F6D 0x28954 +0x3F6E 0x28955 +0x3F6F 0x28956 +0x3F70 0x28964 +0x3F71 0x28959 +0x3F72 0x28957 +0x3F74 0x28958 +0x3F75 0x28C6B +0x3F78 0x28CE7 +0x3F79 0x28CE8 +0x3F7A 0x28CE9 +0x3F7B 0x28CEA +0x3F7C 0x28CEB +0x3F7D 0x28CEC +0x4021 0x28CED +0x4022 0x28EB1 +0x4023 0x28EB4 +0x4025 0x2908A +0x4026 0x2908D +0x4027 0x2908C +0x4028 0x291F2 +0x4029 0x291F3 +0x402B 0x22108 +0x402C 0x29417 +0x402E 0x2959F +0x402F 0x296A0 +0x4031 0x2986D +0x4032 0x2307D +0x4033 0x29F90 +0x4034 0x2A5C4 +0x4035 0x2004C +0x4036 0x20174 +0x4037 0x20175 +0x4038 0x20176 +0x4039 0x20349 +0x403A 0x2034A +0x403B 0x2034B +0x403C 0x2034C +0x403D 0x2034D +0x403E 0x2034E +0x403F 0x2034F +0x4040 0x20350 +0x4041 0x20351 +0x4042 0x20352 +0x4043 0x20353 +0x4044 0x20354 +0x4045 0x20355 +0x4046 0x20356 +0x4047 0x204A4 +0x4048 0x204A9 +0x4049 0x2052A +0x404A 0x2052B +0x404B 0x207B3 +0x404C 0x207C1 +0x404D 0x20898 +0x404E 0x208FB +0x404F 0x208FC +0x4050 0x209BC +0x4051 0x20A96 +0x4052 0x20B0A +0x4054 0x20EA2 +0x4056 0x20E81 +0x4057 0x20E82 +0x4058 0x20E83 +0x4059 0x20E84 +0x405A 0x20E85 +0x405B 0x20E86 +0x405C 0x20E87 +0x405D 0x20E88 +0x405E 0x20E89 +0x405F 0x20E8A +0x4060 0x20E8B +0x4061 0x20E8C +0x4063 0x20E8D +0x4064 0x20ED1 +0x4065 0x21214 +0x4066 0x213C9 +0x4067 0x213CA +0x4068 0x213CB +0x4069 0x29AFD +0x406A 0x213CC +0x406B 0x213CD +0x406C 0x213CE +0x406D 0x213CF +0x406E 0x213D0 +0x406F 0x213D1 +0x4070 0x213D2 +0x4071 0x213D3 +0x4072 0x213D4 +0x4073 0x213D5 +0x4074 0x21571 +0x4075 0x2004D +0x4076 0x21662 +0x4077 0x2180E +0x4078 0x217FE +0x4079 0x217FF +0x407A 0x21800 +0x407C 0x21801 +0x407D 0x21802 +0x407E 0x21803 +0x4121 0x21815 +0x4122 0x21804 +0x4123 0x21805 +0x4125 0x21987 +0x4126 0x21989 +0x4127 0x21A6E +0x4128 0x21A6F +0x4129 0x21A70 +0x412A 0x21A71 +0x412B 0x2F86E +0x412C 0x21A72 +0x412D 0x21A73 +0x412E 0x21A74 +0x412F 0x21B9D +0x4130 0x21CB8 +0x4131 0x21CB9 +0x4132 0x21CBA +0x4133 0x21EC2 +0x4134 0x21EC3 +0x4135 0x21ED5 +0x4136 0x21EC4 +0x4137 0x21EC0 +0x4138 0x21EC5 +0x4139 0x21EC6 +0x413A 0x2228A +0x413B 0x2228B +0x413C 0x2228C +0x413D 0x22364 +0x413E 0x25B8C +0x4140 0x2240D +0x4141 0x224A8 +0x4142 0x2253B +0x4143 0x2253C +0x4144 0x2253D +0x4145 0x2253E +0x4146 0x2253F +0x4147 0x22540 +0x4148 0x22766 +0x4149 0x227CB +0x414A 0x227B7 +0x414B 0x227B8 +0x414C 0x227B9 +0x414D 0x227BA +0x414E 0x22767 +0x414F 0x227BB +0x4150 0x22768 +0x4151 0x22769 +0x4152 0x2276A +0x4153 0x227BC +0x4155 0x229DB +0x4156 0x22C81 +0x4157 0x22C82 +0x4158 0x22C83 +0x4159 0x22C84 +0x415A 0x22C85 +0x415B 0x22C86 +0x415C 0x22C87 +0x415D 0x22C88 +0x415E 0x22C89 +0x415F 0x2F8BF +0x4160 0x22C8A +0x4161 0x22C8B +0x4163 0x22C8C +0x4164 0x22C8D +0x4165 0x22C8E +0x4166 0x22C8F +0x4167 0x22C90 +0x4168 0x22CA1 +0x4169 0x22C91 +0x416A 0x22ED6 +0x416B 0x22F9F +0x416C 0x23058 +0x416D 0x23085 +0x416E 0x2310B +0x416F 0x2310C +0x4170 0x23237 +0x4171 0x23238 +0x4172 0x2F8CE +0x4173 0x23239 +0x4174 0x2323A +0x4175 0x2323B +0x4176 0x2323C +0x4177 0x2323D +0x4178 0x2323E +0x4179 0x23240 +0x417A 0x23241 +0x417B 0x23242 +0x417D 0x23243 +0x417E 0x2338A +0x4221 0x2338B +0x4222 0x23590 +0x4223 0x23559 +0x4224 0x2355B +0x4225 0x2355C +0x4226 0x2355D +0x4227 0x2355E +0x4229 0x2355F +0x422A 0x23560 +0x422B 0x23561 +0x422C 0x23562 +0x422D 0x23563 +0x422E 0x23564 +0x422F 0x23593 +0x4230 0x23565 +0x4231 0x23566 +0x4232 0x23567 +0x4233 0x23568 +0x4234 0x23569 +0x4235 0x2356A +0x4236 0x2356B +0x4237 0x23595 +0x4238 0x2356C +0x4239 0x2356D +0x423A 0x2356E +0x423B 0x2356F +0x423D 0x23570 +0x423E 0x23571 +0x423F 0x23572 +0x4240 0x23573 +0x4241 0x23574 +0x4242 0x23575 +0x4243 0x23576 +0x4244 0x23577 +0x4245 0x23578 +0x4246 0x23579 +0x4248 0x2357A +0x424A 0x2357B +0x424B 0x235A9 +0x424C 0x2357C +0x424D 0x238F1 +0x424E 0x238EB +0x424F 0x2398A +0x4250 0x23A3D +0x4251 0x23AA6 +0x4252 0x23AA7 +0x4253 0x23BBA +0x4255 0x23BBB +0x4256 0x23BBC +0x4257 0x23BBD +0x4258 0x23E91 +0x4259 0x23E92 +0x425A 0x23E93 +0x425B 0x23E94 +0x425C 0x23E95 +0x425D 0x23E96 +0x425E 0x23E97 +0x425F 0x23DDA +0x4260 0x23E98 +0x4261 0x23E99 +0x4262 0x23E9A +0x4265 0x23E9B +0x4266 0x23E9C +0x4267 0x23E9D +0x4268 0x23E9E +0x4269 0x23E9F +0x426A 0x23EA0 +0x426B 0x23EBF +0x426C 0x23EA1 +0x426D 0x23EA2 +0x426E 0x23EA3 +0x426F 0x23EA4 +0x4270 0x23EA5 +0x4271 0x23EA6 +0x4272 0x23EA7 +0x4273 0x23E5B +0x4274 0x2F90D +0x4275 0x23EA8 +0x4276 0x242CB +0x4279 0x242CC +0x427A 0x2434F +0x427B 0x242CD +0x427C 0x242CE +0x427D 0x242CF +0x427E 0x2434E +0x4321 0x242D0 +0x4322 0x242D1 +0x4323 0x242D2 +0x4325 0x242D3 +0x4326 0x242D4 +0x4327 0x242D5 +0x4328 0x242D6 +0x4329 0x242D7 +0x432A 0x242D8 +0x432B 0x242D9 +0x432C 0x242FA +0x432D 0x242DA +0x432E 0x242DB +0x432F 0x2F91C +0x4330 0x242DC +0x4333 0x242DD +0x4334 0x242DE +0x4335 0x242DF +0x4336 0x242E0 +0x4337 0x242E1 +0x4338 0x242E2 +0x4339 0x242E3 +0x433A 0x242E4 +0x433B 0x242E5 +0x433D 0x242E6 +0x433E 0x242E7 +0x433F 0x2458E +0x4340 0x24698 +0x4341 0x24699 +0x4343 0x2480A +0x4345 0x24826 +0x4346 0x24827 +0x4347 0x249BD +0x4348 0x249DF +0x434A 0x249BE +0x434B 0x249DE +0x434C 0x249BF +0x434D 0x249C0 +0x434E 0x249C1 +0x434F 0x249C2 +0x4350 0x2499F +0x4351 0x249C3 +0x4352 0x249C4 +0x4353 0x249C5 +0x4354 0x249C6 +0x4355 0x249C7 +0x4357 0x249C8 +0x4358 0x249C9 +0x4359 0x249E3 +0x435A 0x249CA +0x435B 0x249CB +0x435C 0x249CC +0x435D 0x249CD +0x435E 0x249CE +0x435F 0x249CF +0x4360 0x249D0 +0x4361 0x249D1 +0x4362 0x249D2 +0x4363 0x249D3 +0x4364 0x2F92F +0x4365 0x249D4 +0x4366 0x24B04 +0x4367 0x24B65 +0x4368 0x24BEE +0x4369 0x24CA0 +0x436A 0x24CA1 +0x436B 0x24DDD +0x436C 0x24DDE +0x436D 0x24F83 +0x436E 0x24FFA +0x436F 0x2507F +0x4370 0x25080 +0x4371 0x251E8 +0x4372 0x251E9 +0x4373 0x251EA +0x4374 0x235A6 +0x4375 0x253E1 +0x4377 0x254DB +0x4378 0x254DC +0x4379 0x254DD +0x437A 0x254DE +0x437B 0x254DF +0x437C 0x254E0 +0x437D 0x254E1 +0x437E 0x254E2 +0x4421 0x254E3 +0x4422 0x254E4 +0x4423 0x254E5 +0x4424 0x254E6 +0x4426 0x254E7 +0x4427 0x256B0 +0x4428 0x25698 +0x4429 0x256B1 +0x442A 0x25699 +0x442B 0x256B2 +0x442C 0x256B3 +0x442D 0x256B4 +0x442E 0x256B5 +0x442F 0x256B6 +0x4430 0x256B7 +0x4431 0x256B8 +0x4432 0x256B9 +0x4433 0x257E2 +0x4434 0x257E3 +0x4435 0x257E4 +0x4436 0x257E5 +0x4437 0x257E6 +0x4438 0x257E7 +0x4439 0x257E8 +0x443A 0x257E9 +0x443B 0x259AD +0x443C 0x259CF +0x443D 0x259AE +0x443E 0x259AF +0x443F 0x259B0 +0x4440 0x259B1 +0x4441 0x25A92 +0x4442 0x25A93 +0x4443 0x25A94 +0x4444 0x25B79 +0x4446 0x25B7A +0x4447 0x25B7B +0x4448 0x25B7C +0x4449 0x25B7D +0x444A 0x25B7E +0x444B 0x25B7F +0x444C 0x25B80 +0x444D 0x25B81 +0x444E 0x25B82 +0x444F 0x25B83 +0x4450 0x25B84 +0x4451 0x25E97 +0x4452 0x25E84 +0x4453 0x25E85 +0x4454 0x25E89 +0x4455 0x25E86 +0x4456 0x25E87 +0x4457 0x2602C +0x4458 0x2602D +0x4459 0x2602E +0x445A 0x2602F +0x445B 0x26030 +0x445C 0x26031 +0x445D 0x26032 +0x445E 0x26033 +0x445F 0x26034 +0x4460 0x26035 +0x4461 0x26036 +0x4462 0x26037 +0x4463 0x262D2 +0x4464 0x26444 +0x4465 0x26500 +0x4466 0x26583 +0x4467 0x26584 +0x4468 0x2F986 +0x4469 0x2677A +0x446A 0x2677B +0x446B 0x2677C +0x446C 0x2677D +0x446D 0x2677E +0x446F 0x2677F +0x4470 0x26787 +0x4471 0x26780 +0x4472 0x26A43 +0x4473 0x26D34 +0x4475 0x26D35 +0x4476 0x26D36 +0x4477 0x26D37 +0x4478 0x26D38 +0x4479 0x26D39 +0x447A 0x26D3A +0x447B 0x26D3B +0x447C 0x26D3C +0x447D 0x26D3D +0x447E 0x26D3E +0x4521 0x26D3F +0x4522 0x26D40 +0x4523 0x26D41 +0x4524 0x26D42 +0x4525 0x26D43 +0x4526 0x26D44 +0x4527 0x26D45 +0x4528 0x26D46 +0x4529 0x26D47 +0x452A 0x26D48 +0x452B 0x26D49 +0x452C 0x26D4A +0x452E 0x26D4B +0x452F 0x26D4C +0x4530 0x26D4D +0x4531 0x26D4E +0x4532 0x272E7 +0x4533 0x272E8 +0x4534 0x272E9 +0x4535 0x272EA +0x4536 0x272EB +0x4537 0x272EC +0x4538 0x272ED +0x4539 0x272EE +0x453A 0x275F7 +0x453B 0x2769A +0x453C 0x276CD +0x453D 0x2F9C8 +0x453E 0x276A3 +0x453F 0x276CE +0x4540 0x27831 +0x4541 0x27832 +0x4542 0x27833 +0x4543 0x279E4 +0x4545 0x279E5 +0x4546 0x279E6 +0x4547 0x27CC8 +0x4548 0x27D74 +0x4549 0x27D75 +0x454A 0x27D76 +0x454B 0x27D77 +0x454C 0x27D78 +0x454D 0x27D79 +0x454E 0x27D7A +0x454F 0x27E61 +0x4550 0x27EDF +0x4551 0x27EE0 +0x4552 0x27EE1 +0x4553 0x27EE2 +0x4554 0x27EE3 +0x4555 0x27EE4 +0x4556 0x27EE5 +0x4557 0x27EE6 +0x4559 0x28031 +0x455A 0x2823D +0x455B 0x2823E +0x455C 0x2823F +0x455D 0x282F4 +0x455E 0x282F5 +0x455F 0x282F6 +0x4561 0x28417 +0x4562 0x28541 +0x4563 0x28542 +0x4564 0x28543 +0x4565 0x28544 +0x4566 0x28545 +0x4567 0x28546 +0x4568 0x28547 +0x4569 0x28548 +0x456A 0x28549 +0x456B 0x2854A +0x456C 0x2854B +0x456E 0x286BA +0x456F 0x28744 +0x4570 0x2892A +0x4571 0x2896D +0x4573 0x2F9E7 +0x4574 0x2897E +0x4575 0x2896E +0x4576 0x2896F +0x4577 0x28970 +0x4578 0x28971 +0x4579 0x28976 +0x457A 0x28C79 +0x457D 0x28D04 +0x457E 0x28CF8 +0x4621 0x28D05 +0x4622 0x28EDA +0x4623 0x28EDB +0x4624 0x28EDC +0x4625 0x28EDD +0x4626 0x28EDE +0x4627 0x28EDF +0x4628 0x28EE0 +0x4629 0x28EE1 +0x462A 0x290C5 +0x462B 0x2909A +0x462C 0x2909B +0x462D 0x2909C +0x462E 0x291D8 +0x462F 0x291D9 +0x4630 0x291DA +0x4631 0x2926E +0x4633 0x2946B +0x4634 0x27D83 +0x4636 0x296D6 +0x4637 0x296BD +0x4639 0x2322E +0x463A 0x29AFC +0x463B 0x29D53 +0x463C 0x29DB7 +0x463D 0x2A28C +0x463E 0x2A38E +0x463F 0x2A2FF +0x4640 0x20076 +0x4641 0x20106 +0x4642 0x2017E +0x4643 0x20384 +0x4644 0x20385 +0x4645 0x20386 +0x4646 0x20387 +0x4647 0x20388 +0x4648 0x203A7 +0x4649 0x20389 +0x464A 0x2038A +0x464B 0x2038B +0x464C 0x2038C +0x464D 0x2038D +0x464E 0x2038E +0x464F 0x2038F +0x4650 0x203A3 +0x4651 0x20390 +0x4652 0x20391 +0x4653 0x20392 +0x4654 0x20393 +0x4655 0x203AC +0x4656 0x20394 +0x4657 0x20395 +0x4658 0x20396 +0x4659 0x204AA +0x465A 0x204AB +0x465B 0x2059E +0x465D 0x20608 +0x465E 0x20609 +0x465F 0x20668 +0x4660 0x20669 +0x4661 0x2066A +0x4662 0x2069A +0x4663 0x207D9 +0x4664 0x207DA +0x4665 0x207DB +0x4666 0x208A8 +0x4667 0x20901 +0x4668 0x20928 +0x4669 0x20977 +0x466A 0x209BD +0x466B 0x209BE +0x466C 0x20F60 +0x466D 0x20AA0 +0x466E 0x20AA2 +0x466F 0x20B0F +0x4670 0x20B85 +0x4671 0x20EFE +0x4672 0x20EFF +0x4673 0x20F00 +0x4674 0x20F01 +0x4675 0x20F16 +0x4676 0x20F02 +0x4677 0x20F03 +0x4678 0x20F04 +0x4679 0x20F05 +0x467A 0x20F06 +0x467B 0x20F07 +0x467C 0x20F08 +0x467D 0x20F22 +0x467E 0x20F09 +0x4721 0x20F0A +0x4722 0x20F0B +0x4723 0x20F0C +0x4724 0x20F14 +0x4725 0x20F29 +0x4726 0x20E6E +0x4727 0x20F0D +0x4728 0x20F0E +0x4729 0x20F0F +0x472A 0x20F10 +0x472B 0x20F11 +0x472C 0x20F12 +0x472D 0x20F13 +0x472E 0x2121B +0x472F 0x2121C +0x4730 0x2121D +0x4731 0x21413 +0x4732 0x213FF +0x4733 0x21400 +0x4734 0x21401 +0x4735 0x21402 +0x4736 0x21403 +0x4737 0x21404 +0x4738 0x2140A +0x4739 0x21405 +0x473A 0x21406 +0x473B 0x21407 +0x473C 0x21408 +0x473D 0x2153A +0x473E 0x21573 +0x473F 0x2166F +0x4740 0x21670 +0x4741 0x21671 +0x4742 0x20052 +0x4744 0x21A9A +0x4745 0x21860 +0x4746 0x2F869 +0x4747 0x2182B +0x4748 0x21824 +0x4749 0x2182C +0x474A 0x2182D +0x474B 0x2182E +0x474C 0x2182F +0x474D 0x21830 +0x474E 0x21831 +0x474F 0x21832 +0x4750 0x21833 +0x4751 0x21834 +0x4752 0x21835 +0x4753 0x21845 +0x4754 0x21836 +0x4755 0x21992 +0x4756 0x21993 +0x4757 0x21A88 +0x4758 0x21A89 +0x4759 0x21A8A +0x475A 0x21A8B +0x475B 0x21B3F +0x475D 0x21CCA +0x475E 0x21EF6 +0x475F 0x21EF7 +0x4760 0x21EF8 +0x4761 0x21EF9 +0x4762 0x2212B +0x4764 0x221A4 +0x4765 0x221CE +0x4767 0x2229E +0x4768 0x2229F +0x4769 0x222A0 +0x476A 0x222A1 +0x476B 0x222A2 +0x476C 0x222A3 +0x476D 0x222A4 +0x476E 0x222A5 +0x476F 0x222A6 +0x4770 0x22418 +0x4771 0x22560 +0x4772 0x22561 +0x4773 0x22562 +0x4774 0x22563 +0x4775 0x22564 +0x4776 0x227BD +0x4777 0x227BE +0x4778 0x2280B +0x4779 0x227BF +0x477A 0x227C0 +0x477C 0x2280C +0x477D 0x2278D +0x477E 0x2280D +0x4821 0x2280E +0x4822 0x2285E +0x4823 0x2280F +0x4824 0x22810 +0x4825 0x227C1 +0x4826 0x22811 +0x4828 0x227C2 +0x4829 0x229EA +0x482A 0x229EB +0x482B 0x22CE3 +0x482C 0x22CE4 +0x482D 0x22CE5 +0x482E 0x22CE6 +0x482F 0x22CE7 +0x4830 0x22C92 +0x4831 0x22D4A +0x4833 0x22CE8 +0x4834 0x22CE9 +0x4835 0x22CEA +0x4836 0x22D01 +0x4837 0x22CEB +0x4838 0x22CEC +0x4839 0x22CEF +0x483A 0x22CED +0x483B 0x22CEE +0x483C 0x22CF0 +0x483D 0x22CF1 +0x483E 0x22CF2 +0x483F 0x22CF3 +0x4840 0x22CF4 +0x4841 0x22CF5 +0x4842 0x22CF6 +0x4843 0x22CF7 +0x4844 0x22CF8 +0x4845 0x22CF9 +0x4846 0x22CFE +0x4847 0x22CFA +0x4848 0x22CFB +0x4849 0x22CFC +0x484A 0x23263 +0x484B 0x23264 +0x484C 0x23265 +0x484D 0x23266 +0x484E 0x23267 +0x484F 0x23268 +0x4850 0x2360B +0x4851 0x2360D +0x4853 0x2360E +0x4854 0x2360F +0x4856 0x23614 +0x4857 0x235D4 +0x4858 0x235D5 +0x4859 0x235D6 +0x485A 0x235D7 +0x485B 0x235D8 +0x485C 0x235D9 +0x485D 0x235DA +0x485E 0x235DB +0x485F 0x235DC +0x4860 0x235DD +0x4861 0x235DE +0x4862 0x235DF +0x4863 0x235E0 +0x4864 0x235E1 +0x4865 0x235E2 +0x4866 0x235E3 +0x4867 0x235E4 +0x4868 0x235E5 +0x4869 0x235E6 +0x486A 0x235E7 +0x486B 0x235E8 +0x486C 0x235E9 +0x486D 0x235EA +0x486E 0x235EB +0x486F 0x235EC +0x4870 0x236EC +0x4871 0x235ED +0x4872 0x235EE +0x4873 0x235EF +0x4874 0x23600 +0x4875 0x235F0 +0x4876 0x23904 +0x4878 0x23905 +0x4879 0x2F8F3 +0x487A 0x23AB5 +0x487B 0x2F8F9 +0x487C 0x23BD6 +0x487D 0x23BD7 +0x487E 0x23BD8 +0x4921 0x23BD9 +0x4922 0x23EA9 +0x4923 0x23F00 +0x4924 0x23F01 +0x4925 0x23F02 +0x4926 0x23F03 +0x4927 0x23F04 +0x4928 0x23F05 +0x4929 0x23F06 +0x492A 0x23F3F +0x492B 0x23F07 +0x492C 0x23F08 +0x492D 0x23F09 +0x492E 0x23F0A +0x492F 0x23EB6 +0x4930 0x23F0B +0x4931 0x23F0C +0x4934 0x23F0D +0x4936 0x23F0E +0x4937 0x23F0F +0x4938 0x23F10 +0x4939 0x23F11 +0x493A 0x23F12 +0x493B 0x23F35 +0x493C 0x23F13 +0x493D 0x23F14 +0x493E 0x23EAA +0x4940 0x23FC1 +0x4941 0x23F15 +0x4942 0x23F16 +0x4943 0x23F17 +0x4944 0x2431E +0x4945 0x2431F +0x4946 0x24320 +0x4947 0x24321 +0x4949 0x24322 +0x494A 0x24323 +0x494C 0x24324 +0x494D 0x24325 +0x494E 0x24326 +0x494F 0x24327 +0x4950 0x24328 +0x4951 0x24329 +0x4952 0x2432A +0x4953 0x2432B +0x4954 0x24307 +0x4955 0x2432C +0x4956 0x2432D +0x4957 0x2432E +0x495A 0x2432F +0x495B 0x24330 +0x495C 0x24348 +0x495D 0x24331 +0x495E 0x24332 +0x4960 0x24333 +0x4962 0x24334 +0x4963 0x24335 +0x4964 0x24336 +0x4965 0x24559 +0x4966 0x24591 +0x4967 0x245E7 +0x4968 0x246B8 +0x4969 0x246B9 +0x496A 0x246BA +0x496B 0x246BB +0x496C 0x246C8 +0x496D 0x2484D +0x496E 0x24889 +0x496F 0x24850 +0x4970 0x24828 +0x4971 0x249FB +0x4972 0x249FC +0x4973 0x249FD +0x4974 0x249FE +0x4975 0x249FF +0x4977 0x24A00 +0x4978 0x24A01 +0x4979 0x24A02 +0x497A 0x249E4 +0x497B 0x249E5 +0x497C 0x24A03 +0x497D 0x24A04 +0x497E 0x24A05 +0x4A21 0x24A06 +0x4A22 0x24A07 +0x4A23 0x24A13 +0x4A24 0x24A08 +0x4A25 0x24A09 +0x4A26 0x249E6 +0x4A27 0x24A0A +0x4A28 0x24A0B +0x4A29 0x24A0C +0x4A2A 0x24B0B +0x4A2B 0x24BF4 +0x4A2C 0x24C0A +0x4A2D 0x24CB1 +0x4A2E 0x24E1D +0x4A2F 0x2F93B +0x4A30 0x24F8B +0x4A31 0x24F8C +0x4A32 0x24F8F +0x4A33 0x24F8D +0x4A34 0x24F8E +0x4A35 0x25006 +0x4A36 0x25086 +0x4A37 0x25222 +0x4A38 0x25223 +0x4A39 0x25224 +0x4A3A 0x25225 +0x4A3B 0x25226 +0x4A3C 0x25227 +0x4A3D 0x25228 +0x4A3E 0x253F1 +0x4A40 0x25523 +0x4A41 0x25512 +0x4A43 0x25513 +0x4A44 0x25514 +0x4A45 0x25515 +0x4A46 0x25516 +0x4A47 0x25517 +0x4A48 0x25518 +0x4A49 0x25519 +0x4A4A 0x2554B +0x4A4B 0x2551A +0x4A4C 0x2551B +0x4A4D 0x2551C +0x4A4F 0x2551D +0x4A50 0x2551E +0x4A51 0x2551F +0x4A52 0x25520 +0x4A53 0x256CA +0x4A54 0x222AC +0x4A55 0x256CB +0x4A56 0x256CC +0x4A57 0x256CD +0x4A58 0x256CE +0x4A5A 0x256CF +0x4A5B 0x25810 +0x4A5C 0x25811 +0x4A5D 0x25812 +0x4A5E 0x25813 +0x4A5F 0x25814 +0x4A60 0x2580F +0x4A61 0x25815 +0x4A62 0x25816 +0x4A63 0x25817 +0x4A65 0x25818 +0x4A66 0x259C6 +0x4A67 0x25A9F +0x4A68 0x25AA0 +0x4A69 0x25AA4 +0x4A6A 0x25AA1 +0x4A6B 0x25BB5 +0x4A6C 0x25BB6 +0x4A6D 0x25BB7 +0x4A6E 0x25BB8 +0x4A6F 0x25BB9 +0x4A70 0x25BBA +0x4A71 0x25BD0 +0x4A72 0x25BC6 +0x4A73 0x25BBB +0x4A74 0x25BBC +0x4A75 0x25BBD +0x4A76 0x25BBE +0x4A77 0x25BBF +0x4A78 0x25BC0 +0x4A79 0x25BC1 +0x4A7A 0x25BC2 +0x4A7B 0x2F960 +0x4A7C 0x25EA7 +0x4A7D 0x25EA8 +0x4A7E 0x25EA9 +0x4B21 0x25EAA +0x4B22 0x25EAB +0x4B23 0x25EAC +0x4B24 0x25EBC +0x4B25 0x25EAD +0x4B26 0x25EAE +0x4B28 0x25EAF +0x4B29 0x25EB0 +0x4B2A 0x25EB1 +0x4B2C 0x25EB4 +0x4B2D 0x25EB2 +0x4B2E 0x26066 +0x4B2F 0x26067 +0x4B30 0x26068 +0x4B31 0x26069 +0x4B32 0x2606A +0x4B33 0x2606B +0x4B34 0x2606C +0x4B35 0x2606D +0x4B36 0x2606E +0x4B37 0x2606F +0x4B39 0x2623E +0x4B3A 0x2623F +0x4B3B 0x26240 +0x4B3C 0x262E8 +0x4B3D 0x26452 +0x4B3E 0x26453 +0x4B3F 0x26454 +0x4B40 0x26455 +0x4B41 0x26591 +0x4B42 0x26592 +0x4B43 0x26593 +0x4B44 0x26594 +0x4B45 0x26595 +0x4B46 0x26596 +0x4B47 0x26597 +0x4B48 0x26598 +0x4B4A 0x26599 +0x4B4B 0x2659A +0x4B4C 0x2659B +0x4B4D 0x267B7 +0x4B4E 0x267B8 +0x4B4F 0x267B9 +0x4B51 0x267BA +0x4B52 0x267BB +0x4B53 0x267BD +0x4B55 0x267BC +0x4B56 0x2F988 +0x4B57 0x2F987 +0x4B58 0x268EB +0x4B59 0x268EC +0x4B5A 0x26916 +0x4B5B 0x26944 +0x4B5C 0x269E3 +0x4B5D 0x26A58 +0x4B5E 0x26A53 +0x4B5F 0x26A54 +0x4B60 0x26AE0 +0x4B61 0x26DB1 +0x4B62 0x26DB2 +0x4B63 0x26DB3 +0x4B64 0x26DEA +0x4B66 0x26DB4 +0x4B67 0x26DF0 +0x4B68 0x26DB5 +0x4B69 0x26DB6 +0x4B6A 0x26DB7 +0x4B6B 0x26DB8 +0x4B6C 0x26DB9 +0x4B6D 0x26DBA +0x4B6E 0x26DBB +0x4B6F 0x26DBC +0x4B70 0x26DBD +0x4B71 0x26DBE +0x4B72 0x26DBF +0x4B73 0x26DC0 +0x4B74 0x26DC1 +0x4B75 0x26DC2 +0x4B76 0x26DC3 +0x4B78 0x26DC4 +0x4B79 0x26DC5 +0x4B7A 0x26DC6 +0x4B7B 0x26DFC +0x4B7C 0x26DC7 +0x4B7D 0x26DC8 +0x4B7E 0x26DC9 +0x4C21 0x26DCA +0x4C22 0x26DCB +0x4C23 0x26DCC +0x4C24 0x26E84 +0x4C25 0x26DCD +0x4C26 0x26DCE +0x4C27 0x26DCF +0x4C28 0x26DD0 +0x4C29 0x26DD1 +0x4C2A 0x26DD2 +0x4C2B 0x271CA +0x4C2C 0x271CB +0x4C2D 0x27336 +0x4C2E 0x27337 +0x4C2F 0x2739F +0x4C30 0x27338 +0x4C31 0x27339 +0x4C32 0x2733A +0x4C34 0x276BE +0x4C35 0x276F0 +0x4C36 0x276BF +0x4C37 0x276C0 +0x4C38 0x277F7 +0x4C39 0x277F8 +0x4C3A 0x277FA +0x4C3B 0x27843 +0x4C3C 0x27844 +0x4C3D 0x27A0F +0x4C3E 0x27A10 +0x4C3F 0x27A11 +0x4C40 0x27A12 +0x4C42 0x27A13 +0x4C43 0x27A14 +0x4C44 0x27A15 +0x4C45 0x27A16 +0x4C48 0x27CD3 +0x4C49 0x27CD7 +0x4C4B 0x27DB0 +0x4C4C 0x27D98 +0x4C4D 0x27D90 +0x4C4E 0x27D91 +0x4C4F 0x27D92 +0x4C50 0x27D97 +0x4C51 0x27D93 +0x4C52 0x27E64 +0x4C53 0x27F01 +0x4C54 0x27F02 +0x4C55 0x27F03 +0x4C56 0x27F04 +0x4C57 0x27F05 +0x4C58 0x27F06 +0x4C59 0x27F07 +0x4C5A 0x2805A +0x4C5B 0x2805B +0x4C5C 0x2824E +0x4C5D 0x2824F +0x4C5E 0x28250 +0x4C5F 0x28319 +0x4C60 0x2831A +0x4C61 0x2831B +0x4C63 0x2831C +0x4C65 0x28419 +0x4C66 0x2841A +0x4C68 0x2898A +0x4C69 0x2856E +0x4C6A 0x2856F +0x4C6C 0x28570 +0x4C6D 0x28571 +0x4C6E 0x28572 +0x4C6F 0x28573 +0x4C70 0x28574 +0x4C71 0x28575 +0x4C72 0x28576 +0x4C73 0x2883A +0x4C74 0x2883B +0x4C75 0x2883C +0x4C76 0x2885A +0x4C77 0x2883D +0x4C78 0x28842 +0x4C79 0x2898B +0x4C7A 0x289A0 +0x4C7B 0x2898C +0x4C7C 0x2898D +0x4C7D 0x2898E +0x4C7E 0x289AB +0x4D21 0x2898F +0x4D23 0x28990 +0x4D24 0x28991 +0x4D25 0x28992 +0x4D26 0x289AA +0x4D28 0x28993 +0x4D29 0x28994 +0x4D2A 0x2899E +0x4D2B 0x289A8 +0x4D2E 0x28F00 +0x4D2F 0x28F01 +0x4D30 0x28F02 +0x4D31 0x28F03 +0x4D32 0x28F04 +0x4D33 0x28F05 +0x4D34 0x28FC4 +0x4D35 0x28FC5 +0x4D37 0x290AE +0x4D38 0x290B2 +0x4D3B 0x291F7 +0x4D3C 0x29213 +0x4D3D 0x2939E +0x4D3E 0x29485 +0x4D3F 0x25380 +0x4D40 0x294C8 +0x4D41 0x29841 +0x4D42 0x29881 +0x4D43 0x29882 +0x4D44 0x29883 +0x4D45 0x29884 +0x4D46 0x29AC4 +0x4D47 0x29AC5 +0x4D48 0x29AC6 +0x4D49 0x29C95 +0x4D4A 0x29C96 +0x4D4B 0x29C97 +0x4D4C 0x29D58 +0x4D4D 0x29D59 +0x4D4F 0x29FA9 +0x4D50 0x29FAA +0x4D51 0x29FAB +0x4D52 0x2A28E +0x4D53 0x2A303 +0x4D54 0x2A3B3 +0x4D55 0x20B82 +0x4D56 0x20053 +0x4D57 0x20183 +0x4D58 0x20184 +0x4D59 0x20185 +0x4D5A 0x203CC +0x4D5B 0x203CD +0x4D5C 0x203CE +0x4D5D 0x203CF +0x4D5E 0x203D0 +0x4D60 0x203D1 +0x4D61 0x203D2 +0x4D62 0x203DA +0x4D63 0x204B3 +0x4D64 0x204B4 +0x4D66 0x20613 +0x4D67 0x2060E +0x4D68 0x2066B +0x4D69 0x20903 +0x4D6A 0x20961 +0x4D6B 0x209C1 +0x4D6C 0x209C2 +0x4D6D 0x20AB5 +0x4D6E 0x20140 +0x4D6F 0x20F98 +0x4D70 0x20F99 +0x4D71 0x20F9A +0x4D72 0x20F9B +0x4D73 0x20F9C +0x4D74 0x20F9D +0x4D75 0x20F9E +0x4D76 0x20F9F +0x4D77 0x20FEE +0x4D78 0x20FA0 +0x4D79 0x20FA1 +0x4D7A 0x20F86 +0x4D7B 0x21225 +0x4D7C 0x21434 +0x4D7D 0x21435 +0x4D7E 0x21451 +0x4E21 0x2142D +0x4E22 0x24362 +0x4E23 0x21454 +0x4E24 0x21452 +0x4E26 0x21436 +0x4E27 0x21437 +0x4E28 0x21438 +0x4E29 0x21439 +0x4E2A 0x2143A +0x4E2B 0x2143B +0x4E2C 0x21468 +0x4E2D 0x2143C +0x4E2F 0x21577 +0x4E30 0x23296 +0x4E31 0x2167E +0x4E32 0x2167F +0x4E33 0x21869 +0x4E34 0x2186A +0x4E35 0x2186B +0x4E36 0x2186C +0x4E37 0x2186D +0x4E38 0x2186E +0x4E39 0x2186F +0x4E3A 0x2185D +0x4E3B 0x21870 +0x4E3C 0x21885 +0x4E3D 0x21871 +0x4E3E 0x21872 +0x4E3F 0x21873 +0x4E40 0x21874 +0x4E41 0x21875 +0x4E42 0x21876 +0x4E43 0x21884 +0x4E44 0x21877 +0x4E45 0x21883 +0x4E46 0x2199A +0x4E47 0x21AA7 +0x4E48 0x21AA8 +0x4E49 0x21AA9 +0x4E4A 0x21AAA +0x4E4B 0x21AAB +0x4E4C 0x21AAC +0x4E4D 0x21AB7 +0x4E4E 0x21AAD +0x4E4F 0x21AAE +0x4E51 0x21B45 +0x4E52 0x21CD3 +0x4E53 0x21CD4 +0x4E54 0x21CD5 +0x4E55 0x21CD6 +0x4E56 0x21CD7 +0x4E57 0x21F26 +0x4E58 0x21F27 +0x4E59 0x21F28 +0x4E5B 0x21F29 +0x4E5C 0x21F2A +0x4E5D 0x22005 +0x4E5F 0x221D0 +0x4E60 0x222B7 +0x4E62 0x222B8 +0x4E63 0x222B9 +0x4E64 0x22422 +0x4E65 0x22423 +0x4E66 0x22573 +0x4E67 0x22574 +0x4E68 0x2288F +0x4E69 0x22812 +0x4E6A 0x22813 +0x4E6B 0x22814 +0x4E6C 0x22815 +0x4E6D 0x22816 +0x4E6E 0x22817 +0x4E6F 0x22818 +0x4E70 0x22861 +0x4E71 0x22866 +0x4E72 0x22867 +0x4E73 0x22819 +0x4E74 0x22868 +0x4E75 0x2281A +0x4E76 0x22869 +0x4E77 0x22A04 +0x4E78 0x22A05 +0x4E7A 0x22A06 +0x4E7B 0x229FD +0x4E7C 0x22D50 +0x4E7D 0x22D51 +0x4E7E 0x22D52 +0x4F21 0x22D53 +0x4F22 0x22D54 +0x4F23 0x22D55 +0x4F24 0x22D63 +0x4F25 0x2F8C4 +0x4F26 0x22D56 +0x4F27 0x22D57 +0x4F28 0x22D58 +0x4F29 0x22D59 +0x4F2A 0x22D5A +0x4F2B 0x22D5B +0x4F2D 0x22D5C +0x4F2E 0x22D5D +0x4F2F 0x22D5E +0x4F30 0x22D5F +0x4F31 0x22FD7 +0x4F33 0x23060 +0x4F34 0x23061 +0x4F35 0x23117 +0x4F36 0x23139 +0x4F37 0x2328F +0x4F38 0x232C8 +0x4F39 0x23290 +0x4F3A 0x23291 +0x4F3B 0x23398 +0x4F3C 0x23399 +0x4F3D 0x23644 +0x4F3E 0x23645 +0x4F3F 0x23646 +0x4F40 0x23659 +0x4F41 0x236EE +0x4F43 0x23647 +0x4F44 0x23648 +0x4F46 0x23649 +0x4F47 0x2364A +0x4F48 0x2364B +0x4F49 0x2364C +0x4F4A 0x2364D +0x4F4B 0x2364E +0x4F4C 0x2364F +0x4F4D 0x23650 +0x4F4E 0x23651 +0x4F4F 0x23652 +0x4F50 0x23653 +0x4F51 0x23654 +0x4F52 0x23655 +0x4F53 0x23656 +0x4F54 0x23915 +0x4F55 0x2399A +0x4F56 0x23A58 +0x4F57 0x23AFC +0x4F58 0x23AFD +0x4F59 0x23F86 +0x4F5A 0x23F87 +0x4F5B 0x23F88 +0x4F5C 0x23F89 +0x4F5D 0x23F8A +0x4F5E 0x23F8B +0x4F5F 0x23F8C +0x4F61 0x2401F +0x4F62 0x23F8D +0x4F63 0x23F8E +0x4F64 0x23F8F +0x4F65 0x23F90 +0x4F66 0x23F91 +0x4F67 0x23F92 +0x4F68 0x23F93 +0x4F69 0x2F911 +0x4F6A 0x23F94 +0x4F6B 0x23F95 +0x4F6C 0x23ECA +0x4F6D 0x23F18 +0x4F6F 0x23F96 +0x4F70 0x23F97 +0x4F71 0x23F98 +0x4F72 0x23F99 +0x4F73 0x23F9A +0x4F74 0x23F9B +0x4F75 0x23F9C +0x4F76 0x23F9D +0x4F77 0x23F9E +0x4F78 0x23F9F +0x4F7B 0x23FA0 +0x4F7C 0x23FA1 +0x4F7E 0x23FB7 +0x5022 0x24396 +0x5023 0x24368 +0x5024 0x24369 +0x5025 0x2438C +0x5026 0x2436A +0x5027 0x2436B +0x5028 0x2436C +0x5029 0x2436D +0x502A 0x2436E +0x502B 0x2436F +0x502C 0x2437F +0x502D 0x24384 +0x502E 0x24370 +0x502F 0x24371 +0x5030 0x24385 +0x5031 0x24372 +0x5032 0x24373 +0x5033 0x24374 +0x5034 0x24375 +0x5035 0x24376 +0x5037 0x24377 +0x5038 0x24378 +0x5039 0x24379 +0x503A 0x2437A +0x503B 0x2437B +0x503C 0x2437C +0x503D 0x2F91E +0x503E 0x24594 +0x503F 0x246D5 +0x5040 0x24829 +0x5041 0x24A2B +0x5042 0x24A2C +0x5043 0x24A2D +0x5044 0x24A2E +0x5045 0x24A2F +0x5046 0x24A30 +0x5047 0x24A3E +0x5048 0x24A31 +0x5049 0x24A32 +0x504A 0x24A33 +0x504B 0x24A34 +0x504C 0x24A35 +0x504D 0x24B11 +0x504F 0x24CC0 +0x5050 0x24E42 +0x5051 0x24E43 +0x5052 0x24E44 +0x5053 0x24E45 +0x5054 0x24E46 +0x5055 0x2508C +0x5056 0x2508D +0x5057 0x2508E +0x5058 0x2508F +0x5059 0x25090 +0x505A 0x25091 +0x505B 0x25263 +0x505C 0x25264 +0x505D 0x25265 +0x505F 0x2F94A +0x5061 0x253F6 +0x5062 0x25536 +0x5063 0x25537 +0x5064 0x2552C +0x5065 0x25538 +0x5066 0x25539 +0x5068 0x2553A +0x5069 0x256E3 +0x506A 0x256E2 +0x506B 0x256F5 +0x506C 0x25847 +0x506E 0x25848 +0x506F 0x25849 +0x5070 0x2584A +0x5071 0x2584B +0x5072 0x2584C +0x5073 0x25AA8 +0x5074 0x25AA9 +0x5075 0x25AAA +0x5077 0x25C0B +0x5078 0x25C06 +0x5079 0x25C73 +0x507A 0x25C0C +0x507B 0x25C0D +0x507C 0x25C0E +0x507D 0x25C0F +0x507E 0x25C10 +0x5122 0x25C11 +0x5123 0x2F962 +0x5124 0x25C12 +0x5125 0x25C14 +0x5126 0x25C15 +0x5127 0x25C16 +0x5129 0x25C13 +0x512A 0x25C17 +0x512B 0x25ED9 +0x512C 0x25EDA +0x512D 0x25EDB +0x512F 0x25EDC +0x5130 0x260A6 +0x5131 0x260A7 +0x5132 0x260A8 +0x5133 0x260A9 +0x5134 0x260AA +0x5135 0x260AB +0x5137 0x2F96D +0x5138 0x260AC +0x5139 0x260AD +0x513A 0x260AE +0x513D 0x260AF +0x513E 0x260B0 +0x513F 0x260B1 +0x5140 0x26244 +0x5141 0x26245 +0x5142 0x262F7 +0x5143 0x262F8 +0x5144 0x2646B +0x5145 0x2646C +0x5146 0x26461 +0x5147 0x26512 +0x5148 0x265AF +0x5149 0x265B0 +0x514A 0x265B1 +0x514B 0x265B2 +0x514C 0x265B3 +0x514D 0x265B4 +0x514E 0x265B5 +0x514F 0x265B6 +0x5150 0x26622 +0x5151 0x267EA +0x5152 0x267EB +0x5153 0x267EC +0x5154 0x267ED +0x5156 0x268ED +0x5157 0x2691B +0x5158 0x26947 +0x5159 0x269E8 +0x515A 0x26AD0 +0x515B 0x26AE7 +0x515C 0x26AE8 +0x515D 0x26AE9 +0x515E 0x26E4E +0x515F 0x26E4F +0x5160 0x26E50 +0x5161 0x26E72 +0x5162 0x26E51 +0x5163 0x26E52 +0x5164 0x2F9A7 +0x5166 0x26E53 +0x5167 0x26E54 +0x5168 0x26E55 +0x5169 0x26E56 +0x516A 0x26E57 +0x516B 0x26E77 +0x516C 0x26E58 +0x516D 0x26E59 +0x516E 0x26E5A +0x516F 0x26E5B +0x5170 0x26E5C +0x5171 0x26E6E +0x5172 0x26E5D +0x5175 0x26E5E +0x5177 0x26E5F +0x5179 0x271D7 +0x517A 0x27389 +0x517B 0x2738A +0x517D 0x2F9BE +0x517E 0x2738B +0x5221 0x2738C +0x5222 0x2738D +0x5223 0x2738E +0x5224 0x2F9BC +0x5225 0x2738F +0x5227 0x2739A +0x5228 0x27390 +0x5229 0x27391 +0x522A 0x27392 +0x522B 0x27393 +0x522C 0x27712 +0x522D 0x276F1 +0x522F 0x277FE +0x5230 0x277FB +0x5231 0x27857 +0x5232 0x27A49 +0x5233 0x27A4A +0x5234 0x27A4B +0x5235 0x27A4C +0x5237 0x27A4D +0x5238 0x27A59 +0x5239 0x27A4E +0x523A 0x27A4F +0x523B 0x27BF4 +0x523C 0x27C65 +0x523D 0x27DA6 +0x523E 0x27DA7 +0x523F 0x27DA8 +0x5240 0x27F22 +0x5241 0x27F23 +0x5242 0x2808B +0x5243 0x2808C +0x5244 0x2808D +0x5245 0x2808E +0x5246 0x28258 +0x5248 0x28259 +0x5249 0x2833B +0x524A 0x2833C +0x524B 0x2833D +0x524C 0x2833E +0x524D 0x28448 +0x524E 0x28594 +0x524F 0x28595 +0x5250 0x28596 +0x5251 0x28597 +0x5252 0x28598 +0x5253 0x2877D +0x5254 0x286FE +0x5255 0x2877E +0x5256 0x2877F +0x5258 0x2885B +0x5259 0x2885C +0x525A 0x289E4 +0x525B 0x289C1 +0x525C 0x289FD +0x525D 0x289C2 +0x525E 0x289D6 +0x525F 0x289C3 +0x5260 0x289C4 +0x5262 0x289DC +0x5263 0x289C5 +0x5264 0x289C6 +0x5265 0x289C7 +0x5266 0x289E1 +0x5267 0x289C8 +0x5268 0x289C9 +0x5269 0x289CA +0x526A 0x289CB +0x526C 0x289CC +0x526D 0x289CD +0x526E 0x28D35 +0x526F 0x28D36 +0x5270 0x28D47 +0x5271 0x28D37 +0x5272 0x28F1B +0x5273 0x28F1C +0x5274 0x28F1D +0x5275 0x28F1E +0x5276 0x28F1F +0x5277 0x28F20 +0x5278 0x28F7B +0x5279 0x28F7A +0x527A 0x28FFE +0x527B 0x290C6 +0x527C 0x290C7 +0x527D 0x290C8 +0x527E 0x290C9 +0x5321 0x290CA +0x5323 0x294A0 +0x5324 0x294A1 +0x5325 0x295CC +0x5326 0x295CD +0x5327 0x296F1 +0x5328 0x296D7 +0x5329 0x29842 +0x532A 0x29846 +0x532B 0x298A3 +0x532C 0x298A5 +0x532D 0x298A6 +0x532E 0x29ACB +0x532F 0x29ACC +0x5330 0x29B26 +0x5331 0x29B27 +0x5332 0x29B28 +0x5333 0x29B29 +0x5334 0x29CAE +0x5335 0x29CAF +0x5336 0x29CB0 +0x5337 0x29D73 +0x5339 0x29D7C +0x533A 0x29D74 +0x533C 0x29F80 +0x533D 0x29D75 +0x5340 0x29FCF +0x5342 0x2A38F +0x5343 0x20670 +0x5344 0x20085 +0x5345 0x20397 +0x5346 0x203F6 +0x5347 0x203F7 +0x5348 0x203F8 +0x5349 0x203FA +0x534A 0x203FB +0x534B 0x204BA +0x534C 0x204BB +0x534D 0x204BC +0x534E 0x204BD +0x534F 0x20534 +0x5350 0x20535 +0x5351 0x205A2 +0x5352 0x20614 +0x5353 0x20611 +0x5354 0x2066E +0x5355 0x2066F +0x5356 0x20808 +0x5357 0x208B8 +0x5358 0x20A09 +0x5359 0x20ABD +0x535A 0x20ABE +0x535B 0x20B88 +0x535C 0x20FFE +0x535E 0x20FFF +0x535F 0x21000 +0x5360 0x21001 +0x5361 0x21002 +0x5362 0x21003 +0x5363 0x21004 +0x5364 0x21005 +0x5365 0x21006 +0x5367 0x21007 +0x5368 0x21008 +0x5369 0x21009 +0x536A 0x2100A +0x536B 0x2100B +0x536C 0x2100C +0x536D 0x2100D +0x536E 0x2100E +0x536F 0x2100F +0x5373 0x2122C +0x5374 0x2146B +0x5376 0x2146C +0x5377 0x21487 +0x5378 0x2146D +0x5379 0x21578 +0x537A 0x2168B +0x537B 0x218A4 +0x537C 0x218A5 +0x537D 0x218A6 +0x537E 0x218A7 +0x5421 0x218BE +0x5422 0x218A8 +0x5423 0x218A9 +0x5424 0x218AA +0x5425 0x2188D +0x5426 0x218AB +0x5427 0x218AC +0x5428 0x218BF +0x542B 0x218AD +0x542C 0x218AE +0x542D 0x219A4 +0x542E 0x219A5 +0x542F 0x21AC7 +0x5430 0x21AC8 +0x5431 0x21AC9 +0x5432 0x27DBC +0x5433 0x21ACA +0x5434 0x21ACB +0x5435 0x21ACC +0x5436 0x21ACD +0x5437 0x21ACE +0x5438 0x21C19 +0x5439 0x21CE6 +0x543A 0x21F4C +0x543B 0x21F4D +0x543C 0x21F4E +0x543D 0x22006 +0x543F 0x222CD +0x5440 0x222CE +0x5441 0x222CF +0x5442 0x222D0 +0x5444 0x22581 +0x5445 0x22582 +0x5446 0x20533 +0x5447 0x2286A +0x5448 0x2286B +0x5449 0x228B2 +0x544A 0x2286C +0x544B 0x2286D +0x544C 0x228CC +0x544D 0x228AE +0x544E 0x228B3 +0x544F 0x22891 +0x5451 0x2286E +0x5452 0x228B4 +0x5453 0x2286F +0x5454 0x22DC9 +0x5455 0x22DA7 +0x5456 0x22DA8 +0x5457 0x22DA9 +0x5458 0x22DAA +0x5459 0x22DAB +0x545A 0x22DAC +0x545B 0x22DAD +0x545C 0x22DAE +0x545D 0x22DAF +0x545E 0x22DB0 +0x545F 0x22D60 +0x5460 0x22DB1 +0x5461 0x22EE1 +0x5462 0x22FE3 +0x5463 0x22FF6 +0x5465 0x232AF +0x5466 0x232B0 +0x5467 0x232B1 +0x5468 0x232BA +0x5469 0x232B2 +0x546A 0x232B3 +0x546B 0x2334C +0x546D 0x233A0 +0x546E 0x233A1 +0x546F 0x236B0 +0x5470 0x236B1 +0x5471 0x236B2 +0x5472 0x236B3 +0x5473 0x236B4 +0x5474 0x2F8EB +0x5475 0x236B5 +0x5476 0x236B6 +0x5477 0x236B7 +0x5478 0x236B8 +0x5479 0x236B9 +0x547A 0x236BA +0x547C 0x236BB +0x547D 0x236BC +0x547E 0x236BD +0x5521 0x236BE +0x5522 0x236BF +0x5523 0x236DF +0x5524 0x236C0 +0x5525 0x236C1 +0x5526 0x236C2 +0x5527 0x236C3 +0x5528 0x236C4 +0x552B 0x236C5 +0x552C 0x236C6 +0x552D 0x236C7 +0x552E 0x236C8 +0x552F 0x236C9 +0x5530 0x236CA +0x5531 0x2373C +0x5532 0x236CB +0x5533 0x236CC +0x5534 0x236CD +0x5535 0x236CE +0x5536 0x236CF +0x5537 0x236D0 +0x5538 0x236D1 +0x553A 0x2391D +0x553B 0x2391E +0x553C 0x23A64 +0x553D 0x23A65 +0x553E 0x23AC5 +0x553F 0x23AC6 +0x5540 0x23AC7 +0x5541 0x23AFF +0x5542 0x23BFF +0x5543 0x23C00 +0x5544 0x23C01 +0x5545 0x23C02 +0x5546 0x23FF5 +0x5547 0x2405C +0x5548 0x23FF6 +0x5549 0x23FF7 +0x554A 0x23FB0 +0x554B 0x23FF8 +0x554C 0x23FF9 +0x554D 0x2405D +0x554E 0x24050 +0x554F 0x23FFA +0x5550 0x23FFB +0x5551 0x23FA2 +0x5552 0x23FFC +0x5553 0x23FFD +0x5554 0x23FFE +0x5555 0x23FFF +0x5556 0x2F913 +0x5557 0x24000 +0x5558 0x2F91F +0x5559 0x243C1 +0x555A 0x243C2 +0x555B 0x243C3 +0x555C 0x243C4 +0x555D 0x243C5 +0x555E 0x243C6 +0x555F 0x243C7 +0x5560 0x243C8 +0x5561 0x243C9 +0x5562 0x243CA +0x5563 0x243CB +0x5564 0x290EF +0x5565 0x243D7 +0x5566 0x243CC +0x5567 0x243CD +0x5568 0x243CE +0x5569 0x24422 +0x556A 0x243CF +0x556B 0x243D0 +0x556D 0x243D1 +0x556E 0x243D2 +0x556F 0x243E9 +0x5570 0x243D3 +0x5571 0x243D4 +0x5572 0x243D5 +0x5573 0x24538 +0x5574 0x2103B +0x5575 0x2487D +0x5576 0x2056F +0x5577 0x248A1 +0x5578 0x24A53 +0x5579 0x24A54 +0x557B 0x24A55 +0x557C 0x24A3C +0x557D 0x24A56 +0x5621 0x24A66 +0x5623 0x24A57 +0x5624 0x24A58 +0x5625 0x24A59 +0x5626 0x24A5A +0x5627 0x24A5B +0x5628 0x24A67 +0x5629 0x24A5C +0x562C 0x24A6A +0x562D 0x24A5D +0x562E 0x24A3D +0x562F 0x24A5E +0x5630 0x24A65 +0x5631 0x24CE1 +0x5632 0x24CCD +0x5633 0x2A011 +0x5634 0x24E6F +0x5635 0x24E70 +0x5636 0x2501A +0x5637 0x2509A +0x5638 0x2509B +0x5639 0x2509C +0x563A 0x2509E +0x563B 0x2509F +0x563C 0x2F93F +0x563D 0x2528E +0x563F 0x253FD +0x5641 0x2555E +0x5642 0x2555F +0x5643 0x25560 +0x5644 0x25565 +0x5645 0x25567 +0x5646 0x25568 +0x5647 0x25569 +0x5649 0x2556A +0x564A 0x2558F +0x564B 0x2556B +0x564C 0x2556C +0x564D 0x2556D +0x564E 0x256F7 +0x564F 0x256F8 +0x5650 0x256F9 +0x5651 0x256E4 +0x5652 0x256FA +0x5653 0x258B1 +0x5654 0x25875 +0x5655 0x25876 +0x5656 0x259FF +0x5657 0x25A00 +0x5658 0x25A01 +0x5659 0x25A02 +0x565A 0x25A03 +0x565B 0x25AAE +0x565C 0x25AAD +0x565D 0x25C51 +0x565E 0x25C52 +0x5660 0x25C53 +0x5661 0x25C54 +0x5662 0x25C55 +0x5663 0x25C56 +0x5664 0x25C57 +0x5665 0x25C58 +0x5666 0x25C59 +0x5667 0x25C5A +0x5668 0x25C5B +0x5669 0x25C5C +0x566A 0x25C5D +0x566B 0x25C5E +0x566C 0x25C5F +0x566D 0x25C60 +0x566E 0x25C61 +0x566F 0x25C62 +0x5670 0x25C63 +0x5671 0x25C64 +0x5672 0x25C4C +0x5673 0x25C66 +0x5674 0x25EF1 +0x5675 0x25EF2 +0x5676 0x260F2 +0x5677 0x260F3 +0x5678 0x260F4 +0x5679 0x260F5 +0x567A 0x260F6 +0x567B 0x260F7 +0x567C 0x260F8 +0x567D 0x260F9 +0x567E 0x260FA +0x5721 0x2624C +0x5722 0x2624B +0x5723 0x2631B +0x5724 0x263CE +0x5725 0x263B3 +0x5726 0x2647F +0x5727 0x2F979 +0x5728 0x2F97C +0x5729 0x2651A +0x572A 0x265C4 +0x572B 0x265C5 +0x572C 0x265C6 +0x572D 0x265C7 +0x572E 0x265C8 +0x572F 0x265C9 +0x5731 0x26819 +0x5732 0x2681C +0x5733 0x2681A +0x5734 0x2694C +0x5735 0x2698E +0x5736 0x26A7E +0x5737 0x26EEB +0x5738 0x26EEC +0x5739 0x26EED +0x573A 0x26EEE +0x573B 0x26EEF +0x573C 0x26EF0 +0x573D 0x26EF1 +0x573E 0x26ED8 +0x573F 0x26ED9 +0x5740 0x26EDA +0x5741 0x26EDB +0x5742 0x26EF2 +0x5743 0x26EF3 +0x5744 0x26EF4 +0x5745 0x26F07 +0x5747 0x2F9AC +0x5749 0x26EF5 +0x574A 0x26F15 +0x574C 0x26EF6 +0x574D 0x26EF7 +0x574E 0x26EF8 +0x574F 0x26EF9 +0x5750 0x26EFA +0x5751 0x26EFB +0x5752 0x26EFC +0x5753 0x26EFD +0x5754 0x26EFE +0x5755 0x26FA7 +0x5756 0x26EFF +0x5757 0x26F00 +0x5758 0x26F01 +0x5759 0x26F02 +0x575A 0x26F03 +0x575B 0x26F04 +0x575C 0x26F05 +0x575D 0x271E9 +0x575E 0x271EA +0x575F 0x271EB +0x5760 0x273DE +0x5761 0x273DF +0x5763 0x273E0 +0x5764 0x273E1 +0x5765 0x273E2 +0x5766 0x273E3 +0x5767 0x2773E +0x5768 0x2773F +0x5769 0x27740 +0x576A 0x27741 +0x576B 0x27871 +0x576C 0x27872 +0x576D 0x27873 +0x576E 0x27A88 +0x576F 0x27A89 +0x5770 0x27A8A +0x5771 0x27A8B +0x5772 0x27A8C +0x5773 0x27A8D +0x5774 0x27A8E +0x5775 0x27A8F +0x5776 0x27A90 +0x5777 0x27A91 +0x5778 0x27A92 +0x577A 0x27CF1 +0x577B 0x27DBE +0x577C 0x27DBF +0x577D 0x27DC0 +0x577E 0x27DC1 +0x5821 0x27DC2 +0x5822 0x27DC3 +0x5823 0x27E6E +0x5824 0x27F37 +0x5825 0x27F57 +0x5826 0x27F38 +0x5827 0x27F39 +0x5828 0x27F3A +0x5829 0x27F3B +0x582A 0x27F3C +0x582B 0x27F3D +0x582C 0x27F3E +0x582D 0x27F27 +0x582E 0x27F3F +0x5831 0x280C0 +0x5832 0x280C1 +0x5834 0x28267 +0x5836 0x28268 +0x5837 0x28358 +0x5838 0x28365 +0x5839 0x28359 +0x583A 0x2835A +0x583B 0x28424 +0x583C 0x285CD +0x583D 0x285CE +0x583E 0x285CF +0x583F 0x285D2 +0x5840 0x2879F +0x5841 0x28722 +0x5842 0x2887D +0x5843 0x2887E +0x5844 0x289FF +0x5845 0x28A25 +0x5846 0x28A00 +0x5847 0x28A01 +0x5849 0x28A02 +0x584A 0x28A03 +0x584B 0x28A04 +0x584D 0x28A05 +0x584E 0x28A06 +0x584F 0x28A07 +0x5850 0x28A16 +0x5851 0x28A08 +0x5852 0x28A17 +0x5853 0x28A09 +0x5854 0x28A0A +0x5856 0x28A0B +0x5857 0x28A0C +0x5858 0x28A29 +0x585A 0x28A0D +0x585C 0x28A0E +0x585D 0x28A10 +0x585E 0x28A11 +0x585F 0x28A1D +0x5860 0x28A12 +0x5861 0x28A13 +0x5863 0x28A14 +0x5864 0x28A15 +0x5865 0x28C8D +0x5866 0x28D54 +0x5867 0x28D55 +0x5868 0x28D56 +0x5869 0x28F33 +0x586A 0x28F34 +0x586B 0x28F35 +0x586C 0x28F36 +0x586D 0x28FFA +0x586E 0x290E3 +0x586F 0x290E6 +0x5870 0x290ED +0x5871 0x290E7 +0x5872 0x290E8 +0x5873 0x290E9 +0x5874 0x290EA +0x5875 0x290EB +0x5876 0x29227 +0x5877 0x29220 +0x5878 0x2F9F8 +0x5879 0x2942A +0x587A 0x294C9 +0x587C 0x294CA +0x587D 0x294CB +0x587E 0x294D9 +0x5921 0x294CC +0x5922 0x294CD +0x5923 0x294CE +0x5925 0x295E1 +0x5926 0x2971B +0x5927 0x2971C +0x5928 0x2971D +0x5929 0x2971E +0x592A 0x29847 +0x592B 0x298D1 +0x592C 0x298C9 +0x592D 0x29AD0 +0x592E 0x29AD1 +0x592F 0x29B3F +0x5930 0x29B40 +0x5931 0x29B41 +0x5932 0x2FA09 +0x5933 0x29B42 +0x5934 0x29CC4 +0x5935 0x29D9B +0x5936 0x29D92 +0x5937 0x29D93 +0x5939 0x29D94 +0x593A 0x29D95 +0x593D 0x29FF3 +0x593E 0x29FF4 +0x593F 0x29FF5 +0x5940 0x29FF6 +0x5941 0x2A260 +0x5942 0x2A29E +0x5943 0x2A2A0 +0x5944 0x2A2A1 +0x5945 0x2A31C +0x5946 0x2A39F +0x5947 0x20056 +0x5948 0x20412 +0x5949 0x2041F +0x594A 0x20415 +0x594B 0x20416 +0x594C 0x20417 +0x594D 0x2F80C +0x594E 0x20418 +0x594F 0x204C2 +0x5950 0x204C3 +0x5951 0x204C4 +0x5952 0x205A1 +0x5953 0x2061B +0x5954 0x2061C +0x5955 0x20671 +0x5956 0x20813 +0x5957 0x20B17 +0x5958 0x20B8F +0x5959 0x2105F +0x595A 0x21060 +0x595B 0x210AC +0x595E 0x21061 +0x595F 0x21062 +0x5960 0x21063 +0x5961 0x21064 +0x5962 0x21065 +0x5964 0x21499 +0x5965 0x2149A +0x5966 0x2149B +0x5967 0x2149C +0x5968 0x2149D +0x5969 0x2149E +0x596A 0x2149F +0x596B 0x214A0 +0x596C 0x218DA +0x596D 0x218DB +0x596E 0x218DC +0x596F 0x218DD +0x5970 0x218DE +0x5971 0x218DF +0x5972 0x21AD5 +0x5973 0x21AD6 +0x5974 0x21AD7 +0x5975 0x21AD8 +0x5976 0x21AE0 +0x5977 0x21BB4 +0x5979 0x21F6E +0x597A 0x21F6F +0x597B 0x21F70 +0x597C 0x22163 +0x597E 0x222D5 +0x5A21 0x222D6 +0x5A22 0x222D7 +0x5A23 0x222D8 +0x5A24 0x22430 +0x5A25 0x228B5 +0x5A26 0x228B6 +0x5A27 0x228C1 +0x5A28 0x228F7 +0x5A2A 0x228CB +0x5A2B 0x228E8 +0x5A2D 0x228E9 +0x5A2E 0x228B7 +0x5A2F 0x22A15 +0x5A30 0x22DE6 +0x5A31 0x22DE7 +0x5A32 0x22DE8 +0x5A33 0x22DE9 +0x5A34 0x22DEA +0x5A35 0x22DEB +0x5A36 0x2F8CA +0x5A37 0x2300B +0x5A38 0x2300C +0x5A39 0x23064 +0x5A3A 0x232D4 +0x5A3B 0x232D5 +0x5A3C 0x232D6 +0x5A3D 0x232D8 +0x5A3E 0x233A5 +0x5A3F 0x2005B +0x5A40 0x2370F +0x5A41 0x23710 +0x5A43 0x23711 +0x5A44 0x23712 +0x5A45 0x23713 +0x5A46 0x23714 +0x5A47 0x23715 +0x5A48 0x23716 +0x5A49 0x23717 +0x5A4A 0x23718 +0x5A4B 0x23719 +0x5A4C 0x2371A +0x5A4D 0x2372F +0x5A4E 0x2371B +0x5A4F 0x2371C +0x5A50 0x2373F +0x5A51 0x2371D +0x5A52 0x2371E +0x5A53 0x2372C +0x5A54 0x2371F +0x5A55 0x23924 +0x5A56 0x239A4 +0x5A57 0x239A5 +0x5A58 0x26251 +0x5A59 0x23AFE +0x5A5A 0x23C11 +0x5A5B 0x23C12 +0x5A5C 0x23C13 +0x5A5D 0x23C54 +0x5A5E 0x2405E +0x5A5F 0x24021 +0x5A60 0x2403F +0x5A61 0x24040 +0x5A62 0x24041 +0x5A63 0x24042 +0x5A64 0x24043 +0x5A65 0x24044 +0x5A66 0x24020 +0x5A67 0x24045 +0x5A69 0x24046 +0x5A6A 0x240B0 +0x5A6B 0x24047 +0x5A6C 0x24057 +0x5A6D 0x24001 +0x5A6E 0x240B1 +0x5A6F 0x2405A +0x5A70 0x24048 +0x5A71 0x24404 +0x5A72 0x24405 +0x5A74 0x2444F +0x5A75 0x24450 +0x5A76 0x24406 +0x5A77 0x24407 +0x5A78 0x24408 +0x5A79 0x24409 +0x5A7A 0x2440A +0x5A7B 0x2440B +0x5A7C 0x2440C +0x5A7D 0x2440D +0x5A7E 0x2440E +0x5B21 0x2440F +0x5B22 0x24410 +0x5B23 0x24411 +0x5B24 0x24533 +0x5B25 0x24534 +0x5B26 0x24535 +0x5B27 0x245FC +0x5B28 0x245FD +0x5B29 0x248B0 +0x5B2A 0x248B1 +0x5B2B 0x248B2 +0x5B2C 0x248B3 +0x5B2E 0x24A7B +0x5B2F 0x24A7C +0x5B30 0x24A7D +0x5B31 0x24A7E +0x5B32 0x24A7F +0x5B33 0x24A80 +0x5B34 0x24A81 +0x5B35 0x24A82 +0x5B36 0x24BF9 +0x5B37 0x24CDA +0x5B38 0x24EA1 +0x5B3B 0x250AD +0x5B3C 0x250AE +0x5B3E 0x252C8 +0x5B3F 0x252C9 +0x5B40 0x252CA +0x5B41 0x25582 +0x5B42 0x25583 +0x5B43 0x25584 +0x5B44 0x25585 +0x5B45 0x25586 +0x5B46 0x25587 +0x5B47 0x25588 +0x5B48 0x25589 +0x5B49 0x2558A +0x5B4B 0x25707 +0x5B4C 0x25708 +0x5B4D 0x25701 +0x5B4E 0x25709 +0x5B4F 0x25702 +0x5B50 0x2570A +0x5B51 0x2570B +0x5B52 0x2570C +0x5B53 0x258A7 +0x5B54 0x25898 +0x5B55 0x25899 +0x5B56 0x2589A +0x5B57 0x2589B +0x5B58 0x2589C +0x5B5A 0x2589D +0x5B5B 0x25A1A +0x5B5C 0x25AB2 +0x5B5D 0x25CB0 +0x5B5E 0x25CB1 +0x5B60 0x25CB2 +0x5B61 0x25CB3 +0x5B62 0x25CB4 +0x5B63 0x25CB5 +0x5B64 0x25CB6 +0x5B65 0x25CC0 +0x5B66 0x25CB7 +0x5B67 0x25CB8 +0x5B68 0x25CB9 +0x5B69 0x25CBA +0x5B6A 0x25D1D +0x5B6B 0x25F0C +0x5B6C 0x25F0D +0x5B6D 0x25F0E +0x5B6E 0x25F35 +0x5B6F 0x25F0F +0x5B70 0x25F10 +0x5B71 0x25F11 +0x5B72 0x25F12 +0x5B73 0x26122 +0x5B74 0x26123 +0x5B75 0x26124 +0x5B77 0x26125 +0x5B78 0x26126 +0x5B79 0x26127 +0x5B7A 0x26128 +0x5B7B 0x26129 +0x5B7C 0x2612A +0x5B7D 0x2612B +0x5B7E 0x2612C +0x5C21 0x2612D +0x5C22 0x2612E +0x5C23 0x26252 +0x5C24 0x26253 +0x5C25 0x26319 +0x5C26 0x263BF +0x5C27 0x2648B +0x5C28 0x2648C +0x5C29 0x26523 +0x5C2A 0x26524 +0x5C2B 0x265F1 +0x5C2C 0x265D8 +0x5C2D 0x2F97F +0x5C2E 0x2684E +0x5C2F 0x2684F +0x5C30 0x26855 +0x5C31 0x26850 +0x5C32 0x26851 +0x5C33 0x26852 +0x5C34 0x26853 +0x5C35 0x26802 +0x5C36 0x26854 +0x5C37 0x268F1 +0x5C38 0x26924 +0x5C39 0x26AD1 +0x5C3A 0x26F7C +0x5C3B 0x26F7D +0x5C3C 0x26F7E +0x5C3D 0x26F7F +0x5C3E 0x26F80 +0x5C3F 0x26F9F +0x5C40 0x26F81 +0x5C41 0x26F82 +0x5C42 0x26F83 +0x5C43 0x26F84 +0x5C44 0x26F85 +0x5C45 0x26F86 +0x5C46 0x26F87 +0x5C47 0x26F88 +0x5C48 0x26F9B +0x5C49 0x26F89 +0x5C4A 0x26F8A +0x5C4B 0x26F8B +0x5C4C 0x26F8C +0x5C4E 0x26FA1 +0x5C4F 0x26F8D +0x5C50 0x26F8E +0x5C51 0x271F3 +0x5C52 0x271F4 +0x5C53 0x271F5 +0x5C54 0x27424 +0x5C55 0x27425 +0x5C56 0x27426 +0x5C57 0x27427 +0x5C58 0x27428 +0x5C59 0x27429 +0x5C5A 0x2742A +0x5C5C 0x2742B +0x5C5D 0x275CD +0x5C5E 0x27601 +0x5C5F 0x2258D +0x5C60 0x27770 +0x5C61 0x27880 +0x5C62 0x27881 +0x5C63 0x27AC0 +0x5C64 0x27AC1 +0x5C65 0x27AC2 +0x5C66 0x27AC3 +0x5C67 0x27AC4 +0x5C68 0x27AC5 +0x5C69 0x27AC6 +0x5C6A 0x27AC7 +0x5C6B 0x27AC8 +0x5C6C 0x27CFE +0x5C6E 0x27DD9 +0x5C6F 0x27DDC +0x5C70 0x27DDA +0x5C71 0x27E75 +0x5C72 0x27F58 +0x5C73 0x27F59 +0x5C74 0x27F5A +0x5C75 0x27F5B +0x5C76 0x27F5C +0x5C77 0x280EC +0x5C79 0x280F3 +0x5C7A 0x28272 +0x5C7B 0x28273 +0x5C7C 0x28382 +0x5C7D 0x28383 +0x5C7E 0x2842A +0x5D21 0x2842B +0x5D22 0x2842C +0x5D23 0x2842D +0x5D24 0x285F6 +0x5D25 0x28600 +0x5D26 0x285F7 +0x5D27 0x285F8 +0x5D28 0x285F9 +0x5D2A 0x28894 +0x5D2B 0x28895 +0x5D2C 0x28896 +0x5D2D 0x2891B +0x5D2E 0x28A86 +0x5D2F 0x28A4C +0x5D30 0x28A4D +0x5D31 0x28A83 +0x5D33 0x28A82 +0x5D34 0x28A4E +0x5D35 0x28A4F +0x5D36 0x28A50 +0x5D37 0x28A51 +0x5D38 0x28A81 +0x5D3A 0x28A52 +0x5D3B 0x28A53 +0x5D3C 0x28A54 +0x5D3D 0x28A55 +0x5D3F 0x28A56 +0x5D40 0x28A57 +0x5D42 0x28A58 +0x5D43 0x28A5B +0x5D44 0x28A5C +0x5D45 0x28A5D +0x5D46 0x28A5E +0x5D47 0x28A5F +0x5D48 0x28A60 +0x5D49 0x28A61 +0x5D4A 0x28A7C +0x5D4B 0x28A62 +0x5D4E 0x28A63 +0x5D4F 0x28A64 +0x5D50 0x28D73 +0x5D51 0x28F45 +0x5D52 0x28F46 +0x5D53 0x28F47 +0x5D54 0x28F4C +0x5D55 0x29012 +0x5D57 0x29013 +0x5D58 0x29139 +0x5D59 0x29103 +0x5D5A 0x2910D +0x5D5B 0x29230 +0x5D5C 0x292D5 +0x5D5D 0x293C0 +0x5D5E 0x294F2 +0x5D5F 0x294F3 +0x5D60 0x294F4 +0x5D61 0x294F5 +0x5D62 0x294F6 +0x5D63 0x294F7 +0x5D64 0x295FA +0x5D65 0x295FB +0x5D66 0x29745 +0x5D67 0x29746 +0x5D68 0x29849 +0x5D69 0x298E7 +0x5D6A 0x298E8 +0x5D6B 0x29AD8 +0x5D6C 0x29AD9 +0x5D6D 0x29B55 +0x5D6E 0x29B56 +0x5D6F 0x29B57 +0x5D70 0x29CDA +0x5D71 0x29CDB +0x5D72 0x29CDC +0x5D73 0x29DB8 +0x5D74 0x29DB9 +0x5D75 0x29DBA +0x5D77 0x29DBB +0x5D78 0x29F89 +0x5D79 0x29DBC +0x5D7A 0x2A030 +0x5D7B 0x2A031 +0x5D7C 0x2A032 +0x5D7D 0x2A033 +0x5E21 0x2A034 +0x5E22 0x2A035 +0x5E23 0x2A036 +0x5E25 0x2A037 +0x5E26 0x2A2B2 +0x5E27 0x2A390 +0x5E28 0x2A326 +0x5E29 0x2A3A2 +0x5E2A 0x2A438 +0x5E2C 0x2042E +0x5E2E 0x2042F +0x5E2F 0x20430 +0x5E30 0x2042A +0x5E31 0x2042B +0x5E32 0x204C9 +0x5E33 0x20537 +0x5E34 0x20620 +0x5E35 0x20672 +0x5E36 0x2081F +0x5E37 0x20965 +0x5E38 0x209CA +0x5E39 0x20AC0 +0x5E3A 0x20AC1 +0x5E3B 0x20AC2 +0x5E3C 0x210B7 +0x5E3D 0x210B8 +0x5E3E 0x210B9 +0x5E3F 0x210BA +0x5E40 0x210BB +0x5E43 0x210BC +0x5E44 0x210BD +0x5E45 0x210BE +0x5E46 0x210F2 +0x5E47 0x214B5 +0x5E48 0x214B7 +0x5E49 0x214B8 +0x5E4A 0x210DF +0x5E4B 0x214B9 +0x5E4C 0x214D5 +0x5E4D 0x214BA +0x5E4E 0x214BB +0x5E4F 0x2154A +0x5E50 0x218F2 +0x5E51 0x218F3 +0x5E52 0x218F4 +0x5E53 0x218FA +0x5E54 0x218F5 +0x5E55 0x21902 +0x5E56 0x21AE2 +0x5E57 0x21AE3 +0x5E58 0x21F8E +0x5E59 0x21F8B +0x5E5A 0x222E4 +0x5E5B 0x222EB +0x5E5C 0x222E5 +0x5E5D 0x22435 +0x5E5E 0x22593 +0x5E5F 0x228EA +0x5E60 0x228EB +0x5E62 0x228EC +0x5E63 0x228ED +0x5E64 0x22917 +0x5E65 0x228EE +0x5E66 0x228EF +0x5E67 0x228F0 +0x5E68 0x22E0E +0x5E69 0x22E0F +0x5E6A 0x22E10 +0x5E6B 0x22E19 +0x5E6C 0x22E18 +0x5E6D 0x22E11 +0x5E6E 0x22E12 +0x5E6F 0x22E13 +0x5E70 0x2F8C7 +0x5E71 0x22E14 +0x5E72 0x22E15 +0x5E74 0x22E16 +0x5E75 0x23065 +0x5E76 0x232EA +0x5E77 0x232EB +0x5E78 0x232EC +0x5E79 0x232ED +0x5E7B 0x232EE +0x5E7C 0x233AC +0x5E7D 0x237C2 +0x5E7E 0x23769 +0x5F21 0x23781 +0x5F22 0x2376A +0x5F23 0x2376B +0x5F24 0x2376C +0x5F25 0x2376D +0x5F26 0x2376E +0x5F27 0x2376F +0x5F28 0x23770 +0x5F2A 0x23771 +0x5F2B 0x23772 +0x5F2C 0x23773 +0x5F2D 0x2378C +0x5F2E 0x23774 +0x5F2F 0x23775 +0x5F30 0x23776 +0x5F31 0x23C24 +0x5F32 0x23C2A +0x5F33 0x2408E +0x5F34 0x240AF +0x5F35 0x2408F +0x5F36 0x24090 +0x5F37 0x24091 +0x5F39 0x24092 +0x5F3A 0x24093 +0x5F3B 0x24094 +0x5F3C 0x24095 +0x5F3D 0x24096 +0x5F3E 0x24097 +0x5F3F 0x24098 +0x5F40 0x24099 +0x5F41 0x2409A +0x5F42 0x2409B +0x5F43 0x2409C +0x5F44 0x24439 +0x5F45 0x2443B +0x5F46 0x2443A +0x5F47 0x2443C +0x5F48 0x2443D +0x5F49 0x2443E +0x5F4A 0x2443F +0x5F4B 0x24470 +0x5F4C 0x24440 +0x5F4D 0x24441 +0x5F4E 0x248C0 +0x5F4F 0x248C1 +0x5F50 0x24AA4 +0x5F51 0x24A97 +0x5F52 0x24AA5 +0x5F53 0x24A98 +0x5F54 0x24A99 +0x5F55 0x24A9A +0x5F57 0x24A9B +0x5F58 0x24AA6 +0x5F59 0x24A9C +0x5F5A 0x24A9D +0x5F5B 0x24A9E +0x5F5C 0x24A9F +0x5F5D 0x28ACE +0x5F5E 0x24AC8 +0x5F5F 0x24AA0 +0x5F60 0x24B19 +0x5F61 0x24C0D +0x5F62 0x250BF +0x5F63 0x252E9 +0x5F64 0x252EA +0x5F65 0x255A2 +0x5F66 0x255A3 +0x5F67 0x255A4 +0x5F68 0x255A5 +0x5F69 0x255A6 +0x5F6A 0x25715 +0x5F6B 0x25717 +0x5F6C 0x258BF +0x5F6D 0x258C0 +0x5F6E 0x258C1 +0x5F6F 0x258C2 +0x5F70 0x258C3 +0x5F71 0x258C4 +0x5F72 0x258C5 +0x5F73 0x2190D +0x5F74 0x25A23 +0x5F75 0x25ABE +0x5F76 0x25D03 +0x5F77 0x25D04 +0x5F78 0x25D05 +0x5F79 0x25D06 +0x5F7A 0x25D07 +0x5F7B 0x25D08 +0x5F7C 0x25D09 +0x5F7D 0x25D0A +0x5F7E 0x25D0B +0x6021 0x25D0C +0x6022 0x25D20 +0x6023 0x25D0D +0x6024 0x25D0E +0x6025 0x25D0F +0x6027 0x25F26 +0x6028 0x25F27 +0x6029 0x25F28 +0x602A 0x2615D +0x602B 0x2615E +0x602C 0x2615F +0x602D 0x26160 +0x602E 0x26161 +0x602F 0x26162 +0x6030 0x26163 +0x6031 0x26164 +0x6032 0x26165 +0x6033 0x26257 +0x6034 0x263CF +0x6035 0x263D0 +0x6036 0x26499 +0x6037 0x2649A +0x6038 0x265EA +0x6039 0x265EB +0x603A 0x265EC +0x603B 0x2687E +0x603C 0x2687F +0x603D 0x26880 +0x6040 0x26881 +0x6041 0x26882 +0x6042 0x268F3 +0x6043 0x26925 +0x6044 0x2699F +0x6045 0x269A0 +0x6046 0x269F3 +0x6047 0x26A00 +0x6048 0x26FEB +0x6049 0x26FEC +0x604A 0x26FED +0x604B 0x26FEE +0x604C 0x26FEF +0x604F 0x26FF0 +0x6050 0x26FF1 +0x6051 0x26FF2 +0x6052 0x26FF3 +0x6053 0x26FF4 +0x6054 0x26FF5 +0x6055 0x26FF9 +0x6056 0x26FFA +0x6057 0x26FFB +0x6058 0x26FFC +0x6059 0x26FFD +0x605A 0x26FFE +0x605B 0x26FFF +0x605C 0x27000 +0x605D 0x2F9AE +0x605E 0x27001 +0x605F 0x27002 +0x6060 0x27203 +0x6061 0x27486 +0x6062 0x27479 +0x6064 0x2747A +0x6065 0x2747B +0x6066 0x2747C +0x6067 0x27484 +0x6068 0x2747D +0x6069 0x2747E +0x606A 0x2747F +0x606B 0x27786 +0x606C 0x27787 +0x606D 0x27800 +0x606E 0x27801 +0x606F 0x27888 +0x6070 0x27889 +0x6071 0x2788A +0x6072 0x27AF5 +0x6074 0x27B25 +0x6075 0x27AF6 +0x6076 0x27DEB +0x6077 0x27DEC +0x6078 0x27DED +0x6079 0x27DEE +0x607B 0x27DEF +0x607C 0x27DF0 +0x607D 0x27F6C +0x607E 0x28121 +0x6121 0x28122 +0x6122 0x28123 +0x6123 0x28124 +0x6124 0x28125 +0x6125 0x28126 +0x6126 0x2827B +0x6127 0x2827C +0x6128 0x28391 +0x6129 0x28392 +0x612A 0x28393 +0x612B 0x2860E +0x612C 0x2860F +0x612D 0x28610 +0x612E 0x288B3 +0x612F 0x28936 +0x6130 0x28AC6 +0x6131 0x28AA1 +0x6132 0x28AA2 +0x6134 0x28AA3 +0x6135 0x28ACC +0x6136 0x28AA4 +0x6137 0x28AA5 +0x6138 0x28AA6 +0x6139 0x28ACB +0x613A 0x28AA7 +0x613C 0x28AA8 +0x613D 0x28AA9 +0x613E 0x28AAA +0x6140 0x28AAB +0x6141 0x28AAC +0x6142 0x28AAD +0x6144 0x28AAE +0x6145 0x28AAF +0x6146 0x28AB0 +0x6147 0x28D8C +0x6148 0x28D8D +0x6149 0x28D8E +0x614A 0x2F9F1 +0x614B 0x28D92 +0x614C 0x28D8F +0x614D 0x28F52 +0x614E 0x28F53 +0x614F 0x28F54 +0x6150 0x28F55 +0x6151 0x29129 +0x6153 0x292F3 +0x6154 0x292F4 +0x6155 0x2950D +0x6156 0x2950E +0x6157 0x2950F +0x6158 0x29510 +0x6159 0x29614 +0x615A 0x29771 +0x615B 0x29772 +0x615C 0x2990F +0x615D 0x29904 +0x615E 0x29906 +0x6160 0x29907 +0x6161 0x29ADC +0x6162 0x29ADD +0x6163 0x29B6D +0x6164 0x29B79 +0x6165 0x29B6E +0x6167 0x29CEC +0x6168 0x29DDD +0x6169 0x29DDE +0x616A 0x29DDF +0x616B 0x29DE0 +0x616C 0x29DE1 +0x616D 0x29DE2 +0x616E 0x29DE3 +0x616F 0x29DE4 +0x6170 0x29E3A +0x6171 0x29DE5 +0x6173 0x29DE6 +0x6174 0x2A06B +0x6175 0x2A06C +0x6176 0x2444E +0x6178 0x2A2BD +0x6179 0x2A2BE +0x617A 0x2A2BF +0x617B 0x2A334 +0x617D 0x2A512 +0x617E 0x20440 +0x6221 0x20441 +0x6222 0x21102 +0x6223 0x21103 +0x6224 0x21104 +0x6225 0x21105 +0x6226 0x21106 +0x6227 0x214D7 +0x6228 0x214CC +0x6229 0x21698 +0x622A 0x21906 +0x622B 0x21907 +0x622C 0x219AF +0x622D 0x219B0 +0x622E 0x21AEA +0x622F 0x21AF2 +0x6230 0x21FA2 +0x6231 0x21FA3 +0x6232 0x21FA4 +0x6233 0x22176 +0x6234 0x222F5 +0x6235 0x222F6 +0x6236 0x222F7 +0x6238 0x2293B +0x6239 0x22925 +0x623A 0x2293A +0x623B 0x2293C +0x623C 0x2293D +0x623D 0x2293E +0x623E 0x22E37 +0x623F 0x22E38 +0x6240 0x22E39 +0x6241 0x22E3A +0x6242 0x22E3B +0x6243 0x22E3C +0x6244 0x22E3D +0x6245 0x22E3E +0x6246 0x22E3F +0x6247 0x22E4B +0x6249 0x22E40 +0x624A 0x23022 +0x624B 0x23067 +0x624C 0x230D3 +0x624D 0x232FA +0x624F 0x237BC +0x6252 0x237A5 +0x6254 0x237B6 +0x6256 0x237A6 +0x6257 0x237BB +0x6258 0x237A7 +0x6259 0x237A8 +0x625A 0x237A9 +0x625B 0x237AA +0x625C 0x237AB +0x625D 0x237AC +0x625E 0x237BF +0x625F 0x237AD +0x6260 0x237AE +0x6261 0x237AF +0x6262 0x2392E +0x6263 0x23B00 +0x6264 0x2409D +0x6265 0x2409E +0x6266 0x240CB +0x6267 0x240CC +0x6268 0x240CD +0x6269 0x240CE +0x626A 0x240CF +0x626C 0x2409F +0x626D 0x240D0 +0x626E 0x240D1 +0x626F 0x240D2 +0x6270 0x240D3 +0x6271 0x240D4 +0x6274 0x2445D +0x6275 0x2445E +0x6276 0x2445F +0x6277 0x24460 +0x6279 0x24ABA +0x627A 0x24ABC +0x627C 0x24AB5 +0x627D 0x24ABD +0x627E 0x24AB6 +0x6321 0x24AB7 +0x6322 0x24AB8 +0x6323 0x24AA8 +0x6324 0x2F932 +0x6325 0x24BFE +0x6326 0x24BFC +0x6327 0x24EE1 +0x6328 0x250C4 +0x6329 0x250C5 +0x632A 0x25314 +0x632B 0x255AE +0x632C 0x255AF +0x632D 0x255B0 +0x632E 0x255B1 +0x632F 0x255B9 +0x6330 0x258E7 +0x6331 0x25D46 +0x6333 0x25D47 +0x6334 0x25D48 +0x6335 0x25D49 +0x6336 0x25D1E +0x6337 0x25D1F +0x6338 0x25D4A +0x6339 0x25D4B +0x633A 0x25D4C +0x633B 0x25D4D +0x633C 0x25D4E +0x633E 0x25F46 +0x633F 0x25F4B +0x6340 0x26190 +0x6341 0x26191 +0x6343 0x26192 +0x6344 0x26193 +0x6345 0x26194 +0x6346 0x2625B +0x6347 0x265F2 +0x6348 0x265F8 +0x6349 0x265F9 +0x634A 0x26894 +0x634B 0x268A4 +0x634C 0x26897 +0x634D 0x26898 +0x634E 0x26929 +0x634F 0x269AE +0x6350 0x26AAF +0x6351 0x27059 +0x6352 0x2705A +0x6354 0x2705B +0x6355 0x2705C +0x6356 0x2705D +0x6357 0x2705E +0x6358 0x2705F +0x6359 0x27060 +0x635A 0x27061 +0x635B 0x26FAA +0x635C 0x27062 +0x635D 0x27063 +0x635E 0x27064 +0x635F 0x27065 +0x6360 0x27066 +0x6361 0x27067 +0x6362 0x27068 +0x6363 0x27069 +0x6364 0x2706A +0x6365 0x2706B +0x6366 0x2706C +0x6367 0x2706D +0x6368 0x2706E +0x6369 0x2706F +0x636B 0x274B2 +0x636C 0x274B3 +0x636D 0x274B4 +0x636F 0x274B5 +0x6370 0x274B6 +0x6371 0x274B7 +0x6372 0x274B8 +0x6373 0x274B9 +0x6374 0x274BA +0x6375 0x274BB +0x6376 0x27788 +0x6378 0x27B19 +0x6379 0x27B1A +0x637A 0x27B1B +0x637B 0x27C16 +0x637C 0x27E0C +0x637D 0x27E0D +0x637E 0x27E0E +0x6421 0x27E0F +0x6423 0x27F83 +0x6424 0x27F84 +0x6425 0x27F85 +0x6426 0x28283 +0x6427 0x28284 +0x6428 0x283B0 +0x642A 0x28626 +0x642B 0x28627 +0x642C 0x28636 +0x642D 0x28628 +0x642E 0x28629 +0x6431 0x28AE7 +0x6432 0x28AE8 +0x6433 0x28AE9 +0x6435 0x28AEA +0x6436 0x28AEB +0x6438 0x28AEC +0x6439 0x28AED +0x643A 0x28AEE +0x643B 0x28AEF +0x643C 0x28AF0 +0x643D 0x28AF1 +0x643E 0x28B0C +0x643F 0x28AF2 +0x6440 0x28AF3 +0x6441 0x28AF4 +0x6442 0x28AF5 +0x6443 0x28AF6 +0x6444 0x28AF7 +0x6445 0x28AF8 +0x6446 0x28DA3 +0x6447 0x28DA4 +0x6448 0x28DA5 +0x6449 0x28DA6 +0x644A 0x28DA7 +0x644C 0x28F5C +0x644E 0x2914B +0x644F 0x291E1 +0x6450 0x29315 +0x6452 0x29316 +0x6453 0x29317 +0x6454 0x2952C +0x6455 0x2952D +0x6456 0x29622 +0x6457 0x29623 +0x6458 0x29796 +0x6459 0x29797 +0x645B 0x2992E +0x645C 0x29930 +0x645D 0x29931 +0x645F 0x29ADF +0x6460 0x29B8B +0x6461 0x29B8C +0x6463 0x29B8D +0x6464 0x29CFC +0x6465 0x29CFD +0x6466 0x29CFE +0x6467 0x29CFF +0x6468 0x29E17 +0x6469 0x29E2D +0x646A 0x29E18 +0x646C 0x29E19 +0x646E 0x29E12 +0x646F 0x29E1A +0x6470 0x29E1B +0x6471 0x29E1C +0x6474 0x2A097 +0x6476 0x2A098 +0x6477 0x2A099 +0x6479 0x2A3C4 +0x647A 0x2044F +0x647B 0x204CD +0x647C 0x20AC7 +0x647D 0x2111C +0x647E 0x2111D +0x6521 0x2111E +0x6522 0x214E7 +0x6523 0x214E9 +0x6524 0x214EA +0x6525 0x214EB +0x6526 0x21915 +0x6527 0x21CF1 +0x6528 0x21CF2 +0x6529 0x21FB6 +0x652A 0x225A0 +0x652B 0x2294A +0x652C 0x22A20 +0x652D 0x22E60 +0x652E 0x22E61 +0x652F 0x22E41 +0x6530 0x22E62 +0x6531 0x23303 +0x6532 0x23304 +0x6533 0x237D9 +0x6534 0x237DA +0x6535 0x237DB +0x6536 0x237DC +0x6537 0x237DD +0x6539 0x237DE +0x653A 0x237DF +0x653B 0x237E0 +0x653C 0x237E1 +0x653D 0x237E2 +0x653F 0x237E3 +0x6541 0x23C31 +0x6542 0x24105 +0x6543 0x24106 +0x6544 0x24107 +0x6545 0x24472 +0x6546 0x2448A +0x6547 0x2448B +0x6548 0x24488 +0x654A 0x2448C +0x654B 0x2448D +0x654C 0x2448E +0x654D 0x2448F +0x654E 0x24490 +0x654F 0x24542 +0x6550 0x24543 +0x6552 0x24AC1 +0x6553 0x24AC2 +0x6554 0x24AC3 +0x6555 0x24AC4 +0x6556 0x250CB +0x6557 0x25322 +0x655A 0x255C3 +0x655B 0x255C4 +0x655C 0x255C5 +0x655D 0x255C6 +0x655E 0x2571E +0x655F 0x25725 +0x6560 0x258F3 +0x6561 0x258F4 +0x6563 0x258F5 +0x6564 0x25A38 +0x6565 0x25A48 +0x6566 0x25ACA +0x6568 0x25D7A +0x6569 0x25D7B +0x656A 0x25F55 +0x656B 0x25F56 +0x656C 0x261B1 +0x656D 0x261B2 +0x656E 0x261B3 +0x6570 0x261B4 +0x6571 0x261B5 +0x6572 0x264A4 +0x6573 0x26600 +0x6574 0x26601 +0x6575 0x26602 +0x6576 0x268AC +0x6578 0x269B3 +0x6579 0x270B6 +0x657A 0x270B7 +0x657B 0x270B8 +0x657C 0x270B9 +0x657D 0x270BA +0x657E 0x270BB +0x6621 0x270BC +0x6622 0x270BD +0x6623 0x270BE +0x6624 0x270BF +0x6625 0x270C0 +0x6626 0x270C1 +0x6627 0x270C2 +0x6628 0x270C3 +0x6629 0x270C4 +0x662A 0x270C5 +0x662B 0x270C6 +0x662C 0x270C7 +0x662D 0x274E3 +0x662E 0x274E4 +0x662F 0x274E5 +0x6630 0x274E6 +0x6631 0x274E7 +0x6633 0x277B5 +0x6634 0x277A1 +0x6635 0x27895 +0x6636 0x27B3B +0x6637 0x27B3C +0x6638 0x27B3D +0x6639 0x27B3E +0x663A 0x27C14 +0x663B 0x27E20 +0x663C 0x27E21 +0x663D 0x27E22 +0x663E 0x27E23 +0x663F 0x27E24 +0x6640 0x27F96 +0x6641 0x27F97 +0x6642 0x27F98 +0x6643 0x28194 +0x6644 0x28195 +0x6645 0x28196 +0x6646 0x28197 +0x6647 0x28198 +0x6648 0x2828F +0x6649 0x28290 +0x664A 0x283BC +0x664B 0x2843B +0x664C 0x2863D +0x664E 0x288DF +0x664F 0x2891E +0x6650 0x28B23 +0x6651 0x28B24 +0x6652 0x28B49 +0x6653 0x28B25 +0x6654 0x28B26 +0x6655 0x28B27 +0x6656 0x28B28 +0x6658 0x28B29 +0x6659 0x28B2A +0x665A 0x28B2E +0x665B 0x28B2F +0x665C 0x28B4E +0x665D 0x28B30 +0x665E 0x2F9EB +0x665F 0x28B31 +0x6660 0x28B32 +0x6661 0x28B33 +0x6662 0x28B34 +0x6663 0x28B35 +0x6664 0x28B36 +0x6666 0x28B37 +0x6667 0x28B50 +0x6668 0x28B38 +0x666A 0x28B39 +0x666B 0x28B3A +0x666C 0x28B3B +0x666D 0x28B3C +0x666E 0x28B3D +0x666F 0x28B3E +0x6670 0x28DB8 +0x6671 0x28DB9 +0x6672 0x28F62 +0x6673 0x28F63 +0x6674 0x29041 +0x6675 0x2916D +0x6677 0x29352 +0x6678 0x29337 +0x6679 0x293DB +0x667A 0x2953F +0x667B 0x29634 +0x667C 0x2985B +0x667D 0x29946 +0x667E 0x2995A +0x6721 0x2995B +0x6722 0x29AE1 +0x6723 0x29AE2 +0x6724 0x29AE3 +0x6725 0x29AE4 +0x6726 0x29BA7 +0x6727 0x29BA8 +0x6728 0x29BA9 +0x6729 0x29D0F +0x672A 0x29D2B +0x672B 0x29E56 +0x672C 0x29E57 +0x672D 0x29E58 +0x672E 0x29E5E +0x672F 0x29E59 +0x6730 0x29E5A +0x6731 0x29E5B +0x6732 0x29E5C +0x6734 0x29E68 +0x6736 0x2A12C +0x6737 0x2A0E2 +0x6738 0x2A0F3 +0x6739 0x2A2D2 +0x673A 0x2A356 +0x673B 0x2A3CE +0x673C 0x2A461 +0x673D 0x2A69B +0x673E 0x2A6B4 +0x673F 0x2045C +0x6740 0x2F810 +0x6741 0x204D2 +0x6742 0x20571 +0x6743 0x20673 +0x6744 0x2082C +0x6745 0x20B94 +0x6747 0x2113F +0x6748 0x21140 +0x6749 0x214F9 +0x674A 0x214FA +0x674B 0x214FD +0x674C 0x214FB +0x674D 0x2191C +0x674E 0x2191D +0x674F 0x21AFF +0x6750 0x21B00 +0x6751 0x21CF7 +0x6752 0x24CFE +0x6754 0x224B6 +0x6755 0x22954 +0x6756 0x22E77 +0x6757 0x22E79 +0x6758 0x22E7A +0x6759 0x22E7B +0x675A 0x23069 +0x675B 0x23802 +0x675C 0x23803 +0x675D 0x23804 +0x675E 0x23805 +0x675F 0x23806 +0x6760 0x23807 +0x6761 0x23808 +0x6762 0x23809 +0x6763 0x2380A +0x6764 0x2380B +0x6765 0x23835 +0x6767 0x23C39 +0x6768 0x2411E +0x6769 0x2411F +0x676A 0x24120 +0x676B 0x24121 +0x676D 0x24122 +0x676E 0x24123 +0x676F 0x24124 +0x6770 0x2412C +0x6771 0x244B3 +0x6772 0x244B5 +0x6773 0x244B6 +0x6774 0x244B7 +0x6775 0x244B8 +0x6776 0x24AD0 +0x6777 0x24CFA +0x6778 0x24F07 +0x6779 0x24FBD +0x677A 0x250D7 +0x677B 0x250D2 +0x677C 0x255DB +0x677D 0x255D6 +0x677E 0x2045D +0x6821 0x25A43 +0x6822 0x25ACF +0x6823 0x25DA3 +0x6824 0x25DA4 +0x6825 0x25DA5 +0x6826 0x25DA6 +0x6827 0x25DA7 +0x6828 0x25DA8 +0x6829 0x25DA9 +0x682A 0x25F5D +0x682B 0x25F5E +0x682C 0x261C9 +0x682D 0x261CA +0x682E 0x261CB +0x682F 0x261CC +0x6830 0x26606 +0x6831 0x26607 +0x6833 0x268C5 +0x6834 0x268F5 +0x6835 0x269B4 +0x6836 0x269B8 +0x6837 0x269B5 +0x6838 0x270FD +0x683A 0x270FE +0x683B 0x270FF +0x683C 0x27100 +0x683D 0x27101 +0x683E 0x27102 +0x683F 0x27103 +0x6840 0x27109 +0x6841 0x27104 +0x6842 0x27105 +0x6843 0x27106 +0x6844 0x27107 +0x6845 0x27511 +0x6846 0x27512 +0x6847 0x27513 +0x6848 0x27514 +0x6849 0x27515 +0x684B 0x27898 +0x684C 0x27899 +0x684D 0x27E3C +0x684E 0x27E2D +0x684F 0x27E2E +0x6851 0x281BB +0x6852 0x281BC +0x6854 0x2843D +0x6855 0x28647 +0x6856 0x28648 +0x6857 0x28649 +0x6858 0x2864A +0x6859 0x287E1 +0x685A 0x287E7 +0x685B 0x288EB +0x685C 0x28920 +0x685D 0x28938 +0x685E 0x28B62 +0x685F 0x28B67 +0x6860 0x28B68 +0x6861 0x28B69 +0x6862 0x28B6A +0x6863 0x28B6B +0x6864 0x28B6D +0x6865 0x28B6E +0x6866 0x28B6F +0x6867 0x28B70 +0x6868 0x28B71 +0x6869 0x28B72 +0x686A 0x28B8F +0x686B 0x28B73 +0x686C 0x28B74 +0x686D 0x28B75 +0x686E 0x28B76 +0x686F 0x28B77 +0x6870 0x28DC9 +0x6871 0x28DCA +0x6873 0x28DCB +0x6874 0x28DCC +0x6875 0x28DCD +0x6876 0x29051 +0x6879 0x29245 +0x687A 0x29559 +0x687B 0x2955A +0x687C 0x2955B +0x687D 0x29640 +0x687E 0x297CF +0x6921 0x2985E +0x6922 0x2997B +0x6923 0x29A93 +0x6924 0x29BBC +0x6925 0x29D16 +0x6926 0x29D30 +0x6928 0x29E8D +0x6929 0x29E8E +0x692B 0x29E8F +0x692C 0x29E90 +0x692D 0x29E91 +0x692E 0x29E92 +0x692F 0x29E93 +0x6930 0x29E94 +0x6931 0x29E95 +0x6932 0x29E96 +0x6933 0x2A123 +0x6934 0x2A114 +0x6935 0x2A2DB +0x6936 0x2A40A +0x6937 0x2A5CE +0x6938 0x20466 +0x6939 0x20468 +0x693A 0x20467 +0x693B 0x204D3 +0x693C 0x21163 +0x693D 0x21504 +0x693E 0x2169E +0x693F 0x21926 +0x6940 0x2192A +0x6941 0x2296C +0x6942 0x22964 +0x6943 0x22E8F +0x6944 0x22E90 +0x6945 0x23034 +0x6946 0x2330E +0x6947 0x23825 +0x6948 0x23826 +0x6949 0x23827 +0x694B 0x23828 +0x694E 0x23829 +0x694F 0x2382A +0x6950 0x2382B +0x6951 0x2382C +0x6952 0x23C3E +0x6953 0x24142 +0x6954 0x24143 +0x6955 0x24133 +0x6956 0x244C1 +0x6957 0x244C2 +0x6958 0x244C3 +0x6959 0x24AD6 +0x695A 0x24AD7 +0x695B 0x255E1 +0x695C 0x255E2 +0x695D 0x2572B +0x695E 0x25AD1 +0x695F 0x25DCC +0x6960 0x25DCD +0x6961 0x25DCE +0x6962 0x25DCF +0x6963 0x261DE +0x6964 0x261DF +0x6965 0x261E0 +0x6966 0x261E1 +0x6967 0x268F6 +0x6968 0x2712C +0x696A 0x27154 +0x696B 0x2712D +0x696C 0x2712E +0x696D 0x27541 +0x696E 0x27542 +0x696F 0x277C7 +0x6970 0x278A0 +0x6971 0x278A1 +0x6972 0x27B70 +0x6973 0x27B71 +0x6974 0x27B72 +0x6976 0x27E34 +0x6977 0x27E35 +0x6978 0x27E36 +0x6979 0x27FA6 +0x697A 0x281CC +0x697C 0x28299 +0x697D 0x288F4 +0x697E 0x28B9B +0x6A21 0x28B9E +0x6A22 0x28B9F +0x6A23 0x28BA0 +0x6A24 0x28BA1 +0x6A25 0x28BA2 +0x6A26 0x28BA3 +0x6A27 0x28BA4 +0x6A28 0x28BA5 +0x6A29 0x28BA6 +0x6A2A 0x28BA7 +0x6A2B 0x28BA8 +0x6A2C 0x28DDB +0x6A2D 0x28DDC +0x6A2E 0x28DDD +0x6A2F 0x28DD7 +0x6A30 0x28DDE +0x6A31 0x28DDF +0x6A32 0x29059 +0x6A33 0x29446 +0x6A34 0x29565 +0x6A35 0x29649 +0x6A37 0x297DD +0x6A38 0x29995 +0x6A39 0x29996 +0x6A3A 0x29997 +0x6A3B 0x29BD4 +0x6A3C 0x29BD6 +0x6A3D 0x29D26 +0x6A40 0x29EC8 +0x6A41 0x29EC5 +0x6A42 0x29EC6 +0x6A43 0x29EC7 +0x6A44 0x2A151 +0x6A45 0x2A152 +0x6A46 0x2A153 +0x6A47 0x2A154 +0x6A48 0x2A155 +0x6A49 0x2A2DE +0x6A4B 0x2046D +0x6A4C 0x204D5 +0x6A4D 0x21172 +0x6A4E 0x221AE +0x6A4F 0x2230F +0x6A50 0x2296B +0x6A51 0x2296D +0x6A52 0x2296E +0x6A53 0x22978 +0x6A54 0x22E98 +0x6A55 0x22E99 +0x6A56 0x22E9A +0x6A57 0x23844 +0x6A58 0x2385C +0x6A59 0x23845 +0x6A5A 0x23B01 +0x6A5B 0x24158 +0x6A5C 0x24159 +0x6A5D 0x2415A +0x6A5F 0x244D9 +0x6A60 0x244D6 +0x6A61 0x24ADA +0x6A62 0x24ADF +0x6A63 0x24ADB +0x6A64 0x24D03 +0x6A65 0x255EF +0x6A67 0x25733 +0x6A68 0x25AD2 +0x6A69 0x25DE1 +0x6A6A 0x25F6F +0x6A6B 0x26264 +0x6A6C 0x2660E +0x6A6D 0x27150 +0x6A6E 0x27151 +0x6A6F 0x27152 +0x6A70 0x27556 +0x6A71 0x27557 +0x6A72 0x27558 +0x6A74 0x27B81 +0x6A75 0x27B82 +0x6A76 0x27C1D +0x6A77 0x27C1E +0x6A78 0x27E43 +0x6A79 0x27FAA +0x6A7A 0x288FD +0x6A7C 0x28BC6 +0x6A7D 0x28BC7 +0x6A7E 0x28BD9 +0x6B21 0x28BD7 +0x6B23 0x28BC8 +0x6B24 0x28BC9 +0x6B25 0x28BCA +0x6B26 0x28BCB +0x6B27 0x28BDA +0x6B29 0x28BCC +0x6B2A 0x28BCD +0x6B2B 0x28BCE +0x6B2C 0x28BCF +0x6B2D 0x28BD0 +0x6B2E 0x28BD1 +0x6B2F 0x28BBC +0x6B30 0x28DE1 +0x6B31 0x28DE2 +0x6B32 0x28DE3 +0x6B33 0x291A9 +0x6B34 0x2924E +0x6B35 0x29577 +0x6B38 0x299AC +0x6B39 0x299AD +0x6B3A 0x29AB6 +0x6B3B 0x29BE5 +0x6B3C 0x29EF8 +0x6B3D 0x29EEA +0x6B3E 0x29F8D +0x6B3F 0x29EEB +0x6B40 0x2A195 +0x6B41 0x2046E +0x6B42 0x204D8 +0x6B43 0x21183 +0x6B44 0x216A3 +0x6B45 0x21930 +0x6B46 0x21B0F +0x6B47 0x22979 +0x6B48 0x2297A +0x6B49 0x22EA7 +0x6B4A 0x22EA8 +0x6B4B 0x22EA9 +0x6B4C 0x22EAA +0x6B4D 0x23319 +0x6B4E 0x23850 +0x6B4F 0x23851 +0x6B50 0x23852 +0x6B52 0x23868 +0x6B53 0x23853 +0x6B54 0x23854 +0x6B55 0x248E2 +0x6B56 0x24ADC +0x6B57 0x25915 +0x6B58 0x25916 +0x6B59 0x25A4F +0x6B5A 0x25DF5 +0x6B5B 0x25DF6 +0x6B5C 0x25DF7 +0x6B5D 0x261F4 +0x6B5E 0x264CC +0x6B5F 0x2660F +0x6B60 0x27166 +0x6B61 0x27167 +0x6B63 0x27168 +0x6B64 0x278A4 +0x6B65 0x27B8B +0x6B66 0x27B8C +0x6B67 0x281FA +0x6B68 0x28BE6 +0x6B69 0x28BED +0x6B6A 0x28BEE +0x6B6B 0x28BEF +0x6B6C 0x28BF0 +0x6B6D 0x28BFE +0x6B6E 0x28DE7 +0x6B6F 0x28DE8 +0x6B70 0x291B3 +0x6B71 0x291E4 +0x6B72 0x29583 +0x6B73 0x29AEC +0x6B75 0x29F16 +0x6B78 0x29F17 +0x6B79 0x2A1C3 +0x6B7A 0x2A1AC +0x6B7B 0x2A2ED +0x6B7E 0x2A5B4 +0x6C22 0x2118A +0x6C23 0x2118B +0x6C24 0x21934 +0x6C25 0x21B14 +0x6C26 0x21FDF +0x6C27 0x224BB +0x6C28 0x2297F +0x6C29 0x22981 +0x6C2A 0x22EAD +0x6C2B 0x22EAE +0x6C2C 0x23862 +0x6C2D 0x2386E +0x6C2F 0x2416E +0x6C31 0x24717 +0x6C32 0x24AE6 +0x6C33 0x24C10 +0x6C34 0x25919 +0x6C36 0x26610 +0x6C37 0x26AF2 +0x6C38 0x27176 +0x6C39 0x27177 +0x6C3A 0x27B95 +0x6C3B 0x27B96 +0x6C3C 0x28C00 +0x6C3D 0x28C01 +0x6C3E 0x28C31 +0x6C3F 0x2F9ED +0x6C40 0x28C1C +0x6C41 0x2906D +0x6C42 0x29BF4 +0x6C43 0x29BF5 +0x6C44 0x29D3D +0x6C45 0x29F32 +0x6C46 0x29F33 +0x6C47 0x2A2F4 +0x6C49 0x20473 +0x6C4A 0x21937 +0x6C4C 0x23871 +0x6C4D 0x25E0F +0x6C4F 0x25E0E +0x6C50 0x26611 +0x6C51 0x27185 +0x6C52 0x28C14 +0x6C53 0x28C15 +0x6C54 0x28C16 +0x6C55 0x28C17 +0x6C56 0x28C18 +0x6C57 0x28C19 +0x6C58 0x28C1A +0x6C59 0x291C3 +0x6C5A 0x29F42 +0x6C5B 0x29F43 +0x6C5C 0x29F44 +0x6C5D 0x29F48 +0x6C5E 0x2A1FB +0x6C5F 0x216A5 +0x6C60 0x219B8 +0x6C61 0x22EB2 +0x6C62 0x2303D +0x6C63 0x23872 +0x6C64 0x244E7 +0x6C65 0x244E8 +0x6C66 0x25359 +0x6C67 0x2573A +0x6C68 0x25E14 +0x6C69 0x261FF +0x6C6A 0x269C0 +0x6C6B 0x2718D +0x6C6D 0x2718E +0x6C6F 0x28C22 +0x6C72 0x29C04 +0x6C73 0x29C29 +0x6C74 0x29F51 +0x6C75 0x29F66 +0x6C76 0x2A20E +0x6C77 0x2FA13 +0x6C79 0x2119B +0x6C7A 0x2119C +0x6C7B 0x22316 +0x6C7C 0x22986 +0x6C7D 0x22987 +0x6D21 0x28C2C +0x6D22 0x28C30 +0x6D23 0x28C28 +0x6D24 0x2965F +0x6D26 0x2417E +0x6D27 0x25E19 +0x6D28 0x2820A +0x6D29 0x28C36 +0x6D2A 0x28DFC +0x6D2B 0x29F6D +0x6D2C 0x29F6E +0x6D2D 0x2A6C6 +0x6D2F 0x2387B +0x6D30 0x26206 +0x6D31 0x2759F +0x6D32 0x2A232 +0x6D33 0x2820D +0x6D34 0x2298B +0x6D35 0x28C3B +0x6D37 0x2A23D +0x6D38 0x28C3C +0x6D39 0x28C3D diff --git a/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane3.surrogates b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane3.surrogates new file mode 100644 index 00000000000..b9f55b08ee4 --- /dev/null +++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane3.surrogates @@ -0,0 +1,71 @@ +0x2144 0x2000B +0x214F 0x2F817 +0x216F 0x201A9 +0x217C 0x2F850 +0x2225 0x2F82A +0x227B 0x2F815 +0x2329 0x2F82C +0x233C 0x2F83B +0x2359 0x21D46 +0x2424 0x23C86 +0x2429 0x2F835 +0x2441 0x2F81B +0x2452 0x2F80E +0x257E 0x225D7 +0x2627 0x2F8B2 +0x272A 0x2F98F +0x274E 0x20209 +0x2753 0x2F80F +0x2754 0x2F811 +0x275C 0x206EC +0x2A39 0x2233F +0x2A45 0x2592E +0x2C40 0x2F87A +0x2C51 0x2F899 +0x2D35 0x2F8DF +0x2D52 0x2F8FE +0x2E56 0x2F96A +0x2E5A 0x25133 +0x3023 0x2F841 +0x3053 0x2172E +0x315C 0x2F8E1 +0x3350 0x2F983 +0x3460 0x20DAE +0x3470 0x2F855 +0x347E 0x21637 +0x355F 0x2F88D +0x3565 0x2F89C +0x3628 0x2F8BA +0x3640 0x2F8CB +0x3675 0x2F907 +0x3977 0x20564 +0x3A26 0x2F833 +0x3A4F 0x21364 +0x3C3A 0x2F8E5 +0x3D3F 0x2F934 +0x3F6D 0x28CDD +0x4043 0x2F823 +0x407E 0x2F87E +0x416E 0x2F8E8 +0x4333 0x2F94E +0x4425 0x2F98D +0x446D 0x2F9DB +0x4670 0x2F8A6 +0x4731 0x230BA +0x474B 0x235F3 +0x4826 0x24A0F +0x486A 0x2F96C +0x5039 0x20B89 +0x5460 0x2F8AF +0x553A 0x24039 +0x5545 0x2F921 +0x5678 0x2F9F5 +0x5736 0x29937 +0x584F 0x25CD1 +0x5863 0x265DF +0x5A33 0x2F86A +0x5A36 0x2F870 +0x5B26 0x2F9B6 +0x5B2D 0x2F9C1 +0x5C2F 0x2FA19 +0x607C 0x2F9D6 diff --git a/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane4.surrogates b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane4.surrogates new file mode 100644 index 00000000000..501fc1981a8 --- /dev/null +++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane4.surrogates @@ -0,0 +1,3476 @@ +0x2121 0x20086 +0x2125 0x21FE8 +0x2128 0x2010E +0x2129 0x20627 +0x212D 0x2053C +0x212E 0x20675 +0x212F 0x2F828 +0x2133 0x2193C +0x2134 0x2F875 +0x2135 0x2F878 +0x213F 0x2F819 +0x2140 0x206A5 +0x2141 0x206AA +0x2142 0x2090F +0x2143 0x20A0E +0x2146 0x20B9C +0x2147 0x20B9B +0x2148 0x2123C +0x214A 0x21BC2 +0x214E 0x233B4 +0x2156 0x20065 +0x2158 0x201B2 +0x215C 0x20477 +0x215D 0x20542 +0x215F 0x20633 +0x2162 0x206AF +0x2163 0x20836 +0x2168 0x20B22 +0x216E 0x211A3 +0x2174 0x21C25 +0x2175 0x21C24 +0x2177 0x22052 +0x2178 0x22189 +0x2179 0x224BF +0x217D 0x233B5 +0x217E 0x2574C +0x2222 0x28E14 +0x2223 0x28E12 +0x2225 0x200A3 +0x2226 0x200A2 +0x2229 0x201B6 +0x222B 0x201B5 +0x222C 0x201B4 +0x222F 0x201C2 +0x2230 0x201B8 +0x2232 0x20479 +0x2235 0x20508 +0x2237 0x2057A +0x2238 0x205B6 +0x2239 0x206BD +0x223A 0x206B7 +0x223B 0x206BC +0x223D 0x206C4 +0x223E 0x206C9 +0x2243 0x20930 +0x2244 0x20983 +0x2245 0x20985 +0x2246 0x20A12 +0x2247 0x20A34 +0x2249 0x20AE4 +0x224A 0x20ADE +0x224B 0x20B2A +0x224D 0x20BAF +0x224E 0x20BB4 +0x224F 0x20BB3 +0x2250 0x20BB1 +0x2254 0x215DE +0x2257 0x216B8 +0x2258 0x216B0 +0x225A 0x219C2 +0x225E 0x21C2A +0x2262 0x21FE9 +0x2264 0x22057 +0x2267 0x221B6 +0x2268 0x221D7 +0x2269 0x221DE +0x226E 0x224C2 +0x226F 0x225AB +0x2272 0x2298F +0x2276 0x22A6D +0x2277 0x22EB5 +0x227A 0x233C0 +0x227B 0x233BF +0x227D 0x239B9 +0x227E 0x23B1C +0x2323 0x23C80 +0x2324 0x24184 +0x2325 0x24185 +0x2328 0x24724 +0x232C 0x2634C +0x232E 0x26AF6 +0x2331 0x28670 +0x2333 0x28675 +0x2334 0x28E17 +0x2338 0x201F1 +0x233A 0x201DA +0x233C 0x205B9 +0x2341 0x206CE +0x2342 0x206D2 +0x2343 0x206D0 +0x2345 0x20843 +0x2349 0x2084D +0x234A 0x20934 +0x234C 0x209D9 +0x234E 0x20A18 +0x2350 0x20B38 +0x2352 0x20BD7 +0x2355 0x20BDC +0x2356 0x20BCB +0x2357 0x20BD6 +0x2358 0x20BD8 +0x235A 0x20BD1 +0x235B 0x2F83E +0x235C 0x2F83C +0x235D 0x20BD2 +0x2360 0x21259 +0x2363 0x215E5 +0x2364 0x215E6 +0x2366 0x215E8 +0x2368 0x216BD +0x236B 0x216BE +0x236C 0x21949 +0x236E 0x219CD +0x2372 0x21B5E +0x2373 0x21BD0 +0x2375 0x21D06 +0x237C 0x21D7C +0x237D 0x21D71 +0x237E 0x21FEF +0x2426 0x2218D +0x2427 0x221B7 +0x242A 0x22333 +0x242B 0x2237F +0x242D 0x225F2 +0x2434 0x22A2A +0x2435 0x22A8B +0x2437 0x22A83 +0x2438 0x22A8A +0x243B 0x22A8E +0x243D 0x22EB6 +0x2442 0x230D8 +0x2444 0x23156 +0x2445 0x233D2 +0x2447 0x2F8DB +0x2449 0x233C2 +0x244A 0x23887 +0x244B 0x23881 +0x244C 0x239C2 +0x244D 0x239BC +0x244E 0x23B23 +0x2450 0x23C93 +0x2453 0x2418D +0x2454 0x2418E +0x2457 0x2473B +0x2458 0x2474D +0x245A 0x24734 +0x245B 0x24731 +0x245C 0x248F2 +0x245D 0x248F0 +0x245F 0x24C15 +0x2460 0x24D28 +0x2463 0x24F25 +0x2464 0x250E7 +0x2466 0x250E9 +0x2467 0x25417 +0x246A 0x2626C +0x246B 0x26280 +0x246C 0x2634B +0x2471 0x268DE +0x2472 0x268FB +0x2474 0x26951 +0x2477 0x26B01 +0x2478 0x26B02 +0x247A 0x26B05 +0x247C 0x26B03 +0x247E 0x28451 +0x2524 0x28453 +0x2525 0x2867A +0x2526 0x28678 +0x2527 0x28676 +0x2528 0x28679 +0x2529 0x2868F +0x252A 0x2867C +0x252C 0x28E1B +0x252D 0x28E1C +0x252F 0x23D92 +0x2532 0x2012E +0x2533 0x2012C +0x2535 0x2020C +0x2537 0x2020B +0x253A 0x20205 +0x253D 0x2F805 +0x2541 0x205C2 +0x2542 0x205C3 +0x2544 0x20648 +0x2546 0x20646 +0x2549 0x206EA +0x254B 0x206EB +0x254D 0x206EE +0x2552 0x208D8 +0x2553 0x24C1E +0x2554 0x209DF +0x2555 0x209DE +0x2558 0x20A4F +0x255B 0x20C0D +0x255C 0x20C08 +0x255E 0x20C09 +0x2561 0x20C12 +0x2562 0x20C65 +0x2567 0x21289 +0x256A 0x21284 +0x256B 0x2129E +0x256C 0x2128B +0x256F 0x21562 +0x2574 0x215F9 +0x2576 0x215F7 +0x2579 0x21606 +0x257A 0x216DD +0x257C 0x216D9 +0x257D 0x216DF +0x257E 0x216E2 +0x2624 0x200F1 +0x262B 0x21C3F +0x262C 0x21C3E +0x262D 0x21D0B +0x2630 0x21D83 +0x2633 0x21D86 +0x2635 0x2207C +0x2639 0x221F7 +0x263E 0x221FB +0x263F 0x2233B +0x2644 0x225F9 +0x2645 0x225CA +0x2647 0x225FF +0x264A 0x22609 +0x264B 0x22603 +0x2651 0x22610 +0x2652 0x2299A +0x2653 0x2299F +0x2657 0x22A87 +0x265A 0x22EB7 +0x265C 0x22F08 +0x265D 0x22EF9 +0x2660 0x22EF4 +0x2664 0x26657 +0x2666 0x233D6 +0x2668 0x2F8DE +0x266B 0x233D4 +0x266E 0x23890 +0x266F 0x2388D +0x2672 0x23960 +0x2673 0x239CE +0x2674 0x239CF +0x2677 0x239D1 +0x267C 0x23CCA +0x2721 0x23CB7 +0x2723 0x23CB2 +0x2724 0x23CBB +0x2725 0x23CB9 +0x2728 0x2419E +0x272A 0x241B2 +0x272D 0x2456F +0x272E 0x245AC +0x2730 0x24623 +0x2735 0x2476C +0x2737 0x24732 +0x2738 0x2475E +0x273C 0x248FB +0x273D 0x24B29 +0x273E 0x24BBD +0x273F 0x24C1F +0x2741 0x22341 +0x2742 0x24C1D +0x2744 0x24D31 +0x2745 0x24D2F +0x2747 0x25043 +0x2749 0x25041 +0x274B 0x250F5 +0x2750 0x250F2 +0x2754 0x2541E +0x2755 0x25754 +0x2757 0x25756 +0x2758 0x25929 +0x2759 0x25927 +0x275A 0x25928 +0x275D 0x26279 +0x275E 0x2627E +0x275F 0x264B6 +0x2760 0x264B7 +0x2768 0x2F981 +0x276B 0x2664D +0x2770 0x26A09 +0x2771 0x26A08 +0x2774 0x26B1E +0x2775 0x26B1A +0x2776 0x26B23 +0x2777 0x26B15 +0x2778 0x26B19 +0x2779 0x26B16 +0x277C 0x26B14 +0x277D 0x26B18 +0x2822 0x2721F +0x2823 0x275DD +0x2824 0x275DF +0x2825 0x28469 +0x2828 0x2846C +0x282A 0x28693 +0x282C 0x28695 +0x282D 0x28694 +0x282E 0x28691 +0x282F 0x28697 +0x2830 0x28E30 +0x2834 0x2FA18 +0x2836 0x20231 +0x283B 0x20236 +0x2841 0x205C9 +0x2842 0x205CA +0x2844 0x20718 +0x2845 0x20712 +0x2846 0x20719 +0x2847 0x20710 +0x2848 0x20716 +0x284A 0x2085F +0x284C 0x208DF +0x284D 0x20917 +0x284F 0x2093C +0x2851 0x209EA +0x2852 0x209E9 +0x2853 0x20A1C +0x2854 0x20A58 +0x2855 0x20A64 +0x2856 0x20AF3 +0x2858 0x20C97 +0x285A 0x20C5A +0x285B 0x20C59 +0x285D 0x20C8E +0x285F 0x212BC +0x2862 0x2160D +0x2863 0x215FC +0x2864 0x2160C +0x2865 0x21707 +0x2866 0x2170A +0x2868 0x21702 +0x286A 0x21726 +0x286B 0x21708 +0x286C 0x2171D +0x286F 0x2194E +0x2871 0x219ED +0x2872 0x219EE +0x2873 0x219EF +0x2876 0x21C50 +0x2877 0x21C4C +0x287A 0x21C4F +0x287C 0x21DD4 +0x287E 0x21DB0 +0x2926 0x220A5 +0x2927 0x22209 +0x292F 0x223F3 +0x2930 0x223D7 +0x2933 0x224DC +0x2938 0x2260B +0x2942 0x2263A +0x2943 0x2260D +0x2944 0x22611 +0x2946 0x22620 +0x2947 0x22601 +0x2949 0x22637 +0x294A 0x2F8A3 +0x294C 0x229AA +0x294F 0x22AE7 +0x2950 0x22AE8 +0x2953 0x22AF5 +0x2957 0x22B35 +0x2958 0x22AE6 +0x295A 0x22AF8 +0x295C 0x22AF1 +0x295E 0x22F14 +0x295F 0x22F15 +0x2960 0x22F09 +0x2966 0x2317B +0x2968 0x2317E +0x2969 0x23366 +0x296A 0x23367 +0x296B 0x2340A +0x2975 0x2389C +0x2976 0x23962 +0x2977 0x239E1 +0x2978 0x239DE +0x2979 0x239DF +0x297A 0x239E9 +0x297C 0x23CE4 +0x297D 0x23CF7 +0x2A22 0x23CEA +0x2A23 0x23CF6 +0x2A24 0x23D12 +0x2A25 0x2F901 +0x2A29 0x241D9 +0x2A2B 0x2455F +0x2A2D 0x24573 +0x2A30 0x2463F +0x2A31 0x24778 +0x2A33 0x2477D +0x2A36 0x24912 +0x2A3B 0x24B2F +0x2A3E 0x24B30 +0x2A3F 0x24BDB +0x2A42 0x24C29 +0x2A44 0x2F936 +0x2A45 0x24D40 +0x2A47 0x24D3D +0x2A48 0x24D3E +0x2A4B 0x24D38 +0x2A4D 0x24F48 +0x2A4F 0x24FD0 +0x2A5B 0x2510E +0x2A5C 0x25109 +0x2A5E 0x25107 +0x2A60 0x2535F +0x2A61 0x25360 +0x2A63 0x2542A +0x2A65 0x25429 +0x2A68 0x2564D +0x2A6D 0x2576C +0x2A70 0x25767 +0x2A73 0x25939 +0x2A74 0x25934 +0x2A75 0x25A59 +0x2A78 0x26223 +0x2A7A 0x26282 +0x2A7C 0x26283 +0x2A7D 0x262A8 +0x2A7E 0x26355 +0x2B21 0x263F9 +0x2B22 0x263F8 +0x2B23 0x263FC +0x2B24 0x263FA +0x2B26 0x2F97A +0x2B2B 0x26674 +0x2B2D 0x2666B +0x2B2E 0x26671 +0x2B30 0x26676 +0x2B31 0x26A0E +0x2B34 0x26A10 +0x2B35 0x26A0F +0x2B37 0x26B38 +0x2B38 0x26B39 +0x2B39 0x26B3A +0x2B3B 0x26B37 +0x2B3C 0x26B3E +0x2B3F 0x2719C +0x2B40 0x2722A +0x2B41 0x2723A +0x2B42 0x2722B +0x2B43 0x27228 +0x2B44 0x275AA +0x2B45 0x2760F +0x2B47 0x27610 +0x2B48 0x277E6 +0x2B4A 0x27D25 +0x2B4B 0x27E8E +0x2B4F 0x2848B +0x2B51 0x2848C +0x2B52 0x2849A +0x2B55 0x286B3 +0x2B57 0x286B2 +0x2B5C 0x28E44 +0x2B5F 0x20158 +0x2B60 0x202A7 +0x2B63 0x20263 +0x2B66 0x2026A +0x2B67 0x20265 +0x2B68 0x2026B +0x2B6A 0x204ED +0x2B6B 0x205D9 +0x2B6C 0x2073B +0x2B6D 0x20732 +0x2B6F 0x20735 +0x2B70 0x20731 +0x2B71 0x2073E +0x2B72 0x20743 +0x2B73 0x20736 +0x2B74 0x2086D +0x2B76 0x208E4 +0x2B79 0x209F4 +0x2B7B 0x20A69 +0x2B7C 0x20A6B +0x2C22 0x20CBF +0x2C23 0x20CC3 +0x2C24 0x20CAE +0x2C27 0x20CB1 +0x2C2A 0x20CBB +0x2C2B 0x20CAF +0x2C2C 0x20CB0 +0x2C30 0x212EF +0x2C32 0x212ED +0x2C34 0x212F0 +0x2C35 0x21593 +0x2C36 0x21634 +0x2C37 0x2162B +0x2C43 0x21A04 +0x2C44 0x21A03 +0x2C45 0x21A02 +0x2C47 0x21A05 +0x2C4A 0x21A00 +0x2C4B 0x21B74 +0x2C4F 0x21C65 +0x2C50 0x21C63 +0x2C52 0x21DD7 +0x2C56 0x21DE8 +0x2C58 0x21DDB +0x2C59 0x21DD8 +0x2C5D 0x21E09 +0x2C62 0x21DE5 +0x2C63 0x21DE7 +0x2C65 0x2203F +0x2C67 0x220C0 +0x2C69 0x220B9 +0x2C6A 0x220BA +0x2C6E 0x22220 +0x2C6F 0x2234F +0x2C73 0x22491 +0x2C74 0x22490 +0x2C75 0x224EE +0x2C76 0x224F3 +0x2C77 0x224EC +0x2C78 0x224F1 +0x2C79 0x224EB +0x2C7A 0x224F2 +0x2C7B 0x224F4 +0x2C7C 0x224ED +0x2C7D 0x22641 +0x2C7E 0x22648 +0x2D21 0x22645 +0x2D26 0x2267F +0x2D27 0x2268B +0x2D29 0x2263B +0x2D2A 0x2264E +0x2D2E 0x2267C +0x2D34 0x22AF0 +0x2D35 0x22B36 +0x2D36 0x22B3F +0x2D37 0x22B43 +0x2D38 0x22B31 +0x2D39 0x22B34 +0x2D3A 0x22B46 +0x2D3D 0x22B2F +0x2D3E 0x22EC3 +0x2D41 0x22F36 +0x2D45 0x22F21 +0x2D46 0x2F8C8 +0x2D48 0x23073 +0x2D4A 0x230E6 +0x2D50 0x2343F +0x2D53 0x2346B +0x2D5A 0x23471 +0x2D5C 0x2F8E2 +0x2D5F 0x238B0 +0x2D63 0x239F3 +0x2D65 0x2F8F5 +0x2D68 0x23B61 +0x2D69 0x23B5F +0x2D6D 0x23D28 +0x2D6E 0x23D1E +0x2D6F 0x23D29 +0x2D70 0x2F902 +0x2D71 0x23CEB +0x2D72 0x23D66 +0x2D74 0x241F6 +0x2D77 0x24560 +0x2D78 0x24577 +0x2D79 0x245BB +0x2D7B 0x245BC +0x2E23 0x247A2 +0x2E24 0x247B2 +0x2E25 0x2479E +0x2E28 0x2493A +0x2E29 0x24938 +0x2E2E 0x24C4D +0x2E30 0x24C5E +0x2E32 0x24D17 +0x2E3D 0x24D64 +0x2E3E 0x24D67 +0x2E42 0x24F59 +0x2E44 0x24FDA +0x2E48 0x25051 +0x2E4A 0x25055 +0x2E4B 0x2513B +0x2E4C 0x25134 +0x2E4E 0x25137 +0x2E50 0x25131 +0x2E53 0x2513F +0x2E54 0x25159 +0x2E56 0x25361 +0x2E59 0x25458 +0x2E5A 0x25462 +0x2E5B 0x25450 +0x2E5D 0x25451 +0x2E60 0x25446 +0x2E63 0x2562D +0x2E66 0x25948 +0x2E67 0x25951 +0x2E68 0x2594A +0x2E69 0x2594F +0x2E6A 0x25950 +0x2E6B 0x25949 +0x2E6C 0x25A63 +0x2E6E 0x25A66 +0x2E6F 0x25A60 +0x2E74 0x25AF1 +0x2E76 0x25B07 +0x2E79 0x25F9B +0x2E7A 0x25FA3 +0x2E7B 0x25F9D +0x2F22 0x25FA9 +0x2F23 0x25FA7 +0x2F24 0x25FA4 +0x2F26 0x25FBA +0x2F27 0x221C1 +0x2F28 0x26226 +0x2F2B 0x26294 +0x2F2C 0x26293 +0x2F31 0x26407 +0x2F32 0x2640D +0x2F33 0x26402 +0x2F34 0x2640C +0x2F35 0x26409 +0x2F36 0x26408 +0x2F37 0x26413 +0x2F39 0x264D2 +0x2F3B 0x2653E +0x2F3C 0x2653C +0x2F3D 0x26667 +0x2F3E 0x2669E +0x2F40 0x266AD +0x2F42 0x266D9 +0x2F43 0x26642 +0x2F44 0x266A3 +0x2F45 0x266A0 +0x2F48 0x2667C +0x2F49 0x26904 +0x2F4B 0x26958 +0x2F4C 0x26960 +0x2F4D 0x269C9 +0x2F4E 0x269C8 +0x2F51 0x26A1C +0x2F52 0x26A1A +0x2F54 0x26B74 +0x2F56 0x26B6E +0x2F57 0x26B6F +0x2F58 0x26B79 +0x2F5B 0x26B77 +0x2F60 0x26B7C +0x2F62 0x26B70 +0x2F65 0x26B7A +0x2F66 0x26B82 +0x2F6A 0x27244 +0x2F6C 0x27243 +0x2F6E 0x27245 +0x2F70 0x27625 +0x2F71 0x2761F +0x2F74 0x277E8 +0x2F77 0x27809 +0x2F78 0x278B7 +0x2F79 0x278B9 +0x2F7A 0x27964 +0x2F7B 0x27963 +0x3021 0x27962 +0x3022 0x27965 +0x3024 0x27BAC +0x3026 0x27D2A +0x3029 0x27E96 +0x302B 0x27FC2 +0x302C 0x2F9DE +0x3031 0x284AA +0x3032 0x284B0 +0x3035 0x286D4 +0x3036 0x286CD +0x3037 0x286D6 +0x3039 0x287F0 +0x3043 0x29D4B +0x3044 0x20162 +0x3046 0x202B7 +0x3048 0x202AC +0x3049 0x202AB +0x304B 0x202C1 +0x304E 0x205E8 +0x304F 0x20769 +0x3050 0x2075D +0x3051 0x2075F +0x3055 0x20764 +0x3056 0x20762 +0x305B 0x208F9 +0x305D 0x208EE +0x3061 0x209AB +0x3062 0x209AC +0x3063 0x209AA +0x3066 0x20A86 +0x3067 0x20A7A +0x3069 0x20D28 +0x306E 0x20D31 +0x3075 0x20D2D +0x3076 0x2F843 +0x3078 0x20D2B +0x3079 0x20D32 +0x307C 0x21329 +0x307D 0x21326 +0x307E 0x21353 +0x3122 0x21333 +0x3123 0x21334 +0x3124 0x2159D +0x3127 0x21641 +0x312A 0x21791 +0x312B 0x21769 +0x312D 0x21A22 +0x312F 0x21A34 +0x3130 0x2F86D +0x3131 0x21B2E +0x3134 0x21BF4 +0x3136 0x21E28 +0x3138 0x21E1C +0x313A 0x21E11 +0x313B 0x21E24 +0x313C 0x21E15 +0x313E 0x21E16 +0x313F 0x21E54 +0x3140 0x21E23 +0x3141 0x21FFF +0x3143 0x220CF +0x3144 0x220D0 +0x3146 0x220CE +0x314A 0x221C7 +0x314B 0x2225C +0x314D 0x22236 +0x3150 0x22243 +0x3155 0x2252A +0x3156 0x22501 +0x3158 0x2250B +0x3159 0x2250F +0x315F 0x226DF +0x3161 0x226D2 +0x3165 0x226CD +0x3169 0x226DB +0x316D 0x226CF +0x316F 0x229C0 +0x3172 0x22B81 +0x3173 0x22B82 +0x3174 0x22B8A +0x3175 0x22BA8 +0x3176 0x22B8C +0x317D 0x22B8E +0x3222 0x22B8B +0x3224 0x22B96 +0x3226 0x22BCC +0x3229 0x22F4F +0x322A 0x22F4A +0x322D 0x22F4B +0x322E 0x22F3D +0x3230 0x22F44 +0x3231 0x22F49 +0x3232 0x2309E +0x3233 0x230F3 +0x3235 0x230F5 +0x3238 0x231B3 +0x323C 0x231E5 +0x323D 0x231B6 +0x323E 0x2F8D8 +0x3240 0x23486 +0x3244 0x234B6 +0x3245 0x23485 +0x3247 0x234AB +0x324B 0x23A0D +0x324C 0x23A8B +0x324D 0x23A8C +0x3256 0x23B72 +0x3259 0x23D8F +0x325B 0x23D79 +0x325D 0x23D77 +0x325F 0x23D90 +0x3260 0x23D88 +0x3261 0x23D80 +0x3262 0x23D9E +0x3265 0x23D82 +0x3266 0x23D34 +0x3267 0x23D89 +0x3269 0x23D85 +0x326A 0x23D7E +0x326B 0x23D7A +0x326C 0x23DA6 +0x326E 0x23DB5 +0x326F 0x241F4 +0x3273 0x24229 +0x3274 0x24226 +0x3275 0x2422A +0x3278 0x2457E +0x327B 0x2465B +0x327C 0x24661 +0x327D 0x24660 +0x3321 0x2479B +0x3324 0x247C3 +0x3326 0x247CD +0x3331 0x24954 +0x3332 0x24959 +0x3336 0x24AF5 +0x333D 0x24C69 +0x333E 0x24C65 +0x3341 0x24D7C +0x3344 0x24D80 +0x3346 0x24F65 +0x3349 0x24FDF +0x334A 0x25060 +0x334C 0x2505E +0x3353 0x2518F +0x3354 0x25161 +0x3355 0x2515A +0x3358 0x25367 +0x335C 0x253BB +0x3368 0x2579B +0x336C 0x257A9 +0x336E 0x25966 +0x3373 0x25A72 +0x3374 0x25A76 +0x3375 0x25B14 +0x3379 0x25B0F +0x337E 0x25E41 +0x3421 0x25E46 +0x3423 0x25E4B +0x3424 0x25E43 +0x3428 0x25FC6 +0x342A 0x25FC7 +0x342C 0x25FCE +0x342F 0x25FC9 +0x3431 0x25FCB +0x3432 0x25FC5 +0x3439 0x26369 +0x343F 0x2641E +0x3440 0x264BA +0x3442 0x26552 +0x3443 0x26551 +0x3444 0x26553 +0x3445 0x2669F +0x3446 0x266DB +0x3449 0x266E3 +0x344E 0x266D7 +0x344F 0x266E9 +0x3454 0x266DE +0x3455 0x266DC +0x3456 0x2693C +0x3457 0x2F98B +0x3459 0x26A22 +0x345A 0x26A32 +0x345B 0x26A23 +0x345F 0x26BD4 +0x3460 0x26BC8 +0x3461 0x26BBC +0x3464 0x26BCD +0x3468 0x26BBE +0x346A 0x26C40 +0x346B 0x26BD6 +0x346E 0x26BBD +0x3470 0x26BBA +0x3472 0x26BC0 +0x3473 0x2F99B +0x3474 0x2F99D +0x3475 0x26BC1 +0x3476 0x271A6 +0x3477 0x271A5 +0x3478 0x271A8 +0x347D 0x2725F +0x347E 0x27270 +0x3521 0x2726A +0x3522 0x27265 +0x3523 0x27267 +0x3524 0x2726F +0x3525 0x27287 +0x3528 0x2763D +0x3529 0x27643 +0x352B 0x27640 +0x3532 0x27818 +0x3536 0x27819 +0x3537 0x278C1 +0x353B 0x278BC +0x353C 0x278C8 +0x353E 0x27971 +0x3540 0x2796E +0x3542 0x27978 +0x3545 0x2F9CD +0x3546 0x2797A +0x3547 0x27BB1 +0x3548 0x27BAF +0x3549 0x27BB0 +0x354E 0x27CA8 +0x354F 0x27CA6 +0x3552 0x27D48 +0x3553 0x27D45 +0x3557 0x27EA0 +0x3558 0x27EA4 +0x355A 0x27FD4 +0x355F 0x27FD2 +0x3560 0x28222 +0x3564 0x282B7 +0x3565 0x282CC +0x3567 0x284E6 +0x356A 0x284C8 +0x356D 0x286F4 +0x356F 0x286ED +0x3571 0x2867E +0x3572 0x2F9E3 +0x3576 0x287F9 +0x3577 0x287FD +0x3579 0x28807 +0x357E 0x28E78 +0x3621 0x28E7A +0x3622 0x28E79 +0x3623 0x28F8A +0x3625 0x2907B +0x3626 0x291D5 +0x3627 0x291E9 +0x3629 0x291EB +0x362F 0x2016C +0x3635 0x202FA +0x363B 0x20318 +0x363E 0x205F6 +0x3640 0x2078A +0x3641 0x20789 +0x3643 0x2077F +0x3644 0x20788 +0x3646 0x20783 +0x3647 0x20784 +0x3648 0x20798 +0x3649 0x20763 +0x364A 0x20787 +0x364C 0x2F827 +0x364E 0x208F5 +0x364F 0x20950 +0x3652 0x20A87 +0x3653 0x20A8A +0x3654 0x20B65 +0x3655 0x20DB7 +0x3656 0x20DC1 +0x3657 0x20DC7 +0x365A 0x20DC5 +0x365B 0x20DCB +0x365D 0x20DD1 +0x3661 0x20DB8 +0x3662 0x20DCA +0x3664 0x20DDE +0x3666 0x20DCE +0x366A 0x21368 +0x366C 0x2136B +0x3670 0x2136A +0x3672 0x21366 +0x3673 0x21377 +0x3674 0x21396 +0x3675 0x2136E +0x3676 0x2F856 +0x3678 0x21657 +0x367A 0x21656 +0x367B 0x2179C +0x367C 0x2179E +0x3721 0x217A1 +0x3723 0x21A42 +0x3725 0x21A46 +0x3726 0x21A3E +0x3727 0x21B33 +0x372A 0x21BFA +0x372C 0x21C97 +0x372D 0x21C9B +0x372E 0x21CAA +0x3730 0x21E73 +0x3731 0x21E7C +0x3733 0x21E86 +0x3737 0x220F3 +0x3738 0x220F0 +0x373E 0x220EC +0x373F 0x222AF +0x3742 0x22264 +0x3743 0x22268 +0x3744 0x2235A +0x3746 0x2251F +0x3747 0x22525 +0x374B 0x226C6 +0x374C 0x226D6 +0x374D 0x226C3 +0x374F 0x2272C +0x3751 0x2272E +0x3752 0x2275E +0x3753 0x22733 +0x3757 0x2272D +0x3758 0x22746 +0x375A 0x226C1 +0x375B 0x2273A +0x375C 0x229CC +0x375D 0x22B9D +0x375E 0x22B83 +0x375F 0x22BF6 +0x3763 0x22BF8 +0x3766 0x22BFE +0x3767 0x22BF3 +0x3769 0x22BEB +0x376A 0x22BFA +0x376C 0x22C07 +0x376D 0x22BFC +0x3772 0x22F72 +0x3773 0x22F73 +0x3774 0x22F74 +0x377A 0x22F5F +0x377B 0x22F60 +0x377C 0x230AA +0x377D 0x23134 +0x3821 0x231B4 +0x3823 0x231F0 +0x3826 0x2320D +0x3827 0x231F3 +0x3828 0x2320F +0x382B 0x234C9 +0x382E 0x234C5 +0x3830 0x234D7 +0x3831 0x234CC +0x3833 0x234E7 +0x3836 0x234C1 +0x3838 0x234E8 +0x383A 0x238CB +0x383D 0x238C8 +0x383E 0x2397A +0x3840 0x23979 +0x3841 0x2397E +0x3843 0x23A1B +0x3847 0x23A1F +0x3848 0x23A19 +0x384D 0x23B89 +0x3850 0x23B8B +0x3853 0x23E09 +0x3854 0x23DFE +0x3855 0x23E00 +0x3858 0x23E0B +0x385D 0x23E4A +0x3863 0x24279 +0x3866 0x2426C +0x3867 0x24299 +0x3868 0x2F91B +0x3869 0x24262 +0x386A 0x24514 +0x386D 0x245C8 +0x386E 0x245D7 +0x386F 0x2460C +0x3871 0x24670 +0x3874 0x24671 +0x3875 0x247DF +0x3876 0x247E4 +0x3878 0x247E7 +0x387C 0x24990 +0x3922 0x24B4C +0x3927 0x24B4F +0x3929 0x24C7D +0x392A 0x24C7E +0x392B 0x24C7C +0x392D 0x24C8D +0x392E 0x24D19 +0x3931 0x24DC0 +0x3937 0x24DB6 +0x3939 0x24DA8 +0x393B 0x24FEB +0x393C 0x24FE7 +0x393D 0x2506F +0x393E 0x251C7 +0x3940 0x2519F +0x3944 0x251C4 +0x394E 0x2519B +0x394F 0x25197 +0x3950 0x251C5 +0x3951 0x2536B +0x3952 0x253CE +0x3955 0x254B1 +0x3956 0x254AE +0x3957 0x254B0 +0x395B 0x2573E +0x395C 0x257B5 +0x395D 0x257BA +0x395F 0x257B2 +0x3960 0x257B4 +0x3966 0x25977 +0x3968 0x25986 +0x3969 0x2597B +0x396B 0x25A7E +0x396C 0x25B2E +0x396E 0x25B2F +0x3970 0x25B37 +0x3973 0x25B32 +0x3977 0x25B36 +0x3978 0x25B39 +0x3979 0x25B35 +0x397A 0x25E5C +0x397E 0x25E7B +0x3A21 0x25E61 +0x3A22 0x25FEE +0x3A23 0x25FEB +0x3A24 0x25FEF +0x3A25 0x26020 +0x3A29 0x26230 +0x3A2C 0x262BE +0x3A2E 0x26367 +0x3A2F 0x2637C +0x3A32 0x26424 +0x3A36 0x26429 +0x3A37 0x264EF +0x3A3C 0x2670D +0x3A46 0x26764 +0x3A48 0x26715 +0x3A50 0x26A35 +0x3A51 0x26A36 +0x3A52 0x26A34 +0x3A53 0x26A37 +0x3A54 0x26C47 +0x3A55 0x26C2B +0x3A57 0x26C41 +0x3A58 0x26C43 +0x3A5A 0x26C42 +0x3A5D 0x26C32 +0x3A62 0x26C44 +0x3A63 0x26C4A +0x3A66 0x2F9A0 +0x3A69 0x26C54 +0x3A6A 0x26C6E +0x3A6B 0x26C52 +0x3A73 0x27292 +0x3A75 0x2F9B8 +0x3A77 0x272BF +0x3A7C 0x27641 +0x3A7D 0x27669 +0x3A7E 0x27665 +0x3B24 0x27822 +0x3B25 0x2781D +0x3B26 0x278D2 +0x3B27 0x278DA +0x3B28 0x278DB +0x3B2D 0x279A4 +0x3B2E 0x2799E +0x3B32 0x2799D +0x3B37 0x279AD +0x3B38 0x279A6 +0x3B39 0x279A7 +0x3B3A 0x27BB3 +0x3B3B 0x27BE0 +0x3B3C 0x27C35 +0x3B3D 0x27C37 +0x3B40 0x27D4A +0x3B44 0x27E5E +0x3B46 0x27EC0 +0x3B4E 0x27FF9 +0x3B56 0x284F0 +0x3B58 0x284F3 +0x3B59 0x2851B +0x3B5A 0x284F2 +0x3B5B 0x284FB +0x3B5C 0x2871C +0x3B5D 0x28713 +0x3B5F 0x2870F +0x3B61 0x28816 +0x3B62 0x28811 +0x3B63 0x28812 +0x3B65 0x2880E +0x3B68 0x28C67 +0x3B69 0x28CF2 +0x3B6A 0x28CDA +0x3B6C 0x28CDC +0x3B6E 0x28F94 +0x3B6F 0x28F9B +0x3B70 0x28F92 +0x3B71 0x28F9A +0x3B72 0x29088 +0x3B73 0x29086 +0x3B75 0x291EF +0x3B78 0x2925E +0x3B7A 0x29458 +0x3B7C 0x29456 +0x3B7D 0x29454 +0x3C21 0x2959B +0x3C22 0x29696 +0x3C23 0x296A4 +0x3C26 0x2969A +0x3C27 0x29A12 +0x3C2B 0x2036B +0x3C2E 0x20337 +0x3C2F 0x2033C +0x3C30 0x2F80A +0x3C31 0x204F7 +0x3C33 0x20566 +0x3C35 0x207A9 +0x3C36 0x207AE +0x3C37 0x207AD +0x3C38 0x207C8 +0x3C39 0x207A5 +0x3C3A 0x207B0 +0x3C3B 0x20895 +0x3C3D 0x20925 +0x3C3F 0x20A99 +0x3C41 0x20B74 +0x3C42 0x20B70 +0x3C43 0x20B6F +0x3C44 0x20E41 +0x3C45 0x20E54 +0x3C48 0x20E40 +0x3C49 0x20E38 +0x3C4D 0x20E52 +0x3C4E 0x20E3A +0x3C4F 0x20E57 +0x3C50 0x2F84A +0x3C51 0x20E59 +0x3C54 0x213B4 +0x3C55 0x213C0 +0x3C5A 0x21375 +0x3C5D 0x21660 +0x3C5E 0x21647 +0x3C60 0x217F0 +0x3C62 0x217EF +0x3C65 0x217EC +0x3C66 0x21983 +0x3C68 0x21984 +0x3C69 0x2198F +0x3C6B 0x21A61 +0x3C6D 0x21A69 +0x3C70 0x21A62 +0x3C7A 0x21EAE +0x3C7D 0x21EB2 +0x3D22 0x2210B +0x3D24 0x22110 +0x3D25 0x2210D +0x3D2B 0x2227F +0x3D2C 0x22281 +0x3D31 0x2240B +0x3D32 0x2254E +0x3D35 0x227EA +0x3D36 0x22745 +0x3D3F 0x22728 +0x3D40 0x2275D +0x3D41 0x229DC +0x3D44 0x229D4 +0x3D46 0x22C64 +0x3D47 0x22C68 +0x3D49 0x22C62 +0x3D4B 0x22C61 +0x3D4D 0x22C66 +0x3D51 0x22BF2 +0x3D52 0x22C69 +0x3D53 0x22C67 +0x3D55 0x22F9A +0x3D56 0x22F9B +0x3D57 0x22F85 +0x3D58 0x22F9C +0x3D5A 0x22FA4 +0x3D5E 0x22F99 +0x3D5F 0x22F86 +0x3D60 0x22F90 +0x3D61 0x23081 +0x3D62 0x230AE +0x3D66 0x23138 +0x3D6A 0x2353B +0x3D70 0x2354C +0x3D73 0x23547 +0x3D74 0x23535 +0x3D77 0x23533 +0x3D79 0x23582 +0x3D7A 0x23540 +0x3E25 0x23A36 +0x3E26 0x23B0E +0x3E2A 0x23BAD +0x3E2B 0x23BAA +0x3E2C 0x23E17 +0x3E2E 0x23E67 +0x3E31 0x23E72 +0x3E33 0x2F90A +0x3E34 0x23E61 +0x3E35 0x23EB0 +0x3E3A 0x23E6E +0x3E3B 0x23E64 +0x3E3D 0x23E8C +0x3E3E 0x23E66 +0x3E40 0x23E6B +0x3E41 0x23E5F +0x3E42 0x23E74 +0x3E43 0x23E65 +0x3E44 0x242BB +0x3E45 0x242BE +0x3E47 0x242B9 +0x3E4A 0x242EF +0x3E4D 0x245DA +0x3E50 0x24690 +0x3E51 0x247E9 +0x3E55 0x24811 +0x3E56 0x2480D +0x3E57 0x247ED +0x3E58 0x24821 +0x3E5A 0x24981 +0x3E5B 0x249B1 +0x3E5C 0x24B01 +0x3E5E 0x24B5E +0x3E5F 0x24B62 +0x3E64 0x24B5B +0x3E66 0x24C96 +0x3E67 0x24C93 +0x3E6A 0x24C92 +0x3E6C 0x2F939 +0x3E70 0x24DC4 +0x3E71 0x24DC7 +0x3E72 0x24DC3 +0x3E75 0x24DC8 +0x3E79 0x24DCA +0x3E7B 0x24DC5 +0x3E7C 0x24DCF +0x3E7D 0x24DDC +0x3E7E 0x24F7C +0x3F21 0x25001 +0x3F23 0x251D3 +0x3F24 0x251DC +0x3F28 0x251D4 +0x3F2A 0x251CC +0x3F2E 0x251D6 +0x3F2F 0x251DB +0x3F31 0x251D5 +0x3F32 0x253D9 +0x3F34 0x253DD +0x3F35 0x253DC +0x3F36 0x253E0 +0x3F37 0x254CC +0x3F41 0x254D2 +0x3F43 0x254D3 +0x3F48 0x2568D +0x3F4E 0x257D8 +0x3F51 0x257BC +0x3F56 0x25A8A +0x3F58 0x25A8B +0x3F59 0x25A8D +0x3F5C 0x25B53 +0x3F5F 0x25B59 +0x3F64 0x25B56 +0x3F65 0x25B57 +0x3F68 0x25E73 +0x3F69 0x2601B +0x3F6B 0x26021 +0x3F6C 0x26016 +0x3F6D 0x26018 +0x3F70 0x26044 +0x3F72 0x26026 +0x3F74 0x26236 +0x3F79 0x2643A +0x3F7B 0x264F4 +0x3F7E 0x26762 +0x4021 0x2675B +0x4022 0x2676A +0x4024 0x26768 +0x402B 0x26781 +0x4031 0x26CE7 +0x4033 0x26CE6 +0x4034 0x26CD1 +0x4035 0x26D11 +0x4037 0x26CD0 +0x4038 0x26CD9 +0x4039 0x26D0A +0x403B 0x26CDA +0x403C 0x26CDD +0x403D 0x26CC8 +0x403E 0x26CE2 +0x403F 0x26CE9 +0x4040 0x26CCB +0x4042 0x26CCC +0x4043 0x26CC1 +0x4045 0x26CDE +0x404A 0x26D51 +0x404B 0x26D12 +0x404D 0x26CE0 +0x404E 0x26D2B +0x404F 0x2F9B4 +0x4050 0x272D8 +0x4051 0x272D1 +0x4053 0x272D2 +0x4054 0x272CD +0x4058 0x2733D +0x405A 0x272CA +0x405C 0x272CB +0x405E 0x272D7 +0x405F 0x275F4 +0x4063 0x27687 +0x4064 0x2768B +0x4065 0x27683 +0x4068 0x279C5 +0x4069 0x279D2 +0x406A 0x279C6 +0x406B 0x279D3 +0x406F 0x279F0 +0x4070 0x279CD +0x4071 0x279CC +0x4072 0x279DC +0x4073 0x279D6 +0x4075 0x27BE6 +0x4076 0x27C41 +0x4077 0x27C3F +0x4079 0x27CC5 +0x407A 0x27CC0 +0x407B 0x27CC6 +0x407C 0x27CBE +0x407D 0x27CBF +0x4122 0x27D63 +0x4123 0x27ED3 +0x4124 0x27EDA +0x4125 0x27ED5 +0x412B 0x282EE +0x412D 0x282FC +0x412E 0x28414 +0x4130 0x28523 +0x4131 0x28522 +0x4132 0x28530 +0x4133 0x286B5 +0x4135 0x28738 +0x4137 0x2873F +0x4144 0x28968 +0x4145 0x28967 +0x4147 0x28965 +0x414A 0x28C75 +0x414B 0x28CF7 +0x414C 0x28CF3 +0x414D 0x28CF6 +0x414F 0x28D00 +0x4151 0x28CFF +0x4152 0x28CF5 +0x4158 0x29092 +0x4159 0x29206 +0x415B 0x29207 +0x415C 0x2926B +0x415E 0x2926C +0x4160 0x29393 +0x4162 0x29394 +0x4166 0x29462 +0x4167 0x29463 +0x4169 0x2945F +0x416A 0x29464 +0x416B 0x2945B +0x416C 0x29459 +0x416F 0x295A4 +0x4170 0x295AC +0x4173 0x296B5 +0x4176 0x296AE +0x4178 0x296C5 +0x417C 0x2983B +0x4223 0x29ABF +0x4224 0x29C2B +0x4225 0x29C84 +0x4226 0x29C80 +0x4227 0x29D4D +0x4228 0x29D4F +0x422A 0x29D4C +0x422B 0x29F92 +0x4230 0x203AE +0x4231 0x20379 +0x4234 0x20371 +0x4236 0x203B3 +0x4238 0x2032C +0x4239 0x20377 +0x423A 0x2052F +0x423B 0x207C3 +0x423D 0x207CD +0x4240 0x207C9 +0x4244 0x207CE +0x4245 0x208A5 +0x4246 0x208A0 +0x4247 0x208FE +0x4248 0x20959 +0x4249 0x20A9A +0x424C 0x20EE4 +0x424D 0x20ED7 +0x424E 0x20EDC +0x4250 0x20EE7 +0x4254 0x20EE5 +0x425A 0x21414 +0x425C 0x213F1 +0x4261 0x215B6 +0x4262 0x2166E +0x4263 0x2166C +0x4264 0x21681 +0x4265 0x21842 +0x426A 0x2181A +0x426E 0x21827 +0x426F 0x21825 +0x4270 0x21817 +0x4271 0x2181C +0x4272 0x2183D +0x4273 0x21820 +0x4276 0x21A81 +0x427A 0x21C09 +0x427B 0x21CC6 +0x427C 0x21CC4 +0x427E 0x21CC5 +0x4323 0x21EEF +0x4325 0x21EDF +0x4326 0x21EDE +0x4327 0x21EEE +0x4328 0x21EF5 +0x4329 0x21EEC +0x432B 0x21EDD +0x4334 0x22122 +0x4337 0x22297 +0x4338 0x22295 +0x433C 0x224A9 +0x433E 0x22553 +0x4340 0x22556 +0x4341 0x22555 +0x4344 0x227E3 +0x4345 0x227E2 +0x434F 0x227A9 +0x4351 0x2F8AB +0x4352 0x22833 +0x4353 0x2280A +0x4355 0x22A59 +0x4357 0x22CBC +0x4359 0x22CC4 +0x435A 0x22CC7 +0x435B 0x22CC6 +0x435F 0x22CB8 +0x4360 0x22CDA +0x4362 0x22CB7 +0x4363 0x22CC0 +0x4365 0x22CCD +0x4367 0x22FBC +0x4368 0x22FAB +0x436A 0x23086 +0x436C 0x2325A +0x4370 0x23343 +0x4372 0x235AC +0x4376 0x235BE +0x437B 0x235AB +0x4426 0x21B3E +0x4429 0x238F9 +0x442B 0x238F3 +0x442C 0x238F7 +0x442E 0x23A45 +0x442F 0x23A48 +0x4434 0x23A44 +0x4436 0x23AAF +0x4437 0x23AB1 +0x443B 0x23BCF +0x443D 0x23BCB +0x443E 0x23BCD +0x4440 0x23C50 +0x4441 0x23EEC +0x4442 0x23F1A +0x4445 0x23ED8 +0x4447 0x23ED0 +0x4448 0x23ED1 +0x444B 0x23E7B +0x444C 0x23ED2 +0x444E 0x23ED4 +0x444F 0x23EE7 +0x4450 0x23EDF +0x4451 0x23EDE +0x4453 0x23ED9 +0x4454 0x23ECF +0x4455 0x2430D +0x445D 0x24338 +0x4461 0x246A9 +0x446B 0x2483E +0x446C 0x24846 +0x446D 0x249ED +0x446E 0x2F930 +0x4472 0x24B6C +0x447A 0x24CAC +0x447D 0x24DC9 +0x4522 0x24E12 +0x4525 0x24DFD +0x4526 0x24E01 +0x4527 0x24E11 +0x4529 0x24E89 +0x452A 0x24E05 +0x452B 0x24DFE +0x452C 0x24E0B +0x452D 0x24E20 +0x452E 0x24E04 +0x452F 0x24F88 +0x4531 0x25002 +0x4533 0x25003 +0x453A 0x25229 +0x453B 0x2523B +0x453E 0x25206 +0x4545 0x25203 +0x4547 0x25378 +0x4548 0x25379 +0x4549 0x2537D +0x454B 0x2537F +0x4550 0x25532 +0x4552 0x25500 +0x4554 0x25522 +0x4556 0x256A9 +0x455C 0x25804 +0x455F 0x2F959 +0x4561 0x259B8 +0x4562 0x25A9B +0x4567 0x25B92 +0x456C 0x25B8F +0x456F 0x25B98 +0x4571 0x25BAE +0x4573 0x25E9D +0x4576 0x26049 +0x4577 0x26050 +0x4578 0x26046 +0x457A 0x2604E +0x457D 0x26055 +0x4622 0x26064 +0x4624 0x26238 +0x4631 0x264FE +0x463A 0x267A6 +0x4643 0x2679C +0x4644 0x26799 +0x4648 0x267B5 +0x4649 0x267A3 +0x464A 0x267A0 +0x464B 0x267A7 +0x464C 0x2679B +0x464D 0x269DF +0x464E 0x269E1 +0x4652 0x26A4D +0x4654 0x26DF3 +0x4655 0x26D6F +0x4656 0x26D69 +0x4659 0x26D6B +0x465A 0x26D78 +0x465B 0x26D87 +0x465D 0x26D85 +0x465E 0x26D82 +0x465F 0x26D90 +0x4662 0x26D80 +0x4663 0x26D67 +0x4666 0x26D61 +0x4668 0x26D93 +0x466A 0x26DF2 +0x466B 0x26D86 +0x466E 0x271CD +0x466F 0x271C4 +0x4674 0x2730F +0x4677 0x2730D +0x467A 0x27373 +0x467C 0x2F9BA +0x467D 0x2730A +0x4721 0x27308 +0x4722 0x27313 +0x4724 0x275F8 +0x4728 0x276AB +0x4729 0x276A8 +0x472C 0x276A5 +0x472F 0x276C3 +0x4730 0x276A4 +0x4732 0x276D4 +0x4733 0x276BA +0x4734 0x277F1 +0x4737 0x2783F +0x4739 0x278EA +0x473B 0x279F7 +0x473E 0x279FA +0x473F 0x279F5 +0x4741 0x279FE +0x4744 0x27A00 +0x4747 0x27A02 +0x4748 0x279FB +0x4749 0x27A07 +0x474B 0x27A1A +0x474D 0x27BB8 +0x4750 0x27BE9 +0x4751 0x27BEB +0x4752 0x27C50 +0x4753 0x27C4F +0x4755 0x27D86 +0x4757 0x27D8E +0x475C 0x27EF0 +0x475D 0x27EFB +0x4760 0x28042 +0x4763 0x28085 +0x4768 0x28305 +0x476F 0x2874B +0x4772 0x28763 +0x477A 0x28999 +0x477C 0x28C81 +0x477D 0x28D17 +0x477E 0x28D10 +0x4821 0x28D12 +0x4825 0x28EFA +0x4826 0x28EF3 +0x4827 0x28EF2 +0x4828 0x28EF5 +0x4829 0x28EF6 +0x482A 0x28FBB +0x482B 0x28FC2 +0x482C 0x290A7 +0x482F 0x290A8 +0x4830 0x290A3 +0x4832 0x290AA +0x4836 0x291DC +0x4839 0x2920F +0x483C 0x29279 +0x483E 0x2927F +0x483F 0x29285 +0x4845 0x2941B +0x4848 0x29477 +0x4849 0x29476 +0x484A 0x29498 +0x484F 0x2947A +0x4852 0x295BC +0x4853 0x295BA +0x4855 0x295B6 +0x4858 0x295B4 +0x485A 0x296CF +0x4861 0x2987B +0x4863 0x29A1C +0x4864 0x29A21 +0x4865 0x29A1D +0x4866 0x29AC0 +0x4868 0x29AFF +0x486C 0x29D56 +0x486E 0x29FA1 +0x486F 0x29FA2 +0x4870 0x29FA6 +0x4871 0x2A256 +0x4872 0x2A257 +0x4875 0x2A301 +0x4876 0x2A3ED +0x4877 0x2FA1C +0x4878 0x2A5F2 +0x487A 0x203B8 +0x487C 0x203C0 +0x487E 0x203B7 +0x4921 0x203E1 +0x4924 0x207E8 +0x4926 0x208B2 +0x4928 0x20AAE +0x492B 0x20F7E +0x492F 0x20F76 +0x4932 0x20F96 +0x4934 0x21420 +0x4935 0x21421 +0x4936 0x21423 +0x4937 0x21429 +0x4938 0x21677 +0x4939 0x21851 +0x493B 0x21856 +0x493D 0x21888 +0x493E 0x21859 +0x493F 0x21855 +0x4941 0x21997 +0x4942 0x21998 +0x4947 0x21AA1 +0x4948 0x21AA3 +0x494E 0x21F0A +0x4951 0x21F3D +0x4952 0x21F0C +0x4956 0x2213D +0x4957 0x22139 +0x4958 0x222B0 +0x4959 0x222B2 +0x495A 0x222AE +0x4960 0x22420 +0x4962 0x2256E +0x4963 0x2256D +0x4964 0x2256A +0x4966 0x22832 +0x496A 0x22839 +0x496E 0x227A3 +0x4970 0x2287F +0x4971 0x22835 +0x4972 0x2283D +0x4973 0x229F4 +0x4974 0x229F5 +0x4977 0x22D48 +0x4978 0x22D28 +0x497B 0x22D27 +0x497C 0x22D32 +0x497D 0x22D2C +0x4A21 0x22D2E +0x4A25 0x22D23 +0x4A26 0x22D31 +0x4A27 0x2F8C5 +0x4A2C 0x22FC9 +0x4A2D 0x23089 +0x4A2F 0x230BB +0x4A33 0x23397 +0x4A34 0x23393 +0x4A35 0x23628 +0x4A3B 0x23618 +0x4A3C 0x2363B +0x4A3E 0x23627 +0x4A3F 0x23624 +0x4A40 0x2361B +0x4A41 0x23631 +0x4A43 0x23626 +0x4A44 0x236A3 +0x4A45 0x2363F +0x4A46 0x23622 +0x4A47 0x23619 +0x4A49 0x23641 +0x4A4A 0x2362B +0x4A4D 0x2390C +0x4A51 0x23A4E +0x4A52 0x23AB9 +0x4A53 0x23AFA +0x4A54 0x23BE9 +0x4A55 0x23BE8 +0x4A56 0x23BE4 +0x4A5A 0x23F5F +0x4A5B 0x23F5D +0x4A5C 0x23F52 +0x4A5E 0x23F74 +0x4A60 0x23F46 +0x4A63 0x23FAA +0x4A65 0x23F4A +0x4A66 0x23F59 +0x4A67 0x23F4B +0x4A6B 0x24350 +0x4A70 0x246D0 +0x4A74 0x246CC +0x4A78 0x24864 +0x4A79 0x24865 +0x4A7D 0x2485C +0x4A7E 0x24A15 +0x4B28 0x24B79 +0x4B2B 0x24CC5 +0x4B2C 0x24CB8 +0x4B2D 0x24E2C +0x4B30 0x24E37 +0x4B31 0x24E35 +0x4B32 0x24E31 +0x4B34 0x24E2F +0x4B36 0x24E2B +0x4B39 0x24E2D +0x4B3A 0x24E2A +0x4B3C 0x24F95 +0x4B3E 0x2523E +0x4B40 0x25247 +0x4B41 0x25245 +0x4B46 0x25252 +0x4B48 0x25270 +0x4B49 0x25250 +0x4B4A 0x25258 +0x4B4B 0x25251 +0x4B4C 0x2523D +0x4B4E 0x25241 +0x4B4F 0x2520C +0x4B50 0x2523C +0x4B51 0x25386 +0x4B52 0x25383 +0x4B53 0x25389 +0x4B54 0x253F3 +0x4B5A 0x2552D +0x4B5F 0x256C5 +0x4B60 0x2F955 +0x4B67 0x25843 +0x4B69 0x25837 +0x4B6A 0x25845 +0x4B6D 0x259E5 +0x4B6E 0x25AA6 +0x4B6F 0x25BDB +0x4B71 0x25BDA +0x4B72 0x25BE6 +0x4B7C 0x25BF8 +0x4B7D 0x25BE9 +0x4C23 0x25BE8 +0x4C24 0x25BF6 +0x4C29 0x25BE7 +0x4C2F 0x25BD5 +0x4C32 0x25ED3 +0x4C33 0x25EC7 +0x4C34 0x25ED1 +0x4C36 0x25EC3 +0x4C38 0x26080 +0x4C39 0x26098 +0x4C3B 0x26084 +0x4C41 0x26097 +0x4C42 0x26083 +0x4C43 0x26081 +0x4C46 0x2608C +0x4C47 0x26242 +0x4C48 0x263AB +0x4C4A 0x263A3 +0x4C4B 0x263A6 +0x4C4C 0x2645C +0x4C4D 0x26469 +0x4C4E 0x26467 +0x4C50 0x2658B +0x4C51 0x265A8 +0x4C53 0x267D8 +0x4C56 0x2F989 +0x4C57 0x267DC +0x4C59 0x267E0 +0x4C5A 0x267E5 +0x4C60 0x26918 +0x4C61 0x26919 +0x4C66 0x26A5F +0x4C67 0x26A5E +0x4C69 0x26E02 +0x4C75 0x26E12 +0x4C76 0x26E36 +0x4C79 0x2F9A8 +0x4C7B 0x26E23 +0x4C7C 0x26E03 +0x4C7E 0x26E00 +0x4D22 0x26E46 +0x4D23 0x26E61 +0x4D27 0x27384 +0x4D29 0x2736B +0x4D2A 0x27362 +0x4D2B 0x27356 +0x4D2C 0x2736A +0x4D2D 0x27352 +0x4D2E 0x27355 +0x4D32 0x27361 +0x4D33 0x2F9BB +0x4D34 0x27358 +0x4D35 0x27377 +0x4D38 0x276D7 +0x4D3B 0x276DE +0x4D3D 0x276DF +0x4D41 0x276D1 +0x4D43 0x276E2 +0x4D44 0x276E1 +0x4D45 0x276DD +0x4D49 0x2784B +0x4D4B 0x2784E +0x4D4D 0x278FC +0x4D50 0x278FA +0x4D52 0x278FB +0x4D54 0x278FE +0x4D57 0x27A31 +0x4D5D 0x27A38 +0x4D62 0x27A3A +0x4D63 0x27BBB +0x4D66 0x27C59 +0x4D69 0x27CDB +0x4D6A 0x27CDF +0x4D6B 0x27CE2 +0x4D6F 0x27D9E +0x4D70 0x27DA1 +0x4D72 0x27F10 +0x4D7A 0x28076 +0x4D7B 0x2807F +0x4D7C 0x2807D +0x4E24 0x28082 +0x4E25 0x28257 +0x4E2C 0x2832E +0x4E2F 0x2858B +0x4E30 0x2858D +0x4E34 0x28590 +0x4E36 0x286EC +0x4E37 0x2876F +0x4E38 0x2876B +0x4E39 0x28771 +0x4E3A 0x28778 +0x4E42 0x289AD +0x4E49 0x28D2F +0x4E4B 0x28F78 +0x4E4D 0x291F8 +0x4E4E 0x29219 +0x4E50 0x2929B +0x4E51 0x29294 +0x4E52 0x29297 +0x4E53 0x29299 +0x4E54 0x293A6 +0x4E55 0x293A4 +0x4E56 0x293A7 +0x4E58 0x29495 +0x4E5B 0x29490 +0x4E5E 0x2949B +0x4E5F 0x295C4 +0x4E62 0x295C6 +0x4E68 0x296E3 +0x4E6A 0x296DF +0x4E6B 0x296DD +0x4E6C 0x296E7 +0x4E71 0x29A2D +0x4E72 0x29A2C +0x4E77 0x29A34 +0x4E78 0x29A38 +0x4E7A 0x29B1D +0x4E7C 0x29B1A +0x4E7D 0x29B1B +0x4E7E 0x29B14 +0x4F22 0x29B17 +0x4F23 0x29C21 +0x4F26 0x29CAA +0x4F27 0x29CA1 +0x4F2D 0x29D63 +0x4F2E 0x29D79 +0x4F2F 0x29D60 +0x4F31 0x29D62 +0x4F33 0x29D61 +0x4F36 0x29D70 +0x4F38 0x29D6A +0x4F3A 0x29FC8 +0x4F3C 0x29FC5 +0x4F3D 0x29FBE +0x4F3E 0x29FC2 +0x4F43 0x29FC7 +0x4F45 0x29FB0 +0x4F46 0x29FCA +0x4F4E 0x2A30D +0x4F4F 0x2A307 +0x4F50 0x2A396 +0x4F51 0x2A3EF +0x4F54 0x2A41E +0x4F55 0x2A41D +0x4F57 0x2A590 +0x4F58 0x203EB +0x4F5C 0x203EE +0x4F5E 0x203EF +0x4F5F 0x203EC +0x4F60 0x207FA +0x4F65 0x20904 +0x4F66 0x20FD3 +0x4F68 0x20FD1 +0x4F69 0x20FFA +0x4F6E 0x20FC8 +0x4F70 0x20FD5 +0x4F72 0x20FCD +0x4F73 0x20FD2 +0x4F74 0x20FFB +0x4F75 0x2122A +0x4F76 0x21488 +0x4F77 0x21461 +0x4F79 0x21463 +0x4F7A 0x21462 +0x4F7C 0x20057 +0x4F7D 0x218C8 +0x4F7E 0x21898 +0x5022 0x21AC1 +0x5023 0x21F3F +0x5024 0x21F41 +0x5028 0x22152 +0x502A 0x2215E +0x502D 0x222C7 +0x502F 0x22370 +0x5030 0x22427 +0x5032 0x22471 +0x5033 0x224B0 +0x5035 0x22842 +0x5036 0x22843 +0x503C 0x22857 +0x503D 0x2289D +0x503E 0x22D89 +0x503F 0x22D8D +0x5040 0x22D8B +0x5041 0x22D80 +0x5042 0x22D92 +0x5043 0x22D8A +0x5044 0x22DC8 +0x5046 0x22D8F +0x5047 0x22D93 +0x5048 0x22D91 +0x504A 0x22FF2 +0x504B 0x22FDE +0x504D 0x230C8 +0x5054 0x232A7 +0x5055 0x232A1 +0x5057 0x2368C +0x5058 0x2367F +0x505B 0x2367B +0x505C 0x23695 +0x505D 0x23699 +0x505F 0x2368E +0x5061 0x236DA +0x5062 0x2368A +0x5063 0x2369C +0x5065 0x2367E +0x5068 0x2391A +0x5069 0x23A55 +0x506C 0x23A60 +0x5070 0x23BFB +0x5073 0x23BFD +0x5079 0x23FD0 +0x507C 0x23FC5 +0x507E 0x23FD2 +0x5121 0x24011 +0x5126 0x243AD +0x5127 0x243A4 +0x5128 0x243A9 +0x5129 0x243B0 +0x512A 0x2439D +0x512C 0x24598 +0x5131 0x24892 +0x5133 0x2488A +0x5135 0x2488D +0x5136 0x24896 +0x513B 0x24A45 +0x513C 0x24A4B +0x513D 0x24B0F +0x513E 0x24B16 +0x5140 0x24B8A +0x5143 0x24CC9 +0x5145 0x24CC8 +0x5146 0x24CCA +0x5147 0x24E64 +0x514B 0x24E5D +0x514C 0x24E63 +0x5151 0x24E88 +0x5152 0x24F3A +0x5153 0x24F39 +0x5158 0x25017 +0x5159 0x25093 +0x515B 0x25095 +0x515E 0x25276 +0x5162 0x25280 +0x5163 0x2527B +0x5165 0x25248 +0x5166 0x252A8 +0x5167 0x25288 +0x5168 0x2538B +0x5169 0x2538A +0x516A 0x2538C +0x516B 0x253FC +0x516F 0x25558 +0x5171 0x25551 +0x5172 0x25555 +0x5173 0x25553 +0x5177 0x256DC +0x517B 0x2585C +0x517E 0x25865 +0x5221 0x2F95A +0x5223 0x259EE +0x5226 0x259F0 +0x5228 0x259F2 +0x522A 0x25C35 +0x522C 0x25C22 +0x522E 0x25C20 +0x5230 0x25C2D +0x5231 0x25C28 +0x5232 0x25C26 +0x5233 0x25C3C +0x5235 0x25C38 +0x523C 0x25C2A +0x523E 0x25C1A +0x523F 0x25C30 +0x5240 0x25BE3 +0x5241 0x25C19 +0x5242 0x25EE9 +0x5243 0x25EE7 +0x5245 0x260D6 +0x5246 0x260C4 +0x5248 0x26087 +0x524A 0x260C7 +0x524B 0x260D9 +0x524D 0x260DF +0x5250 0x2630A +0x5251 0x26301 +0x5252 0x263B1 +0x5254 0x263C1 +0x5257 0x26476 +0x5258 0x2650D +0x5259 0x2650E +0x525D 0x26807 +0x525F 0x26809 +0x5260 0x26816 +0x5265 0x2680E +0x5268 0x26806 +0x5269 0x2691E +0x526A 0x2694A +0x5270 0x26EA6 +0x5271 0x26E91 +0x5274 0x26EB8 +0x5275 0x26E96 +0x5278 0x26EC5 +0x527D 0x26F0A +0x5326 0x26EB2 +0x5328 0x26EB7 +0x5329 0x26EB4 +0x532A 0x26E89 +0x532B 0x26E8D +0x532D 0x26E87 +0x532E 0x26EC2 +0x532F 0x26E9C +0x5330 0x26E92 +0x5332 0x26ECA +0x5334 0x26E8A +0x5335 0x271E0 +0x5337 0x271E6 +0x5338 0x271E5 +0x533A 0x273A5 +0x533B 0x273B3 +0x533F 0x273B5 +0x5340 0x273AF +0x5342 0x273B0 +0x5343 0x273CC +0x5345 0x273A2 +0x5346 0x273BE +0x5347 0x273C6 +0x5348 0x273AC +0x5349 0x273AE +0x534C 0x2F9C3 +0x534D 0x27708 +0x534E 0x27705 +0x5351 0x276FE +0x5354 0x27700 +0x5357 0x27864 +0x5358 0x27868 +0x535D 0x2786A +0x535E 0x27869 +0x535F 0x2790D +0x5360 0x27912 +0x5363 0x2790F +0x5365 0x27A67 +0x5366 0x27A79 +0x5367 0x27A72 +0x5368 0x27A66 +0x5369 0x27A7C +0x536C 0x27A68 +0x536D 0x27A85 +0x536E 0x27A76 +0x536F 0x27A74 +0x5370 0x27A71 +0x5371 0x27A64 +0x5374 0x27BF8 +0x5376 0x27C6C +0x5378 0x27CEB +0x537C 0x27DB8 +0x5421 0x27F2D +0x5422 0x27F2E +0x5423 0x27F28 +0x5424 0x27F29 +0x5425 0x27F31 +0x5427 0x27F2F +0x5428 0x27F2A +0x542A 0x280A4 +0x542B 0x280B7 +0x542C 0x280BF +0x5431 0x28263 +0x5435 0x28367 +0x5436 0x285BE +0x5437 0x2F9E0 +0x5438 0x28795 +0x5439 0x2879C +0x543E 0x28871 +0x543F 0x28872 +0x5441 0x2886F +0x5444 0x289F1 +0x5447 0x289E8 +0x544A 0x2F9EA +0x544D 0x28D49 +0x544E 0x28D64 +0x5450 0x28D48 +0x5454 0x28F2C +0x5455 0x28FE1 +0x5456 0x28FEF +0x5457 0x290C0 +0x545A 0x290D7 +0x545B 0x290D4 +0x545E 0x292AD +0x5465 0x292AE +0x5466 0x292AC +0x546B 0x29427 +0x546C 0x294AE +0x546E 0x294B0 +0x5471 0x294C0 +0x5472 0x294C4 +0x5479 0x29707 +0x547B 0x296FD +0x5523 0x2FA04 +0x5524 0x2981B +0x5525 0x2981C +0x5527 0x298B2 +0x5528 0x298B4 +0x5529 0x298B7 +0x552A 0x298B1 +0x552B 0x298B3 +0x552C 0x298AE +0x5533 0x29A3F +0x5534 0x29B36 +0x5537 0x29B31 +0x5538 0x29B3B +0x5539 0x29B35 +0x553A 0x29B3A +0x553B 0x29B37 +0x553C 0x29C22 +0x553D 0x29C36 +0x553E 0x29C32 +0x5540 0x29CC0 +0x5546 0x29D85 +0x5549 0x29D89 +0x554C 0x29FE1 +0x5551 0x2A00A +0x5553 0x2A009 +0x5556 0x29FE8 +0x555B 0x2A318 +0x5564 0x2A5C5 +0x5566 0x2040D +0x5567 0x2040C +0x5568 0x20421 +0x556A 0x20616 +0x556B 0x2080E +0x556E 0x20817 +0x5571 0x21048 +0x5575 0x21055 +0x5576 0x21049 +0x5577 0x2104C +0x5579 0x2104F +0x557A 0x2103D +0x557D 0x2148A +0x557E 0x214A8 +0x5621 0x2168A +0x5623 0x218CB +0x5625 0x218D5 +0x5626 0x221D4 +0x5629 0x21F5C +0x562A 0x21F75 +0x562C 0x22161 +0x562E 0x21696 +0x5630 0x2258A +0x5631 0x228D0 +0x5634 0x22849 +0x5635 0x228CF +0x5637 0x22DD6 +0x5638 0x22D7F +0x563A 0x22DD2 +0x563B 0x22DCF +0x563C 0x23006 +0x563D 0x23009 +0x5642 0x23706 +0x5643 0x236F1 +0x5644 0x23704 +0x5646 0x236FA +0x5647 0x236F4 +0x564A 0x236F9 +0x564C 0x2368B +0x564D 0x23703 +0x5650 0x239A2 +0x5654 0x23C0C +0x5655 0x23C0B +0x565A 0x24024 +0x565D 0x2F914 +0x565F 0x24025 +0x5661 0x243F6 +0x5663 0x243FB +0x5665 0x24532 +0x5666 0x245FB +0x5668 0x246F2 +0x5669 0x246F3 +0x566D 0x2489C +0x566E 0x24A72 +0x5670 0x24A74 +0x5674 0x24B86 +0x5676 0x24B8E +0x5677 0x24B90 +0x5679 0x24BCD +0x567A 0x24BF7 +0x567B 0x24CD6 +0x567C 0x24E84 +0x567D 0x24E95 +0x567E 0x24E8A +0x5723 0x24E97 +0x5727 0x24FA0 +0x5728 0x24FA1 +0x5729 0x25022 +0x572A 0x250A6 +0x572B 0x250A4 +0x5735 0x252AF +0x5736 0x252B0 +0x5737 0x252BD +0x573A 0x25576 +0x573C 0x2557B +0x573D 0x25579 +0x5743 0x256EE +0x5744 0x256F1 +0x5746 0x25894 +0x574A 0x25891 +0x574E 0x25A10 +0x5751 0x25AAF +0x575C 0x25C7B +0x575D 0x25C77 +0x5760 0x25C80 +0x5761 0x25CC6 +0x5763 0x25C7C +0x5764 0x25C90 +0x5766 0x25CA3 +0x5767 0x25C7D +0x5768 0x25CBD +0x576C 0x25F13 +0x576F 0x26111 +0x5770 0x26144 +0x5771 0x2610D +0x5774 0x26314 +0x5776 0x263B8 +0x5778 0x263B7 +0x5779 0x26483 +0x577C 0x26514 +0x577E 0x2651C +0x5825 0x265D4 +0x5826 0x265D5 +0x5829 0x26843 +0x582A 0x26842 +0x582D 0x2F98A +0x582E 0x26841 +0x582F 0x2694E +0x5831 0x26A87 +0x5837 0x26F39 +0x5839 0x26F8F +0x583A 0x26F2A +0x583F 0x26F2B +0x5841 0x26F50 +0x5843 0x26F6E +0x5845 0x26F3B +0x5846 0x26F53 +0x5847 0x26F5F +0x5848 0x26F2F +0x5849 0x26F30 +0x584A 0x26F38 +0x584B 0x26F4C +0x584C 0x271F1 +0x5850 0x27407 +0x5851 0x27416 +0x5853 0x27414 +0x5855 0x273FB +0x5859 0x273F8 +0x585A 0x27410 +0x585B 0x2741D +0x585C 0x273FF +0x585D 0x2740B +0x585E 0x27404 +0x5860 0x273FE +0x5861 0x275FF +0x5866 0x27723 +0x586C 0x2792A +0x586D 0x27AA0 +0x586E 0x27A98 +0x586F 0x27A9C +0x5871 0x27A9E +0x5872 0x27AA6 +0x5873 0x27AB5 +0x5874 0x27AB0 +0x5878 0x27CF9 +0x5879 0x27CF5 +0x587B 0x27DD2 +0x587E 0x27F50 +0x5921 0x27F4E +0x5922 0x27F4B +0x5923 0x27F52 +0x5924 0x27F4D +0x5927 0x280E4 +0x5929 0x280DA +0x592E 0x280DF +0x592F 0x280E8 +0x5933 0x28370 +0x5934 0x28372 +0x5936 0x28377 +0x593A 0x285E6 +0x593B 0x287AA +0x593E 0x2888C +0x5940 0x28889 +0x5943 0x28A32 +0x5948 0x28A7A +0x594A 0x28C9E +0x594B 0x28CA0 +0x594C 0x28D70 +0x5950 0x28D6E +0x5951 0x28D66 +0x5953 0x28D65 +0x5956 0x28F7F +0x5957 0x28FE0 +0x5959 0x28FFF +0x595A 0x290F6 +0x595B 0x290F7 +0x595C 0x290F5 +0x595E 0x290FC +0x5961 0x290F9 +0x5965 0x292CA +0x5966 0x292C3 +0x5967 0x292C6 +0x5969 0x293B8 +0x596A 0x293BD +0x596C 0x293BC +0x596D 0x29405 +0x596E 0x294E0 +0x596F 0x294E9 +0x5971 0x294DF +0x5972 0x294EC +0x5974 0x294E5 +0x5975 0x294DE +0x5976 0x2FA00 +0x5978 0x294F0 +0x5979 0x294E3 +0x597B 0x295EC +0x5A23 0x295F2 +0x5A24 0x295EF +0x5A25 0x295E9 +0x5A26 0x296FB +0x5A2B 0x29737 +0x5A2C 0x298DE +0x5A2F 0x298DA +0x5A32 0x29A4B +0x5A34 0x29A49 +0x5A36 0x29AD5 +0x5A39 0x29B52 +0x5A3A 0x29B47 +0x5A3C 0x29B48 +0x5A3D 0x29CCC +0x5A3E 0x29CD0 +0x5A46 0x29D86 +0x5A47 0x29DA7 +0x5A48 0x29DA3 +0x5A4A 0x29DB6 +0x5A4B 0x29DAD +0x5A4C 0x2A013 +0x5A53 0x2A017 +0x5A54 0x2A022 +0x5A57 0x2A049 +0x5A58 0x2A026 +0x5A59 0x2FA0C +0x5A5A 0x2A03C +0x5A5B 0x2A028 +0x5A5C 0x2A2A8 +0x5A5E 0x2A3FB +0x5A60 0x2A432 +0x5A61 0x2A4D6 +0x5A62 0x2A548 +0x5A65 0x2A5C6 +0x5A69 0x20425 +0x5A6A 0x20426 +0x5A6B 0x20424 +0x5A6C 0x20433 +0x5A6D 0x20570 +0x5A6F 0x20B90 +0x5A71 0x21095 +0x5A72 0x210A1 +0x5A73 0x21092 +0x5A74 0x2108F +0x5A75 0x2109F +0x5A76 0x21096 +0x5A77 0x21098 +0x5A78 0x2109D +0x5A79 0x210A0 +0x5A7B 0x21697 +0x5A7C 0x218EB +0x5A7E 0x21F87 +0x5B22 0x22432 +0x5B26 0x228D8 +0x5B27 0x228FB +0x5B28 0x22906 +0x5B2A 0x228D1 +0x5B2C 0x2F8B0 +0x5B33 0x22DF6 +0x5B34 0x22E04 +0x5B35 0x22DFE +0x5B37 0x22DFF +0x5B38 0x22DF7 +0x5B39 0x23018 +0x5B3B 0x23014 +0x5B3C 0x230CD +0x5B3D 0x23120 +0x5B3E 0x232DE +0x5B42 0x23745 +0x5B43 0x23753 +0x5B45 0x2374B +0x5B46 0x23755 +0x5B47 0x23741 +0x5B4B 0x2375C +0x5B4C 0x23754 +0x5B4D 0x23A71 +0x5B4E 0x23AD0 +0x5B51 0x23C53 +0x5B52 0x24029 +0x5B53 0x2407E +0x5B55 0x24079 +0x5B58 0x24070 +0x5B59 0x2406A +0x5B5C 0x24085 +0x5B5D 0x24064 +0x5B5F 0x24078 +0x5B61 0x24432 +0x5B62 0x24427 +0x5B63 0x2442F +0x5B68 0x248BA +0x5B6A 0x24A71 +0x5B6B 0x24A8C +0x5B6D 0x24B1A +0x5B70 0x24B98 +0x5B71 0x24CE4 +0x5B76 0x24EC2 +0x5B78 0x24EBA +0x5B7A 0x24EC8 +0x5C21 0x250B9 +0x5C22 0x250B8 +0x5C23 0x250A5 +0x5C24 0x252E2 +0x5C28 0x252D9 +0x5C2B 0x252AC +0x5C2C 0x252DD +0x5C30 0x2559D +0x5C33 0x25711 +0x5C34 0x25703 +0x5C38 0x258EE +0x5C3C 0x25CA4 +0x5C3D 0x25CD8 +0x5C3E 0x25CDD +0x5C3F 0x25CDE +0x5C41 0x25CE7 +0x5C45 0x25CD4 +0x5C47 0x25CCE +0x5C4D 0x25CF1 +0x5C4E 0x25CD3 +0x5C52 0x25CCA +0x5C53 0x25CE9 +0x5C57 0x25F1A +0x5C58 0x25F41 +0x5C59 0x2F968 +0x5C5C 0x2613D +0x5C5D 0x26140 +0x5C61 0x26143 +0x5C63 0x2613F +0x5C64 0x2613C +0x5C66 0x26321 +0x5C67 0x26320 +0x5C69 0x263C6 +0x5C6C 0x263D1 +0x5C6D 0x263CA +0x5C6E 0x2648E +0x5C6F 0x26491 +0x5C72 0x265E3 +0x5C73 0x26888 +0x5C75 0x26870 +0x5C77 0x2699D +0x5C78 0x26A9D +0x5C79 0x26A91 +0x5C7A 0x26A98 +0x5C7B 0x26A99 +0x5D22 0x26FBF +0x5D24 0x26FAE +0x5D25 0x26FB1 +0x5D26 0x26FCC +0x5D27 0x27004 +0x5D29 0x27016 +0x5D2A 0x26FCD +0x5D2D 0x26FE0 +0x5D2E 0x26FCB +0x5D2F 0x26FD4 +0x5D30 0x26FC9 +0x5D31 0x271FF +0x5D33 0x271FD +0x5D34 0x27457 +0x5D35 0x27452 +0x5D36 0x27450 +0x5D37 0x27445 +0x5D38 0x2744D +0x5D3A 0x27453 +0x5D3C 0x27482 +0x5D3D 0x27444 +0x5D3E 0x275CE +0x5D3F 0x275CF +0x5D40 0x275D2 +0x5D41 0x27602 +0x5D42 0x2774F +0x5D43 0x27758 +0x5D45 0x27743 +0x5D47 0x27752 +0x5D4B 0x27749 +0x5D4C 0x27753 +0x5D4D 0x2774D +0x5D4F 0x27884 +0x5D51 0x27883 +0x5D52 0x27932 +0x5D53 0x27AE2 +0x5D55 0x27AE4 +0x5D56 0x27AD3 +0x5D58 0x27AD5 +0x5D59 0x27ADD +0x5D5C 0x27AEC +0x5D5D 0x27AE6 +0x5D5E 0x27AD2 +0x5D5F 0x27AFA +0x5D60 0x27ADA +0x5D62 0x27C06 +0x5D63 0x27C04 +0x5D65 0x27C7B +0x5D66 0x27D04 +0x5D67 0x27D02 +0x5D6B 0x27F60 +0x5D6F 0x28107 +0x5D70 0x28105 +0x5D71 0x2810C +0x5D73 0x2815A +0x5D76 0x2811A +0x5D79 0x2838A +0x5E21 0x2838C +0x5E22 0x28609 +0x5E23 0x288A6 +0x5E25 0x288AC +0x5E26 0x288A9 +0x5E28 0x28A8B +0x5E2A 0x28A8C +0x5E2D 0x28A88 +0x5E2E 0x28A89 +0x5E30 0x28A93 +0x5E33 0x28D83 +0x5E34 0x28F4F +0x5E37 0x29120 +0x5E39 0x29236 +0x5E3A 0x292E2 +0x5E3D 0x292EE +0x5E3F 0x292E7 +0x5E40 0x292E9 +0x5E44 0x292DF +0x5E46 0x293C7 +0x5E48 0x29509 +0x5E4A 0x29501 +0x5E53 0x29605 +0x5E54 0x2960C +0x5E55 0x29778 +0x5E56 0x2975D +0x5E5C 0x2975E +0x5E5D 0x29760 +0x5E5E 0x29767 +0x5E60 0x2FA05 +0x5E61 0x298F4 +0x5E64 0x298F1 +0x5E66 0x298FA +0x5E69 0x298F8 +0x5E6A 0x298F9 +0x5E6B 0x29909 +0x5E6C 0x298FD +0x5E6D 0x298F7 +0x5E6F 0x29A59 +0x5E71 0x29B60 +0x5E72 0x29B68 +0x5E78 0x29B6A +0x5E79 0x29C14 +0x5E7A 0x29C3E +0x5E7B 0x29CE4 +0x5F28 0x29DD2 +0x5F2D 0x2A058 +0x5F2E 0x2A050 +0x5F30 0x2A05C +0x5F33 0x28119 +0x5F37 0x2FA0E +0x5F41 0x2A4DF +0x5F47 0x2A5D9 +0x5F4B 0x20966 +0x5F4E 0x210E1 +0x5F4F 0x210EF +0x5F50 0x210E8 +0x5F51 0x21233 +0x5F53 0x218FE +0x5F56 0x21AEF +0x5F57 0x21AEC +0x5F58 0x21CEC +0x5F59 0x21F9C +0x5F5B 0x21F99 +0x5F5C 0x22170 +0x5F5D 0x2216E +0x5F5F 0x22441 +0x5F62 0x22902 +0x5F63 0x22901 +0x5F65 0x22A1B +0x5F66 0x22E23 +0x5F67 0x22E25 +0x5F68 0x22E24 +0x5F69 0x22E26 +0x5F6A 0x22E33 +0x5F6B 0x22E2F +0x5F6C 0x2308F +0x5F6D 0x23356 +0x5F74 0x23799 +0x5F76 0x2F8ED +0x5F78 0x23AD9 +0x5F7A 0x240B7 +0x5F7C 0x240B6 +0x6021 0x24454 +0x6022 0x24457 +0x6023 0x2447A +0x6026 0x24A8E +0x6028 0x24A90 +0x6029 0x24AB9 +0x602D 0x24CEF +0x6031 0x24EE2 +0x6033 0x24ED6 +0x6034 0x24ED8 +0x6035 0x24EDA +0x6036 0x24EDE +0x603A 0x25308 +0x603B 0x25304 +0x603C 0x2530A +0x603D 0x2530B +0x603E 0x25302 +0x6040 0x255AA +0x6041 0x255C1 +0x6043 0x258D7 +0x6044 0x258D9 +0x6046 0x258DE +0x6047 0x258DA +0x604A 0x25A2A +0x604D 0x25D31 +0x604F 0x25D2B +0x6050 0x25D2C +0x6051 0x25D29 +0x6052 0x25D2E +0x6054 0x25D27 +0x6055 0x25D28 +0x6057 0x25D5F +0x6058 0x25D30 +0x6059 0x25D24 +0x605C 0x25F3A +0x605E 0x25F39 +0x605F 0x25F40 +0x6060 0x26180 +0x6061 0x26184 +0x6064 0x26175 +0x6065 0x26176 +0x6067 0x2617C +0x6069 0x26178 +0x606A 0x2619B +0x606B 0x2617E +0x606C 0x2625A +0x606E 0x2632C +0x6070 0x2649C +0x6071 0x26847 +0x6072 0x2688A +0x6075 0x26927 +0x6076 0x2704A +0x6079 0x27027 +0x607C 0x2702E +0x607D 0x27026 +0x607E 0x27208 +0x6122 0x274BD +0x6123 0x27496 +0x6127 0x274BE +0x6128 0x2748E +0x6129 0x27774 +0x612B 0x27780 +0x6132 0x2793C +0x6133 0x2793D +0x6135 0x2793A +0x6136 0x27942 +0x6138 0x27B24 +0x6139 0x27B06 +0x613C 0x27B15 +0x613E 0x27B02 +0x613F 0x27B0C +0x6141 0x27B08 +0x6142 0x27B0A +0x6143 0x27B05 +0x6144 0x27B1C +0x6147 0x27C82 +0x6149 0x27C86 +0x614B 0x27E03 +0x614C 0x27F7B +0x614E 0x27F7A +0x6153 0x28180 +0x6155 0x28158 +0x615A 0x283AA +0x615B 0x283AB +0x615C 0x28436 +0x615D 0x2844A +0x6160 0x287D6 +0x616A 0x28B03 +0x616B 0x28ACF +0x616D 0x28D9F +0x616E 0x28DA2 +0x616F 0x2902A +0x6170 0x2902F +0x6171 0x29144 +0x6172 0x29140 +0x6175 0x29311 +0x6176 0x2930F +0x6178 0x2930D +0x6179 0x29307 +0x617A 0x29303 +0x6221 0x29435 +0x6224 0x29504 +0x622A 0x29526 +0x622E 0x2951E +0x6231 0x2960E +0x6233 0x2961D +0x6234 0x2961E +0x6235 0x2961F +0x6237 0x29788 +0x6239 0x2978D +0x623A 0x29791 +0x623B 0x29780 +0x623D 0x29854 +0x623E 0x29855 +0x6242 0x29925 +0x6243 0x2991A +0x624B 0x29B88 +0x624D 0x29B7A +0x6250 0x29B80 +0x6251 0x29D1E +0x6252 0x29DFC +0x6253 0x29E25 +0x6258 0x29E0B +0x625A 0x29E06 +0x625B 0x29E04 +0x625E 0x29DF9 +0x625F 0x29E00 +0x6263 0x29E02 +0x6265 0x29E07 +0x6269 0x2A0B5 +0x626B 0x2A087 +0x626D 0x2A093 +0x626E 0x2FA0F +0x6270 0x2A0BE +0x6271 0x2A266 +0x6273 0x2A2C7 +0x6274 0x2A2CF +0x6278 0x2A33D +0x627A 0x2A33C +0x627B 0x2A347 +0x6322 0x2A3C3 +0x6325 0x2A51B +0x6328 0x2A5C9 +0x632A 0x2A5DD +0x632C 0x2A693 +0x632E 0x2043D +0x6333 0x214E6 +0x6336 0x21AF7 +0x6337 0x21FB0 +0x6338 0x21FAE +0x633D 0x2259F +0x633E 0x2259E +0x633F 0x22930 +0x6341 0x2294F +0x6344 0x22927 +0x6345 0x22951 +0x6348 0x22E51 +0x6349 0x22E54 +0x634A 0x22E56 +0x634B 0x23027 +0x634D 0x23024 +0x6352 0x237EC +0x6353 0x237C4 +0x6356 0x240F8 +0x6357 0x240F6 +0x6358 0x240F7 +0x6359 0x240ED +0x635C 0x240F4 +0x635D 0x240EF +0x6360 0x2447F +0x6361 0x244A2 +0x6362 0x2447E +0x6364 0x248C5 +0x636A 0x24EF1 +0x636B 0x24EF2 +0x636D 0x2502F +0x6372 0x25323 +0x6373 0x25329 +0x6377 0x2571B +0x6378 0x258EB +0x637A 0x258EA +0x637B 0x25A33 +0x637D 0x25D63 +0x6421 0x25D92 +0x6422 0x25D65 +0x6425 0x261A0 +0x6426 0x2F970 +0x6427 0x2625E +0x6429 0x268AA +0x642B 0x268A9 +0x642E 0x2709C +0x6431 0x27092 +0x6435 0x27086 +0x6439 0x27083 +0x643F 0x2F9C2 +0x6442 0x274CE +0x6445 0x27793 +0x6449 0x27B2E +0x644A 0x27B27 +0x644B 0x27B28 +0x6450 0x27E18 +0x6451 0x27E16 +0x6452 0x27F8D +0x6454 0x27F8E +0x6457 0x27F90 +0x6458 0x27F8F +0x6459 0x28181 +0x645C 0x2818A +0x645D 0x2818C +0x645E 0x2828D +0x6462 0x283B2 +0x6464 0x287D9 +0x6468 0x28B0D +0x646A 0x28B13 +0x646E 0x28B1B +0x6470 0x28DAC +0x6472 0x28DB3 +0x6474 0x2915E +0x6476 0x29160 +0x6477 0x29168 +0x6478 0x29163 +0x6479 0x29169 +0x647A 0x29167 +0x647D 0x29328 +0x6521 0x2932E +0x6522 0x29330 +0x6524 0x29326 +0x6525 0x29331 +0x6526 0x29341 +0x6528 0x293DA +0x652A 0x2F9FA +0x652B 0x2940B +0x652D 0x29534 +0x652E 0x29533 +0x6532 0x29539 +0x6533 0x2953B +0x6534 0x29540 +0x6535 0x29630 +0x6537 0x29632 +0x6538 0x29637 +0x653D 0x29781 +0x653E 0x2979F +0x653F 0x297A7 +0x6542 0x29944 +0x6543 0x29947 +0x6544 0x29948 +0x6545 0x2993D +0x6548 0x29949 +0x654A 0x29A80 +0x654B 0x29BA0 +0x654C 0x29B9D +0x6550 0x29B9C +0x6551 0x29C47 +0x6552 0x29D07 +0x6556 0x29E49 +0x6558 0x29E44 +0x655C 0x29EDF +0x655E 0x29E4C +0x6560 0x29E4F +0x6563 0x2A0C1 +0x6565 0x2A0B9 +0x6566 0x2A0CB +0x6567 0x2A0CF +0x6568 0x2A0C4 +0x656D 0x2A0CA +0x656E 0x2A0C3 +0x656F 0x2A2D0 +0x6570 0x2A351 +0x6573 0x2A3A8 +0x6574 0x2A3C7 +0x6575 0x2A3C6 +0x6577 0x2A3CA +0x6578 0x2A402 +0x657A 0x2A45D +0x657B 0x2A45A +0x657E 0x2A459 +0x6622 0x2A4CC +0x6623 0x2A51C +0x6624 0x2A5CC +0x6628 0x2A5E8 +0x6629 0x2A5EC +0x662A 0x2A5EA +0x662B 0x2A6AD +0x662C 0x2A6B0 +0x662D 0x2045F +0x662E 0x20458 +0x662F 0x20457 +0x6631 0x20B93 +0x6633 0x2113B +0x6635 0x21134 +0x6636 0x214F2 +0x6638 0x21AFD +0x6639 0x21C1D +0x663C 0x22304 +0x663D 0x22448 +0x663E 0x22958 +0x663F 0x22E4F +0x6641 0x22E6E +0x6642 0x22E72 +0x6644 0x2302E +0x6645 0x237FC +0x6646 0x237F4 +0x6647 0x23C36 +0x6648 0x2410E +0x664B 0x24114 +0x664D 0x24119 +0x664F 0x244A6 +0x6651 0x24AC9 +0x6652 0x24AC0 +0x6653 0x24ACC +0x6654 0x24B1B +0x6655 0x24BAA +0x6656 0x24BA8 +0x6657 0x24F03 +0x665C 0x25035 +0x6662 0x255D9 +0x6666 0x25A3F +0x6667 0x25A3D +0x666B 0x25D8B +0x6670 0x25D68 +0x6671 0x25D8A +0x6672 0x25F58 +0x6673 0x25F57 +0x6674 0x261CE +0x6675 0x261BC +0x6676 0x261C0 +0x6677 0x261C1 +0x6678 0x261BF +0x6679 0x261AB +0x667A 0x2625F +0x667C 0x264A6 +0x667E 0x26529 +0x6726 0x268B8 +0x6729 0x270DD +0x672A 0x270D6 +0x672B 0x2F9B1 +0x672C 0x270D5 +0x672D 0x270E7 +0x672E 0x270D8 +0x672F 0x274EC +0x6731 0x27500 +0x6732 0x27507 +0x6733 0x274FD +0x6734 0x274F1 +0x6735 0x274FF +0x6736 0x277AA +0x6737 0x277B0 +0x6738 0x27B48 +0x673A 0x27B53 +0x673C 0x27B4D +0x6742 0x27B43 +0x6743 0x27B50 +0x6746 0x27C8C +0x6747 0x27E27 +0x6749 0x27F99 +0x674B 0x281B1 +0x674D 0x281B0 +0x674E 0x281AA +0x674F 0x281AC +0x6753 0x283C8 +0x6754 0x283CA +0x6755 0x28642 +0x6756 0x287E0 +0x6757 0x288E7 +0x6758 0x288E8 +0x6759 0x288E6 +0x675D 0x28B5B +0x675E 0x28B56 +0x6760 0x28B5A +0x6764 0x28CB8 +0x6765 0x28DC5 +0x6768 0x29048 +0x6769 0x2917D +0x676A 0x2917C +0x676B 0x29181 +0x676C 0x29182 +0x676D 0x29162 +0x676F 0x29345 +0x6774 0x293E3 +0x6778 0x29550 +0x677A 0x2954F +0x677D 0x29639 +0x6821 0x2963A +0x6825 0x297C1 +0x6826 0x2994E +0x6827 0x2996E +0x682C 0x29971 +0x682E 0x29A8C +0x682F 0x29A89 +0x6831 0x29AE5 +0x6832 0x29BB3 +0x6833 0x29BB6 +0x6834 0x29BB4 +0x6835 0x29C4D +0x6837 0x29D13 +0x6838 0x29E78 +0x683F 0x29E72 +0x6845 0x2A275 +0x6846 0x2A2DA +0x6847 0x2A2D7 +0x684F 0x2FA16 +0x6850 0x2A469 +0x6851 0x2A467 +0x6853 0x2A466 +0x6854 0x2A46F +0x6855 0x2A471 +0x6857 0x2A4CF +0x6858 0x2A523 +0x685B 0x2A5A5 +0x685D 0x2A5FE +0x685E 0x2A5FB +0x685F 0x2A5FD +0x6864 0x2116D +0x6866 0x21B05 +0x6867 0x21C20 +0x6869 0x21FC8 +0x686A 0x21FC9 +0x686D 0x23127 +0x686F 0x2381E +0x6870 0x23936 +0x6872 0x2413D +0x6874 0x248D7 +0x6876 0x24BAD +0x6877 0x24D00 +0x6879 0x2533A +0x687D 0x25726 +0x6923 0x25DB7 +0x6924 0x25DB6 +0x6925 0x25DC0 +0x6927 0x25D9B +0x6929 0x261D8 +0x692F 0x268C0 +0x6931 0x268BF +0x6932 0x26ABF +0x6934 0x27120 +0x6935 0x270D0 +0x6936 0x2710E +0x6938 0x2711D +0x6939 0x2711E +0x693A 0x27115 +0x693B 0x27114 +0x693C 0x2751E +0x693D 0x2752C +0x693F 0x277B9 +0x6940 0x277B8 +0x6941 0x277B6 +0x6942 0x2789E +0x6943 0x2789C +0x6944 0x2794D +0x6946 0x27B6E +0x6947 0x27B60 +0x6949 0x27B64 +0x694A 0x27B62 +0x694B 0x261E5 +0x694D 0x27FA3 +0x6950 0x283D2 +0x6951 0x283D5 +0x6957 0x29055 +0x6959 0x29193 +0x695D 0x29356 +0x695F 0x293E9 +0x6961 0x29445 +0x6964 0x2967C +0x6966 0x297D3 +0x696C 0x2998E +0x696D 0x29A97 +0x696F 0x29A9B +0x6970 0x29A99 +0x6973 0x29BCF +0x6975 0x29C59 +0x6978 0x29D20 +0x6979 0x29D23 +0x697A 0x29D2A +0x6A22 0x29EB0 +0x6A24 0x2A12F +0x6A28 0x2A132 +0x6A29 0x2A143 +0x6A2A 0x2A13F +0x6A2B 0x2A139 +0x6A2D 0x2A130 +0x6A2E 0x2A2DD +0x6A2F 0x2A3DA +0x6A30 0x2A3DB +0x6A32 0x2A484 +0x6A33 0x2A47F +0x6A34 0x2A472 +0x6A35 0x2A480 +0x6A36 0x2A4EE +0x6A38 0x2A52A +0x6A39 0x2A522 +0x6A3A 0x2A571 +0x6A3B 0x2A5CD +0x6A3E 0x2A60F +0x6A3F 0x2A618 +0x6A40 0x2046A +0x6A45 0x21B0C +0x6A47 0x225A6 +0x6A4A 0x23037 +0x6A4D 0x23AE2 +0x6A4F 0x244BC +0x6A52 0x24AD5 +0x6A56 0x24F12 +0x6A58 0x2534B +0x6A59 0x25341 +0x6A5A 0x253A1 +0x6A5B 0x255EC +0x6A5E 0x25DD4 +0x6A5F 0x25DD8 +0x6A60 0x25DD9 +0x6A62 0x25DDA +0x6A63 0x25F6C +0x6A64 0x25F6D +0x6A67 0x261E7 +0x6A68 0x261EB +0x6A69 0x261EC +0x6A6A 0x26262 +0x6A6C 0x2652B +0x6A6D 0x2660D +0x6A6E 0x268CD +0x6A6F 0x26AC3 +0x6A70 0x2713F +0x6A71 0x2713C +0x6A72 0x2713E +0x6A73 0x2713D +0x6A74 0x2713A +0x6A75 0x27138 +0x6A76 0x27544 +0x6A77 0x27545 +0x6A79 0x27548 +0x6A7A 0x27550 +0x6A7D 0x27B78 +0x6A7E 0x27B79 +0x6B22 0x27E3E +0x6B25 0x28654 +0x6B28 0x28BB9 +0x6B2B 0x2905F +0x6B2E 0x29572 +0x6B2F 0x29575 +0x6B36 0x29AA3 +0x6B37 0x29AA5 +0x6B38 0x29BDC +0x6B39 0x29BDD +0x6B3A 0x29C5A +0x6B3E 0x29EDB +0x6B3F 0x29EDC +0x6B41 0x2A1AB +0x6B42 0x2A184 +0x6B43 0x2A176 +0x6B49 0x2A183 +0x6B4C 0x2A27F +0x6B4F 0x2A373 +0x6B50 0x2A3AD +0x6B51 0x2A3B0 +0x6B53 0x2A40F +0x6B54 0x2A40C +0x6B57 0x2A579 +0x6B59 0x2A577 +0x6B5A 0x2A57A +0x6B5D 0x2A632 +0x6B5E 0x2A627 +0x6B5F 0x2A62A +0x6B60 0x2A62C +0x6B62 0x2A628 +0x6B63 0x2A629 +0x6B64 0x2A638 +0x6B65 0x2082F +0x6B66 0x2117B +0x6B67 0x21B0D +0x6B69 0x21FD6 +0x6B6A 0x21FD5 +0x6B6B 0x22EA1 +0x6B6C 0x2384C +0x6B73 0x24FC0 +0x6B77 0x25DF4 +0x6B7A 0x261F0 +0x6B7C 0x2633F +0x6B7E 0x2755D +0x6C21 0x27572 +0x6C22 0x27562 +0x6C24 0x27566 +0x6C27 0x27B88 +0x6C2A 0x281E8 +0x6C2B 0x281E4 +0x6C2F 0x288FF +0x6C31 0x291AF +0x6C32 0x291AE +0x6C35 0x293F2 +0x6C36 0x29448 +0x6C37 0x29581 +0x6C38 0x2957E +0x6C3B 0x29652 +0x6C3C 0x297EF +0x6C3F 0x29AAD +0x6C40 0x29BE6 +0x6C42 0x29BED +0x6C44 0x29BE9 +0x6C45 0x29C61 +0x6C46 0x29C60 +0x6C47 0x29D33 +0x6C4B 0x29F0B +0x6C4C 0x29F08 +0x6C4F 0x29F07 +0x6C53 0x2A1CA +0x6C55 0x2A1C6 +0x6C57 0x2A284 +0x6C58 0x2A2EB +0x6C59 0x2A37D +0x6C5C 0x2A49B +0x6C5D 0x2A4A2 +0x6C5E 0x2A4A1 +0x6C5F 0x2A4A0 +0x6C60 0x2A49C +0x6C63 0x2A580 +0x6C65 0x2A640 +0x6C67 0x2A639 +0x6C68 0x2A63C +0x6C6B 0x208CA +0x6C6D 0x21189 +0x6C6F 0x2303C +0x6C70 0x23940 +0x6C71 0x24163 +0x6C72 0x24169 +0x6C74 0x25353 +0x6C77 0x25917 +0x6C78 0x2591A +0x6C79 0x25E00 +0x6C7E 0x2756F +0x6D21 0x278AB +0x6D23 0x27B91 +0x6D26 0x27FB1 +0x6D28 0x281EF +0x6D29 0x28DF1 +0x6D2A 0x28DF2 +0x6D2B 0x291B7 +0x6D2C 0x291B5 +0x6D2E 0x29586 +0x6D2F 0x2965A +0x6D31 0x299C6 +0x6D32 0x299CB +0x6D34 0x29AB2 +0x6D36 0x29BF3 +0x6D38 0x29F27 +0x6D3B 0x2A1D5 +0x6D3C 0x2A1D8 +0x6D3E 0x2A1EC +0x6D3F 0x2A287 +0x6D40 0x2A2F2 +0x6D45 0x2A4AD +0x6D46 0x2A4B0 +0x6D47 0x2A4FD +0x6D49 0x2A587 +0x6D4A 0x2A64A +0x6D4D 0x2A64E +0x6D4E 0x2A649 +0x6D4F 0x2A651 +0x6D50 0x2A64D +0x6D52 0x20472 +0x6D54 0x21B16 +0x6D55 0x2386D +0x6D56 0x23941 +0x6D58 0x24171 +0x6D59 0x24174 +0x6D5D 0x25F7C +0x6D5F 0x2718A +0x6D60 0x27956 +0x6D63 0x28BFA +0x6D66 0x2965B +0x6D6A 0x2A1F5 +0x6D6B 0x2A1F0 +0x6D6C 0x2A2F3 +0x6D6D 0x2A37F +0x6D6E 0x2A413 +0x6D71 0x21B19 +0x6D72 0x22985 +0x6D73 0x22EB0 +0x6D74 0x24177 +0x6D75 0x255FF +0x6D7A 0x27187 +0x6D7C 0x2718B +0x6D7E 0x27B9E +0x6E23 0x2958F +0x6E26 0x29839 +0x6E27 0x299D4 +0x6E28 0x29AF1 +0x6E29 0x29C02 +0x6E2A 0x29C6B +0x6E2B 0x29D40 +0x6E2E 0x2A210 +0x6E2F 0x2A4BE +0x6E30 0x2A4B9 +0x6E32 0x2A664 +0x6E34 0x24AE9 +0x6E35 0x27190 +0x6E38 0x2721C +0x6E3A 0x27592 +0x6E3B 0x278AE +0x6E3C 0x27BA3 +0x6E3E 0x291C9 +0x6E40 0x299D8 +0x6E41 0x29D44 +0x6E42 0x2A224 +0x6E46 0x2A670 +0x6E47 0x2A6D3 +0x6E4A 0x2A4C3 +0x6E4E 0x25E21 +0x6E4F 0x26ACA +0x6E50 0x2759C +0x6E51 0x29C73 +0x6E52 0x2A386 +0x6E53 0x2A5C1 +0x6E54 0x29C09 +0x6E56 0x2A6D5 +0x6E5C 0x291D4 diff --git a/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane5.surrogates b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane5.surrogates new file mode 100644 index 00000000000..7c7131f8517 --- /dev/null +++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane5.surrogates @@ -0,0 +1,8143 @@ +0x2121 0x200D1 +0x2122 0x200CB +0x2123 0x200C9 +0x2124 0x2010C +0x2125 0x20000 +0x2126 0x20087 +0x2127 0x2010D +0x2128 0x2010F +0x2129 0x2F81D +0x212A 0x22398 +0x212B 0x200D2 +0x212C 0x20111 +0x212D 0x2007E +0x212E 0x20AD3 +0x212F 0x21552 +0x2130 0x21CFE +0x2131 0x225A9 +0x2132 0x23942 +0x2133 0x20009 +0x2134 0x200D6 +0x2135 0x204DD +0x2136 0x204DC +0x2137 0x20502 +0x2138 0x20573 +0x2139 0x20676 +0x213A 0x206A7 +0x213B 0x206A8 +0x213C 0x20833 +0x213D 0x208CC +0x213E 0x20A0D +0x213F 0x20A2C +0x2140 0x20B1B +0x2142 0x20B1D +0x2143 0x20B99 +0x2144 0x2123E +0x2145 0x21D2D +0x2146 0x21D2F +0x2147 0x22399 +0x2148 0x233B3 +0x2149 0x239B6 +0x214A 0x23B1B +0x214B 0x244EF +0x214C 0x248E9 +0x214D 0x20014 +0x214E 0x20094 +0x214F 0x200E1 +0x2150 0x20506 +0x2151 0x2054A +0x2152 0x20544 +0x2153 0x20631 +0x2154 0x2067A +0x2155 0x206AD +0x2156 0x206AE +0x2157 0x206B1 +0x2158 0x20838 +0x2159 0x20837 +0x215A 0x2097D +0x215B 0x2097E +0x215C 0x20A2D +0x215D 0x20A32 +0x215E 0x20B23 +0x215F 0x20B26 +0x2160 0x2F83A +0x2161 0x20BA0 +0x2162 0x216A8 +0x2163 0x2193F +0x2164 0x219BC +0x2165 0x21BC4 +0x2166 0x21D3B +0x2167 0x22019 +0x2168 0x22018 +0x2169 0x221B3 +0x216A 0x223AA +0x216B 0x224BE +0x216C 0x225AC +0x216D 0x22A25 +0x216E 0x22A66 +0x216F 0x22A6B +0x2170 0x23943 +0x2171 0x239B5 +0x2172 0x23AEC +0x2173 0x23C76 +0x2175 0x24614 +0x2176 0x215DC +0x2177 0x2471C +0x2178 0x2471D +0x2179 0x264D0 +0x217A 0x26612 +0x217B 0x26AF3 +0x217C 0x28669 +0x217E 0x28E11 +0x2221 0x28E15 +0x2222 0x28E10 +0x2223 0x28E13 +0x2224 0x200A4 +0x2225 0x200A5 +0x2226 0x201D0 +0x2227 0x201BA +0x2228 0x201CB +0x2229 0x2057B +0x222A 0x20686 +0x222B 0x206BB +0x222C 0x206BA +0x222D 0x206C3 +0x222E 0x206B9 +0x222F 0x206C0 +0x2231 0x20839 +0x2232 0x2083B +0x2233 0x20841 +0x2234 0x208D1 +0x2235 0x208CF +0x2236 0x208D2 +0x2237 0x2092E +0x2238 0x2096E +0x2239 0x2098C +0x223A 0x20988 +0x223B 0x20A35 +0x223D 0x20A3A +0x223E 0x20A3B +0x223F 0x20A38 +0x2240 0x20A39 +0x2241 0x20B2E +0x2242 0x20B2C +0x2243 0x20BC8 +0x2244 0x20BB5 +0x2245 0x20BAD +0x2246 0x20BB0 +0x2247 0x20BAB +0x2248 0x211B3 +0x2249 0x211A9 +0x224A 0x216BB +0x224B 0x216B9 +0x224C 0x21B5A +0x224D 0x21BCD +0x224E 0x21C2B +0x224F 0x21D05 +0x2252 0x21D51 +0x2253 0x21D4B +0x2254 0x21FEA +0x2255 0x21FED +0x2256 0x22036 +0x2257 0x22062 +0x2258 0x22056 +0x2259 0x22055 +0x225A 0x22064 +0x225B 0x22058 +0x225D 0x221DA +0x225E 0x221D8 +0x225F 0x223AD +0x2260 0x223AB +0x2261 0x224C0 +0x2262 0x224C3 +0x2263 0x225B3 +0x2264 0x225B7 +0x2265 0x225BA +0x2268 0x225C7 +0x2269 0x225B5 +0x226A 0x2298E +0x226B 0x22A73 +0x226C 0x22A6C +0x226D 0x22A74 +0x226E 0x2F8B4 +0x226F 0x22A72 +0x2270 0x22A71 +0x2271 0x22A82 +0x2272 0x22A70 +0x2273 0x2313F +0x2274 0x233BA +0x2275 0x233B8 +0x2276 0x239B7 +0x2277 0x24723 +0x2278 0x24721 +0x2279 0x2472B +0x227A 0x24726 +0x227B 0x24722 +0x227C 0x24D25 +0x227D 0x250E4 +0x227E 0x25415 +0x2321 0x264E4 +0x2322 0x26633 +0x2323 0x2662A +0x2324 0x26632 +0x2325 0x26629 +0x2326 0x26AFB +0x2327 0x2795B +0x2328 0x2795C +0x2329 0x27C28 +0x232A 0x2866F +0x232B 0x2866D +0x232C 0x2866B +0x232D 0x2866E +0x232E 0x28E16 +0x232F 0x20022 +0x2330 0x20116 +0x2331 0x20148 +0x2332 0x201D8 +0x2333 0x20200 +0x2335 0x20480 +0x2336 0x204E4 +0x2338 0x204E7 +0x2339 0x2050C +0x233A 0x20553 +0x233B 0x205B7 +0x233C 0x20AE8 +0x233D 0x206D1 +0x233E 0x206E5 +0x233F 0x206D8 +0x2340 0x206D6 +0x2341 0x206DA +0x2342 0x206D9 +0x2343 0x206D5 +0x2344 0x206E6 +0x2345 0x206D4 +0x2346 0x206D3 +0x2347 0x20844 +0x2348 0x208D6 +0x2349 0x208D7 +0x234A 0x20913 +0x234C 0x20970 +0x234D 0x20992 +0x234E 0x209DB +0x234F 0x209DA +0x2350 0x20A41 +0x2351 0x20A43 +0x2352 0x20B33 +0x2353 0x20BF6 +0x2354 0x20BD4 +0x2355 0x20BDD +0x2356 0x20BD0 +0x2357 0x20C04 +0x2358 0x20BD9 +0x2359 0x20BDB +0x235A 0x20C05 +0x235B 0x20BD3 +0x235C 0x20BE1 +0x235D 0x21280 +0x235E 0x21277 +0x235F 0x21281 +0x2360 0x21282 +0x2361 0x21283 +0x2362 0x2F85C +0x2363 0x21561 +0x2364 0x21560 +0x2365 0x216D8 +0x2366 0x216D6 +0x2367 0x216D7 +0x2368 0x24605 +0x2369 0x2194D +0x236A 0x21948 +0x236B 0x21BD6 +0x236C 0x21BCF +0x236D 0x21BD9 +0x236E 0x21BD8 +0x236F 0x21C3D +0x2371 0x21D54 +0x2372 0x21D5B +0x2373 0x21D5C +0x2375 0x21D59 +0x2376 0x21D58 +0x2377 0x21D5A +0x2378 0x21D55 +0x2379 0x21D56 +0x237A 0x21D82 +0x237B 0x21FF0 +0x237C 0x2201C +0x237D 0x2206A +0x237E 0x22069 +0x2421 0x22071 +0x2422 0x22067 +0x2423 0x2206C +0x2424 0x2206E +0x2425 0x22079 +0x2426 0x2218B +0x2427 0x221B8 +0x2428 0x221E7 +0x2429 0x221E8 +0x242A 0x221E4 +0x242B 0x221E6 +0x242C 0x221E5 +0x242D 0x221F0 +0x242E 0x22383 +0x242F 0x223B7 +0x2430 0x223BB +0x2431 0x223B9 +0x2432 0x223C5 +0x2433 0x22453 +0x2434 0x224C4 +0x2435 0x224C6 +0x2436 0x224CB +0x2437 0x225C8 +0x2438 0x2F89F +0x2439 0x225C9 +0x243A 0x225DB +0x243B 0x22994 +0x243C 0x22A95 +0x243D 0x22A88 +0x243E 0x22A8D +0x243F 0x22EEC +0x2440 0x22EEE +0x2441 0x22EF1 +0x2442 0x2312E +0x2443 0x23149 +0x2444 0x2335F +0x2445 0x233D1 +0x2446 0x233CB +0x2447 0x23885 +0x2449 0x2394A +0x244A 0x23947 +0x244B 0x2394B +0x244C 0x239BB +0x244D 0x239C4 +0x244F 0x23B02 +0x2450 0x23C82 +0x2451 0x23C91 +0x2452 0x23C8F +0x2453 0x23C92 +0x2454 0x2418F +0x2455 0x24191 +0x2456 0x241B4 +0x2457 0x24192 +0x2458 0x244F4 +0x2459 0x245AA +0x245A 0x24735 +0x245B 0x24737 +0x245C 0x2473D +0x245D 0x2473C +0x245E 0x2472F +0x245F 0x24730 +0x2460 0x248F8 +0x2461 0x248EF +0x2462 0x24B26 +0x2464 0x24D26 +0x2465 0x24D27 +0x2466 0x24F41 +0x2467 0x24FC6 +0x2468 0x24FC7 +0x2469 0x250EB +0x246A 0x250E8 +0x246B 0x250EA +0x246C 0x2541A +0x246D 0x25419 +0x246F 0x25923 +0x2470 0x25924 +0x2471 0x25E25 +0x2472 0x26635 +0x2473 0x26634 +0x2474 0x26A07 +0x2475 0x2721D +0x2476 0x277E1 +0x2477 0x27BAB +0x2478 0x28460 +0x2479 0x28677 +0x247A 0x2867D +0x247C 0x28E1E +0x247D 0x28E1A +0x247E 0x28E1D +0x2521 0x2006B +0x2522 0x2012D +0x2523 0x2014C +0x2524 0x2022A +0x2526 0x20215 +0x2527 0x2022C +0x2528 0x20206 +0x2529 0x20208 +0x252A 0x2020A +0x252C 0x20556 +0x252D 0x20584 +0x252F 0x205C6 +0x2530 0x206F5 +0x2531 0x20709 +0x2532 0x206F8 +0x2533 0x206E8 +0x2534 0x206FB +0x2535 0x206E9 +0x2536 0x206F6 +0x2539 0x20852 +0x253C 0x20854 +0x253D 0x20851 +0x253E 0x20939 +0x253F 0x2093A +0x2540 0x20998 +0x2541 0x20A4E +0x2543 0x20C36 +0x2544 0x20C0C +0x2545 0x20C10 +0x2546 0x20C32 +0x2547 0x20C11 +0x2548 0x20C18 +0x2549 0x20C1C +0x254A 0x20C1A +0x254B 0x20C19 +0x254C 0x20C0B +0x254D 0x20C0F +0x254E 0x20C1D +0x254F 0x20C21 +0x2550 0x20C13 +0x2551 0x20C1B +0x2552 0x20C15 +0x2554 0x211D1 +0x2555 0x211C8 +0x2556 0x2128D +0x2557 0x212B5 +0x255A 0x215F8 +0x255B 0x216E0 +0x255C 0x216E1 +0x255E 0x216DE +0x255F 0x216FE +0x2560 0x216DC +0x2561 0x21701 +0x2562 0x216FD +0x2563 0x21700 +0x2564 0x219D7 +0x2565 0x219D6 +0x2566 0x219D9 +0x2567 0x21B65 +0x2568 0x21BD2 +0x2569 0x21BDC +0x256A 0x21BE1 +0x256B 0x21BDE +0x256C 0x21C42 +0x256D 0x21C4B +0x256F 0x21D8E +0x2570 0x21D91 +0x2571 0x21D8B +0x2572 0x21D90 +0x2573 0x21D88 +0x2574 0x21D89 +0x2575 0x21D84 +0x2576 0x21DAA +0x2577 0x2208D +0x2578 0x2208F +0x2579 0x2207D +0x257A 0x2207F +0x257B 0x2207B +0x257C 0x22080 +0x257D 0x2207E +0x257E 0x22083 +0x2621 0x22081 +0x2622 0x22086 +0x2623 0x2208A +0x2624 0x221BD +0x2625 0x221BE +0x2627 0x221F4 +0x2628 0x221F3 +0x2629 0x22202 +0x262A 0x221F6 +0x262B 0x221F5 +0x262C 0x221F2 +0x262D 0x22204 +0x262E 0x2233D +0x262F 0x223C6 +0x2630 0x22489 +0x2631 0x224D4 +0x2632 0x224D6 +0x2633 0x224D2 +0x2634 0x225FA +0x2635 0x22606 +0x2636 0x2260C +0x2637 0x2260A +0x2638 0x2260F +0x2639 0x22A2F +0x263B 0x22AB7 +0x263C 0x22ABE +0x263D 0x22ABC +0x263E 0x22AE2 +0x263F 0x22F06 +0x2640 0x22EF7 +0x2641 0x22F07 +0x2642 0x22EF6 +0x2643 0x23B35 +0x2644 0x2315F +0x2645 0x23165 +0x2646 0x23164 +0x2647 0x23161 +0x2648 0x2315A +0x2649 0x2315D +0x264A 0x2F8D7 +0x264B 0x233D7 +0x264C 0x233D5 +0x264D 0x233DE +0x264E 0x233E1 +0x264F 0x233E0 +0x2650 0x233D9 +0x2652 0x233DA +0x2653 0x233DF +0x2654 0x233F6 +0x2655 0x23403 +0x2657 0x23893 +0x2658 0x2388B +0x2659 0x23891 +0x265A 0x23892 +0x265B 0x2388A +0x265C 0x23889 +0x265D 0x2388F +0x265E 0x23956 +0x265F 0x23959 +0x2660 0x239CA +0x2661 0x239CC +0x2663 0x239D0 +0x2664 0x239CD +0x2665 0x239D6 +0x2666 0x239CB +0x2667 0x23A83 +0x2668 0x23A82 +0x2669 0x23B06 +0x266A 0x23B2A +0x266B 0x23B2C +0x266C 0x23B2B +0x266D 0x23B29 +0x266E 0x23CBD +0x266F 0x23CB3 +0x2670 0x23CBE +0x2671 0x23CC0 +0x2672 0x23CB5 +0x2673 0x23CB6 +0x2674 0x2419D +0x2675 0x2419F +0x2676 0x24620 +0x2678 0x2461E +0x2679 0x2461C +0x267A 0x24632 +0x267B 0x2461F +0x267C 0x2462B +0x267D 0x24621 +0x267E 0x24626 +0x2721 0x24624 +0x2722 0x2461D +0x2723 0x24627 +0x2724 0x2475B +0x2725 0x24759 +0x2726 0x24780 +0x2727 0x24755 +0x2728 0x24750 +0x2729 0x2475A +0x272A 0x24756 +0x272B 0x24763 +0x272C 0x24752 +0x272D 0x24758 +0x272F 0x24739 +0x2730 0x248F9 +0x2731 0x24B28 +0x2733 0x24BBC +0x2734 0x24BD6 +0x2735 0x24C05 +0x2736 0x24C20 +0x2738 0x24D33 +0x2739 0x24F46 +0x273A 0x24F42 +0x273B 0x24F43 +0x273C 0x24F47 +0x273D 0x24FCB +0x273E 0x25042 +0x273F 0x25045 +0x2740 0x250FD +0x2741 0x250F4 +0x2742 0x250F9 +0x2743 0x250FA +0x2744 0x2535E +0x2745 0x2541D +0x2747 0x25758 +0x2748 0x25755 +0x2749 0x25A57 +0x274A 0x25A58 +0x274B 0x25AD9 +0x274C 0x25ADC +0x274D 0x25ADB +0x274E 0x25E27 +0x274F 0x25F85 +0x2750 0x25F87 +0x2751 0x25F8A +0x2752 0x2628B +0x2753 0x2634F +0x2754 0x26530 +0x2755 0x2652F +0x2756 0x26668 +0x2757 0x26649 +0x2759 0x26648 +0x275A 0x2663F +0x275B 0x2664B +0x275C 0x2665C +0x275D 0x26646 +0x275E 0x26640 +0x275F 0x26A0D +0x2760 0x26B1B +0x2761 0x26B1D +0x2762 0x26B17 +0x2764 0x26B22 +0x2765 0x275A7 +0x2766 0x27608 +0x2767 0x27806 +0x2768 0x2847D +0x276A 0x28463 +0x276B 0x28464 +0x276C 0x2847F +0x276D 0x2846B +0x276E 0x2847C +0x276F 0x28468 +0x2770 0x28465 +0x2771 0x2846A +0x2772 0x28698 +0x2773 0x28699 +0x2774 0x286AE +0x2775 0x28E2B +0x2776 0x28E2D +0x2777 0x28E31 +0x2778 0x28E2E +0x2779 0x28E2F +0x277A 0x2006D +0x277B 0x20131 +0x277C 0x2022D +0x277D 0x20239 +0x277E 0x20238 +0x2822 0x2023A +0x2823 0x20235 +0x2824 0x20262 +0x2825 0x204EA +0x2826 0x204EB +0x2827 0x20515 +0x2828 0x205CC +0x2829 0x205C8 +0x282A 0x205CD +0x282B 0x205DB +0x282C 0x205CB +0x282D 0x20711 +0x282E 0x20726 +0x282F 0x20862 +0x2830 0x2085E +0x2831 0x20861 +0x2832 0x20941 +0x2833 0x2093F +0x2834 0x20975 +0x2835 0x23965 +0x2836 0x20B49 +0x2837 0x209EB +0x2838 0x20A1A +0x2839 0x20A57 +0x283A 0x20C6B +0x283B 0x20CA9 +0x283C 0x20C54 +0x283D 0x20C62 +0x283E 0x20CAA +0x283F 0x20C58 +0x2840 0x20C72 +0x2841 0x20C63 +0x2842 0x20C73 +0x2843 0x20C8B +0x2844 0x20C8C +0x2845 0x20C5C +0x2846 0x20C51 +0x2847 0x20C16 +0x2848 0x20C60 +0x2849 0x20C61 +0x284A 0x20C5E +0x284B 0x20C5D +0x284C 0x20C64 +0x284D 0x20C53 +0x284E 0x20C5F +0x284F 0x20C5B +0x2850 0x20C6E +0x2851 0x20C55 +0x2852 0x20C52 +0x2853 0x20C68 +0x2854 0x211D2 +0x2855 0x211D6 +0x2856 0x211D3 +0x2857 0x212B8 +0x2858 0x212BB +0x2859 0x212EB +0x285A 0x212E8 +0x285B 0x212B6 +0x285C 0x212EA +0x285D 0x212E7 +0x285E 0x212E9 +0x285F 0x21591 +0x2860 0x21610 +0x2861 0x2160E +0x2862 0x2160F +0x2863 0x2170B +0x2864 0x21703 +0x2865 0x2172B +0x2866 0x21709 +0x2867 0x21728 +0x2868 0x2172C +0x2869 0x21725 +0x286A 0x21727 +0x286B 0x2170F +0x286C 0x219E9 +0x286D 0x219EC +0x286F 0x21B27 +0x2870 0x21B73 +0x2871 0x21BE2 +0x2872 0x21BE6 +0x2873 0x2F876 +0x2874 0x21C61 +0x2875 0x21C51 +0x2876 0x21D12 +0x2877 0x21D0E +0x2878 0x21DAD +0x2879 0x21DAF +0x287A 0x21DB1 +0x287B 0x21DD3 +0x287C 0x22094 +0x287D 0x22092 +0x287E 0x22090 +0x2921 0x2209D +0x2922 0x22093 +0x2923 0x22095 +0x2924 0x22098 +0x2925 0x22097 +0x2927 0x2F88A +0x2928 0x22207 +0x2929 0x2220B +0x292A 0x22208 +0x292B 0x223D9 +0x292C 0x223D5 +0x292D 0x224D7 +0x292E 0x224DF +0x2930 0x224DE +0x2931 0x224E3 +0x2932 0x224E2 +0x2934 0x22647 +0x2936 0x2263D +0x2937 0x22638 +0x2938 0x22A44 +0x2939 0x22A3A +0x293A 0x22AB8 +0x293B 0x22B2A +0x293C 0x22B00 +0x293D 0x22AF3 +0x293E 0x22AF2 +0x293F 0x22AEB +0x2940 0x22AFA +0x2941 0x22AED +0x2942 0x22AEC +0x2943 0x22AFF +0x2944 0x22AFB +0x2946 0x22B4E +0x2947 0x22AEF +0x2948 0x22AF7 +0x2949 0x22F10 +0x294A 0x22F11 +0x294B 0x22F0C +0x294C 0x22F0B +0x294D 0x230DD +0x294E 0x23130 +0x2950 0x2317A +0x2951 0x23177 +0x2952 0x23328 +0x2953 0x23327 +0x2954 0x23365 +0x2955 0x2340E +0x2956 0x2340B +0x2957 0x23441 +0x2958 0x23413 +0x2959 0x2340F +0x295A 0x23412 +0x295B 0x23430 +0x295C 0x238A0 +0x295D 0x238A3 +0x295E 0x2389E +0x295F 0x23897 +0x2960 0x238A1 +0x2961 0x2389D +0x2962 0x2389B +0x2963 0x23963 +0x2964 0x239E3 +0x2965 0x239E4 +0x2966 0x239E6 +0x2967 0x239E7 +0x2968 0x239DD +0x296A 0x239EC +0x296B 0x239E5 +0x296C 0x239F1 +0x296D 0x23B3B +0x296E 0x23B39 +0x296F 0x23B3A +0x2970 0x23B3C +0x2971 0x23B3D +0x2972 0x23B47 +0x2973 0x23B3F +0x2974 0x23B44 +0x2975 0x23C48 +0x2976 0x23C49 +0x2977 0x23C60 +0x2978 0x23CE3 +0x2979 0x23CE9 +0x297A 0x23CF0 +0x297D 0x23CF2 +0x297E 0x23CED +0x2A21 0x23CEC +0x2A22 0x23CE6 +0x2A23 0x23D16 +0x2A25 0x241BC +0x2A26 0x241BE +0x2A27 0x241C0 +0x2A28 0x241E0 +0x2A29 0x24500 +0x2A2A 0x24502 +0x2A2B 0x244FE +0x2A2C 0x2455E +0x2A2D 0x245B3 +0x2A2E 0x245B7 +0x2A2F 0x2463A +0x2A30 0x24639 +0x2A31 0x2463E +0x2A32 0x24638 +0x2A33 0x2463D +0x2A34 0x2464F +0x2A35 0x2476E +0x2A36 0x2475F +0x2A37 0x24781 +0x2A38 0x24782 +0x2A39 0x24771 +0x2A3A 0x2477B +0x2A3B 0x24779 +0x2A3C 0x24777 +0x2A3D 0x24773 +0x2A3E 0x2476F +0x2A3F 0x24797 +0x2A40 0x2477E +0x2A41 0x248FC +0x2A42 0x24911 +0x2A43 0x24932 +0x2A44 0x24931 +0x2A45 0x24910 +0x2A46 0x24AEC +0x2A47 0x24AEB +0x2A48 0x24B2C +0x2A49 0x24B2D +0x2A4A 0x24BDA +0x2A4B 0x24C2E +0x2A4C 0x24C2C +0x2A4D 0x24C2A +0x2A4E 0x24C33 +0x2A4F 0x24C4B +0x2A50 0x24D18 +0x2A51 0x24D42 +0x2A52 0x24D3B +0x2A53 0x24D3F +0x2A54 0x24D41 +0x2A55 0x24D43 +0x2A56 0x24D3C +0x2A57 0x24F4C +0x2A58 0x24F4A +0x2A59 0x24F49 +0x2A5A 0x24F56 +0x2A5B 0x24FCF +0x2A5C 0x25047 +0x2A5D 0x25048 +0x2A5E 0x25046 +0x2A5F 0x2511B +0x2A60 0x25111 +0x2A61 0x25114 +0x2A62 0x2511D +0x2A63 0x25117 +0x2A64 0x2511E +0x2A65 0x2510B +0x2A66 0x2511C +0x2A67 0x25112 +0x2A68 0x25116 +0x2A69 0x2510D +0x2A6A 0x25115 +0x2A6B 0x25113 +0x2A6C 0x25118 +0x2A6E 0x253AC +0x2A6F 0x25444 +0x2A70 0x2542C +0x2A71 0x25445 +0x2A72 0x25766 +0x2A73 0x2576E +0x2A74 0x25765 +0x2A75 0x25768 +0x2A76 0x25784 +0x2A77 0x25938 +0x2A78 0x2593B +0x2A79 0x2593A +0x2A7A 0x2593F +0x2A7B 0x25ADF +0x2A7C 0x25ADD +0x2A7D 0x25ADE +0x2A7E 0x25AE2 +0x2B22 0x25E2C +0x2B23 0x25E2F +0x2B24 0x25F8F +0x2B25 0x25F90 +0x2B26 0x25F8C +0x2B27 0x25F93 +0x2B28 0x26225 +0x2B29 0x26288 +0x2B2A 0x262A7 +0x2B2B 0x263F7 +0x2B2C 0x264BB +0x2B2D 0x26538 +0x2B2E 0x26539 +0x2B2F 0x26537 +0x2B30 0x26614 +0x2B31 0x2666E +0x2B32 0x2667B +0x2B34 0x2666C +0x2B35 0x2667F +0x2B36 0x26678 +0x2B37 0x2667A +0x2B38 0x2666F +0x2B3A 0x268FE +0x2B3B 0x26B48 +0x2B3C 0x26B4B +0x2B3D 0x26B41 +0x2B3E 0x26B49 +0x2B3F 0x26B3B +0x2B40 0x2722D +0x2B41 0x275E3 +0x2B42 0x2761A +0x2B43 0x2760D +0x2B44 0x27613 +0x2B45 0x27611 +0x2B46 0x2761C +0x2B48 0x278B5 +0x2B4A 0x27C29 +0x2B4B 0x27CA1 +0x2B4C 0x27D24 +0x2B4D 0x27FBB +0x2B4E 0x282A1 +0x2B4F 0x28483 +0x2B50 0x2848D +0x2B51 0x28487 +0x2B52 0x28485 +0x2B53 0x2848A +0x2B54 0x284A3 +0x2B55 0x28489 +0x2B56 0x28484 +0x2B57 0x284A2 +0x2B58 0x286B1 +0x2B59 0x286B0 +0x2B5A 0x286AF +0x2B5B 0x286B6 +0x2B5C 0x286C9 +0x2B5D 0x286CA +0x2B5E 0x286C8 +0x2B5F 0x286B4 +0x2B60 0x28C59 +0x2B61 0x28CC9 +0x2B62 0x28E41 +0x2B63 0x28E4C +0x2B65 0x28E45 +0x2B66 0x28E5A +0x2B67 0x200B9 +0x2B68 0x20294 +0x2B69 0x2026E +0x2B6A 0x202A2 +0x2B6B 0x20267 +0x2B6D 0x202A3 +0x2B6E 0x20276 +0x2B6F 0x2026C +0x2B70 0x20264 +0x2B71 0x202A5 +0x2B72 0x20230 +0x2B73 0x202A6 +0x2B74 0x20269 +0x2B75 0x202A4 +0x2B76 0x20490 +0x2B77 0x2055F +0x2B78 0x20560 +0x2B79 0x205DA +0x2B7A 0x205D8 +0x2B7B 0x205DD +0x2B7D 0x20759 +0x2B7E 0x2075B +0x2C21 0x2075A +0x2C22 0x20739 +0x2C23 0x20734 +0x2C24 0x20744 +0x2C25 0x20733 +0x2C26 0x2073C +0x2C27 0x20758 +0x2C28 0x2076A +0x2C29 0x2086F +0x2C2A 0x20872 +0x2C2B 0x20870 +0x2C2C 0x20871 +0x2C2D 0x2086E +0x2C2E 0x208F0 +0x2C2F 0x208EB +0x2C30 0x20949 +0x2C31 0x2094C +0x2C32 0x209F5 +0x2C33 0x20A20 +0x2C34 0x20A6A +0x2C35 0x20A72 +0x2C36 0x20B4B +0x2C37 0x20B5D +0x2C38 0x20C50 +0x2C39 0x20CF9 +0x2C3A 0x20CFA +0x2C3B 0x20CFB +0x2C3C 0x20D23 +0x2C3D 0x20CB7 +0x2C3E 0x20D22 +0x2C3F 0x20CB5 +0x2C40 0x20CC4 +0x2C41 0x20CB4 +0x2C42 0x20CEF +0x2C44 0x20CCD +0x2C45 0x20CF0 +0x2C46 0x20CB8 +0x2C47 0x20CCB +0x2C48 0x20CF1 +0x2C49 0x20CBA +0x2C4A 0x20D03 +0x2C4B 0x20CF8 +0x2C4C 0x20CB6 +0x2C4D 0x20CBC +0x2C4E 0x20CB3 +0x2C4F 0x20D21 +0x2C50 0x20CF7 +0x2C51 0x20CC2 +0x2C52 0x20CBE +0x2C53 0x20CC9 +0x2C54 0x20CBD +0x2C55 0x20CCE +0x2C56 0x20CB9 +0x2C57 0x20CC7 +0x2C58 0x20CCA +0x2C59 0x20CCC +0x2C5A 0x20D26 +0x2C5B 0x211E4 +0x2C5C 0x211E0 +0x2C5D 0x211F0 +0x2C5E 0x212EC +0x2C5F 0x21324 +0x2C60 0x21318 +0x2C61 0x2132F +0x2C62 0x21325 +0x2C63 0x21528 +0x2C64 0x21522 +0x2C65 0x2156A +0x2C66 0x20157 +0x2C67 0x21594 +0x2C68 0x21592 +0x2C69 0x2159C +0x2C6A 0x21622 +0x2C6B 0x21630 +0x2C6C 0x2161D +0x2C6D 0x21623 +0x2C6E 0x21735 +0x2C6F 0x21733 +0x2C70 0x2172F +0x2C71 0x2174D +0x2C72 0x21731 +0x2C73 0x2175B +0x2C74 0x2175A +0x2C75 0x21732 +0x2C76 0x2175C +0x2C77 0x21759 +0x2C78 0x2175D +0x2C79 0x21969 +0x2C7A 0x2196D +0x2C7B 0x22232 +0x2C7D 0x21A0A +0x2C7E 0x21A20 +0x2D21 0x21A1F +0x2D22 0x21A0D +0x2D23 0x21BE8 +0x2D24 0x21BEC +0x2D25 0x21C77 +0x2D26 0x21C70 +0x2D27 0x21C71 +0x2D28 0x21DF8 +0x2D29 0x21DD6 +0x2D2A 0x21DD9 +0x2D2B 0x21DDE +0x2D2C 0x21DD5 +0x2D2D 0x21DE1 +0x2D2F 0x21DE2 +0x2D30 0x21DDD +0x2D31 0x21DE0 +0x2D32 0x21E0E +0x2D33 0x21E08 +0x2D34 0x21DDC +0x2D35 0x21E0A +0x2D36 0x21E0C +0x2D37 0x220B4 +0x2D38 0x220B1 +0x2D39 0x220B6 +0x2D3A 0x220BC +0x2D3B 0x2221D +0x2D3C 0x22224 +0x2D3D 0x22219 +0x2D3E 0x2221B +0x2D3F 0x22222 +0x2D40 0x2221A +0x2D41 0x2221C +0x2D42 0x22221 +0x2D43 0x223E6 +0x2D44 0x223E4 +0x2D45 0x223E7 +0x2D46 0x223EA +0x2D48 0x2F89B +0x2D49 0x224F0 +0x2D4A 0x224F5 +0x2D4B 0x224EF +0x2D4C 0x22642 +0x2D4D 0x2266E +0x2D4E 0x2263C +0x2D4F 0x22697 +0x2D50 0x2268C +0x2D51 0x22681 +0x2D52 0x22671 +0x2D53 0x226CE +0x2D54 0x226BA +0x2D55 0x2267A +0x2D56 0x2267E +0x2D58 0x22672 +0x2D59 0x226BB +0x2D5B 0x22673 +0x2D5C 0x22682 +0x2D5E 0x229BA +0x2D5F 0x229B8 +0x2D60 0x22A4B +0x2D61 0x22A48 +0x2D62 0x22B2B +0x2D63 0x22AF4 +0x2D64 0x22B2C +0x2D65 0x22B42 +0x2D66 0x22B48 +0x2D67 0x22B44 +0x2D68 0x22B45 +0x2D69 0x22B3C +0x2D6A 0x22B37 +0x2D6B 0x22B33 +0x2D6C 0x22B41 +0x2D6D 0x22B32 +0x2D6E 0x22B87 +0x2D6F 0x22F27 +0x2D70 0x22F23 +0x2D71 0x22F2D +0x2D72 0x22F1F +0x2D73 0x22F2C +0x2D74 0x22F28 +0x2D75 0x23075 +0x2D76 0x23074 +0x2D77 0x230E7 +0x2D78 0x23132 +0x2D79 0x23131 +0x2D7A 0x23199 +0x2D7B 0x23196 +0x2D7C 0x23198 +0x2D7D 0x2319D +0x2D7E 0x23192 +0x2E21 0x23194 +0x2E22 0x23195 +0x2E23 0x23197 +0x2E24 0x266B9 +0x2E26 0x23411 +0x2E27 0x2343B +0x2E28 0x23479 +0x2E29 0x23442 +0x2E2A 0x23443 +0x2E2C 0x23478 +0x2E2D 0x238AC +0x2E2F 0x238B1 +0x2E30 0x238B4 +0x2E31 0x238B3 +0x2E32 0x238AF +0x2E33 0x238AA +0x2E34 0x238B2 +0x2E35 0x23968 +0x2E36 0x239F2 +0x2E37 0x239FE +0x2E38 0x239F8 +0x2E39 0x239F9 +0x2E3A 0x239FF +0x2E3B 0x239F5 +0x2E3C 0x239F7 +0x2E3D 0x239FD +0x2E3E 0x23A00 +0x2E3F 0x23A88 +0x2E40 0x23B6E +0x2E41 0x23B5D +0x2E42 0x23B63 +0x2E43 0x23B60 +0x2E44 0x23C61 +0x2E45 0x23D37 +0x2E46 0x23D71 +0x2E47 0x23D23 +0x2E48 0x23D22 +0x2E49 0x23D1F +0x2E4A 0x23D25 +0x2E4B 0x241FD +0x2E4C 0x24211 +0x2E4D 0x24223 +0x2E4E 0x241F0 +0x2E4F 0x241EF +0x2E50 0x2450E +0x2E51 0x2450C +0x2E52 0x245BA +0x2E54 0x24652 +0x2E55 0x24655 +0x2E56 0x24653 +0x2E57 0x24654 +0x2E58 0x24651 +0x2E59 0x24658 +0x2E5A 0x247B0 +0x2E5B 0x2479F +0x2E5D 0x247A1 +0x2E5E 0x2479A +0x2E5F 0x247BE +0x2E60 0x247A0 +0x2E61 0x24937 +0x2E63 0x24AF1 +0x2E64 0x24AF2 +0x2E65 0x24B34 +0x2E66 0x24B37 +0x2E67 0x24B35 +0x2E68 0x2238C +0x2E69 0x24BDF +0x2E6A 0x24C4C +0x2E6B 0x24C4E +0x2E6C 0x24C64 +0x2E6D 0x24C63 +0x2E6E 0x24C36 +0x2E6F 0x24D58 +0x2E70 0x24D68 +0x2E71 0x24D5B +0x2E72 0x24D5F +0x2E73 0x24D59 +0x2E74 0x24D65 +0x2E75 0x24D60 +0x2E76 0x24D5E +0x2E77 0x24FD5 +0x2E78 0x24FD6 +0x2E79 0x2504E +0x2E7A 0x25052 +0x2E7B 0x25135 +0x2E7C 0x25139 +0x2E7D 0x25158 +0x2E7E 0x25141 +0x2F21 0x25157 +0x2F22 0x25138 +0x2F23 0x2513D +0x2F24 0x25132 +0x2F25 0x25144 +0x2F26 0x2F944 +0x2F27 0x25363 +0x2F28 0x25362 +0x2F29 0x253B8 +0x2F2A 0x253B0 +0x2F2B 0x253B1 +0x2F2C 0x2544D +0x2F2D 0x25463 +0x2F2E 0x25470 +0x2F2F 0x2544B +0x2F30 0x2544F +0x2F31 0x2544E +0x2F32 0x25453 +0x2F33 0x25447 +0x2F35 0x25454 +0x2F36 0x25452 +0x2F37 0x25459 +0x2F38 0x2547E +0x2F39 0x2562B +0x2F3A 0x2562E +0x2F3B 0x2577F +0x2F3C 0x2577E +0x2F3D 0x25781 +0x2F3E 0x25783 +0x2F3F 0x25947 +0x2F40 0x25954 +0x2F41 0x2594D +0x2F42 0x2594C +0x2F43 0x2594B +0x2F44 0x25957 +0x2F45 0x25A65 +0x2F46 0x25A64 +0x2F47 0x25A61 +0x2F48 0x25A62 +0x2F49 0x25AF0 +0x2F4A 0x25AF3 +0x2F4B 0x25AF9 +0x2F4C 0x25AF4 +0x2F4D 0x25AF5 +0x2F4E 0x25AEF +0x2F4F 0x25AF8 +0x2F50 0x25AFC +0x2F51 0x25AF7 +0x2F52 0x25AFD +0x2F53 0x25B17 +0x2F54 0x25E34 +0x2F55 0x25E36 +0x2F56 0x25E38 +0x2F57 0x25FAF +0x2F58 0x25FAE +0x2F59 0x25FAC +0x2F5A 0x25FA2 +0x2F5B 0x26228 +0x2F5C 0x22EC2 +0x2F5D 0x2629C +0x2F5E 0x262B3 +0x2F5F 0x26290 +0x2F60 0x26406 +0x2F61 0x26404 +0x2F62 0x2640B +0x2F63 0x26405 +0x2F64 0x26540 +0x2F65 0x2654F +0x2F66 0x266AB +0x2F67 0x2669D +0x2F68 0x266B8 +0x2F69 0x266B2 +0x2F6A 0x266D2 +0x2F6B 0x266CF +0x2F6C 0x266A2 +0x2F6E 0x266A5 +0x2F6F 0x266A9 +0x2F70 0x266A7 +0x2F71 0x266D0 +0x2F72 0x26902 +0x2F73 0x269CF +0x2F74 0x269D0 +0x2F75 0x26A16 +0x2F76 0x26A19 +0x2F77 0x26B75 +0x2F78 0x26B71 +0x2F79 0x26B91 +0x2F7A 0x26B72 +0x2F7B 0x26B8E +0x2F7C 0x26B6D +0x2F7D 0x26B88 +0x2F7E 0x26B73 +0x3022 0x26B81 +0x3023 0x26B76 +0x3024 0x26B7B +0x3025 0x26B7F +0x3026 0x26B90 +0x3027 0x26B78 +0x3028 0x2724B +0x3029 0x27248 +0x302A 0x2725B +0x302B 0x27251 +0x302C 0x2723D +0x302D 0x27240 +0x302E 0x27246 +0x302F 0x2724D +0x3030 0x2723B +0x3031 0x2724A +0x3032 0x27241 +0x3033 0x2723E +0x3034 0x2724E +0x3035 0x275AC +0x3036 0x275E6 +0x3037 0x275E9 +0x3038 0x27629 +0x303A 0x27633 +0x303B 0x2762E +0x303C 0x2761E +0x303E 0x2F9C5 +0x303F 0x27622 +0x3040 0x27627 +0x3041 0x277E7 +0x3042 0x2780B +0x3043 0x27966 +0x3044 0x27BAD +0x3045 0x27BAE +0x3047 0x27C2B +0x3048 0x27C2A +0x3049 0x27D2C +0x304A 0x27D2D +0x304D 0x27E8F +0x304E 0x27E93 +0x304F 0x27FC6 +0x3050 0x27FC5 +0x3051 0x28215 +0x3052 0x28213 +0x3053 0x282B1 +0x3054 0x282A9 +0x3056 0x284A8 +0x3057 0x284AB +0x3058 0x284BE +0x3059 0x284AC +0x305A 0x284A9 +0x305B 0x284A6 +0x305C 0x284C1 +0x305D 0x286CC +0x305E 0x286D1 +0x305F 0x286D3 +0x3060 0x286E4 +0x3061 0x286CB +0x3062 0x286E1 +0x3063 0x286D2 +0x3064 0x286E3 +0x3065 0x286CF +0x3066 0x286D0 +0x3067 0x286E5 +0x3068 0x2870E +0x3069 0x28CCC +0x306A 0x28CCA +0x306B 0x28CCB +0x306C 0x28E5C +0x306D 0x28E61 +0x306E 0x28E5D +0x306F 0x28E59 +0x3070 0x29077 +0x3071 0x29684 +0x3072 0x20041 +0x3073 0x200FD +0x3074 0x2011A +0x3075 0x20163 +0x3076 0x202B6 +0x3077 0x202B2 +0x3078 0x202E9 +0x3079 0x202E7 +0x307A 0x202D6 +0x307B 0x20330 +0x307C 0x202EC +0x307D 0x202DD +0x307E 0x202E8 +0x3121 0x202B0 +0x3122 0x202B5 +0x3123 0x202E1 +0x3124 0x20498 +0x3125 0x20499 +0x3127 0x20593 +0x3128 0x205E5 +0x312A 0x20760 +0x312B 0x2075E +0x312D 0x2087B +0x312E 0x208F1 +0x312F 0x208F3 +0x3130 0x20A7F +0x3131 0x2F838 +0x3132 0x20B57 +0x3133 0x20B58 +0x3134 0x20D39 +0x3135 0x20DA7 +0x3136 0x20D35 +0x3137 0x20D60 +0x3138 0x20D51 +0x3139 0x20D62 +0x313A 0x20D42 +0x313B 0x20D3C +0x313C 0x20D43 +0x313D 0x20DAB +0x313E 0x20DA9 +0x313F 0x20DB4 +0x3140 0x20D79 +0x3141 0x20D6A +0x3142 0x20D3B +0x3143 0x20DAA +0x3144 0x20D33 +0x3145 0x20D37 +0x3146 0x20D27 +0x3147 0x20DA8 +0x3148 0x20D70 +0x3149 0x20D2F +0x314A 0x20D36 +0x314B 0x20DB5 +0x314C 0x20D30 +0x314D 0x20D3A +0x314E 0x20D38 +0x314F 0x20DB1 +0x3150 0x20DAC +0x3151 0x20D2E +0x3152 0x20D75 +0x3153 0x20DB0 +0x3154 0x211F7 +0x3155 0x21200 +0x3156 0x211F1 +0x3157 0x211F3 +0x3158 0x21360 +0x3159 0x21361 +0x315A 0x21332 +0x315B 0x2132D +0x315C 0x2134A +0x315D 0x2132A +0x315E 0x21567 +0x315F 0x215A2 +0x3160 0x215A3 +0x3161 0x2159E +0x3162 0x215A4 +0x3163 0x21644 +0x3164 0x21632 +0x3165 0x2179B +0x3166 0x21798 +0x3167 0x21799 +0x3168 0x2179A +0x3169 0x21766 +0x316A 0x21762 +0x316B 0x2176B +0x316C 0x24562 +0x316D 0x21767 +0x316E 0x21A3B +0x316F 0x21A23 +0x3170 0x21A29 +0x3171 0x21B7E +0x3172 0x21BF3 +0x3174 0x21BF5 +0x3176 0x21C80 +0x3177 0x21C7E +0x3178 0x21C7C +0x3179 0x21C7F +0x317A 0x21C7D +0x317B 0x21C81 +0x317C 0x21E25 +0x317D 0x21E29 +0x317E 0x21E17 +0x3221 0x21E63 +0x3222 0x21E67 +0x3223 0x21E65 +0x3224 0x21E2A +0x3225 0x21E68 +0x3226 0x21E26 +0x3227 0x21E64 +0x3228 0x21E1B +0x3229 0x21E62 +0x322A 0x21E69 +0x322B 0x21FFE +0x322C 0x22044 +0x322D 0x22042 +0x322E 0x220B7 +0x322F 0x220D2 +0x3230 0x220D4 +0x3231 0x220D7 +0x3232 0x220DC +0x3233 0x220D1 +0x3234 0x220D5 +0x3235 0x220CD +0x3236 0x220D8 +0x3237 0x2219A +0x3238 0x22242 +0x3239 0x22235 +0x323A 0x22258 +0x323B 0x22234 +0x323C 0x2223C +0x323D 0x2223B +0x323E 0x2223E +0x323F 0x2223D +0x3240 0x2225A +0x3241 0x22241 +0x3242 0x22238 +0x3243 0x22245 +0x3244 0x22233 +0x3245 0x22326 +0x3247 0x223F7 +0x3248 0x223EF +0x3249 0x223F0 +0x324A 0x223EE +0x324B 0x2249D +0x324C 0x22506 +0x324D 0x22511 +0x324E 0x22508 +0x324F 0x22502 +0x3250 0x2250A +0x3251 0x22507 +0x3252 0x22691 +0x3253 0x2268E +0x3254 0x22685 +0x3255 0x226E8 +0x3256 0x22717 +0x3257 0x226D4 +0x3259 0x226C4 +0x325A 0x226D5 +0x325C 0x226D8 +0x325D 0x22680 +0x325E 0x226DE +0x325F 0x22742 +0x3260 0x229C7 +0x3261 0x229BF +0x3262 0x22B8D +0x3263 0x22B89 +0x3264 0x22B90 +0x3265 0x22B9A +0x3266 0x22BC8 +0x3267 0x22B92 +0x3268 0x22BA1 +0x3269 0x22B84 +0x326A 0x22F57 +0x326B 0x22F47 +0x326C 0x22F77 +0x326D 0x22F3A +0x326E 0x22F50 +0x326F 0x22F42 +0x3270 0x22F43 +0x3271 0x22FA3 +0x3272 0x23077 +0x3273 0x231B2 +0x3274 0x231E2 +0x3275 0x231BD +0x3276 0x23374 +0x3277 0x23482 +0x3278 0x234B8 +0x327A 0x234BA +0x327B 0x234B9 +0x327C 0x234BB +0x327D 0x23487 +0x327E 0x2F8E4 +0x3321 0x23483 +0x3322 0x234B7 +0x3323 0x20043 +0x3324 0x238CE +0x3325 0x238BA +0x3326 0x23973 +0x3327 0x23A09 +0x3328 0x23A0A +0x3329 0x23A0B +0x332A 0x23A07 +0x332B 0x23A05 +0x332C 0x23A0E +0x332D 0x23A97 +0x332E 0x23B77 +0x332F 0x23B7B +0x3330 0x23B7A +0x3331 0x23B74 +0x3332 0x23B79 +0x3333 0x23D86 +0x3334 0x23DF5 +0x3335 0x23DA5 +0x3336 0x23D9D +0x3337 0x23DBE +0x3338 0x23D96 +0x3339 0x23DE1 +0x333A 0x23DA4 +0x333B 0x23DA1 +0x333C 0x23DF6 +0x333E 0x23D8D +0x333F 0x23D8B +0x3340 0x23D78 +0x3341 0x23D98 +0x3342 0x23E0A +0x3343 0x2425D +0x3344 0x24227 +0x3345 0x2425F +0x3346 0x245C0 +0x3347 0x245C1 +0x3348 0x2466D +0x3349 0x2465E +0x334A 0x2468A +0x334B 0x24662 +0x334C 0x24664 +0x334E 0x247C0 +0x334F 0x247CA +0x3350 0x247D1 +0x3352 0x247C7 +0x3353 0x247CE +0x3355 0x247C5 +0x3356 0x24936 +0x3357 0x24957 +0x3358 0x24977 +0x3359 0x24AF6 +0x335A 0x24AF7 +0x335B 0x24B55 +0x335C 0x24B44 +0x335D 0x24B3E +0x335E 0x24B42 +0x335F 0x24B52 +0x3360 0x24BE1 +0x3361 0x24C08 +0x3362 0x24C68 +0x3363 0x24C67 +0x3365 0x2F937 +0x3366 0x24D7E +0x3367 0x24D93 +0x3368 0x24D79 +0x3369 0x24D81 +0x336A 0x24D7D +0x336B 0x24D7B +0x336C 0x24D94 +0x336E 0x24F66 +0x336F 0x24FD9 +0x3370 0x24FE0 +0x3371 0x2F93E +0x3372 0x2505F +0x3373 0x2515F +0x3374 0x2515E +0x3375 0x25168 +0x3377 0x25188 +0x3378 0x2516A +0x3379 0x2516C +0x337A 0x25166 +0x337B 0x25167 +0x337C 0x25189 +0x337D 0x25160 +0x337E 0x25185 +0x3421 0x2032A +0x3422 0x25368 +0x3423 0x253B9 +0x3424 0x253BA +0x3425 0x253BE +0x3426 0x2546F +0x3427 0x25480 +0x3428 0x25474 +0x3429 0x25481 +0x342A 0x2547A +0x342B 0x2549C +0x342C 0x25473 +0x342D 0x25482 +0x342E 0x2547F +0x342F 0x254A7 +0x3430 0x25479 +0x3431 0x25478 +0x3432 0x2547D +0x3433 0x254A8 +0x3434 0x2547C +0x3435 0x25668 +0x3436 0x2564E +0x3437 0x2579E +0x343A 0x25798 +0x343C 0x25785 +0x343D 0x2579C +0x343E 0x257C5 +0x343F 0x2579A +0x3440 0x25968 +0x3441 0x25965 +0x3442 0x25967 +0x3443 0x25961 +0x3444 0x25960 +0x3447 0x25A7B +0x3449 0x25B19 +0x344A 0x25B0E +0x344B 0x25B31 +0x344C 0x25B12 +0x344D 0x25B10 +0x344E 0x25B15 +0x344F 0x25B3F +0x3450 0x25B1D +0x3451 0x25B1E +0x3452 0x25E4D +0x3453 0x25E48 +0x3454 0x25E45 +0x3455 0x25E42 +0x3456 0x25E49 +0x3457 0x25E4A +0x3458 0x25E47 +0x345A 0x25E4C +0x345B 0x25FCD +0x345C 0x25FD5 +0x345D 0x25FC4 +0x345E 0x25FCA +0x345F 0x25FC3 +0x3461 0x26229 +0x3462 0x262B4 +0x3463 0x2636D +0x3464 0x26366 +0x3465 0x2636A +0x3466 0x26415 +0x3467 0x264D3 +0x3468 0x264EC +0x3469 0x26555 +0x346B 0x266D6 +0x346C 0x266D8 +0x346D 0x26751 +0x346E 0x266E0 +0x346F 0x26703 +0x3470 0x26704 +0x3471 0x266DA +0x3472 0x266EA +0x3473 0x26702 +0x3474 0x266D3 +0x3475 0x266E4 +0x3476 0x266E5 +0x3477 0x2693B +0x3478 0x26966 +0x3479 0x26A2C +0x347A 0x26A21 +0x347B 0x26A26 +0x347C 0x26AD4 +0x347D 0x26AD5 +0x347E 0x26AD9 +0x3521 0x26BD5 +0x3522 0x26BEB +0x3523 0x26BC5 +0x3525 0x26C27 +0x3526 0x26BF0 +0x3527 0x26BB9 +0x3528 0x26C18 +0x3529 0x26BEE +0x352B 0x26BB7 +0x352C 0x26BBB +0x352D 0x26BEF +0x352E 0x26BB8 +0x352F 0x26BDF +0x3530 0x26BDA +0x3531 0x26BE3 +0x3532 0x26BC9 +0x3533 0x26BEC +0x3534 0x271A4 +0x3536 0x271A3 +0x3537 0x2725E +0x3538 0x27261 +0x3539 0x27262 +0x353A 0x27263 +0x353B 0x2728E +0x353C 0x27269 +0x353D 0x2726B +0x353E 0x27285 +0x353F 0x2728D +0x3540 0x27264 +0x3541 0x2726D +0x3542 0x2764C +0x3543 0x27649 +0x3544 0x27647 +0x3545 0x27648 +0x3546 0x27642 +0x3547 0x27645 +0x3548 0x2765B +0x3549 0x2765D +0x354A 0x27646 +0x354B 0x27813 +0x354C 0x2781A +0x354D 0x2780E +0x354E 0x2780F +0x354F 0x2781B +0x3550 0x27812 +0x3551 0x278C3 +0x3552 0x278BE +0x3553 0x278BD +0x3554 0x27979 +0x3555 0x2797C +0x3558 0x27980 +0x3559 0x27975 +0x355A 0x2799B +0x355C 0x27974 +0x355F 0x22041 +0x3560 0x22494 +0x3561 0x27C30 +0x3562 0x27CA7 +0x3563 0x27CA5 +0x3564 0x27CA4 +0x3565 0x27D3A +0x3566 0x27E5B +0x3567 0x27E9F +0x3568 0x27EA8 +0x3569 0x27EB3 +0x356A 0x27EA1 +0x356B 0x27EA7 +0x356C 0x27EB2 +0x356D 0x27E9D +0x356E 0x27EA3 +0x356F 0x27EA2 +0x3570 0x27FEF +0x3571 0x27FD9 +0x3573 0x27FD5 +0x3574 0x27FDD +0x3575 0x27FDA +0x3576 0x27FEE +0x3577 0x27FD7 +0x3578 0x2821A +0x3579 0x28219 +0x357A 0x28218 +0x357B 0x282B3 +0x357C 0x282BF +0x357D 0x282BB +0x357E 0x282C0 +0x3621 0x282B9 +0x3622 0x282B8 +0x3623 0x282D5 +0x3624 0x28411 +0x3625 0x28410 +0x3626 0x284C3 +0x3627 0x284C2 +0x3628 0x284E9 +0x3629 0x284CD +0x362A 0x284E5 +0x362B 0x284CA +0x362C 0x284C7 +0x362D 0x284E8 +0x362E 0x286F1 +0x362F 0x2870C +0x3630 0x286EF +0x3631 0x286EE +0x3632 0x286F3 +0x3633 0x2870D +0x3634 0x286F6 +0x3635 0x286F0 +0x3637 0x287F5 +0x3638 0x287F4 +0x3639 0x287F8 +0x363A 0x287FE +0x363B 0x28911 +0x363C 0x28922 +0x363D 0x28942 +0x363E 0x28C5C +0x363F 0x28C5A +0x3640 0x28C5D +0x3641 0x28CD1 +0x3642 0x28CD0 +0x3643 0x28E75 +0x3644 0x28E7B +0x3645 0x28F89 +0x3646 0x2944D +0x3647 0x29689 +0x3648 0x29692 +0x3649 0x2968C +0x364A 0x29688 +0x364B 0x29867 +0x364C 0x29868 +0x364D 0x20321 +0x364E 0x202F2 +0x364F 0x20309 +0x3650 0x202F8 +0x3651 0x202F0 +0x3652 0x202F3 +0x3653 0x202F5 +0x3654 0x202FB +0x3655 0x202F7 +0x3656 0x202EF +0x3657 0x2030B +0x3658 0x204A2 +0x3659 0x205F5 +0x365A 0x205F3 +0x365B 0x205F4 +0x365C 0x205F2 +0x365D 0x20698 +0x365E 0x20768 +0x365F 0x20780 +0x3660 0x20785 +0x3661 0x2078E +0x3662 0x2078F +0x3663 0x202F4 +0x3664 0x20786 +0x3665 0x207A4 +0x3666 0x20886 +0x3667 0x20889 +0x3668 0x20887 +0x3669 0x20885 +0x366B 0x20888 +0x366C 0x20AFF +0x366D 0x20B66 +0x366F 0x20DC3 +0x3671 0x20DC4 +0x3672 0x20E3B +0x3673 0x20DE7 +0x3674 0x20DF8 +0x3675 0x20DFB +0x3677 0x20DBE +0x3678 0x20DC6 +0x367B 0x20DFC +0x367C 0x20DC0 +0x367D 0x20E33 +0x367E 0x20DC9 +0x3721 0x20DFE +0x3722 0x20DDA +0x3723 0x20DCC +0x3724 0x20DBB +0x3725 0x20DFD +0x3726 0x20DDF +0x3727 0x20DCD +0x3728 0x20DC2 +0x3729 0x20DC8 +0x372A 0x20E32 +0x372B 0x20E2D +0x372C 0x20DD2 +0x372D 0x20E31 +0x372E 0x20DD3 +0x372F 0x20E2E +0x3730 0x20DCF +0x3731 0x211FF +0x3732 0x21209 +0x3733 0x211FC +0x3734 0x21372 +0x3735 0x213AA +0x3736 0x213AB +0x3737 0x213A7 +0x3738 0x2137B +0x3739 0x21376 +0x373A 0x213A8 +0x373B 0x213AC +0x373E 0x215AA +0x373F 0x20A03 +0x3740 0x215AC +0x3741 0x215AD +0x3742 0x215AB +0x3743 0x21650 +0x3744 0x21658 +0x3745 0x217DD +0x3747 0x217AE +0x3748 0x217A2 +0x3749 0x217AB +0x374A 0x217E3 +0x374B 0x217AF +0x374C 0x217E0 +0x374D 0x217E4 +0x374F 0x217A7 +0x3750 0x217AA +0x3751 0x217E2 +0x3752 0x217E1 +0x3753 0x217DF +0x3754 0x217AD +0x3755 0x217E5 +0x3756 0x217D1 +0x3757 0x217AC +0x3758 0x217D5 +0x3759 0x217A3 +0x375A 0x2179F +0x375B 0x21979 +0x375C 0x21976 +0x375D 0x21A43 +0x375E 0x21A3D +0x375F 0x21A47 +0x3760 0x21A44 +0x3761 0x21A3F +0x3762 0x21A5B +0x3763 0x21B7F +0x3764 0x21C9A +0x3765 0x21C9C +0x3767 0x21D1E +0x3768 0x21E88 +0x3769 0x21E6A +0x376A 0x21E76 +0x376B 0x21E72 +0x376C 0x21E70 +0x376D 0x21E7E +0x376E 0x21E6C +0x376F 0x21E6F +0x3770 0x21E75 +0x3771 0x21E77 +0x3772 0x21E78 +0x3773 0x21E8A +0x3774 0x21E79 +0x3775 0x21E94 +0x3776 0x22001 +0x3777 0x22105 +0x3778 0x220F1 +0x3779 0x220EE +0x377A 0x220EF +0x377B 0x22104 +0x377D 0x220FA +0x377E 0x22107 +0x3821 0x220F4 +0x3822 0x220F5 +0x3823 0x2219C +0x3824 0x2226D +0x3825 0x22269 +0x3826 0x22266 +0x3827 0x22262 +0x3828 0x22246 +0x382A 0x22265 +0x382B 0x2225D +0x382C 0x2225E +0x382D 0x2225F +0x382E 0x2238E +0x382F 0x22402 +0x3830 0x22406 +0x3831 0x22404 +0x3832 0x22403 +0x3833 0x22462 +0x3834 0x22527 +0x3835 0x22521 +0x3836 0x22520 +0x3837 0x22524 +0x3838 0x22529 +0x3839 0x22531 +0x383A 0x22523 +0x383B 0x22522 +0x383C 0x226DC +0x383D 0x2274D +0x383E 0x226E5 +0x383F 0x226D3 +0x3840 0x226EE +0x3841 0x226E6 +0x3843 0x22736 +0x3844 0x22740 +0x3845 0x2283F +0x3846 0x2273D +0x3847 0x22744 +0x3849 0x2275F +0x384A 0x22729 +0x384B 0x22749 +0x384C 0x2278A +0x384D 0x2272A +0x384E 0x22787 +0x384F 0x2274C +0x3850 0x22731 +0x3851 0x22748 +0x3852 0x2272B +0x3853 0x2273B +0x3854 0x22741 +0x3855 0x226C9 +0x3856 0x22734 +0x3857 0x22753 +0x3858 0x22735 +0x3859 0x22747 +0x385A 0x22738 +0x385B 0x229D1 +0x385C 0x229D2 +0x385D 0x22A51 +0x385E 0x22A55 +0x385F 0x22A52 +0x3860 0x22A53 +0x3861 0x22B8F +0x3862 0x22BF4 +0x3863 0x22C47 +0x3864 0x22C0D +0x3865 0x22C1C +0x3866 0x22BFB +0x3867 0x22C19 +0x3868 0x22BF7 +0x3869 0x22BF9 +0x386A 0x22BF5 +0x386B 0x22BE9 +0x386C 0x22C0A +0x386D 0x22BEE +0x386E 0x22C0B +0x386F 0x22BFD +0x3870 0x22C06 +0x3871 0x22C02 +0x3872 0x22C16 +0x3873 0x22C18 +0x3874 0x22BF0 +0x3875 0x22ED4 +0x3876 0x22F66 +0x3877 0x22F6A +0x3878 0x22F75 +0x3879 0x22F76 +0x387A 0x22F80 +0x387B 0x22F6D +0x387D 0x22F69 +0x387E 0x22F67 +0x3921 0x22F68 +0x3922 0x22F5D +0x3923 0x230A4 +0x3924 0x230FE +0x3925 0x230FD +0x3926 0x231EC +0x3927 0x231E9 +0x3928 0x23221 +0x3929 0x231EB +0x392A 0x231E7 +0x392B 0x231F2 +0x392C 0x23220 +0x392D 0x2337A +0x392E 0x2352D +0x392F 0x2352E +0x3930 0x234CA +0x3931 0x2352F +0x3932 0x234C8 +0x3934 0x234CB +0x3935 0x234C3 +0x3936 0x23484 +0x3937 0x234D2 +0x3938 0x234C6 +0x393A 0x234CF +0x393B 0x234D5 +0x393C 0x234D4 +0x393D 0x234DD +0x393E 0x2352B +0x393F 0x235A3 +0x3940 0x234DB +0x3941 0x2352C +0x3942 0x23513 +0x3944 0x238D1 +0x3945 0x238CC +0x3946 0x238D5 +0x3947 0x238C9 +0x3948 0x238CF +0x3949 0x238D2 +0x394A 0x2397B +0x394B 0x2397C +0x394C 0x23A23 +0x394D 0x23A1D +0x394E 0x23A1C +0x394F 0x23A1E +0x3950 0x23A22 +0x3951 0x23A24 +0x3952 0x23A20 +0x3953 0x23A18 +0x3954 0x23A21 +0x3955 0x23B88 +0x3956 0x23B8A +0x3957 0x23B94 +0x3958 0x23B8F +0x3959 0x23B8E +0x395A 0x23B90 +0x395C 0x23BA7 +0x395D 0x23C64 +0x395F 0x23E18 +0x3960 0x23E14 +0x3961 0x23E1D +0x3962 0x23E05 +0x3963 0x23DFF +0x3964 0x23E1B +0x3965 0x23E1A +0x3966 0x23E19 +0x3967 0x23E03 +0x3968 0x23E0E +0x3969 0x23E47 +0x396A 0x23E04 +0x396B 0x23E5A +0x396C 0x23E07 +0x396D 0x23E20 +0x396E 0x2426A +0x396F 0x24266 +0x3970 0x2427A +0x3971 0x24265 +0x3972 0x242AF +0x3973 0x245CD +0x3974 0x245CF +0x3975 0x245D1 +0x3976 0x245CE +0x3977 0x2465F +0x3978 0x24677 +0x3979 0x24674 +0x397A 0x24688 +0x397B 0x24675 +0x397C 0x24689 +0x397D 0x24672 +0x397E 0x247C6 +0x3A21 0x247EA +0x3A22 0x247E0 +0x3A23 0x24807 +0x3A24 0x247E6 +0x3A25 0x247E5 +0x3A26 0x247DD +0x3A27 0x247E3 +0x3A28 0x247DA +0x3A29 0x249AE +0x3A2A 0x2497E +0x3A2B 0x2497D +0x3A2C 0x2497F +0x3A2E 0x249D9 +0x3A2F 0x24AFA +0x3A30 0x24AFB +0x3A31 0x24B4D +0x3A32 0x24B54 +0x3A33 0x24B51 +0x3A34 0x24B50 +0x3A35 0x24D98 +0x3A36 0x24D95 +0x3A37 0x24D9D +0x3A38 0x24DC1 +0x3A39 0x24D9A +0x3A3A 0x24D9B +0x3A3C 0x24D9C +0x3A3D 0x24DD7 +0x3A3E 0x24DA4 +0x3A3F 0x24D96 +0x3A40 0x24DA0 +0x3A41 0x24F31 +0x3A42 0x24FE9 +0x3A43 0x2506E +0x3A44 0x2519A +0x3A45 0x251A5 +0x3A46 0x25194 +0x3A47 0x251A6 +0x3A48 0x25199 +0x3A49 0x2518B +0x3A4A 0x25198 +0x3A4B 0x25191 +0x3A4C 0x2518C +0x3A4D 0x251A1 +0x3A4E 0x251A3 +0x3A4F 0x251C6 +0x3A50 0x2536F +0x3A51 0x2536D +0x3A52 0x2536A +0x3A53 0x2536C +0x3A54 0x25371 +0x3A55 0x2536E +0x3A56 0x253DF +0x3A57 0x254AC +0x3A58 0x254AA +0x3A5A 0x254B5 +0x3A5B 0x254AD +0x3A5C 0x254B2 +0x3A5D 0x254B3 +0x3A5E 0x254AB +0x3A5F 0x254B6 +0x3A60 0x254C7 +0x3A61 0x254C6 +0x3A62 0x2566C +0x3A63 0x25670 +0x3A64 0x257B3 +0x3A66 0x2598C +0x3A67 0x25981 +0x3A68 0x25983 +0x3A69 0x2597D +0x3A6A 0x25985 +0x3A6B 0x25990 +0x3A6C 0x259A2 +0x3A6D 0x2598D +0x3A6E 0x2598F +0x3A6F 0x2597E +0x3A70 0x2598A +0x3A71 0x2597F +0x3A72 0x25976 +0x3A73 0x25987 +0x3A74 0x25978 +0x3A75 0x25A80 +0x3A76 0x25A82 +0x3A77 0x25A81 +0x3A78 0x25A83 +0x3A79 0x25B5A +0x3A7A 0x25B34 +0x3A7B 0x25B2C +0x3A7C 0x25B2A +0x3A7D 0x25B40 +0x3A7E 0x25B2D +0x3B21 0x25B33 +0x3B22 0x25B2B +0x3B23 0x25B4B +0x3B25 0x25B3C +0x3B26 0x25E5A +0x3B27 0x25E77 +0x3B28 0x25E60 +0x3B29 0x25FFA +0x3B2A 0x25FF9 +0x3B2B 0x25FFC +0x3B2D 0x25FF5 +0x3B2E 0x25FE8 +0x3B2F 0x26009 +0x3B30 0x25FE7 +0x3B31 0x25FE6 +0x3B32 0x25FE9 +0x3B33 0x26232 +0x3B34 0x2622C +0x3B35 0x262BD +0x3B36 0x262BC +0x3B37 0x2637A +0x3B38 0x2637E +0x3B39 0x26379 +0x3B3B 0x26423 +0x3B3C 0x26430 +0x3B3D 0x26428 +0x3B3E 0x264D4 +0x3B3F 0x26ACE +0x3B40 0x264F1 +0x3B41 0x264F0 +0x3B42 0x26560 +0x3B43 0x26565 +0x3B44 0x266A8 +0x3B45 0x2670A +0x3B46 0x2671B +0x3B47 0x26712 +0x3B48 0x26707 +0x3B49 0x2674F +0x3B4A 0x2670E +0x3B4B 0x26752 +0x3B4C 0x26716 +0x3B4E 0x26753 +0x3B4F 0x26754 +0x3B50 0x2F984 +0x3B51 0x26756 +0x3B52 0x2696D +0x3B53 0x26972 +0x3B54 0x26A2F +0x3B55 0x26C2A +0x3B57 0x26C63 +0x3B58 0x26C84 +0x3B59 0x26CAF +0x3B5A 0x26C45 +0x3B5B 0x26C70 +0x3B5C 0x26C56 +0x3B5D 0x26C16 +0x3B5E 0x26C3D +0x3B5F 0x26C38 +0x3B60 0x26C6F +0x3B61 0x26C77 +0x3B62 0x26C2E +0x3B63 0x26C31 +0x3B64 0x26C4C +0x3B65 0x26C5F +0x3B66 0x26C75 +0x3B67 0x26C39 +0x3B68 0x26C3A +0x3B69 0x26C2C +0x3B6A 0x26C2D +0x3B6B 0x26C3F +0x3B6C 0x26C2F +0x3B6D 0x26C30 +0x3B6E 0x26C3E +0x3B71 0x271B2 +0x3B72 0x272B7 +0x3B73 0x2728F +0x3B75 0x27296 +0x3B76 0x2729E +0x3B77 0x27297 +0x3B78 0x27295 +0x3B79 0x272A5 +0x3B7A 0x27298 +0x3B7C 0x272A3 +0x3B7D 0x2729A +0x3B7E 0x272AD +0x3C21 0x272A6 +0x3C22 0x272B6 +0x3C23 0x27299 +0x3C24 0x272AF +0x3C25 0x272AC +0x3C27 0x2729F +0x3C28 0x27294 +0x3C29 0x275EB +0x3C2A 0x2766F +0x3C2B 0x2766D +0x3C2C 0x2767E +0x3C2D 0x2766C +0x3C2E 0x27661 +0x3C2F 0x27663 +0x3C30 0x2766B +0x3C31 0x2765E +0x3C32 0x2763E +0x3C33 0x27664 +0x3C34 0x276AD +0x3C36 0x27820 +0x3C37 0x278D1 +0x3C38 0x278D5 +0x3C39 0x279AE +0x3C3A 0x279AF +0x3C3B 0x2799F +0x3C3C 0x279A8 +0x3C3D 0x279CA +0x3C3E 0x27BE1 +0x3C3F 0x27C39 +0x3C40 0x27C38 +0x3C41 0x27C3B +0x3C42 0x27CAD +0x3C43 0x27CB5 +0x3C44 0x27CAF +0x3C45 0x27CB1 +0x3C46 0x27CAE +0x3C47 0x27CB4 +0x3C48 0x27CB0 +0x3C49 0x27D4B +0x3C4A 0x27D51 +0x3C4B 0x27D4C +0x3C4D 0x27D60 +0x3C4E 0x27EBE +0x3C4F 0x27EB9 +0x3C50 0x27EB7 +0x3C51 0x27EB6 +0x3C53 0x27EBD +0x3C54 0x27EB8 +0x3C55 0x27EC1 +0x3C56 0x27FF7 +0x3C57 0x27FF3 +0x3C58 0x27FF4 +0x3C59 0x27FFB +0x3C5A 0x27FFD +0x3C5B 0x27FF5 +0x3C5D 0x27FFA +0x3C5E 0x28014 +0x3C60 0x27FF2 +0x3C61 0x27FFC +0x3C62 0x28000 +0x3C64 0x2822B +0x3C65 0x28229 +0x3C66 0x2822E +0x3C68 0x282D7 +0x3C69 0x282DB +0x3C6A 0x282D9 +0x3C6B 0x282D8 +0x3C6C 0x282E6 +0x3C6D 0x282D6 +0x3C6E 0x282D1 +0x3C6F 0x282E7 +0x3C70 0x282D0 +0x3C71 0x282DC +0x3C72 0x284ED +0x3C73 0x2851A +0x3C74 0x28519 +0x3C75 0x28516 +0x3C76 0x284EC +0x3C77 0x284EF +0x3C78 0x284EE +0x3C79 0x284F4 +0x3C7A 0x2852F +0x3C7B 0x28730 +0x3C7C 0x28719 +0x3C7D 0x28718 +0x3C7E 0x28711 +0x3D21 0x28716 +0x3D22 0x28712 +0x3D23 0x28710 +0x3D24 0x28714 +0x3D25 0x2880C +0x3D26 0x2880D +0x3D27 0x28910 +0x3D28 0x28929 +0x3D29 0x28928 +0x3D2A 0x28C65 +0x3D2B 0x28C66 +0x3D2C 0x28CDE +0x3D2D 0x28CDF +0x3D2E 0x28CE0 +0x3D2F 0x28CD9 +0x3D30 0x28CDB +0x3D31 0x28CD8 +0x3D32 0x28CE3 +0x3D33 0x28CD7 +0x3D34 0x28EA6 +0x3D35 0x28EA7 +0x3D36 0x28EBF +0x3D37 0x28EA8 +0x3D38 0x28E9F +0x3D39 0x28EA1 +0x3D3A 0x28EA2 +0x3D3B 0x28EAD +0x3D3C 0x28EA3 +0x3D3D 0x28EA0 +0x3D3E 0x29083 +0x3D3F 0x29085 +0x3D40 0x29082 +0x3D41 0x29084 +0x3D42 0x291EE +0x3D43 0x2925D +0x3D44 0x29392 +0x3D45 0x29455 +0x3D46 0x29453 +0x3D47 0x2F9FC +0x3D48 0x29451 +0x3D49 0x29452 +0x3D4A 0x29450 +0x3D4B 0x2959D +0x3D4C 0x29687 +0x3D4D 0x29697 +0x3D4E 0x2969B +0x3D4F 0x2969D +0x3D50 0x29869 +0x3D51 0x29A11 +0x3D53 0x29C7A +0x3D55 0x23244 +0x3D56 0x200C6 +0x3D57 0x20340 +0x3D58 0x2032E +0x3D59 0x20368 +0x3D5A 0x2032D +0x3D5B 0x20334 +0x3D5C 0x20332 +0x3D5D 0x20369 +0x3D5E 0x20331 +0x3D5F 0x2036A +0x3D60 0x2033E +0x3D61 0x2036F +0x3D62 0x20375 +0x3D63 0x204F6 +0x3D64 0x20520 +0x3D65 0x20528 +0x3D66 0x20567 +0x3D67 0x205FB +0x3D68 0x205FE +0x3D69 0x205FC +0x3D6A 0x205FD +0x3D6B 0x205FF +0x3D6C 0x205FA +0x3D6D 0x207AC +0x3D6E 0x207AF +0x3D6F 0x207B1 +0x3D71 0x207BF +0x3D72 0x207BE +0x3D73 0x207A7 +0x3D74 0x207AA +0x3D75 0x20894 +0x3D76 0x20893 +0x3D77 0x20899 +0x3D79 0x208FA +0x3D7A 0x20956 +0x3D7B 0x20A22 +0x3D7C 0x20A91 +0x3D7D 0x20A92 +0x3D7E 0x20B08 +0x3E21 0x20B06 +0x3E22 0x20DD6 +0x3E23 0x20E37 +0x3E24 0x20E4B +0x3E25 0x20ECE +0x3E26 0x20ED0 +0x3E27 0x20E39 +0x3E28 0x20E64 +0x3E29 0x20ECF +0x3E2A 0x20E46 +0x3E2B 0x20E66 +0x3E2C 0x20E56 +0x3E2D 0x20E43 +0x3E2E 0x20E4A +0x3E2F 0x20E58 +0x3E30 0x20E65 +0x3E31 0x20E5A +0x3E32 0x20E5B +0x3E33 0x20E55 +0x3E34 0x20E50 +0x3E35 0x20E4C +0x3E36 0x20ECD +0x3E37 0x20E51 +0x3E38 0x20E47 +0x3E3A 0x20E53 +0x3E3B 0x20E62 +0x3E3C 0x20ECC +0x3E3E 0x20E7F +0x3E3F 0x20E4D +0x3E40 0x2120A +0x3E41 0x2120C +0x3E42 0x2120F +0x3E43 0x213BB +0x3E44 0x213B9 +0x3E45 0x213EB +0x3E46 0x213AE +0x3E47 0x213C1 +0x3E48 0x213EA +0x3E49 0x213BE +0x3E4A 0x213BF +0x3E4B 0x213BA +0x3E4C 0x213B7 +0x3E4D 0x213B3 +0x3E4E 0x213E9 +0x3E4F 0x2156E +0x3E50 0x215AF +0x3E51 0x215B3 +0x3E52 0x215B2 +0x3E53 0x21668 +0x3E54 0x21669 +0x3E55 0x2166A +0x3E56 0x217DE +0x3E57 0x217EB +0x3E58 0x21811 +0x3E59 0x217ED +0x3E5A 0x217E9 +0x3E5B 0x217F7 +0x3E5C 0x217F4 +0x3E5D 0x217EA +0x3E5E 0x21812 +0x3E5F 0x217E8 +0x3E60 0x21813 +0x3E61 0x2198E +0x3E62 0x21986 +0x3E63 0x21A63 +0x3E64 0x21A65 +0x3E65 0x21B99 +0x3E66 0x21CC2 +0x3E67 0x21CAE +0x3E68 0x21CB0 +0x3E69 0x21CAD +0x3E6A 0x21EB4 +0x3E6B 0x21ED1 +0x3E6C 0x21EAD +0x3E6E 0x21EBD +0x3E6F 0x21EB7 +0x3E70 0x21EAB +0x3E71 0x21EAF +0x3E72 0x21EC1 +0x3E73 0x21EB5 +0x3E74 0x2210F +0x3E75 0x2210E +0x3E76 0x2211C +0x3E77 0x22113 +0x3E78 0x2210A +0x3E79 0x2211E +0x3E7A 0x22114 +0x3E7B 0x2211A +0x3E7C 0x221CB +0x3E7D 0x22287 +0x3E7E 0x22293 +0x3F22 0x22284 +0x3F23 0x22285 +0x3F24 0x22292 +0x3F25 0x22280 +0x3F26 0x2232B +0x3F27 0x22363 +0x3F28 0x2240A +0x3F2A 0x22466 +0x3F2B 0x22534 +0x3F2C 0x22533 +0x3F2D 0x2254D +0x3F2E 0x22789 +0x3F2F 0x22757 +0x3F31 0x2274A +0x3F33 0x22739 +0x3F34 0x2273F +0x3F35 0x22790 +0x3F36 0x2278F +0x3F37 0x227B2 +0x3F38 0x2279F +0x3F39 0x22795 +0x3F3A 0x227A1 +0x3F3B 0x2279C +0x3F3C 0x2278E +0x3F3D 0x227A0 +0x3F3E 0x227AE +0x3F3F 0x22796 +0x3F40 0x227CA +0x3F41 0x227AC +0x3F43 0x227A6 +0x3F44 0x22797 +0x3F45 0x22793 +0x3F46 0x203B6 +0x3F47 0x229D6 +0x3F48 0x229E0 +0x3F49 0x229D8 +0x3F4A 0x22A56 +0x3F4B 0x22C6E +0x3F4C 0x22C7E +0x3F4D 0x22C74 +0x3F4E 0x22C77 +0x3F4F 0x22C80 +0x3F50 0x22C7A +0x3F51 0x22C6B +0x3F52 0x22C5F +0x3F53 0x22C76 +0x3F54 0x22CB0 +0x3F55 0x22C63 +0x3F56 0x22F92 +0x3F57 0x22F82 +0x3F58 0x22F9D +0x3F59 0x22F94 +0x3F5A 0x22F83 +0x3F5B 0x22F8B +0x3F5C 0x22F84 +0x3F5D 0x23057 +0x3F5E 0x23084 +0x3F5F 0x230B5 +0x3F60 0x23109 +0x3F61 0x231E6 +0x3F63 0x23225 +0x3F64 0x23251 +0x3F65 0x2333E +0x3F66 0x2F8DA +0x3F67 0x23385 +0x3F68 0x2353F +0x3F69 0x23542 +0x3F6A 0x23538 +0x3F6B 0x2353A +0x3F6C 0x2354E +0x3F6D 0x23545 +0x3F6E 0x23539 +0x3F6F 0x23537 +0x3F70 0x23544 +0x3F71 0x2F8E7 +0x3F72 0x235A4 +0x3F73 0x2353D +0x3F74 0x23541 +0x3F75 0x238DF +0x3F76 0x238DE +0x3F77 0x238CA +0x3F78 0x238E9 +0x3F79 0x238E2 +0x3F7A 0x238E0 +0x3F7B 0x23989 +0x3F7C 0x23987 +0x3F7D 0x23A32 +0x3F7E 0x23A33 +0x4021 0x23AAC +0x4022 0x23AF9 +0x4023 0x23B0D +0x4024 0x23BB9 +0x4025 0x23E5E +0x4026 0x23E6A +0x4028 0x23E81 +0x4029 0x23E69 +0x402A 0x23EAC +0x402B 0x23E80 +0x402C 0x23E75 +0x402D 0x23E71 +0x402E 0x23E76 +0x402F 0x23E6F +0x4030 0x242B6 +0x4031 0x24303 +0x4032 0x242BF +0x4033 0x24301 +0x4034 0x242B2 +0x4035 0x242C4 +0x4036 0x245DB +0x4037 0x245DC +0x4038 0x245D8 +0x4039 0x29672 +0x403A 0x246B5 +0x403B 0x246A8 +0x403C 0x2468F +0x403D 0x2469E +0x403E 0x2468E +0x403F 0x247DE +0x4040 0x247E2 +0x4041 0x24820 +0x4042 0x2481D +0x4043 0x2481A +0x4044 0x24819 +0x4045 0x2482B +0x4046 0x24818 +0x4047 0x24810 +0x4048 0x2480E +0x4049 0x24824 +0x404A 0x2481F +0x404B 0x24813 +0x404C 0x24835 +0x404D 0x24983 +0x404F 0x249D7 +0x4050 0x24B02 +0x4051 0x24B03 +0x4052 0x24B5C +0x4053 0x24B5F +0x4054 0x24BC7 +0x4055 0x24C9A +0x4056 0x24C97 +0x4057 0x24CA3 +0x4058 0x24DF7 +0x4059 0x24DC6 +0x405A 0x24DCC +0x405B 0x24DD6 +0x405C 0x24DCD +0x405D 0x24DF9 +0x405E 0x24DD9 +0x405F 0x24DD8 +0x4061 0x24DD1 +0x4062 0x24DCE +0x4063 0x24DD5 +0x4065 0x24DD4 +0x4066 0x24DF8 +0x4067 0x24F7A +0x4068 0x24F79 +0x4069 0x24F7F +0x406A 0x24FF3 +0x406B 0x24FF5 +0x406C 0x24FF6 +0x406D 0x24FF4 +0x406E 0x24FF7 +0x4070 0x25079 +0x4071 0x2519C +0x4072 0x251DF +0x4073 0x251F5 +0x4074 0x251FF +0x4075 0x251D1 +0x4076 0x251DA +0x4077 0x251CF +0x4078 0x251CD +0x4079 0x251DE +0x407A 0x251D8 +0x407B 0x23AAD +0x407C 0x251E0 +0x407D 0x251FE +0x407E 0x2519E +0x4121 0x25375 +0x4122 0x25373 +0x4123 0x25372 +0x4124 0x253D8 +0x4125 0x254D0 +0x4126 0x254D6 +0x4127 0x254D7 +0x4128 0x254CA +0x4129 0x254CD +0x412A 0x2568A +0x412B 0x25689 +0x412C 0x2568B +0x412D 0x257D3 +0x412E 0x257DA +0x412F 0x257CE +0x4130 0x257D2 +0x4132 0x257D4 +0x4133 0x257D7 +0x4134 0x257D5 +0x4135 0x257FB +0x4136 0x257CD +0x4137 0x257FA +0x4138 0x257D6 +0x413A 0x2599B +0x413B 0x2599E +0x413C 0x2599D +0x413D 0x259A4 +0x413E 0x2599F +0x413F 0x259A5 +0x4140 0x259A8 +0x4141 0x25A8F +0x4142 0x25A8C +0x4143 0x25A95 +0x4144 0x25B60 +0x4145 0x25B55 +0x4146 0x25B5C +0x4147 0x25B6F +0x4148 0x25B51 +0x4149 0x25B61 +0x414A 0x25BA7 +0x414B 0x25B5E +0x414C 0x25B62 +0x414D 0x25B54 +0x414E 0x25B6E +0x414F 0x25B52 +0x4150 0x25B58 +0x4151 0x25B6D +0x4152 0x25B5F +0x4153 0x25B6C +0x4154 0x25B50 +0x4155 0x25B5D +0x4156 0x25B8E +0x4157 0x25E72 +0x4158 0x25E78 +0x4159 0x25E75 +0x415A 0x25E76 +0x415B 0x25E7C +0x415C 0x25E7E +0x415D 0x25E7D +0x415E 0x26015 +0x415F 0x26014 +0x4160 0x2601D +0x4161 0x2601C +0x4162 0x26023 +0x4163 0x26057 +0x4164 0x262C8 +0x4166 0x262C9 +0x4167 0x262C5 +0x4168 0x26387 +0x4169 0x2638A +0x416A 0x26394 +0x416B 0x26439 +0x416C 0x26440 +0x416D 0x2643E +0x416E 0x26438 +0x416F 0x264D6 +0x4171 0x26577 +0x4172 0x26578 +0x4173 0x2657D +0x4174 0x266DD +0x4175 0x2675E +0x4176 0x26777 +0x4177 0x267D4 +0x4178 0x26766 +0x4179 0x2675F +0x417A 0x26773 +0x417B 0x26772 +0x417C 0x26797 +0x417D 0x2675A +0x417E 0x26796 +0x4221 0x2675D +0x4222 0x26765 +0x4223 0x26770 +0x4224 0x26775 +0x4225 0x26774 +0x4226 0x2675C +0x4227 0x26760 +0x4229 0x2676D +0x422A 0x26941 +0x422B 0x26A3C +0x422C 0x26A3E +0x422E 0x26A49 +0x422F 0x26BE4 +0x4230 0x26D0C +0x4231 0x26D15 +0x4232 0x26D0E +0x4233 0x26CD4 +0x4234 0x26CC7 +0x4235 0x26D14 +0x4236 0x26CDB +0x4237 0x26D5F +0x4238 0x26CED +0x4239 0x26D09 +0x423A 0x26CCF +0x423B 0x26CFF +0x423C 0x26D1A +0x423D 0x26CF5 +0x423E 0x26CEE +0x423F 0x26CE5 +0x4240 0x26D0D +0x4241 0x26CDF +0x4242 0x26CEC +0x4243 0x26CD7 +0x4244 0x26D2C +0x4245 0x26CCD +0x4246 0x26CE3 +0x4247 0x26D00 +0x4248 0x26CEB +0x4249 0x26CFD +0x424A 0x26D0F +0x424B 0x26D2D +0x424C 0x26D50 +0x424D 0x26CFE +0x424E 0x26CC4 +0x424F 0x26CE1 +0x4250 0x26CF9 +0x4251 0x271BB +0x4252 0x271BC +0x4255 0x271BA +0x4256 0x272D0 +0x4257 0x272D6 +0x4258 0x272CE +0x4259 0x272E1 +0x425A 0x272D5 +0x425B 0x272CF +0x425C 0x272D3 +0x425E 0x272D4 +0x425F 0x275B5 +0x4260 0x27690 +0x4261 0x276A1 +0x4262 0x27681 +0x4263 0x27685 +0x4264 0x2766E +0x4265 0x27688 +0x4266 0x27682 +0x4267 0x27686 +0x4268 0x2768F +0x4269 0x27689 +0x426A 0x27680 +0x426B 0x27684 +0x426D 0x27829 +0x426E 0x2782B +0x426F 0x2782A +0x4270 0x27830 +0x4271 0x278E2 +0x4272 0x278E3 +0x4273 0x278E1 +0x4274 0x279D5 +0x4275 0x279C4 +0x4276 0x279C9 +0x4277 0x279E0 +0x4278 0x279DF +0x4279 0x279CB +0x427A 0x279DD +0x427B 0x279E8 +0x427C 0x279D4 +0x427D 0x27A1C +0x427E 0x27BB5 +0x4321 0x27BB6 +0x4322 0x27BE5 +0x4323 0x27C45 +0x4324 0x27C49 +0x4325 0x27C40 +0x4326 0x27C46 +0x4327 0x27C44 +0x4328 0x27C4A +0x4329 0x27CC9 +0x432A 0x27CC4 +0x432B 0x27CC2 +0x432C 0x27D68 +0x432E 0x27D82 +0x432F 0x27D6B +0x4330 0x27D67 +0x4331 0x27D6C +0x4332 0x27D6D +0x4333 0x27D71 +0x4335 0x27ED7 +0x4336 0x27ED2 +0x4337 0x27ED9 +0x4339 0x27EBC +0x433A 0x27EDD +0x433B 0x27ED6 +0x433D 0x27ED8 +0x433E 0x28020 +0x433F 0x28016 +0x4340 0x28018 +0x4341 0x28015 +0x4342 0x28019 +0x4343 0x28027 +0x4344 0x28050 +0x4345 0x2801D +0x4346 0x2802C +0x4347 0x2801C +0x4348 0x28029 +0x4349 0x2802B +0x434A 0x28024 +0x434C 0x28028 +0x434D 0x28239 +0x434E 0x282F2 +0x434F 0x282F0 +0x4351 0x282ED +0x4352 0x282EF +0x4353 0x282EA +0x4354 0x28301 +0x4355 0x284BC +0x4356 0x2855C +0x4357 0x2855B +0x4358 0x2855A +0x4359 0x28526 +0x435A 0x28743 +0x435B 0x28733 +0x435C 0x2873A +0x435D 0x28737 +0x435E 0x28736 +0x435F 0x2873C +0x4360 0x28734 +0x4361 0x2874A +0x4362 0x2873B +0x4363 0x28735 +0x4364 0x2873D +0x4365 0x28740 +0x4366 0x2873E +0x4367 0x28717 +0x4368 0x28826 +0x4369 0x28824 +0x436A 0x28810 +0x436B 0x28836 +0x436C 0x28825 +0x436E 0x28966 +0x436F 0x28C7F +0x4370 0x28C7A +0x4371 0x28CFB +0x4372 0x28CFD +0x4373 0x28CFC +0x4374 0x28CFA +0x4375 0x28ED6 +0x4376 0x28ED2 +0x4377 0x28EC8 +0x4378 0x28EC2 +0x4379 0x28EC7 +0x437A 0x28ECD +0x437B 0x28EC1 +0x437C 0x28EC6 +0x437D 0x28ECC +0x437E 0x28FA1 +0x4421 0x29095 +0x4422 0x29094 +0x4423 0x29097 +0x4424 0x29096 +0x4425 0x29093 +0x4426 0x290A1 +0x4427 0x29209 +0x4428 0x29208 +0x4429 0x29267 +0x442A 0x29265 +0x442B 0x29262 +0x442C 0x29261 +0x442D 0x29397 +0x442E 0x29401 +0x442F 0x29419 +0x4430 0x29418 +0x4431 0x2945C +0x4432 0x29467 +0x4433 0x2946C +0x4435 0x2F9FD +0x4436 0x29466 +0x4437 0x29461 +0x4438 0x2946E +0x4439 0x2945D +0x443A 0x2945A +0x443B 0x295A2 +0x443C 0x295A9 +0x443D 0x295A5 +0x443E 0x295A6 +0x443F 0x295B2 +0x4440 0x295A3 +0x4441 0x296AC +0x4442 0x296AA +0x4443 0x296AF +0x4444 0x296AB +0x4445 0x296B1 +0x4446 0x296C6 +0x4447 0x296AD +0x4448 0x296B9 +0x4449 0x29870 +0x444B 0x29C0C +0x444C 0x29C81 +0x444D 0x29C83 +0x444E 0x29C7E +0x444F 0x29D51 +0x4450 0x29F99 +0x4451 0x29F94 +0x4452 0x29F95 +0x4453 0x2A2FE +0x4454 0x2A418 +0x4455 0x20105 +0x4456 0x20372 +0x4458 0x20399 +0x4459 0x204AD +0x445A 0x20606 +0x445B 0x207C2 +0x445C 0x207CB +0x445D 0x207D5 +0x445E 0x207D2 +0x445F 0x207CC +0x4460 0x207D7 +0x4461 0x207C5 +0x4462 0x207CA +0x4464 0x208A2 +0x4465 0x208A3 +0x4466 0x208A1 +0x4468 0x208A6 +0x4469 0x208A4 +0x446A 0x208FF +0x446B 0x20900 +0x446D 0x20A06 +0x446E 0x20A25 +0x446F 0x20A9F +0x4470 0x20B7F +0x4471 0x20EEA +0x4472 0x20EEB +0x4473 0x20EDE +0x4474 0x20F18 +0x4475 0x20EE0 +0x4476 0x20EE8 +0x4477 0x20EDF +0x4478 0x20EF1 +0x4479 0x20EEC +0x447A 0x20F1A +0x447B 0x20EE6 +0x447C 0x20EE1 +0x447D 0x20F5D +0x447E 0x20077 +0x4521 0x20F1E +0x4523 0x20F80 +0x4524 0x21217 +0x4525 0x2141D +0x4526 0x213F7 +0x4527 0x213EF +0x4528 0x213EE +0x4529 0x213ED +0x452A 0x213F5 +0x452B 0x2141E +0x452C 0x215BD +0x452D 0x257FF +0x452E 0x215BE +0x452F 0x2166D +0x4530 0x21676 +0x4531 0x2184C +0x4532 0x21819 +0x4533 0x21848 +0x4534 0x2181E +0x4535 0x2184A +0x4536 0x21849 +0x4537 0x21826 +0x4538 0x21995 +0x4539 0x21A85 +0x453A 0x21A7E +0x453B 0x21A97 +0x453C 0x21A7D +0x453D 0x21B42 +0x453E 0x21B9E +0x453F 0x21C0C +0x4540 0x21C0B +0x4541 0x21C0E +0x4542 0x21CCF +0x4543 0x21ED8 +0x4544 0x21EE0 +0x4545 0x21EE8 +0x4546 0x21EE9 +0x4547 0x21EE2 +0x4548 0x21EE1 +0x4549 0x21EDA +0x454A 0x21EE3 +0x454B 0x21ED9 +0x454C 0x21EF0 +0x454D 0x21EE7 +0x454E 0x21EE4 +0x454F 0x22123 +0x4550 0x22131 +0x4551 0x22133 +0x4552 0x2210C +0x4553 0x269E0 +0x4554 0x22126 +0x4555 0x22124 +0x4556 0x22132 +0x4557 0x22127 +0x4558 0x22121 +0x4559 0x22130 +0x455A 0x221A2 +0x455B 0x221CC +0x455C 0x22296 +0x455D 0x2F88F +0x455E 0x22298 +0x455F 0x2229C +0x4560 0x2229B +0x4561 0x2236B +0x4562 0x22412 +0x4563 0x22414 +0x4564 0x2255A +0x4565 0x22554 +0x4566 0x22551 +0x4567 0x2255E +0x4568 0x22558 +0x456A 0x22559 +0x456B 0x2279A +0x456C 0x227F2 +0x456D 0x227AD +0x456E 0x22820 +0x456F 0x227F1 +0x4570 0x227F0 +0x4571 0x227F3 +0x4572 0x227F4 +0x4573 0x227E9 +0x4574 0x227FE +0x4575 0x2282E +0x4576 0x227E8 +0x4577 0x227E7 +0x4578 0x227FF +0x4579 0x227F5 +0x457A 0x229E5 +0x457B 0x229E7 +0x457C 0x229E6 +0x457D 0x229E9 +0x457E 0x22A58 +0x4621 0x22C6C +0x4622 0x22CD9 +0x4624 0x22CCB +0x4626 0x22CBE +0x4627 0x22CB5 +0x4628 0x22CD1 +0x4629 0x22CC2 +0x462A 0x22CB6 +0x462B 0x22CD3 +0x462C 0x2F8C2 +0x462D 0x22EDA +0x462F 0x22FAE +0x4631 0x22FAC +0x4632 0x22FA9 +0x4633 0x22FBA +0x4634 0x22FA7 +0x4635 0x22FB3 +0x4636 0x22FBD +0x4637 0x22FB1 +0x4638 0x2310E +0x4639 0x23111 +0x463A 0x2310F +0x463B 0x23252 +0x463C 0x2326A +0x463D 0x23254 +0x463E 0x23255 +0x463F 0x23253 +0x4640 0x23257 +0x4641 0x2F8D0 +0x4642 0x2325B +0x4643 0x23258 +0x4644 0x23259 +0x4646 0x235B8 +0x4647 0x235B5 +0x4648 0x235BF +0x4649 0x235C1 +0x464A 0x235BB +0x464C 0x235C3 +0x464D 0x235AD +0x464E 0x235A8 +0x464F 0x235AE +0x4650 0x235AA +0x4651 0x235D0 +0x4652 0x235B1 +0x4653 0x235BC +0x4654 0x235B7 +0x4655 0x235B0 +0x4656 0x235FA +0x4657 0x235FB +0x4658 0x235B9 +0x4659 0x23907 +0x465A 0x238FC +0x465B 0x238FF +0x465C 0x238F2 +0x465D 0x238F8 +0x465E 0x238F4 +0x4661 0x23AAE +0x4662 0x23B0F +0x4663 0x23B10 +0x4664 0x29AC1 +0x4665 0x23BC7 +0x4666 0x23BC6 +0x4667 0x23BCE +0x4669 0x23BDC +0x466A 0x23ED5 +0x466B 0x23ED3 +0x466C 0x23F20 +0x466D 0x23EE2 +0x466E 0x23EF1 +0x466F 0x23EDB +0x4670 0x23EEA +0x4671 0x23EEB +0x4672 0x23EE1 +0x4673 0x23EFF +0x4674 0x23ED6 +0x4675 0x23EE0 +0x4676 0x23ED7 +0x4677 0x23EE5 +0x4679 0x2431B +0x467A 0x24310 +0x467B 0x2430F +0x467C 0x2430E +0x467D 0x24339 +0x467E 0x2430A +0x4721 0x24314 +0x4722 0x2430C +0x4723 0x24523 +0x4724 0x2455A +0x4725 0x245E2 +0x4726 0x24693 +0x4727 0x246B0 +0x4728 0x246AB +0x4729 0x246BD +0x472A 0x246B1 +0x472B 0x2468D +0x472C 0x246AD +0x472D 0x246AA +0x472E 0x246AC +0x472F 0x246BC +0x4730 0x246C9 +0x4731 0x24847 +0x4732 0x24862 +0x4733 0x24840 +0x4734 0x24844 +0x4735 0x2483F +0x4736 0x24843 +0x4737 0x2483D +0x4738 0x24860 +0x4739 0x2485F +0x473A 0x2483A +0x473B 0x24842 +0x473C 0x2485E +0x473D 0x2485D +0x473E 0x249BC +0x473F 0x249E0 +0x4740 0x249EE +0x4741 0x249EB +0x4742 0x24A0D +0x4743 0x24B09 +0x4744 0x24B0C +0x4745 0x24B69 +0x4746 0x24B74 +0x4747 0x24B67 +0x474A 0x24CAD +0x474B 0x24DFF +0x474C 0x24E16 +0x474D 0x24E08 +0x474E 0x24E09 +0x474F 0x24E00 +0x4750 0x24DFC +0x4751 0x24E13 +0x4752 0x24E14 +0x4753 0x24E0A +0x4754 0x2983E +0x4755 0x24E29 +0x4756 0x24E17 +0x4757 0x24E3B +0x4758 0x24DFB +0x475A 0x24E0E +0x475C 0x25008 +0x475D 0x2521B +0x475E 0x2521A +0x475F 0x25219 +0x4760 0x25202 +0x4762 0x25217 +0x4763 0x25207 +0x4764 0x25213 +0x4765 0x25209 +0x4766 0x2520A +0x4767 0x25212 +0x4768 0x252AA +0x4769 0x25238 +0x476A 0x2537B +0x476B 0x2537C +0x476C 0x2537A +0x476D 0x253EA +0x476E 0x253EB +0x476F 0x253EF +0x4770 0x253F0 +0x4771 0x25509 +0x4772 0x25502 +0x4773 0x25501 +0x4774 0x2552B +0x4775 0x25507 +0x4777 0x25528 +0x4778 0x254FB +0x4779 0x2552A +0x477A 0x254FE +0x477B 0x25504 +0x477C 0x25529 +0x477D 0x2550A +0x4821 0x256C2 +0x4823 0x256A6 +0x4825 0x22FC6 +0x4826 0x21C07 +0x4827 0x2580A +0x4828 0x257FD +0x4829 0x25806 +0x482A 0x2580D +0x482B 0x25809 +0x482C 0x2580B +0x482D 0x25800 +0x482E 0x25805 +0x482F 0x2583D +0x4830 0x259D5 +0x4831 0x259BF +0x4832 0x259BA +0x4833 0x259C7 +0x4834 0x25A98 +0x4835 0x25A9A +0x4837 0x25BA4 +0x4838 0x25B9C +0x4839 0x25B9D +0x483A 0x25BA2 +0x483B 0x25B96 +0x483C 0x25B95 +0x483D 0x25BA5 +0x483E 0x25BAA +0x483F 0x25BAD +0x4840 0x25B9A +0x4841 0x25BA3 +0x4842 0x25B97 +0x4843 0x25B90 +0x4844 0x25BAF +0x4845 0x25B8D +0x4847 0x25BA8 +0x4848 0x25BEE +0x4849 0x25EA3 +0x484A 0x25E99 +0x484B 0x25EA1 +0x484C 0x25E9C +0x484D 0x25EA4 +0x484E 0x25ECB +0x484F 0x26056 +0x4850 0x26048 +0x4851 0x26059 +0x4852 0x2604A +0x4853 0x2605C +0x4855 0x2604F +0x4856 0x2604D +0x4857 0x2605D +0x4858 0x2623A +0x4859 0x262E3 +0x485A 0x262E1 +0x485B 0x262DE +0x485C 0x26397 +0x485D 0x2639A +0x485E 0x26448 +0x485F 0x2644A +0x4860 0x2644C +0x4861 0x2644E +0x4862 0x2644F +0x4863 0x2644B +0x4864 0x2644D +0x4865 0x26447 +0x4866 0x26451 +0x4867 0x264DA +0x4868 0x264F9 +0x4869 0x264FC +0x486A 0x264FB +0x486B 0x264FD +0x486C 0x264F8 +0x486D 0x264FA +0x486E 0x2658A +0x486F 0x2658E +0x4870 0x26588 +0x4871 0x26589 +0x4872 0x2658D +0x4873 0x26590 +0x4874 0x2F97E +0x4875 0x2671C +0x4876 0x267AB +0x4877 0x267A4 +0x4878 0x267A8 +0x4879 0x267AD +0x487A 0x2679F +0x487B 0x2679A +0x487C 0x267B0 +0x487D 0x267A5 +0x487E 0x267D5 +0x4921 0x267A2 +0x4922 0x267B2 +0x4923 0x2679D +0x4924 0x267A1 +0x4925 0x26915 +0x4926 0x26942 +0x4927 0x26973 +0x4928 0x26984 +0x4929 0x269DD +0x492A 0x26A5C +0x492B 0x26A4C +0x492D 0x26A4B +0x492E 0x26C67 +0x492F 0x26DA8 +0x4930 0x26D7F +0x4931 0x26D8D +0x4932 0x26D8B +0x4933 0x26DF7 +0x4934 0x26DA9 +0x4935 0x26DF4 +0x4936 0x26D9A +0x4937 0x26D8C +0x4938 0x26D95 +0x4939 0x26D7E +0x493A 0x26D77 +0x493D 0x26D71 +0x493E 0x26DFD +0x493F 0x26D88 +0x4940 0x26D99 +0x4941 0x26D6D +0x4942 0x26DD4 +0x4943 0x26D91 +0x4944 0x26D7D +0x4945 0x26D63 +0x4946 0x26D75 +0x4947 0x26DF9 +0x4948 0x26D8E +0x4949 0x26D74 +0x494A 0x26DD9 +0x494B 0x26D66 +0x494C 0x26DFA +0x494D 0x26DF5 +0x494F 0x271C1 +0x4950 0x271C9 +0x4951 0x27303 +0x4952 0x2732C +0x4953 0x27334 +0x4954 0x27317 +0x4955 0x27309 +0x4956 0x27304 +0x4957 0x27306 +0x4958 0x2731A +0x4959 0x2730E +0x495A 0x27327 +0x495B 0x27305 +0x495C 0x27307 +0x495D 0x27319 +0x495E 0x27314 +0x495F 0x2730C +0x4960 0x2731D +0x4961 0x27322 +0x4962 0x27323 +0x4963 0x275BB +0x4964 0x275BC +0x4965 0x275BA +0x4966 0x276A9 +0x4967 0x276B5 +0x4968 0x276AC +0x4969 0x276AA +0x496A 0x276AF +0x496B 0x276B7 +0x496E 0x2783D +0x496F 0x27845 +0x4970 0x27848 +0x4971 0x2783C +0x4972 0x2783E +0x4973 0x278EC +0x4974 0x278ED +0x4975 0x278E9 +0x4976 0x27A0A +0x4977 0x27A0B +0x4978 0x279F8 +0x4979 0x27A04 +0x497A 0x279F6 +0x497B 0x279F9 +0x497C 0x27C53 +0x497D 0x27C52 +0x497E 0x27C60 +0x4A21 0x27C63 +0x4A22 0x27CCE +0x4A23 0x27CCD +0x4A24 0x27CD0 +0x4A25 0x27CCC +0x4A26 0x27D87 +0x4A27 0x27D8D +0x4A28 0x27D9D +0x4A2A 0x27E63 +0x4A2B 0x27EF4 +0x4A2C 0x27EF1 +0x4A2D 0x27EFF +0x4A2E 0x27EF5 +0x4A2F 0x27EFC +0x4A30 0x27EF2 +0x4A31 0x27EF6 +0x4A33 0x27EFA +0x4A35 0x2802E +0x4A36 0x28045 +0x4A37 0x28043 +0x4A38 0x28051 +0x4A39 0x2804C +0x4A3A 0x28073 +0x4A3B 0x28047 +0x4A3C 0x2804B +0x4A3D 0x2804F +0x4A3F 0x28044 +0x4A40 0x2804D +0x4A41 0x2804E +0x4A42 0x2804A +0x4A43 0x28041 +0x4A44 0x28052 +0x4A45 0x2809F +0x4A46 0x28054 +0x4A47 0x28059 +0x4A48 0x280A2 +0x4A49 0x2824B +0x4A4A 0x28248 +0x4A4B 0x2830D +0x4A4C 0x2831F +0x4A4D 0x28308 +0x4A4E 0x2830E +0x4A4F 0x2831D +0x4A50 0x28304 +0x4A51 0x28418 +0x4A52 0x2841B +0x4A53 0x28566 +0x4A54 0x28562 +0x4A55 0x28583 +0x4A56 0x28567 +0x4A57 0x28762 +0x4A58 0x2874F +0x4A59 0x2874E +0x4A5A 0x28767 +0x4A5B 0x28753 +0x4A5C 0x2874D +0x4A5D 0x2874C +0x4A5E 0x28768 +0x4A5F 0x28751 +0x4A61 0x28758 +0x4A62 0x2875B +0x4A63 0x28750 +0x4A64 0x2876A +0x4A65 0x28839 +0x4A66 0x28838 +0x4A67 0x28982 +0x4A68 0x28984 +0x4A69 0x28986 +0x4A6A 0x28C80 +0x4A6B 0x28C86 +0x4A6C 0x28D25 +0x4A6D 0x28D11 +0x4A6F 0x28D0E +0x4A70 0x28D15 +0x4A71 0x28D0F +0x4A72 0x28D18 +0x4A73 0x28D0D +0x4A74 0x28D13 +0x4A75 0x28D16 +0x4A76 0x28D19 +0x4A77 0x28F08 +0x4A78 0x28EF7 +0x4A79 0x28EFB +0x4A7A 0x28EFC +0x4A7B 0x28FB4 +0x4A7C 0x28FBE +0x4A7D 0x28FC1 +0x4A7E 0x290A6 +0x4B21 0x290A5 +0x4B22 0x290A2 +0x4B23 0x290A4 +0x4B24 0x29212 +0x4B25 0x2920E +0x4B26 0x2927A +0x4B27 0x29278 +0x4B28 0x2927D +0x4B29 0x2927E +0x4B2A 0x29281 +0x4B2B 0x29283 +0x4B2C 0x29280 +0x4B2D 0x29282 +0x4B2E 0x2939B +0x4B2F 0x29399 +0x4B30 0x2939C +0x4B31 0x2939A +0x4B32 0x293A1 +0x4B33 0x2941A +0x4B34 0x2941C +0x4B35 0x2948A +0x4B36 0x29479 +0x4B37 0x29473 +0x4B38 0x29475 +0x4B39 0x2947C +0x4B3A 0x29478 +0x4B3B 0x29460 +0x4B3C 0x29483 +0x4B3D 0x29470 +0x4B40 0x29487 +0x4B41 0x29484 +0x4B42 0x2947B +0x4B43 0x2947E +0x4B44 0x29474 +0x4B45 0x295B9 +0x4B46 0x295B8 +0x4B47 0x295B7 +0x4B48 0x295B5 +0x4B49 0x296CC +0x4B4A 0x296CE +0x4B4B 0x296D1 +0x4B4D 0x296CB +0x4B4F 0x2987E +0x4B50 0x2987A +0x4B51 0x29877 +0x4B52 0x2988C +0x4B53 0x298E1 +0x4B54 0x29A20 +0x4B55 0x29A1E +0x4B56 0x29AC2 +0x4B57 0x29B0F +0x4B58 0x29B00 +0x4B5A 0x29B10 +0x4B5B 0x29C0D +0x4B5C 0x29C0E +0x4B5D 0x29C8E +0x4B5E 0x29C8D +0x4B5F 0x29C8A +0x4B60 0x29C8B +0x4B61 0x29C8C +0x4B62 0x29C8F +0x4B63 0x29D57 +0x4B65 0x29D55 +0x4B66 0x29D5B +0x4B67 0x29FAC +0x4B68 0x29FA7 +0x4B69 0x29FA0 +0x4B6A 0x29F9E +0x4B6C 0x2A28D +0x4B6E 0x2A393 +0x4B6F 0x2A394 +0x4B70 0x2A392 +0x4B71 0x20181 +0x4B72 0x203D6 +0x4B73 0x203C3 +0x4B74 0x203E4 +0x4B75 0x203E2 +0x4B76 0x20409 +0x4B77 0x203BF +0x4B78 0x203C8 +0x4B79 0x203C7 +0x4B7A 0x204B5 +0x4B7B 0x204B2 +0x4B7C 0x2060C +0x4B7D 0x2060B +0x4B7E 0x2060A +0x4C21 0x20605 +0x4C22 0x207D3 +0x4C23 0x207E6 +0x4C24 0x207E9 +0x4C25 0x207F0 +0x4C26 0x207EA +0x4C27 0x207E7 +0x4C28 0x208B1 +0x4C29 0x208B3 +0x4C2A 0x208B4 +0x4C2B 0x208B0 +0x4C2C 0x2095C +0x4C2D 0x2095D +0x4C2E 0x2095E +0x4C2F 0x209C0 +0x4C30 0x20AAF +0x4C32 0x20B86 +0x4C33 0x20B83 +0x4C34 0x20B84 +0x4C35 0x20F5C +0x4C36 0x20F70 +0x4C37 0x20F8C +0x4C38 0x20F7B +0x4C39 0x20F66 +0x4C3A 0x20F79 +0x4C3B 0x20F63 +0x4C3C 0x20FC5 +0x4C3D 0x20F6B +0x4C3E 0x20F6D +0x4C3F 0x20F72 +0x4C40 0x20F69 +0x4C41 0x20F75 +0x4C42 0x20F89 +0x4C43 0x20FC6 +0x4C44 0x20FA5 +0x4C45 0x203E7 +0x4C46 0x20F6A +0x4C47 0x20F97 +0x4C48 0x2145A +0x4C49 0x2145C +0x4C4A 0x21459 +0x4C4B 0x21424 +0x4C4C 0x21425 +0x4C4D 0x21430 +0x4C4E 0x21458 +0x4C4F 0x21431 +0x4C50 0x21576 +0x4C51 0x215C1 +0x4C52 0x21685 +0x4C53 0x2167D +0x4C54 0x21865 +0x4C55 0x21887 +0x4C56 0x21852 +0x4C57 0x21854 +0x4C58 0x2188A +0x4C59 0x21850 +0x4C5A 0x21886 +0x4C5B 0x2184F +0x4C5C 0x21868 +0x4C5D 0x2199D +0x4C5E 0x21AA0 +0x4C5F 0x21ABA +0x4C60 0x21ABD +0x4C61 0x21AB8 +0x4C62 0x21BA6 +0x4C64 0x21CDE +0x4C65 0x21CD8 +0x4C66 0x21CD1 +0x4C67 0x21F13 +0x4C69 0x21F0E +0x4C6A 0x21F1B +0x4C6B 0x21F3A +0x4C6D 0x21F1C +0x4C6E 0x21F12 +0x4C6F 0x21F16 +0x4C70 0x21F1A +0x4C71 0x21448 +0x4C72 0x2214B +0x4C73 0x22137 +0x4C74 0x22136 +0x4C75 0x22138 +0x4C76 0x2213A +0x4C77 0x22149 +0x4C78 0x2213C +0x4C79 0x2214A +0x4C7A 0x222B1 +0x4C7B 0x222C2 +0x4C7C 0x222B5 +0x4C7D 0x222C4 +0x4C7E 0x222B6 +0x4D21 0x2241E +0x4D22 0x2241F +0x4D23 0x224AF +0x4D24 0x2256B +0x4D25 0x2256F +0x4D26 0x22792 +0x4D27 0x227E4 +0x4D28 0x2282C +0x4D29 0x227EF +0x4D2B 0x2284F +0x4D2C 0x22852 +0x4D2D 0x22850 +0x4D2E 0x2283A +0x4D2F 0x22837 +0x4D30 0x22847 +0x4D31 0x22864 +0x4D32 0x22840 +0x4D33 0x2283C +0x4D34 0x22845 +0x4D35 0x22841 +0x4D36 0x229F3 +0x4D38 0x22CC1 +0x4D39 0x22CB4 +0x4D3B 0x22D2A +0x4D3C 0x22D22 +0x4D3D 0x22D29 +0x4D3F 0x22D3E +0x4D40 0x22D3C +0x4D41 0x22D30 +0x4D42 0x22FC7 +0x4D43 0x22FD5 +0x4D44 0x22FD6 +0x4D45 0x22FD3 +0x4D46 0x22FCE +0x4D47 0x22FC8 +0x4D48 0x2305C +0x4D49 0x2305F +0x4D4A 0x23062 +0x4D4C 0x230BD +0x4D4D 0x230BF +0x4D4E 0x2325C +0x4D4F 0x232B6 +0x4D51 0x2329D +0x4D52 0x2327F +0x4D54 0x23294 +0x4D55 0x23281 +0x4D56 0x23347 +0x4D57 0x23346 +0x4D59 0x23394 +0x4D5A 0x23675 +0x4D5B 0x2361A +0x4D5C 0x2362A +0x4D5D 0x23632 +0x4D5E 0x23617 +0x4D5F 0x23623 +0x4D60 0x23674 +0x4D62 0x23676 +0x4D63 0x2362E +0x4D64 0x23625 +0x4D65 0x23620 +0x4D66 0x23671 +0x4D67 0x23616 +0x4D68 0x23670 +0x4D69 0x2362C +0x4D6A 0x2362F +0x4D6B 0x2361F +0x4D6C 0x23664 +0x4D6E 0x23908 +0x4D6F 0x23914 +0x4D70 0x2390A +0x4D71 0x2390B +0x4D72 0x23A4F +0x4D73 0x23A59 +0x4D74 0x23A54 +0x4D75 0x23A51 +0x4D76 0x23AB6 +0x4D77 0x23BEC +0x4D78 0x23BED +0x4D79 0x23BEA +0x4D7A 0x23EEE +0x4D7B 0x23F5A +0x4D7C 0x23F73 +0x4D7D 0x23F65 +0x4D7E 0x23F61 +0x4E21 0x23F55 +0x4E22 0x23F6B +0x4E23 0x23F64 +0x4E24 0x23F5B +0x4E25 0x23F4C +0x4E26 0x23F6F +0x4E27 0x23F84 +0x4E28 0x23F70 +0x4E29 0x2435D +0x4E2A 0x24357 +0x4E2B 0x24366 +0x4E2C 0x24353 +0x4E2D 0x24398 +0x4E2E 0x24397 +0x4E2F 0x24528 +0x4E30 0x245EB +0x4E31 0x245EA +0x4E32 0x245E8 +0x4E33 0x245EC +0x4E34 0x245EF +0x4E35 0x246D1 +0x4E36 0x246CA +0x4E38 0x246CF +0x4E39 0x246CD +0x4E3A 0x246CE +0x4E3B 0x24870 +0x4E3C 0x24867 +0x4E3D 0x24873 +0x4E3E 0x2486D +0x4E3F 0x24876 +0x4E40 0x24879 +0x4E41 0x2486A +0x4E42 0x2488B +0x4E43 0x24872 +0x4E44 0x24871 +0x4E45 0x2486E +0x4E46 0x2487A +0x4E47 0x24A16 +0x4E48 0x24A39 +0x4E49 0x24A3B +0x4E4A 0x24B10 +0x4E4B 0x24B96 +0x4E4C 0x24B7B +0x4E4D 0x24B7C +0x4E4E 0x24B7D +0x4E4F 0x24CBE +0x4E50 0x24E5C +0x4E51 0x24E38 +0x4E52 0x24E39 +0x4E53 0x24E2E +0x4E54 0x24E34 +0x4E55 0x24E32 +0x4E56 0x24E5B +0x4E57 0x24E33 +0x4E58 0x24E3C +0x4E5A 0x2500E +0x4E5B 0x2500F +0x4E5C 0x25010 +0x4E5D 0x25087 +0x4E5E 0x2525B +0x4E5F 0x25253 +0x4E61 0x2525C +0x4E62 0x2523F +0x4E63 0x25259 +0x4E64 0x2524A +0x4E65 0x25244 +0x4E66 0x2524C +0x4E67 0x25240 +0x4E68 0x2525F +0x4E69 0x2525E +0x4E6A 0x2524E +0x4E6B 0x25254 +0x4E6C 0x25243 +0x4E6D 0x25287 +0x4E6E 0x25382 +0x4E6F 0x25385 +0x4E70 0x25531 +0x4E71 0x25547 +0x4E72 0x2552E +0x4E73 0x2552F +0x4E74 0x25548 +0x4E75 0x25534 +0x4E77 0x2059F +0x4E78 0x25832 +0x4E79 0x25836 +0x4E7A 0x25833 +0x4E7B 0x25831 +0x4E7C 0x25840 +0x4E7D 0x25841 +0x4E7E 0x259DD +0x4F21 0x259D2 +0x4F22 0x259D9 +0x4F24 0x259DF +0x4F25 0x259DB +0x4F26 0x259D8 +0x4F27 0x259D3 +0x4F28 0x259DE +0x4F29 0x259E0 +0x4F2A 0x259D4 +0x4F2B 0x259D7 +0x4F2C 0x259DA +0x4F2D 0x25AA7 +0x4F2E 0x25BFE +0x4F2F 0x25BDD +0x4F30 0x25C40 +0x4F31 0x25BE2 +0x4F33 0x25BD6 +0x4F34 0x25BDE +0x4F35 0x25BEF +0x4F37 0x25BEB +0x4F38 0x25BEA +0x4F39 0x25BE4 +0x4F3A 0x25BD1 +0x4F3C 0x25BEC +0x4F3D 0x25BFA +0x4F3E 0x25BD9 +0x4F3F 0x25BF3 +0x4F40 0x25BE1 +0x4F41 0x25BDC +0x4F42 0x25BE5 +0x4F43 0x25BDF +0x4F44 0x25BD4 +0x4F46 0x25C05 +0x4F47 0x25ED6 +0x4F48 0x25ED5 +0x4F49 0x25ED0 +0x4F4A 0x25EC8 +0x4F4B 0x25EC4 +0x4F4C 0x25EC9 +0x4F4D 0x25ECD +0x4F4E 0x25ED2 +0x4F4F 0x25ECC +0x4F50 0x25ECA +0x4F51 0x260A0 +0x4F52 0x26092 +0x4F55 0x2608B +0x4F56 0x260A1 +0x4F57 0x26095 +0x4F58 0x26088 +0x4F59 0x26086 +0x4F5A 0x2608D +0x4F5B 0x26085 +0x4F5C 0x26091 +0x4F5D 0x26089 +0x4F5E 0x260A2 +0x4F5F 0x262F0 +0x4F60 0x262F3 +0x4F61 0x262F4 +0x4F62 0x262EF +0x4F63 0x26306 +0x4F64 0x263A2 +0x4F65 0x2645E +0x4F66 0x26463 +0x4F67 0x26460 +0x4F68 0x2645B +0x4F69 0x2647B +0x4F6A 0x26458 +0x4F6B 0x26459 +0x4F6C 0x2645D +0x4F6D 0x26505 +0x4F6E 0x26506 +0x4F6F 0x26502 +0x4F70 0x26503 +0x4F71 0x26504 +0x4F72 0x265A2 +0x4F73 0x265A7 +0x4F74 0x265A6 +0x4F75 0x265A4 +0x4F76 0x265AC +0x4F77 0x265A9 +0x4F78 0x267E7 +0x4F79 0x26801 +0x4F7A 0x267DF +0x4F7B 0x267D9 +0x4F7C 0x267E3 +0x4F7D 0x2680F +0x4F7E 0x2691A +0x5021 0x26945 +0x5022 0x26948 +0x5023 0x2697B +0x5024 0x26985 +0x5025 0x26986 +0x5026 0x269FE +0x5027 0x269FF +0x5028 0x26A64 +0x5029 0x26A71 +0x502A 0x26A72 +0x502B 0x26A61 +0x502C 0x26A62 +0x502D 0x26A6C +0x502E 0x26A60 +0x502F 0x26A5D +0x5030 0x26A63 +0x5031 0x26A67 +0x5032 0x26E01 +0x5033 0x26E2A +0x5034 0x26E30 +0x5035 0x26E06 +0x5036 0x26E7D +0x5037 0x26E22 +0x5038 0x26EB9 +0x5039 0x26E0A +0x503A 0x26E10 +0x503B 0x26D8F +0x503C 0x26E80 +0x503D 0x26E13 +0x503E 0x26E2E +0x503F 0x26E18 +0x5040 0x26E17 +0x5041 0x26E1A +0x5042 0x26E14 +0x5043 0x26E47 +0x5044 0x26E63 +0x5045 0x26E38 +0x5047 0x26E7F +0x5048 0x26E21 +0x5049 0x26E37 +0x504A 0x26E31 +0x504B 0x26E1B +0x504C 0x26EA5 +0x504D 0x26F6C +0x504E 0x271D3 +0x504F 0x27388 +0x5050 0x2736E +0x5051 0x2735C +0x5052 0x27374 +0x5053 0x27354 +0x5054 0x27383 +0x5056 0x27365 +0x5057 0x27360 +0x5058 0x27370 +0x5059 0x2736F +0x505A 0x2736D +0x505B 0x27372 +0x505C 0x2736C +0x505D 0x27376 +0x505E 0x27375 +0x505F 0x27359 +0x5060 0x273C7 +0x5061 0x275C1 +0x5062 0x275F9 +0x5063 0x276E3 +0x5064 0x276E7 +0x5065 0x276D6 +0x5066 0x276CF +0x5067 0x276DA +0x5068 0x276E9 +0x5069 0x276D2 +0x506A 0x27855 +0x506B 0x2784F +0x506C 0x2784D +0x506D 0x27851 +0x506E 0x27856 +0x506F 0x278F9 +0x5070 0x278F8 +0x5071 0x27906 +0x5072 0x27903 +0x5073 0x27909 +0x5074 0x278F7 +0x5075 0x278F5 +0x5076 0x27A47 +0x5077 0x27A45 +0x5078 0x27A3E +0x5079 0x27A46 +0x507A 0x27A29 +0x507B 0x27A34 +0x507C 0x27A3F +0x507D 0x27A44 +0x507E 0x27A35 +0x5121 0x27A5A +0x5122 0x27A2A +0x5123 0x27A33 +0x5124 0x27A37 +0x5125 0x27A43 +0x5126 0x27A39 +0x5127 0x27A30 +0x5128 0x27A5D +0x5129 0x27A32 +0x512A 0x27A27 +0x512B 0x27BBD +0x512C 0x27BBA +0x512D 0x27BBC +0x512E 0x27BF1 +0x512F 0x27BF0 +0x5130 0x27C61 +0x5131 0x27C5C +0x5132 0x27C58 +0x5133 0x27C5D +0x5134 0x27CDA +0x5135 0x27CD9 +0x5136 0x27CDD +0x5137 0x27CDC +0x5138 0x27CDE +0x513A 0x27DA0 +0x513B 0x27DA2 +0x513C 0x27F0F +0x513D 0x27F13 +0x513E 0x27F12 +0x513F 0x27F11 +0x5140 0x27F14 +0x5141 0x27F19 +0x5142 0x27F0E +0x5143 0x27F17 +0x5144 0x27F21 +0x5145 0x27F20 +0x5146 0x27F16 +0x5147 0x28078 +0x5149 0x28087 +0x514A 0x28079 +0x514B 0x28080 +0x514C 0x28077 +0x514D 0x28081 +0x514E 0x28046 +0x514F 0x2807A +0x5150 0x2809C +0x5151 0x28083 +0x5152 0x28084 +0x5153 0x280AD +0x5154 0x2809D +0x5155 0x2809E +0x5156 0x28255 +0x5157 0x28336 +0x5158 0x2832B +0x5159 0x28327 +0x515A 0x28346 +0x515B 0x2832C +0x515C 0x28345 +0x515D 0x28333 +0x515E 0x2832D +0x515F 0x28334 +0x5160 0x28322 +0x5162 0x2841F +0x5163 0x285B3 +0x5164 0x2858C +0x5165 0x2858F +0x5166 0x285AF +0x5167 0x285AD +0x5168 0x2858E +0x5169 0x285AC +0x516A 0x285B0 +0x516B 0x285B1 +0x516C 0x285AE +0x516D 0x28599 +0x516E 0x286EB +0x516F 0x28774 +0x5170 0x28775 +0x5171 0x2878E +0x5172 0x2876D +0x5173 0x28770 +0x5174 0x2878C +0x5175 0x2884F +0x5176 0x28851 +0x5177 0x28858 +0x5178 0x2884C +0x5179 0x2884E +0x517A 0x28915 +0x517B 0x289BE +0x517C 0x289DB +0x517D 0x289B3 +0x517E 0x289AE +0x5221 0x28C87 +0x5222 0x28C8A +0x5223 0x28C88 +0x5224 0x28C8B +0x5225 0x28C8C +0x5226 0x28D44 +0x5227 0x28D2D +0x5228 0x28D2A +0x5229 0x28D31 +0x522A 0x28D2C +0x522B 0x28D45 +0x522C 0x28D30 +0x522D 0x28D29 +0x522E 0x28D46 +0x522F 0x28EF4 +0x5230 0x28F14 +0x5231 0x28F10 +0x5232 0x28F0F +0x5233 0x28F12 +0x5234 0x28F0B +0x5235 0x28F0C +0x5236 0x28F0A +0x5237 0x28F13 +0x5238 0x28F0E +0x5239 0x28FD9 +0x523A 0x28FD0 +0x523C 0x290C1 +0x523D 0x290BF +0x523E 0x290BD +0x523F 0x290BC +0x5240 0x290BA +0x5241 0x290BB +0x5242 0x290D1 +0x5243 0x290BE +0x5244 0x290D0 +0x5245 0x290B9 +0x5246 0x2921A +0x5247 0x2921C +0x5248 0x2921B +0x5249 0x29291 +0x524A 0x29296 +0x524B 0x2929F +0x524C 0x2929C +0x524D 0x2929A +0x524E 0x2929D +0x524F 0x293AD +0x5250 0x293A5 +0x5251 0x293AE +0x5252 0x29403 +0x5253 0x29426 +0x5254 0x29420 +0x5255 0x29423 +0x5256 0x29424 +0x5257 0x29421 +0x5258 0x29428 +0x5259 0x29425 +0x525A 0x2941E +0x525B 0x29494 +0x525C 0x29493 +0x525D 0x2948F +0x525E 0x2949A +0x525F 0x294AD +0x5261 0x295CA +0x5262 0x295C5 +0x5263 0x296BB +0x5264 0x296E1 +0x5265 0x296EA +0x5266 0x296E4 +0x5267 0x296ED +0x5268 0x296E6 +0x5269 0x296E0 +0x526A 0x296E8 +0x526B 0x296E5 +0x526C 0x2981A +0x526D 0x29894 +0x526E 0x29896 +0x526F 0x2989E +0x5270 0x29895 +0x5271 0x298A1 +0x5272 0x2988E +0x5273 0x2989B +0x5274 0x29892 +0x5275 0x29897 +0x5276 0x29899 +0x5277 0x29893 +0x5278 0x29A32 +0x5279 0x29A2F +0x527A 0x29A2E +0x527B 0x29A33 +0x527C 0x29B1C +0x527D 0x29B1E +0x527E 0x29B11 +0x5321 0x29B20 +0x5322 0x29B1F +0x5323 0x29B19 +0x5324 0x29B16 +0x5325 0x29CAC +0x5326 0x29CB9 +0x5327 0x29CB3 +0x5328 0x29CA6 +0x5329 0x29CA2 +0x532A 0x29CA9 +0x532B 0x29CA7 +0x532C 0x29D6C +0x532D 0x29D6D +0x532E 0x29D69 +0x532F 0x29D80 +0x5330 0x29D66 +0x5331 0x29D65 +0x5332 0x29D71 +0x5333 0x29D6B +0x5334 0x29FBD +0x5335 0x29FC1 +0x5336 0x29FD3 +0x5337 0x29FB6 +0x5339 0x29FB9 +0x533A 0x29FD4 +0x533B 0x29FB7 +0x533C 0x29FDB +0x533D 0x29FB8 +0x533E 0x29FC0 +0x533F 0x29FBC +0x5340 0x29FD5 +0x5341 0x29FBF +0x5342 0x29FC3 +0x5343 0x29FC9 +0x5344 0x2A258 +0x5345 0x2A290 +0x5346 0x2A295 +0x5347 0x2A297 +0x5348 0x2A309 +0x5349 0x2A308 +0x534A 0x2A306 +0x534B 0x2A305 +0x534C 0x2A310 +0x534D 0x2A397 +0x534E 0x2A395 +0x534F 0x2A3EE +0x5350 0x2A41F +0x5351 0x2FA1A +0x5352 0x21B4B +0x5353 0x2018E +0x5354 0x203E8 +0x5355 0x203F0 +0x5356 0x203F4 +0x5357 0x20406 +0x5358 0x203ED +0x535A 0x203E9 +0x535B 0x20400 +0x535C 0x204B8 +0x535D 0x2056D +0x535E 0x20804 +0x535F 0x20801 +0x5360 0x20803 +0x5361 0x20802 +0x5364 0x20962 +0x5365 0x20ABA +0x5366 0x20B13 +0x5367 0x20FDE +0x5368 0x20FD7 +0x5369 0x20FE4 +0x536A 0x20FCE +0x536B 0x20FE3 +0x536C 0x20FDD +0x536D 0x2103A +0x536E 0x20FDB +0x536F 0x20FD6 +0x5370 0x20FE0 +0x5371 0x20FD4 +0x5372 0x20FCB +0x5373 0x20FE1 +0x5374 0x20FC9 +0x5375 0x20FDF +0x5376 0x2103C +0x5377 0x20FFC +0x5378 0x20FCF +0x5379 0x21479 +0x537A 0x21476 +0x537B 0x21478 +0x537C 0x21687 +0x537D 0x2189C +0x537E 0x218B1 +0x5421 0x218C1 +0x5422 0x2189A +0x5423 0x21892 +0x5425 0x218C2 +0x5426 0x21896 +0x5427 0x218C0 +0x5428 0x21891 +0x5429 0x21895 +0x542A 0x219A2 +0x542B 0x21AC3 +0x542C 0x21AC0 +0x542D 0x21AC2 +0x542E 0x20B8A +0x542F 0x21BB0 +0x5430 0x21C16 +0x5431 0x21F46 +0x5432 0x21F4A +0x5433 0x21F3E +0x5434 0x21F45 +0x5435 0x21F42 +0x5437 0x21F5B +0x5438 0x21F44 +0x5439 0x22004 +0x543A 0x24022 +0x543B 0x22155 +0x543C 0x22157 +0x543D 0x22151 +0x543E 0x2214E +0x543F 0x2215A +0x5440 0x222C6 +0x5441 0x222C3 +0x5443 0x222C5 +0x5444 0x222CC +0x5445 0x22371 +0x5446 0x22426 +0x5447 0x224B2 +0x5448 0x2257A +0x5449 0x22584 +0x544A 0x2257B +0x544B 0x22874 +0x544C 0x2288C +0x544D 0x22851 +0x544E 0x22848 +0x544F 0x2288D +0x5450 0x22892 +0x5451 0x22898 +0x5452 0x22893 +0x5453 0x228B0 +0x5454 0x2284E +0x5455 0x22896 +0x5456 0x22897 +0x5457 0x2289C +0x5458 0x228CA +0x5459 0x22D33 +0x545A 0x22D83 +0x545B 0x22D84 +0x545C 0x22D9A +0x545D 0x22D8C +0x545F 0x22D99 +0x5460 0x22EE0 +0x5461 0x22FE4 +0x5462 0x22FF8 +0x5463 0x22FED +0x5464 0x22FF3 +0x5465 0x22FF4 +0x5466 0x22FF5 +0x5467 0x22FFD +0x5468 0x23119 +0x5469 0x2329E +0x546A 0x232C4 +0x546B 0x2329F +0x546C 0x2339B +0x546D 0x2339F +0x546E 0x2339A +0x546F 0x236AA +0x5470 0x2369D +0x5471 0x23692 +0x5472 0x236A2 +0x5473 0x236AF +0x5474 0x236EB +0x5475 0x236A0 +0x5476 0x236A1 +0x5477 0x23694 +0x5478 0x23698 +0x5479 0x2368F +0x547A 0x23687 +0x547B 0x23684 +0x547C 0x236A9 +0x547D 0x2367C +0x547E 0x23918 +0x5521 0x23A5F +0x5522 0x23A62 +0x5523 0x23A61 +0x5524 0x23AC0 +0x5525 0x23B15 +0x5526 0x23BFC +0x5527 0x23BF9 +0x5528 0x23FC8 +0x5529 0x23FC9 +0x552A 0x23FDE +0x552B 0x23FCA +0x552C 0x23FE2 +0x552F 0x24004 +0x5530 0x23FCC +0x5531 0x23FDD +0x5532 0x23FE4 +0x5533 0x23FD3 +0x5534 0x23FC7 +0x5535 0x23FC6 +0x5537 0x24037 +0x5538 0x243D8 +0x5539 0x243EE +0x553A 0x243B2 +0x553B 0x243A3 +0x553C 0x243B3 +0x553D 0x243ED +0x553E 0x243F8 +0x553F 0x24531 +0x5540 0x2455B +0x5541 0x24566 +0x5542 0x24569 +0x5543 0x24596 +0x5544 0x2459B +0x5545 0x245F7 +0x5546 0x245F3 +0x5547 0x245F4 +0x5548 0x245F5 +0x5549 0x246E2 +0x554A 0x246E7 +0x554B 0x246E5 +0x554C 0x246E9 +0x554D 0x246E6 +0x554E 0x246E3 +0x554F 0x24874 +0x5550 0x2487F +0x5551 0x2488F +0x5552 0x24890 +0x5553 0x24897 +0x5554 0x248A3 +0x5555 0x2488E +0x5556 0x24898 +0x5557 0x2488C +0x5558 0x24A42 +0x5559 0x24A44 +0x555A 0x24A69 +0x555B 0x24A43 +0x555C 0x24A68 +0x555E 0x24B8D +0x555F 0x24B88 +0x5560 0x24B8B +0x5561 0x24B89 +0x5562 0x24CCC +0x5563 0x24D1F +0x5564 0x24E80 +0x5565 0x24E5E +0x5566 0x24E67 +0x5567 0x24E68 +0x5568 0x24E65 +0x556A 0x24E74 +0x556B 0x24E69 +0x556C 0x24E61 +0x556D 0x24E62 +0x556E 0x24E6C +0x556F 0x24E93 +0x5570 0x24E86 +0x5571 0x24F9D +0x5572 0x24F9B +0x5573 0x2501B +0x5574 0x25016 +0x5575 0x25019 +0x5576 0x25014 +0x5577 0x25018 +0x5578 0x25015 +0x5579 0x25099 +0x557A 0x25098 +0x557B 0x2525D +0x557C 0x25289 +0x557D 0x2527A +0x557E 0x2527D +0x5621 0x2524B +0x5623 0x25278 +0x5624 0x2527F +0x5625 0x25277 +0x5626 0x2527E +0x5627 0x25279 +0x5628 0x252AB +0x5629 0x2527C +0x562A 0x25274 +0x562B 0x25275 +0x562C 0x252A7 +0x562D 0x2538D +0x562E 0x2554E +0x562F 0x25566 +0x5630 0x25561 +0x5631 0x2554D +0x5632 0x2554F +0x5634 0x25554 +0x5635 0x2557C +0x5636 0x256DA +0x5637 0x256DE +0x5638 0x256D8 +0x5639 0x256DD +0x563A 0x256DF +0x563B 0x25866 +0x563C 0x25862 +0x563D 0x2585F +0x563E 0x25864 +0x563F 0x25863 +0x5640 0x25860 +0x5641 0x25888 +0x5642 0x2586A +0x5643 0x25867 +0x5644 0x25887 +0x5645 0x2583F +0x5646 0x2586C +0x5647 0x2586E +0x5648 0x258AD +0x5649 0x259F1 +0x564A 0x259F4 +0x564B 0x259F6 +0x564C 0x259F5 +0x564D 0x259F8 +0x564E 0x259FB +0x564F 0x259EC +0x5650 0x259EF +0x5651 0x259ED +0x5653 0x259F7 +0x5654 0x259F9 +0x5655 0x259FD +0x5656 0x25AB1 +0x5657 0x25C36 +0x5658 0x25C1B +0x5659 0x25C32 +0x565A 0x25C42 +0x565B 0x25C4D +0x565C 0x25C1F +0x565D 0x25C21 +0x565E 0x25C1C +0x565F 0x25C31 +0x5660 0x25C2E +0x5661 0x25C47 +0x5662 0x25C3B +0x5663 0x25C41 +0x5664 0x25C18 +0x5665 0x25C39 +0x5666 0x25C1D +0x5667 0x25C27 +0x5668 0x25C23 +0x566A 0x25EEE +0x566B 0x25EE8 +0x566C 0x25EE5 +0x566D 0x25EEF +0x566E 0x25EE4 +0x566F 0x25EEC +0x5670 0x25EF0 +0x5671 0x260D7 +0x5672 0x260D8 +0x5673 0x260D4 +0x5674 0x260CA +0x5675 0x260D2 +0x5676 0x260CB +0x5677 0x260D3 +0x5678 0x260E6 +0x5679 0x260E2 +0x567A 0x26249 +0x567B 0x26248 +0x567C 0x262FF +0x567D 0x26309 +0x567E 0x263B0 +0x5721 0x263AF +0x5722 0x2647C +0x5723 0x26478 +0x5724 0x2647A +0x5725 0x26472 +0x5726 0x26479 +0x5727 0x2647E +0x5728 0x2650C +0x5729 0x2650B +0x572A 0x265CD +0x572B 0x265BE +0x572C 0x265BC +0x572D 0x265BF +0x572E 0x265C0 +0x572F 0x265BD +0x5730 0x26838 +0x5731 0x26808 +0x5732 0x26805 +0x5733 0x2683B +0x5734 0x26810 +0x5735 0x2680C +0x5736 0x2680D +0x5737 0x26804 +0x5738 0x2683A +0x5739 0x26813 +0x573A 0x26837 +0x573B 0x26839 +0x573C 0x2691F +0x573D 0x2694B +0x573E 0x269EE +0x573F 0x26A75 +0x5740 0x26A78 +0x5741 0x26A7C +0x5742 0x26A74 +0x5743 0x26A76 +0x5744 0x26AEA +0x5745 0x26AEB +0x5746 0x26DFB +0x5747 0x26E19 +0x5748 0x26EA7 +0x5749 0x26E8C +0x574A 0x26EDC +0x574B 0x26E98 +0x574C 0x26EBE +0x574D 0x26E9E +0x574E 0x26F0F +0x574F 0x26E9F +0x5750 0x26EDD +0x5751 0x26E93 +0x5752 0x26EBB +0x5753 0x26EB6 +0x5754 0x26E90 +0x5755 0x26EA1 +0x5756 0x26EBD +0x5757 0x26EDE +0x5758 0x26E3A +0x5759 0x26F22 +0x575A 0x26E97 +0x575B 0x26E94 +0x575C 0x26EC3 +0x575D 0x26E8E +0x575E 0x26EA8 +0x575F 0x26E99 +0x5760 0x26EAD +0x5761 0x26E9B +0x5762 0x26EA2 +0x5763 0x26F21 +0x5764 0x26EAC +0x5765 0x26F0E +0x5766 0x26F31 +0x5767 0x271E1 +0x5768 0x271DE +0x5769 0x271DF +0x576A 0x271DC +0x576B 0x271DD +0x576C 0x271EC +0x576D 0x271E7 +0x576E 0x27369 +0x576F 0x273B8 +0x5770 0x273A1 +0x5771 0x273A8 +0x5772 0x273BA +0x5773 0x273C2 +0x5774 0x273A6 +0x5775 0x273A4 +0x5776 0x273A3 +0x5777 0x273AB +0x5778 0x273BC +0x5779 0x273B7 +0x577A 0x273BF +0x577B 0x273AD +0x577C 0x273B1 +0x577D 0x273CA +0x577E 0x273C4 +0x5821 0x273B9 +0x5822 0x275C8 +0x5823 0x275C6 +0x5824 0x275C7 +0x5825 0x2770A +0x5826 0x2770D +0x5827 0x276FB +0x5828 0x27703 +0x5829 0x27702 +0x582A 0x276FC +0x582B 0x276F9 +0x582C 0x276F8 +0x582D 0x2786E +0x582E 0x27863 +0x582F 0x27862 +0x5830 0x27861 +0x5831 0x2786B +0x5833 0x2786F +0x5834 0x27866 +0x5835 0x2786C +0x5836 0x2790E +0x5837 0x27915 +0x5838 0x27916 +0x5839 0x27910 +0x583A 0x27917 +0x583B 0x27911 +0x583C 0x27A6E +0x583D 0x27A6C +0x583E 0x27A87 +0x583F 0x27A83 +0x5840 0x27A63 +0x5841 0x27ADC +0x5842 0x27BC0 +0x5843 0x27BF7 +0x5844 0x27BFA +0x5845 0x27C70 +0x5846 0x27C6A +0x5847 0x27C68 +0x5848 0x27C69 +0x5849 0x27C84 +0x584A 0x27CEC +0x584B 0x27CE7 +0x584C 0x27CEE +0x584D 0x27DBA +0x584E 0x27DB2 +0x584F 0x27DB5 +0x5850 0x27DCB +0x5851 0x2080B +0x5852 0x27DD0 +0x5853 0x27E6D +0x5854 0x27E6C +0x5856 0x27F45 +0x5857 0x27F46 +0x5858 0x27F34 +0x5859 0x27F2C +0x585A 0x27F35 +0x585B 0x27F44 +0x585D 0x27F76 +0x585E 0x280B1 +0x585F 0x280AA +0x5860 0x280A1 +0x5861 0x280B2 +0x5863 0x280A6 +0x5864 0x280B5 +0x5865 0x280B4 +0x5866 0x280B8 +0x5867 0x280AF +0x5868 0x280B0 +0x5869 0x280A3 +0x586A 0x28262 +0x586B 0x28264 +0x586C 0x28356 +0x586D 0x28351 +0x586E 0x2834F +0x586F 0x28368 +0x5870 0x2834C +0x5871 0x28350 +0x5873 0x28348 +0x5874 0x2834A +0x5875 0x28421 +0x5876 0x285E3 +0x5877 0x285B9 +0x5878 0x285DE +0x5879 0x285B7 +0x587A 0x285E1 +0x587B 0x285B6 +0x587C 0x285B5 +0x587D 0x285DF +0x5921 0x28797 +0x5922 0x2879A +0x5923 0x2879B +0x5924 0x28798 +0x5925 0x28792 +0x5926 0x28793 +0x5927 0x287D7 +0x5928 0x28773 +0x5929 0x2886B +0x592A 0x28874 +0x592B 0x28878 +0x592C 0x2886D +0x592D 0x28918 +0x592E 0x289E9 +0x592F 0x289F5 +0x5930 0x289EA +0x5931 0x28A2E +0x5932 0x289E7 +0x5933 0x289FE +0x5934 0x289E5 +0x5935 0x28A36 +0x5936 0x289F0 +0x5937 0x289E6 +0x5938 0x28A2C +0x5939 0x28C89 +0x593A 0x28C95 +0x593B 0x28C93 +0x593C 0x28D4D +0x593D 0x28D4A +0x593E 0x28D4F +0x593F 0x28D50 +0x5940 0x28D4B +0x5941 0x28F2A +0x5942 0x28F2B +0x5943 0x28F2F +0x5944 0x28F2E +0x5945 0x28F7C +0x5946 0x28FED +0x5947 0x28FE2 +0x5948 0x290E0 +0x5949 0x290DC +0x594A 0x290DA +0x594B 0x290D6 +0x594C 0x290F4 +0x594D 0x290D9 +0x594E 0x290D5 +0x594F 0x29222 +0x5950 0x29221 +0x5951 0x29224 +0x5952 0x29225 +0x5953 0x29226 +0x5954 0x29223 +0x5955 0x292AA +0x5956 0x292AF +0x5957 0x292B0 +0x5958 0x292AB +0x5959 0x293AF +0x595A 0x293B7 +0x595B 0x293B5 +0x595C 0x293B2 +0x595D 0x293B3 +0x595E 0x2942B +0x595F 0x294D8 +0x5960 0x294C2 +0x5961 0x294AF +0x5962 0x294BC +0x5963 0x294B8 +0x5964 0x294BE +0x5965 0x294B7 +0x5966 0x294B4 +0x5967 0x294BF +0x5968 0x294B3 +0x5969 0x294B1 +0x596A 0x294BB +0x596B 0x294BD +0x596C 0x294D6 +0x596D 0x294DD +0x596E 0x295D8 +0x596F 0x295D3 +0x5970 0x295D5 +0x5971 0x295E3 +0x5972 0x295E2 +0x5973 0x295D9 +0x5974 0x295DE +0x5975 0x295DF +0x5976 0x295DA +0x5977 0x295D4 +0x5978 0x296F3 +0x5979 0x296E2 +0x597A 0x2970D +0x597B 0x29701 +0x597C 0x29705 +0x597D 0x2971A +0x597E 0x29703 +0x5A21 0x2971F +0x5A22 0x29716 +0x5A23 0x296FA +0x5A24 0x296FC +0x5A25 0x2970A +0x5A27 0x298BC +0x5A28 0x298CA +0x5A29 0x298B6 +0x5A2A 0x298C7 +0x5A2B 0x298BF +0x5A2D 0x298B9 +0x5A2F 0x298B0 +0x5A30 0x298B8 +0x5A31 0x298BD +0x5A32 0x29891 +0x5A33 0x298BB +0x5A34 0x298BE +0x5A35 0x29A3E +0x5A36 0x29A3D +0x5A37 0x29B38 +0x5A38 0x29B3D +0x5A39 0x29B39 +0x5A3A 0x29B33 +0x5A3B 0x29C33 +0x5A3C 0x29CBB +0x5A3D 0x29CC6 +0x5A3E 0x29CC5 +0x5A3F 0x29CC7 +0x5A40 0x29CCB +0x5A41 0x29CA8 +0x5A42 0x29CC8 +0x5A43 0x29CBE +0x5A44 0x29CC1 +0x5A45 0x29CBD +0x5A46 0x29D82 +0x5A47 0x29D9E +0x5A48 0x29D81 +0x5A49 0x29D84 +0x5A4B 0x29D96 +0x5A4C 0x29D8E +0x5A4D 0x29D88 +0x5A4E 0x29D87 +0x5A4F 0x29FE0 +0x5A50 0x2A00D +0x5A51 0x29FDF +0x5A52 0x29FE4 +0x5A53 0x29FE2 +0x5A54 0x29FDD +0x5A55 0x29FEC +0x5A56 0x29FDE +0x5A57 0x29FE7 +0x5A58 0x29FEA +0x5A59 0x29FE3 +0x5A5A 0x2A25C +0x5A5C 0x2A25D +0x5A5D 0x2A29C +0x5A5E 0x2A31D +0x5A5F 0x2A39D +0x5A60 0x2A39E +0x5A61 0x2A39B +0x5A62 0x2A3B5 +0x5A63 0x2A3B9 +0x5A64 0x2A3B6 +0x5A65 0x2A3F3 +0x5A66 0x2A3F2 +0x5A67 0x2A3F4 +0x5A68 0x2A426 +0x5A69 0x2A427 +0x5A6A 0x2A425 +0x5A6B 0x2A506 +0x5A6C 0x2A50B +0x5A6D 0x2A53A +0x5A6E 0x2A53C +0x5A6F 0x2040A +0x5A70 0x2040B +0x5A71 0x204BF +0x5A72 0x204FD +0x5A73 0x20618 +0x5A74 0x291DF +0x5A75 0x25390 +0x5A76 0x2069E +0x5A77 0x207FC +0x5A78 0x20810 +0x5A79 0x2080F +0x5A7A 0x2080D +0x5A7B 0x208B9 +0x5A7C 0x208B7 +0x5A7D 0x208BA +0x5A7E 0x2090A +0x5B21 0x21041 +0x5B22 0x2108B +0x5B23 0x21046 +0x5B24 0x21053 +0x5B25 0x210E2 +0x5B26 0x2103F +0x5B27 0x20F7C +0x5B28 0x2104B +0x5B29 0x2104E +0x5B2A 0x2108A +0x5B2B 0x21047 +0x5B2C 0x21493 +0x5B2D 0x27DCE +0x5B2E 0x2148C +0x5B2F 0x214AF +0x5B30 0x214C9 +0x5B31 0x215C6 +0x5B32 0x215C8 +0x5B33 0x21691 +0x5B34 0x218CF +0x5B35 0x218D4 +0x5B36 0x218CE +0x5B37 0x21ADD +0x5B38 0x21AD4 +0x5B39 0x21F49 +0x5B3A 0x21F63 +0x5B3B 0x21F5D +0x5B3D 0x21F67 +0x5B3E 0x21FBB +0x5B3F 0x21F60 +0x5B40 0x21F80 +0x5B41 0x2215F +0x5B42 0x22160 +0x5B43 0x222DA +0x5B44 0x222D2 +0x5B45 0x222DD +0x5B46 0x2258E +0x5B47 0x22588 +0x5B48 0x2256C +0x5B49 0x2289E +0x5B4A 0x228C9 +0x5B4B 0x228A4 +0x5B4D 0x228D9 +0x5B4E 0x228D2 +0x5B4F 0x228DA +0x5B50 0x228DD +0x5B51 0x228CE +0x5B52 0x228FC +0x5B53 0x22A14 +0x5B54 0x22A60 +0x5B55 0x22DD7 +0x5B56 0x22DCB +0x5B57 0x22DCD +0x5B58 0x22DD5 +0x5B59 0x22EE7 +0x5B5A 0x23000 +0x5B5B 0x2300A +0x5B5C 0x2300F +0x5B5D 0x23002 +0x5B5E 0x23001 +0x5B5F 0x2311D +0x5B60 0x232CA +0x5B61 0x232CB +0x5B62 0x232CD +0x5B63 0x2334F +0x5B64 0x2339C +0x5B65 0x23680 +0x5B66 0x2370D +0x5B67 0x23702 +0x5B69 0x23707 +0x5B6A 0x236F7 +0x5B6B 0x236F8 +0x5B6C 0x236FD +0x5B6D 0x23724 +0x5B6E 0x236FB +0x5B6F 0x23739 +0x5B70 0x2373A +0x5B71 0x23922 +0x5B73 0x23A6A +0x5B74 0x23A6D +0x5B75 0x23A74 +0x5B76 0x23C0E +0x5B77 0x23FDF +0x5B78 0x2402B +0x5B79 0x23FE3 +0x5B7A 0x24026 +0x5B7B 0x2402A +0x5B7C 0x24023 +0x5B7D 0x24035 +0x5B7E 0x2404A +0x5C21 0x243FD +0x5C22 0x24400 +0x5C23 0x2441E +0x5C24 0x243FF +0x5C25 0x2459E +0x5C26 0x245FA +0x5C27 0x246F1 +0x5C28 0x24895 +0x5C29 0x248A8 +0x5C2A 0x248A6 +0x5C2B 0x24A6E +0x5C2C 0x24A83 +0x5C2D 0x24A6D +0x5C2E 0x24B8F +0x5C30 0x24CDF +0x5C31 0x24CD5 +0x5C32 0x24CE0 +0x5C33 0x24CD3 +0x5C34 0x24CD8 +0x5C35 0x24E8C +0x5C37 0x24E94 +0x5C38 0x24E96 +0x5C39 0x24E85 +0x5C3A 0x24E8F +0x5C3B 0x24EA9 +0x5C3C 0x24E8E +0x5C3D 0x24E90 +0x5C3E 0x24EB8 +0x5C3F 0x24EC3 +0x5C40 0x24EBB +0x5C41 0x24FA5 +0x5C42 0x24FA2 +0x5C44 0x24FA3 +0x5C45 0x250B5 +0x5C46 0x250AC +0x5C47 0x250A8 +0x5C48 0x252AD +0x5C49 0x252B8 +0x5C4A 0x252B4 +0x5C4B 0x252AE +0x5C4C 0x252B6 +0x5C4E 0x252C1 +0x5C4F 0x252BF +0x5C50 0x25392 +0x5C51 0x25400 +0x5C52 0x25401 +0x5C53 0x25575 +0x5C54 0x25572 +0x5C55 0x25578 +0x5C56 0x25570 +0x5C57 0x2557E +0x5C58 0x2557D +0x5C59 0x2557F +0x5C5A 0x256EF +0x5C5B 0x2586D +0x5C5C 0x2588E +0x5C5D 0x2588F +0x5C5E 0x2588A +0x5C5F 0x2588D +0x5C60 0x25895 +0x5C61 0x2588B +0x5C62 0x2588C +0x5C63 0x258B0 +0x5C64 0x25893 +0x5C65 0x259FC +0x5C66 0x25A15 +0x5C67 0x25A0E +0x5C68 0x25A18 +0x5C69 0x25A11 +0x5C6A 0x25A0D +0x5C6B 0x25ABB +0x5C6C 0x25AB3 +0x5C6E 0x25CA1 +0x5C6F 0x25C9A +0x5C70 0x25C84 +0x5C71 0x25CA0 +0x5C72 0x25C86 +0x5C73 0x25C9D +0x5C74 0x25CAA +0x5C75 0x25C78 +0x5C76 0x25C8D +0x5C77 0x25C8A +0x5C78 0x25CA6 +0x5C79 0x25C7A +0x5C7A 0x25C97 +0x5C7B 0x25C88 +0x5C7C 0x25C8E +0x5D21 0x25C76 +0x5D22 0x25C81 +0x5D23 0x25C85 +0x5D24 0x25C75 +0x5D25 0x25CA8 +0x5D26 0x25C8F +0x5D27 0x25C91 +0x5D28 0x25CA2 +0x5D29 0x25C9C +0x5D2A 0x25C89 +0x5D2B 0x25C7F +0x5D2C 0x25C96 +0x5D2D 0x25C79 +0x5D2E 0x25C9F +0x5D2F 0x25CA7 +0x5D31 0x25C87 +0x5D32 0x25C9B +0x5D33 0x25CA5 +0x5D34 0x25C8B +0x5D35 0x25CC9 +0x5D36 0x25EFF +0x5D37 0x25F03 +0x5D38 0x25F00 +0x5D39 0x25F02 +0x5D3A 0x25F04 +0x5D3B 0x25F05 +0x5D3C 0x25EE6 +0x5D3D 0x25F1F +0x5D3E 0x26114 +0x5D40 0x2610C +0x5D41 0x2610F +0x5D42 0x26119 +0x5D43 0x2610B +0x5D44 0x26113 +0x5D45 0x260D5 +0x5D47 0x2611C +0x5D48 0x26250 +0x5D49 0x2624E +0x5D4A 0x26312 +0x5D4B 0x263B9 +0x5D4C 0x26485 +0x5D4D 0x26488 +0x5D4E 0x26490 +0x5D4F 0x26513 +0x5D50 0x265D0 +0x5D51 0x265D1 +0x5D52 0x265D2 +0x5D53 0x265D7 +0x5D54 0x265D6 +0x5D55 0x265E5 +0x5D56 0x26846 +0x5D57 0x2686B +0x5D58 0x26845 +0x5D59 0x2683F +0x5D5A 0x2683E +0x5D5C 0x2686A +0x5D5D 0x26868 +0x5D5E 0x2684C +0x5D5F 0x26923 +0x5D60 0x26922 +0x5D61 0x26997 +0x5D62 0x26991 +0x5D63 0x25AB5 +0x5D64 0x26998 +0x5D65 0x2699C +0x5D66 0x26A89 +0x5D68 0x26A8B +0x5D69 0x26A8A +0x5D6A 0x26A8D +0x5D6B 0x26A8E +0x5D6C 0x26A88 +0x5D6D 0x26F4E +0x5D6E 0x26F44 +0x5D6F 0x26F37 +0x5D70 0x26F75 +0x5D71 0x26F54 +0x5D72 0x26F76 +0x5D73 0x26F34 +0x5D74 0x26F6B +0x5D75 0x26F32 +0x5D76 0x26F57 +0x5D77 0x26F52 +0x5D78 0x26F45 +0x5D7A 0x26EB1 +0x5D7B 0x26F4B +0x5D7C 0x26F47 +0x5D7D 0x26F33 +0x5D7E 0x26F40 +0x5E21 0x26F3C +0x5E22 0x26F43 +0x5E23 0x26F4F +0x5E24 0x26F55 +0x5E25 0x26F41 +0x5E26 0x26FB2 +0x5E27 0x26FC0 +0x5E28 0x27434 +0x5E29 0x273F9 +0x5E2A 0x27419 +0x5E2B 0x2740D +0x5E2C 0x273FA +0x5E2D 0x2741E +0x5E2E 0x2741F +0x5E2F 0x2740E +0x5E30 0x27440 +0x5E31 0x27408 +0x5E33 0x27413 +0x5E34 0x2744C +0x5E36 0x275CC +0x5E37 0x275CB +0x5E38 0x27724 +0x5E39 0x27725 +0x5E3A 0x2773D +0x5E3B 0x27720 +0x5E3C 0x27727 +0x5E3D 0x27726 +0x5E3E 0x2771D +0x5E3F 0x2771E +0x5E40 0x27732 +0x5E41 0x2776C +0x5E42 0x27759 +0x5E44 0x2787A +0x5E45 0x27879 +0x5E46 0x2791B +0x5E47 0x2792E +0x5E48 0x27923 +0x5E49 0x27920 +0x5E4A 0x2791F +0x5E4B 0x27AB6 +0x5E4C 0x27AB9 +0x5E4D 0x27AA1 +0x5E4E 0x27AA3 +0x5E4F 0x27AA8 +0x5E50 0x27AAF +0x5E51 0x27A9A +0x5E52 0x27A99 +0x5E53 0x27AA2 +0x5E54 0x27A9D +0x5E56 0x27AAB +0x5E57 0x27BC9 +0x5E58 0x27BFE +0x5E59 0x27C00 +0x5E5A 0x27BFC +0x5E5B 0x27C07 +0x5E5C 0x27C75 +0x5E5D 0x27C72 +0x5E5E 0x27C73 +0x5E5F 0x27C74 +0x5E60 0x27CFA +0x5E61 0x27CFC +0x5E62 0x27CF8 +0x5E63 0x27CF6 +0x5E64 0x27CFB +0x5E65 0x27DCD +0x5E66 0x27DD1 +0x5E67 0x27DCF +0x5E68 0x27E74 +0x5E69 0x27E72 +0x5E6A 0x27E73 +0x5E6B 0x27F54 +0x5E6C 0x27F51 +0x5E6E 0x27F53 +0x5E6F 0x27F49 +0x5E70 0x27F4C +0x5E71 0x27F4A +0x5E72 0x27F4F +0x5E73 0x27F56 +0x5E74 0x28100 +0x5E75 0x280D5 +0x5E76 0x280D7 +0x5E77 0x280FF +0x5E78 0x280D9 +0x5E79 0x280E3 +0x5E7A 0x280D3 +0x5E7C 0x280D8 +0x5E7D 0x280D4 +0x5E7E 0x280DE +0x5F21 0x28271 +0x5F22 0x28374 +0x5F23 0x28388 +0x5F24 0x2837F +0x5F25 0x2836B +0x5F26 0x28387 +0x5F27 0x28379 +0x5F28 0x28378 +0x5F29 0x28389 +0x5F2A 0x28380 +0x5F2B 0x28376 +0x5F2C 0x28429 +0x5F2D 0x28428 +0x5F2E 0x2842F +0x5F2F 0x285E5 +0x5F30 0x28604 +0x5F31 0x28603 +0x5F32 0x285F0 +0x5F33 0x285E8 +0x5F34 0x285EA +0x5F35 0x285F1 +0x5F36 0x28601 +0x5F37 0x28602 +0x5F38 0x287A9 +0x5F39 0x287AB +0x5F3A 0x287B7 +0x5F3B 0x287B6 +0x5F3D 0x288A0 +0x5F3E 0x2888E +0x5F3F 0x28886 +0x5F40 0x28887 +0x5F41 0x28885 +0x5F42 0x2888B +0x5F43 0x28888 +0x5F44 0x28890 +0x5F45 0x2891A +0x5F46 0x28934 +0x5F47 0x28A37 +0x5F48 0x28A2F +0x5F49 0x28A30 +0x5F4A 0x28A39 +0x5F4B 0x28A34 +0x5F4C 0x28A33 +0x5F4D 0x28A85 +0x5F4E 0x28A84 +0x5F4F 0x28A3A +0x5F50 0x28C9F +0x5F51 0x28D69 +0x5F52 0x28D6C +0x5F53 0x28D6A +0x5F54 0x28D67 +0x5F55 0x28D6B +0x5F56 0x28F3F +0x5F57 0x28F40 +0x5F58 0x2900B +0x5F59 0x290D2 +0x5F5A 0x290F8 +0x5F5B 0x29101 +0x5F5C 0x290FA +0x5F5D 0x29116 +0x5F5E 0x2F9F6 +0x5F5F 0x2922C +0x5F60 0x2922D +0x5F61 0x2922F +0x5F62 0x2922E +0x5F63 0x292C1 +0x5F64 0x292F5 +0x5F65 0x292C4 +0x5F66 0x292DE +0x5F67 0x292CC +0x5F68 0x292D2 +0x5F69 0x292C2 +0x5F6A 0x292CD +0x5F6B 0x292CF +0x5F6C 0x292DD +0x5F6D 0x292C8 +0x5F6E 0x293BA +0x5F6F 0x293BE +0x5F70 0x293BF +0x5F71 0x2942E +0x5F72 0x29430 +0x5F73 0x294E7 +0x5F74 0x294EE +0x5F75 0x294E8 +0x5F76 0x294E6 +0x5F77 0x294E2 +0x5F78 0x294E4 +0x5F79 0x294FB +0x5F7A 0x294FC +0x5F7B 0x294EA +0x5F7C 0x295ED +0x5F7D 0x295F6 +0x5F7E 0x295F3 +0x6021 0x295F4 +0x6022 0x295F1 +0x6023 0x295F7 +0x6024 0x295F5 +0x6025 0x295EA +0x6026 0x295EB +0x6027 0x29700 +0x6028 0x2972C +0x6029 0x29712 +0x602A 0x2973D +0x602B 0x29733 +0x602D 0x29730 +0x602E 0x29740 +0x602F 0x29731 +0x6030 0x29757 +0x6032 0x29735 +0x6033 0x29732 +0x6034 0x2972D +0x6035 0x29736 +0x6036 0x29738 +0x6037 0x29762 +0x6038 0x2975F +0x6039 0x2978A +0x603A 0x298D6 +0x603B 0x298D8 +0x603C 0x298DD +0x603D 0x298E4 +0x603E 0x298E3 +0x603F 0x29A4D +0x6040 0x29AD7 +0x6041 0x29B4A +0x6042 0x29B4C +0x6043 0x29B50 +0x6044 0x29B4B +0x6045 0x29B4E +0x6046 0x29B4F +0x6047 0x29C39 +0x6048 0x29CD2 +0x6049 0x29CCD +0x604A 0x29CD3 +0x604B 0x29CE1 +0x604C 0x29CCE +0x604D 0x29CD5 +0x604E 0x29CDD +0x604F 0x29CD4 +0x6050 0x29CCF +0x6051 0x29DCB +0x6052 0x29DA6 +0x6053 0x29DC2 +0x6054 0x29DA5 +0x6055 0x29DA9 +0x6056 0x29DA2 +0x6057 0x29DA4 +0x6058 0x29DB0 +0x6059 0x29DCC +0x605A 0x29DAF +0x605B 0x29DBF +0x605C 0x2A024 +0x605D 0x2A01A +0x605E 0x2A014 +0x605F 0x2A03A +0x6060 0x2A020 +0x6061 0x2A01B +0x6062 0x2A021 +0x6063 0x2A025 +0x6064 0x2A01E +0x6065 0x2A03F +0x6066 0x2A040 +0x6067 0x2A018 +0x6068 0x2A02C +0x6069 0x2A015 +0x606A 0x2A02D +0x606B 0x2A01F +0x606C 0x2A029 +0x606D 0x2A04B +0x606E 0x2A2B3 +0x606F 0x2A2A5 +0x6070 0x2A2A7 +0x6071 0x2A2AB +0x6072 0x2A2A6 +0x6073 0x2A2AA +0x6074 0x2A322 +0x6075 0x2A323 +0x6076 0x2A3A1 +0x6077 0x2A3A3 +0x6078 0x2A3A0 +0x6079 0x2A3BD +0x607A 0x2A3BA +0x607B 0x2A3FA +0x607C 0x2A3F8 +0x607D 0x2A3FC +0x607E 0x2A3F6 +0x6121 0x2A434 +0x6122 0x2A443 +0x6124 0x2A4D4 +0x6125 0x2A50D +0x6126 0x2A543 +0x6127 0x2A541 +0x6128 0x2A53D +0x6129 0x2A540 +0x612A 0x2A53E +0x612B 0x2A53F +0x612C 0x2A546 +0x612E 0x2A5D4 +0x612F 0x20435 +0x6130 0x20436 +0x6131 0x20432 +0x6132 0x2043A +0x6133 0x204C8 +0x6134 0x20536 +0x6135 0x2061E +0x6136 0x2061D +0x6137 0x2061F +0x6138 0x2081C +0x6139 0x2081D +0x613A 0x20820 +0x613C 0x208C0 +0x613D 0x2109A +0x613E 0x21093 +0x613F 0x210DD +0x6141 0x210A3 +0x6142 0x210A9 +0x6143 0x2109C +0x6144 0x2109B +0x6146 0x21097 +0x6147 0x214B1 +0x6148 0x214CA +0x6149 0x214B3 +0x614A 0x214CD +0x614B 0x218EA +0x614C 0x218EE +0x614D 0x218EF +0x614E 0x21ADF +0x614F 0x21B50 +0x6150 0x21BBB +0x6151 0x21F88 +0x6152 0x21F89 +0x6153 0x21F8C +0x6154 0x21F85 +0x6155 0x21F5E +0x6156 0x21F94 +0x6157 0x21F95 +0x6158 0x2216B +0x6159 0x2216A +0x615A 0x22169 +0x615B 0x222E3 +0x615C 0x222F1 +0x615D 0x22437 +0x615E 0x22433 +0x615F 0x22591 +0x6160 0x2258F +0x6161 0x22597 +0x6162 0x228D4 +0x6163 0x228DE +0x6164 0x228D3 +0x6165 0x228E0 +0x6166 0x22943 +0x6167 0x2290B +0x6168 0x228FF +0x6169 0x22904 +0x616A 0x22907 +0x616B 0x22DF9 +0x616C 0x22DFA +0x616D 0x22DFB +0x616E 0x22DF8 +0x616F 0x23012 +0x6170 0x23010 +0x6171 0x2311F +0x6172 0x232DF +0x6173 0x232E3 +0x6174 0x23352 +0x6175 0x233A9 +0x6176 0x23765 +0x6177 0x23787 +0x6178 0x23742 +0x6179 0x23752 +0x617A 0x2374C +0x617B 0x2369F +0x617C 0x23701 +0x617D 0x23748 +0x617E 0x2374F +0x6221 0x2377E +0x6222 0x2374D +0x6223 0x23758 +0x6224 0x23747 +0x6225 0x2375E +0x6226 0x23749 +0x6227 0x2374E +0x6228 0x2375D +0x6229 0x2375A +0x622A 0x23786 +0x622B 0x23751 +0x622C 0x23929 +0x622D 0x239A6 +0x622E 0x239A7 +0x622F 0x23A70 +0x6230 0x23A6F +0x6231 0x23AD3 +0x6232 0x23AD2 +0x6233 0x23C28 +0x6234 0x23C1B +0x6235 0x23C1A +0x6236 0x23C1C +0x6237 0x23C21 +0x6238 0x24032 +0x6239 0x24066 +0x623A 0x2407D +0x623B 0x24073 +0x623C 0x2407F +0x623D 0x24065 +0x623E 0x24080 +0x623F 0x24061 +0x6240 0x24075 +0x6241 0x2406E +0x6242 0x24067 +0x6243 0x24071 +0x6244 0x2406C +0x6245 0x24063 +0x6246 0x24062 +0x6247 0x24083 +0x6248 0x240B2 +0x6249 0x24081 +0x624A 0x2406F +0x624B 0x2406B +0x624C 0x24082 +0x624D 0x2408A +0x624E 0x24429 +0x624F 0x24430 +0x6250 0x24431 +0x6251 0x24597 +0x6252 0x24600 +0x6253 0x245FF +0x6254 0x248B6 +0x6255 0x248B5 +0x6256 0x248C3 +0x6257 0x24A8D +0x6258 0x24B18 +0x6259 0x24B9C +0x625A 0x24B9A +0x625B 0x24B99 +0x625C 0x24EB7 +0x625D 0x24EC4 +0x625E 0x24EC6 +0x625F 0x24EC7 +0x6260 0x24EBC +0x6261 0x24EC0 +0x6262 0x24EC5 +0x6263 0x24ECD +0x6264 0x24EC1 +0x6265 0x24EBE +0x6266 0x24FA7 +0x6267 0x24FB8 +0x6268 0x25023 +0x626A 0x252E8 +0x626B 0x252DE +0x626C 0x252E3 +0x626D 0x252EF +0x626E 0x252DC +0x626F 0x252E4 +0x6270 0x252E1 +0x6271 0x252E5 +0x6272 0x25395 +0x6273 0x25394 +0x6274 0x25393 +0x6275 0x2538E +0x6276 0x25598 +0x6277 0x2559C +0x6278 0x25599 +0x6279 0x255A0 +0x627A 0x2559E +0x627B 0x25704 +0x627C 0x258D3 +0x627D 0x258B4 +0x627E 0x258BB +0x6321 0x258B7 +0x6322 0x258B8 +0x6323 0x258BD +0x6324 0x258B6 +0x6325 0x258B9 +0x6326 0x258B5 +0x6327 0x25A22 +0x6328 0x25A21 +0x6329 0x25AC3 +0x632A 0x25ABC +0x632B 0x25CFF +0x632C 0x25CE5 +0x632D 0x25CF7 +0x632E 0x25CD2 +0x632F 0x25D00 +0x6330 0x25CDB +0x6331 0x25CF0 +0x6332 0x25CE2 +0x6333 0x25CCD +0x6335 0x25CE1 +0x6336 0x25CF2 +0x6337 0x25CDC +0x6338 0x25CCC +0x6339 0x25CD6 +0x633A 0x25CF3 +0x633B 0x25CFA +0x633C 0x25CF6 +0x633D 0x25CEC +0x633E 0x25CEA +0x633F 0x25CE3 +0x6340 0x25CD0 +0x6342 0x25C95 +0x6343 0x25CD5 +0x6344 0x25CF4 +0x6345 0x25CCB +0x6346 0x25CDA +0x6347 0x25CC8 +0x6348 0x25CDF +0x6349 0x25CF5 +0x634A 0x25CCF +0x634B 0x25CC7 +0x634C 0x25CD7 +0x634D 0x25F24 +0x634F 0x25F1C +0x6350 0x25F21 +0x6351 0x25F1E +0x6352 0x25F18 +0x6353 0x25F1B +0x6355 0x26146 +0x6356 0x2614B +0x6357 0x26148 +0x6358 0x26147 +0x6359 0x26167 +0x635A 0x26154 +0x635B 0x26315 +0x635C 0x26322 +0x635D 0x263C5 +0x635E 0x26329 +0x635F 0x263C7 +0x6360 0x2648D +0x6361 0x2651B +0x6362 0x26520 +0x6363 0x265E2 +0x6364 0x265E7 +0x6365 0x265E8 +0x6366 0x265E1 +0x6367 0x26872 +0x6368 0x2687B +0x6369 0x26874 +0x636A 0x26871 +0x636B 0x26879 +0x636C 0x26875 +0x636D 0x26890 +0x636E 0x26877 +0x636F 0x2687D +0x6370 0x2694F +0x6371 0x26950 +0x6372 0x269A3 +0x6373 0x269A2 +0x6374 0x269F4 +0x6375 0x26A94 +0x6376 0x26A9A +0x6377 0x26A9B +0x6378 0x26AA7 +0x6379 0x26A97 +0x637A 0x26A95 +0x637B 0x26A92 +0x637C 0x26A9C +0x637D 0x26A96 +0x637E 0x26FB6 +0x6421 0x26FB8 +0x6422 0x26FB0 +0x6423 0x27018 +0x6424 0x26FC5 +0x6425 0x26FB5 +0x6426 0x26FC2 +0x6427 0x27006 +0x6428 0x27019 +0x6429 0x26FB9 +0x642A 0x27015 +0x642B 0x26FD6 +0x642C 0x26FAC +0x642E 0x26FC6 +0x642F 0x26FB3 +0x6430 0x26FC3 +0x6431 0x26FCA +0x6432 0x26FCF +0x6433 0x26FBD +0x6434 0x26FCE +0x6435 0x27014 +0x6436 0x26FBA +0x6437 0x2701A +0x6438 0x26FC1 +0x6439 0x26FBB +0x643C 0x27201 +0x643D 0x271FC +0x643E 0x2745A +0x643F 0x27454 +0x6440 0x27461 +0x6441 0x2745C +0x6442 0x27455 +0x6443 0x2744A +0x6444 0x2744B +0x6445 0x27451 +0x6446 0x27469 +0x6447 0x2746B +0x6449 0x27466 +0x644A 0x27458 +0x644B 0x2745D +0x644C 0x27467 +0x644D 0x27456 +0x644E 0x27488 +0x644F 0x27464 +0x6450 0x2744E +0x6451 0x27757 +0x6452 0x2775A +0x6453 0x27751 +0x6454 0x2774A +0x6455 0x2774B +0x6457 0x27747 +0x6458 0x2776F +0x6459 0x2776A +0x645A 0x2776B +0x645B 0x27746 +0x645C 0x2776D +0x645D 0x27754 +0x645E 0x2776E +0x645F 0x2774C +0x6460 0x27878 +0x6461 0x27886 +0x6462 0x27882 +0x6464 0x27AE1 +0x6465 0x27AE5 +0x6466 0x27ADB +0x6467 0x27ADE +0x6468 0x27AD7 +0x6469 0x27C03 +0x646A 0x27C7C +0x646B 0x27C7E +0x646C 0x27D05 +0x646D 0x27D07 +0x646E 0x27DE6 +0x646F 0x27DE1 +0x6470 0x27DFB +0x6471 0x27DE5 +0x6472 0x27DE7 +0x6473 0x27DDF +0x6474 0x27DFF +0x6475 0x27E76 +0x6476 0x27F63 +0x6477 0x27F66 +0x6478 0x27F65 +0x6479 0x27F5E +0x647A 0x27F64 +0x647B 0x27F6B +0x647C 0x27F5F +0x647D 0x27F67 +0x647E 0x27F68 +0x6521 0x28108 +0x6522 0x28109 +0x6523 0x28117 +0x6524 0x28115 +0x6525 0x2811B +0x6526 0x2810B +0x6527 0x28128 +0x6528 0x2810E +0x6529 0x28118 +0x652A 0x28153 +0x652B 0x28145 +0x652C 0x2810D +0x652D 0x2810A +0x652E 0x28113 +0x652F 0x2814A +0x6530 0x28279 +0x6531 0x283A1 +0x6532 0x2838D +0x6533 0x283A2 +0x6534 0x28390 +0x6536 0x28431 +0x6537 0x28430 +0x6538 0x2861F +0x6539 0x28619 +0x653A 0x2860C +0x653B 0x2861E +0x653C 0x2861D +0x653D 0x28607 +0x653E 0x28766 +0x653F 0x287C5 +0x6540 0x287BA +0x6541 0x287BD +0x6542 0x287C2 +0x6543 0x287C3 +0x6544 0x287BF +0x6546 0x288A1 +0x6547 0x288A2 +0x6548 0x288A8 +0x6549 0x288A3 +0x654A 0x288AA +0x654B 0x288AF +0x654C 0x288B9 +0x654D 0x28937 +0x654E 0x28A8F +0x6550 0x28A8E +0x6551 0x28A87 +0x6552 0x28A8A +0x6553 0x28A92 +0x6554 0x28A97 +0x6555 0x28A9F +0x6556 0x28B05 +0x6557 0x28CA9 +0x6558 0x28CA7 +0x6559 0x28D8A +0x655A 0x28D82 +0x655B 0x28D85 +0x655C 0x28D8B +0x655D 0x28D89 +0x655E 0x28D81 +0x655F 0x28D80 +0x6560 0x28D87 +0x6561 0x28D86 +0x6562 0x28F4D +0x6563 0x2901C +0x6564 0x2901F +0x6565 0x29121 +0x6566 0x2911D +0x6567 0x29122 +0x6568 0x290FE +0x6569 0x2911B +0x656A 0x2913A +0x656B 0x29137 +0x656C 0x29117 +0x656D 0x29138 +0x656E 0x29126 +0x656F 0x29118 +0x6570 0x29234 +0x6571 0x29235 +0x6572 0x29232 +0x6574 0x292E1 +0x6575 0x292FD +0x6576 0x292E3 +0x6577 0x292E8 +0x6578 0x292F9 +0x6579 0x292FF +0x657A 0x292FE +0x657C 0x292E0 +0x657D 0x29300 +0x6621 0x292EC +0x6622 0x292E4 +0x6623 0x292EF +0x6624 0x292FA +0x6625 0x293CA +0x6626 0x29431 +0x6627 0x29432 +0x6628 0x29434 +0x6629 0x29441 +0x662A 0x29500 +0x662B 0x29506 +0x662C 0x29508 +0x662D 0x29505 +0x662E 0x29503 +0x662F 0x2950B +0x6630 0x29502 +0x6631 0x2950A +0x6632 0x295F0 +0x6633 0x29613 +0x6634 0x2960A +0x6635 0x2960F +0x6636 0x29611 +0x6637 0x29608 +0x6638 0x2960B +0x6639 0x29612 +0x663A 0x2960D +0x663B 0x2975B +0x663C 0x29763 +0x663D 0x29761 +0x663E 0x29768 +0x663F 0x2975A +0x6640 0x2984E +0x6641 0x2984D +0x6642 0x29850 +0x6643 0x298FC +0x6644 0x29912 +0x6645 0x298F5 +0x6646 0x2991E +0x6647 0x298F0 +0x6648 0x298F3 +0x6649 0x298F2 +0x664A 0x29901 +0x664B 0x298EF +0x664C 0x298EE +0x664D 0x29916 +0x664E 0x298F6 +0x664F 0x298FB +0x6650 0x2991C +0x6652 0x29A5D +0x6653 0x29A60 +0x6654 0x29A66 +0x6655 0x29A5F +0x6656 0x29A61 +0x6657 0x29A5B +0x6658 0x29A62 +0x6659 0x29A57 +0x665A 0x29B69 +0x665B 0x29B6B +0x665C 0x29B61 +0x665D 0x29B77 +0x665E 0x29B5F +0x665F 0x29B63 +0x6660 0x29B62 +0x6661 0x29B65 +0x6662 0x29CEF +0x6663 0x29CE2 +0x6664 0x29D00 +0x6665 0x29CE8 +0x6666 0x29CF2 +0x6667 0x29CE7 +0x6669 0x29CE5 +0x666A 0x29DD5 +0x666B 0x29DD0 +0x666C 0x29DDA +0x666D 0x29DD3 +0x666F 0x29DD9 +0x6670 0x29DCF +0x6671 0x29DD6 +0x6672 0x29DD8 +0x6673 0x29DF5 +0x6674 0x29DCE +0x6675 0x29DD7 +0x6676 0x29DF4 +0x6677 0x29DCD +0x6678 0x29E01 +0x667A 0x2A052 +0x667B 0x2A055 +0x667C 0x2A05A +0x667D 0x2A04D +0x667E 0x2A054 +0x6721 0x2A053 +0x6722 0x2A05E +0x6723 0x2A067 +0x6724 0x2A065 +0x6725 0x2A04E +0x6727 0x2A04F +0x6728 0x2A061 +0x6729 0x2A06E +0x672A 0x2A051 +0x672B 0x2A05B +0x672C 0x2A263 +0x672D 0x2A2B7 +0x672E 0x2A2B6 +0x672F 0x2A2C3 +0x6730 0x2A2BB +0x6731 0x2A2B5 +0x6732 0x2A32E +0x6733 0x2A330 +0x6734 0x2A333 +0x6735 0x2A331 +0x6736 0x2A3A4 +0x6737 0x2A3C1 +0x6738 0x2A3BB +0x6739 0x2A3BE +0x673A 0x2A400 +0x673B 0x2A3FF +0x673C 0x2A440 +0x673E 0x2A43F +0x673F 0x2A444 +0x6742 0x2A4DB +0x6743 0x2A50F +0x6744 0x2A511 +0x6745 0x2A54E +0x6746 0x2A54D +0x6747 0x2A54B +0x6748 0x2A54C +0x6749 0x2A595 +0x674A 0x2043B +0x674B 0x20445 +0x674C 0x20444 +0x674D 0x2043E +0x674E 0x2043C +0x674F 0x2043F +0x6750 0x204CC +0x6751 0x204CE +0x6752 0x20622 +0x6753 0x20623 +0x6754 0x2069F +0x6755 0x208C5 +0x6756 0x208C4 +0x6757 0x210E9 +0x6758 0x21099 +0x675A 0x210E6 +0x675B 0x210E7 +0x675C 0x210F7 +0x675D 0x214D2 +0x675F 0x218FD +0x6760 0x2190C +0x6761 0x2190B +0x6762 0x21CED +0x6765 0x21F9B +0x6766 0x2200A +0x6767 0x2216F +0x6768 0x22175 +0x6769 0x222F2 +0x676A 0x222F8 +0x676B 0x2243E +0x676C 0x22924 +0x676D 0x2290E +0x676E 0x22916 +0x676F 0x22918 +0x6770 0x22910 +0x6771 0x22931 +0x6772 0x22944 +0x6774 0x22929 +0x6775 0x2292F +0x6776 0x2294B +0x6777 0x22936 +0x6779 0x22E34 +0x677A 0x22E00 +0x677B 0x22E2B +0x677C 0x23020 +0x677D 0x23021 +0x677E 0x2301E +0x6821 0x2301D +0x6822 0x232F5 +0x6823 0x232F2 +0x6824 0x232F6 +0x6825 0x23790 +0x6826 0x2379D +0x6827 0x2379C +0x6828 0x23792 +0x6829 0x23794 +0x682A 0x237D1 +0x682B 0x23793 +0x682C 0x237B7 +0x682D 0x23797 +0x682E 0x237B0 +0x682F 0x2379F +0x6830 0x237C9 +0x6831 0x2392D +0x6832 0x2392C +0x6833 0x23A77 +0x6834 0x23C2C +0x6835 0x240C0 +0x6836 0x240B9 +0x6837 0x24453 +0x6838 0x24540 +0x6839 0x24702 +0x683A 0x246FB +0x683C 0x24A8B +0x683D 0x24AAE +0x683E 0x24AAB +0x683F 0x24BA1 +0x6840 0x2A2CD +0x6841 0x24CEA +0x6842 0x24EDD +0x6843 0x24EDC +0x6844 0x24ED9 +0x6845 0x24FAB +0x6846 0x24FAC +0x6847 0x24FAD +0x6848 0x24FB2 +0x6849 0x2502C +0x684A 0x2502B +0x684B 0x250C2 +0x684C 0x25300 +0x684D 0x2530D +0x684E 0x25306 +0x684F 0x252FF +0x6850 0x25303 +0x6851 0x25301 +0x6852 0x25310 +0x6853 0x2530F +0x6854 0x25305 +0x6855 0x25398 +0x6856 0x25397 +0x6857 0x25396 +0x6858 0x25399 +0x6859 0x255AC +0x685A 0x255AB +0x685B 0x25712 +0x685C 0x258D8 +0x685D 0x258DF +0x685E 0x258D6 +0x685F 0x25A2D +0x6860 0x25A32 +0x6861 0x25D3F +0x6862 0x25D2F +0x6863 0x25D26 +0x6864 0x25D3A +0x6865 0x25D39 +0x6867 0x25D3B +0x6868 0x25D35 +0x6869 0x25D2A +0x686A 0x25D21 +0x686B 0x25D38 +0x686C 0x25D37 +0x686D 0x25D34 +0x686F 0x25D22 +0x6870 0x25D36 +0x6871 0x25D44 +0x6872 0x25F45 +0x6873 0x25F3B +0x6874 0x25F36 +0x6875 0x25F42 +0x6876 0x2617A +0x6877 0x26186 +0x6878 0x2618B +0x6879 0x2617F +0x687A 0x26181 +0x687B 0x2632A +0x687C 0x263D5 +0x687D 0x2649F +0x687E 0x2649D +0x6921 0x26526 +0x6922 0x265F4 +0x6923 0x265F5 +0x6924 0x26815 +0x6925 0x2688E +0x6926 0x2688F +0x6927 0x26926 +0x6928 0x269A7 +0x6929 0x269AF +0x692A 0x26AAD +0x692B 0x26AAC +0x692C 0x26AAB +0x692D 0x26AAA +0x692E 0x2702F +0x692F 0x27021 +0x6930 0x27023 +0x6931 0x270A3 +0x6932 0x27049 +0x6933 0x2703A +0x6934 0x27048 +0x6935 0x2702D +0x6936 0x27025 +0x6937 0x27029 +0x6938 0x27032 +0x6939 0x27034 +0x693A 0x27024 +0x693B 0x2702C +0x693C 0x2704B +0x693D 0x2703B +0x693E 0x27020 +0x693F 0x27028 +0x6940 0x27498 +0x6942 0x27497 +0x6944 0x2749D +0x6945 0x274A8 +0x6946 0x275D5 +0x6947 0x27777 +0x6948 0x27778 +0x6949 0x27772 +0x694A 0x27773 +0x694B 0x27802 +0x694C 0x2793B +0x694D 0x27AFE +0x694E 0x27B0B +0x694F 0x27AFF +0x6950 0x27B07 +0x6953 0x27B30 +0x6954 0x27BCD +0x6955 0x27BCF +0x6956 0x27C10 +0x6957 0x27C0A +0x6958 0x27C83 +0x6959 0x27D15 +0x695A 0x27D0E +0x695B 0x27D0C +0x695C 0x27E02 +0x695D 0x27DFE +0x695E 0x27E05 +0x695F 0x27E15 +0x6960 0x27E08 +0x6961 0x27F7F +0x6962 0x27F77 +0x6963 0x27F7C +0x6964 0x27F82 +0x6965 0x27F7E +0x6966 0x27F78 +0x6967 0x27F7D +0x6968 0x27F79 +0x6969 0x27F81 +0x696A 0x2814B +0x696B 0x28163 +0x696C 0x28164 +0x696D 0x28156 +0x696E 0x28154 +0x696F 0x2814E +0x6970 0x28110 +0x6971 0x2814F +0x6972 0x28157 +0x6973 0x2815E +0x6974 0x28151 +0x6975 0x2816A +0x6976 0x28169 +0x6977 0x283AD +0x6978 0x283A4 +0x6979 0x283AC +0x697A 0x283A9 +0x697B 0x283AE +0x697C 0x2044C +0x697D 0x28650 +0x697E 0x28635 +0x6A21 0x28632 +0x6A22 0x287D8 +0x6A23 0x287D1 +0x6A24 0x287CF +0x6A25 0x287BE +0x6A26 0x288D5 +0x6A27 0x288C1 +0x6A28 0x288C6 +0x6A29 0x288C3 +0x6A2A 0x288C2 +0x6A2B 0x288C0 +0x6A2C 0x288C5 +0x6A2D 0x288C7 +0x6A2E 0x288BF +0x6A2F 0x288C4 +0x6A30 0x288D4 +0x6A31 0x28A90 +0x6A32 0x28AD2 +0x6A34 0x28AD4 +0x6A35 0x28CAF +0x6A36 0x28CAE +0x6A37 0x28CB2 +0x6A38 0x28CAD +0x6A39 0x28D9C +0x6A3A 0x28DA0 +0x6A3B 0x28DB6 +0x6A3C 0x28F3D +0x6A3D 0x28F56 +0x6A3E 0x28F82 +0x6A3F 0x29028 +0x6A40 0x2902B +0x6A41 0x2913C +0x6A42 0x2913E +0x6A43 0x2913F +0x6A44 0x29142 +0x6A45 0x2913D +0x6A46 0x29141 +0x6A47 0x2913B +0x6A48 0x29149 +0x6A49 0x29143 +0x6A4A 0x29239 +0x6A4B 0x29238 +0x6A4C 0x29322 +0x6A4D 0x29308 +0x6A4E 0x2930C +0x6A4F 0x29306 +0x6A50 0x29313 +0x6A51 0x29304 +0x6A52 0x29320 +0x6A53 0x2931D +0x6A54 0x29305 +0x6A55 0x2930A +0x6A56 0x293D6 +0x6A57 0x293D7 +0x6A58 0x29436 +0x6A59 0x29437 +0x6A5A 0x29523 +0x6A5B 0x29522 +0x6A5C 0x29520 +0x6A5D 0x2951A +0x6A5E 0x2951D +0x6A5F 0x2961C +0x6A60 0x29620 +0x6A61 0x29677 +0x6A62 0x2977F +0x6A63 0x2978B +0x6A64 0x2977D +0x6A65 0x29799 +0x6A66 0x29784 +0x6A67 0x29789 +0x6A68 0x29785 +0x6A69 0x29783 +0x6A6A 0x29786 +0x6A6B 0x2979E +0x6A6C 0x29853 +0x6A6D 0x29917 +0x6A6F 0x29919 +0x6A70 0x29920 +0x6A71 0x2991F +0x6A72 0x29923 +0x6A73 0x29918 +0x6A74 0x29921 +0x6A75 0x29929 +0x6A76 0x29924 +0x6A77 0x29926 +0x6A78 0x29A5E +0x6A79 0x29A6F +0x6A7A 0x29A6E +0x6A7B 0x29A74 +0x6A7C 0x29A72 +0x6A7D 0x29A73 +0x6A7E 0x29B7D +0x6B21 0x29B7E +0x6B22 0x29B85 +0x6B23 0x29B7F +0x6B24 0x29B84 +0x6B25 0x29C44 +0x6B26 0x29CF5 +0x6B27 0x29CF8 +0x6B28 0x29D03 +0x6B29 0x29CF6 +0x6B2A 0x29E28 +0x6B2C 0x29E39 +0x6B2D 0x29DFB +0x6B2E 0x29E0E +0x6B2F 0x29DFD +0x6B30 0x29E1F +0x6B32 0x29E03 +0x6B34 0x29E10 +0x6B36 0x29E0D +0x6B37 0x29E27 +0x6B38 0x29E41 +0x6B39 0x2A072 +0x6B3A 0x2A078 +0x6B3B 0x2A080 +0x6B3D 0x2A085 +0x6B3E 0x2A07B +0x6B40 0x2A07D +0x6B41 0x2A091 +0x6B42 0x2A088 +0x6B43 0x2A0AA +0x6B44 0x2A08D +0x6B45 0x2A089 +0x6B46 0x2A095 +0x6B47 0x2A09B +0x6B48 0x2A08C +0x6B49 0x2A09E +0x6B4A 0x2A07C +0x6B4B 0x2A086 +0x6B4C 0x2A084 +0x6B4D 0x2A268 +0x6B4E 0x2A2C5 +0x6B4F 0x2A2C4 +0x6B50 0x2A2C9 +0x6B51 0x2A2C6 +0x6B52 0x2A342 +0x6B53 0x2A345 +0x6B54 0x2A341 +0x6B55 0x2A344 +0x6B56 0x2A3A6 +0x6B57 0x2A3C2 +0x6B58 0x2A442 +0x6B59 0x2A449 +0x6B5A 0x2A448 +0x6B5B 0x2A44A +0x6B5C 0x2A44C +0x6B5D 0x2A44B +0x6B5E 0x2A517 +0x6B5F 0x2A518 +0x6B60 0x2A515 +0x6B61 0x2A552 +0x6B62 0x2A554 +0x6B63 0x2A553 +0x6B64 0x2A59A +0x6B65 0x2A59B +0x6B66 0x2A5DC +0x6B67 0x2A5E4 +0x6B68 0x2A691 +0x6B6A 0x2A6BA +0x6B6B 0x20451 +0x6B6C 0x2045B +0x6B6D 0x204CF +0x6B6E 0x23305 +0x6B6F 0x21113 +0x6B70 0x21115 +0x6B71 0x21114 +0x6B72 0x21123 +0x6B74 0x21111 +0x6B75 0x21112 +0x6B77 0x214F0 +0x6B78 0x2169B +0x6B79 0x21912 +0x6B7A 0x21916 +0x6B7B 0x21917 +0x6B7C 0x219B5 +0x6B7D 0x21CF4 +0x6B7E 0x21FB1 +0x6C21 0x22179 +0x6C22 0x222FF +0x6C23 0x222FC +0x6C24 0x222FB +0x6C25 0x2243F +0x6C26 0x22444 +0x6C27 0x2259D +0x6C28 0x22932 +0x6C29 0x2294C +0x6C2A 0x2292B +0x6C2B 0x2295A +0x6C2C 0x22A1F +0x6C2D 0x22E01 +0x6C2E 0x22E2D +0x6C2F 0x22E27 +0x6C30 0x22E59 +0x6C31 0x22E5A +0x6C32 0x22E4D +0x6C33 0x22E58 +0x6C34 0x23023 +0x6C35 0x23025 +0x6C36 0x2302B +0x6C37 0x232FF +0x6C38 0x233AE +0x6C39 0x237CB +0x6C3A 0x237CA +0x6C3B 0x237D0 +0x6C3C 0x237CE +0x6C3D 0x237CC +0x6C3E 0x237D8 +0x6C3F 0x237C6 +0x6C40 0x237D2 +0x6C41 0x237CF +0x6C42 0x237C8 +0x6C43 0x23B17 +0x6C45 0x240C4 +0x6C46 0x29240 +0x6C47 0x240E9 +0x6C48 0x240F2 +0x6C49 0x240FC +0x6C4A 0x240EA +0x6C4B 0x240EB +0x6C4C 0x240FD +0x6C4D 0x24478 +0x6C4E 0x24477 +0x6C4F 0x24473 +0x6C50 0x2449E +0x6C51 0x24479 +0x6C52 0x245A2 +0x6C53 0x24603 +0x6C54 0x24704 +0x6C55 0x24705 +0x6C56 0x248CE +0x6C57 0x24ABF +0x6C58 0x24EF6 +0x6C59 0x24EF7 +0x6C5A 0x25031 +0x6C5B 0x25030 +0x6C5C 0x250C9 +0x6C5D 0x250C7 +0x6C5E 0x2531C +0x6C5F 0x25328 +0x6C60 0x2531A +0x6C61 0x2531E +0x6C62 0x2531B +0x6C63 0x2531F +0x6C64 0x255BF +0x6C65 0x255BB +0x6C66 0x255BC +0x6C67 0x255C0 +0x6C68 0x2571A +0x6C69 0x258EF +0x6C6A 0x258EC +0x6C6B 0x258E9 +0x6C6C 0x258F0 +0x6C6D 0x258FE +0x6C6E 0x25A34 +0x6C6F 0x25D6A +0x6C70 0x25D95 +0x6C71 0x25D6C +0x6C72 0x25D72 +0x6C73 0x25D67 +0x6C74 0x25D60 +0x6C75 0x25D6B +0x6C76 0x25D5E +0x6C77 0x25D6F +0x6C78 0x25D66 +0x6C7A 0x25D62 +0x6C7B 0x25D5D +0x6C7C 0x25D5C +0x6C7D 0x2F965 +0x6C7E 0x25F50 +0x6D21 0x2619F +0x6D23 0x2619E +0x6D24 0x261A6 +0x6D25 0x26335 +0x6D26 0x26338 +0x6D27 0x26336 +0x6D28 0x2633A +0x6D29 0x263DC +0x6D2A 0x2687C +0x6D2B 0x268AB +0x6D2D 0x268A8 +0x6D2E 0x268A7 +0x6D2F 0x2692B +0x6D30 0x2692C +0x6D31 0x26928 +0x6D32 0x2092B +0x6D33 0x269A9 +0x6D34 0x269AA +0x6D35 0x269AB +0x6D36 0x269F8 +0x6D37 0x26AB1 +0x6D38 0x26AF0 +0x6D39 0x26AEF +0x6D3A 0x270A8 +0x6D3B 0x2708B +0x6D3C 0x27094 +0x6D3D 0x2709E +0x6D3E 0x2708F +0x6D3F 0x27088 +0x6D40 0x2707E +0x6D41 0x27081 +0x6D42 0x27030 +0x6D43 0x2709B +0x6D44 0x27082 +0x6D45 0x27090 +0x6D46 0x27085 +0x6D47 0x2707F +0x6D48 0x270A9 +0x6D49 0x270DE +0x6D4A 0x2720D +0x6D4C 0x274CF +0x6D4D 0x274CB +0x6D4E 0x274D8 +0x6D4F 0x274DD +0x6D50 0x274D3 +0x6D51 0x274D0 +0x6D52 0x274D5 +0x6D53 0x274D6 +0x6D54 0x275D6 +0x6D55 0x27792 +0x6D56 0x27795 +0x6D57 0x2A5CB +0x6D58 0x2778D +0x6D59 0x2779B +0x6D5A 0x2779D +0x6D5B 0x2778F +0x6D5C 0x2779E +0x6D5D 0x277A6 +0x6D5E 0x27896 +0x6D5F 0x27892 +0x6D60 0x27B16 +0x6D61 0x27B2A +0x6D62 0x27B29 +0x6D63 0x27B2C +0x6D64 0x27C15 +0x6D65 0x27C12 +0x6D66 0x27C11 +0x6D67 0x27C13 +0x6D68 0x27C88 +0x6D69 0x27C8B +0x6D6A 0x27C8A +0x6D6B 0x27C87 +0x6D6C 0x27D17 +0x6D6D 0x27D16 +0x6D6E 0x27D1A +0x6D6F 0x27E19 +0x6D70 0x27E17 +0x6D71 0x27F91 +0x6D72 0x27F94 +0x6D73 0x2818B +0x6D74 0x28190 +0x6D75 0x2818F +0x6D76 0x28186 +0x6D77 0x28183 +0x6D78 0x2818E +0x6D79 0x28187 +0x6D7A 0x281A8 +0x6D7B 0x28185 +0x6D7C 0x281A6 +0x6D7D 0x28182 +0x6D7E 0x281A7 +0x6E21 0x283B9 +0x6E22 0x283B7 +0x6E23 0x283B4 +0x6E24 0x283B6 +0x6E25 0x283B3 +0x6E26 0x283C6 +0x6E27 0x2863C +0x6E28 0x28640 +0x6E29 0x28638 +0x6E2A 0x28791 +0x6E2B 0x287A6 +0x6E2C 0x287DA +0x6E2D 0x288DA +0x6E2E 0x288D8 +0x6E2F 0x288D9 +0x6E30 0x288DB +0x6E31 0x288D7 +0x6E32 0x28B16 +0x6E33 0x28B12 +0x6E34 0x28B1F +0x6E36 0x28B14 +0x6E37 0x28B1A +0x6E38 0x28B10 +0x6E39 0x28CB3 +0x6E3A 0x28DAE +0x6E3B 0x28DC1 +0x6E3C 0x28DB0 +0x6E3D 0x28DAF +0x6E3E 0x28DB1 +0x6E3F 0x28DAD +0x6E40 0x28DB2 +0x6E41 0x28DC4 +0x6E42 0x2903C +0x6E43 0x2903F +0x6E44 0x29161 +0x6E45 0x29166 +0x6E46 0x2923C +0x6E47 0x2923B +0x6E48 0x2932C +0x6E4A 0x2932A +0x6E4B 0x2933E +0x6E4C 0x2932F +0x6E4D 0x29332 +0x6E4E 0x29327 +0x6E4F 0x29329 +0x6E50 0x29340 +0x6E51 0x293DF +0x6E52 0x293DE +0x6E53 0x2943C +0x6E54 0x2943B +0x6E55 0x2943E +0x6E56 0x29521 +0x6E57 0x29546 +0x6E58 0x2953C +0x6E59 0x29536 +0x6E5A 0x29538 +0x6E5B 0x29535 +0x6E5C 0x29631 +0x6E5D 0x29636 +0x6E5E 0x2962D +0x6E5F 0x29633 +0x6E60 0x2962F +0x6E61 0x2962E +0x6E62 0x29635 +0x6E63 0x297AC +0x6E64 0x297A9 +0x6E65 0x297A6 +0x6E67 0x2994C +0x6E68 0x29943 +0x6E69 0x29941 +0x6E6A 0x2994F +0x6E6B 0x29942 +0x6E6C 0x29951 +0x6E6E 0x29940 +0x6E6F 0x29950 +0x6E70 0x29945 +0x6E71 0x2994A +0x6E72 0x2994B +0x6E73 0x29A83 +0x6E74 0x29A82 +0x6E75 0x29A81 +0x6E76 0x29AE0 +0x6E77 0x29B98 +0x6E78 0x29B9F +0x6E79 0x29B9B +0x6E7A 0x29B9A +0x6E7B 0x29B99 +0x6E7C 0x29B96 +0x6E7D 0x29BAE +0x6E7E 0x29B9E +0x6F21 0x29D09 +0x6F22 0x29D0D +0x6F23 0x29E4E +0x6F24 0x29E4A +0x6F25 0x29E4D +0x6F26 0x29E40 +0x6F27 0x29E3E +0x6F28 0x29E48 +0x6F29 0x29E42 +0x6F2A 0x29E62 +0x6F2B 0x29E45 +0x6F2C 0x29E51 +0x6F2D 0x2A0C6 +0x6F2E 0x2A0D0 +0x6F2F 0x2A0C0 +0x6F30 0x2A0B7 +0x6F31 0x2A0C2 +0x6F32 0x2A0BC +0x6F33 0x2A0C5 +0x6F34 0x2A0DC +0x6F35 0x2A0DB +0x6F36 0x2A0D2 +0x6F37 0x2A0C7 +0x6F38 0x2A0B6 +0x6F39 0x2A0C9 +0x6F3A 0x2A0CC +0x6F3B 0x2A0D1 +0x6F3C 0x2A0CD +0x6F3D 0x2A0DA +0x6F3E 0x2A0BA +0x6F3F 0x2A0D3 +0x6F40 0x2A0CE +0x6F41 0x2A0F6 +0x6F42 0x2A0BD +0x6F43 0x2A0DD +0x6F44 0x2A0C8 +0x6F45 0x2A10D +0x6F46 0x2A135 +0x6F47 0x2A271 +0x6F48 0x2A26E +0x6F49 0x2A26F +0x6F4A 0x2A2D6 +0x6F4B 0x2A34C +0x6F4C 0x2A34F +0x6F4D 0x2A354 +0x6F4E 0x2A353 +0x6F4F 0x2A3C9 +0x6F50 0x2A3C8 +0x6F51 0x2A403 +0x6F53 0x2A404 +0x6F55 0x2A457 +0x6F56 0x2A452 +0x6F57 0x2A453 +0x6F59 0x2A456 +0x6F5A 0x2A45C +0x6F5B 0x2A455 +0x6F5C 0x2A564 +0x6F5D 0x2A55D +0x6F5E 0x2A55E +0x6F5F 0x2A5A2 +0x6F60 0x2A5A3 +0x6F62 0x2A5E7 +0x6F63 0x2A5E6 +0x6F64 0x2A698 +0x6F65 0x2A6AC +0x6F66 0x2A6AF +0x6F67 0x2A6AE +0x6F68 0x20459 +0x6F69 0x205A9 +0x6F6A 0x2082A +0x6F6B 0x208C7 +0x6F6C 0x21141 +0x6F6D 0x21137 +0x6F6E 0x21135 +0x6F6F 0x21133 +0x6F70 0x21139 +0x6F71 0x21132 +0x6F72 0x214FF +0x6F73 0x21501 +0x6F74 0x214F8 +0x6F75 0x2191B +0x6F76 0x21919 +0x6F77 0x21BBF +0x6F78 0x21FBC +0x6F79 0x21FBE +0x6F7A 0x21FBD +0x6F7B 0x2217D +0x6F7C 0x22446 +0x6F7D 0x22447 +0x6F7E 0x225A4 +0x7021 0x22A21 +0x7022 0x22A62 +0x7023 0x22E86 +0x7025 0x2302F +0x7026 0x23031 +0x7028 0x237F8 +0x7029 0x237F5 +0x702A 0x237F9 +0x702B 0x237F2 +0x702C 0x237FA +0x702D 0x237F3 +0x702E 0x23814 +0x702F 0x237FD +0x7030 0x2380F +0x7031 0x2380E +0x7032 0x23801 +0x7033 0x23937 +0x7034 0x23935 +0x7035 0x23934 +0x7036 0x23931 +0x7037 0x23A7A +0x7038 0x23A7B +0x7039 0x23C37 +0x703A 0x2412B +0x703B 0x240FB +0x703C 0x24116 +0x703D 0x24113 +0x703F 0x24111 +0x7040 0x2410F +0x7041 0x2411B +0x7042 0x24138 +0x7043 0x244A4 +0x7044 0x24709 +0x7045 0x24707 +0x7046 0x2470B +0x7047 0x248D3 +0x7048 0x248D1 +0x7049 0x248D8 +0x704A 0x24B1D +0x704B 0x24BA9 +0x704C 0x24BD0 +0x704D 0x27215 +0x704E 0x24F02 +0x704F 0x24F05 +0x7050 0x24F01 +0x7051 0x24F00 +0x7052 0x2532E +0x7053 0x25330 +0x7054 0x2532F +0x7055 0x25331 +0x7056 0x255D2 +0x7057 0x255D3 +0x7058 0x25902 +0x7059 0x25A40 +0x705A 0x25A42 +0x705B 0x25A3B +0x705C 0x25ACE +0x705D 0x25D98 +0x705E 0x25D8F +0x705F 0x25D94 +0x7060 0x25D91 +0x7062 0x25DBA +0x7063 0x25D90 +0x7064 0x25D86 +0x7065 0x25D9A +0x7066 0x25D8C +0x7067 0x25D93 +0x7068 0x25D87 +0x7069 0x25D88 +0x706A 0x25D97 +0x706B 0x25D8D +0x706C 0x25D9C +0x706D 0x25DBD +0x706E 0x25F3C +0x706F 0x25F59 +0x7071 0x261D1 +0x7072 0x261BB +0x7073 0x261BE +0x7074 0x2625D +0x7075 0x263E2 +0x7076 0x26605 +0x7077 0x268BA +0x7079 0x268F4 +0x707A 0x269B2 +0x707B 0x269F9 +0x707C 0x26AB7 +0x707D 0x26AB6 +0x707E 0x27089 +0x7121 0x270F9 +0x7122 0x270D9 +0x7123 0x270E8 +0x7124 0x270D4 +0x7125 0x270DB +0x7126 0x270E2 +0x7127 0x270DF +0x7128 0x270D1 +0x7129 0x270E9 +0x712A 0x270EA +0x712B 0x27213 +0x712C 0x27211 +0x712D 0x274FA +0x712E 0x274F8 +0x712F 0x274F4 +0x7130 0x274FB +0x7131 0x2750E +0x7132 0x27502 +0x7133 0x2750F +0x7134 0x27790 +0x7135 0x277AD +0x7136 0x277A9 +0x7137 0x27948 +0x7138 0x27B5A +0x7139 0x27B4F +0x713A 0x27B4E +0x713B 0x27B55 +0x713C 0x27B54 +0x713D 0x27B4A +0x713E 0x27BD5 +0x713F 0x27C18 +0x7140 0x27C8D +0x7141 0x27D1D +0x7142 0x27D19 +0x7143 0x27E26 +0x7144 0x27E28 +0x7145 0x27E2B +0x7146 0x27E7D +0x7147 0x27FA0 +0x7148 0x27F9A +0x7149 0x27F9B +0x714A 0x281B5 +0x714B 0x281AD +0x714C 0x281B2 +0x714D 0x28294 +0x714E 0x283C9 +0x714F 0x2864E +0x7150 0x2864F +0x7151 0x28644 +0x7152 0x28652 +0x7153 0x288E9 +0x7154 0x28939 +0x7157 0x28DC7 +0x7158 0x28DD3 +0x7159 0x28DC6 +0x715A 0x28DC3 +0x715C 0x28DD2 +0x715D 0x28F66 +0x715E 0x2917F +0x715F 0x29180 +0x7160 0x29184 +0x7161 0x29185 +0x7162 0x291E3 +0x7164 0x29241 +0x7165 0x29244 +0x7166 0x29243 +0x7167 0x2934E +0x7168 0x2934F +0x716A 0x29349 +0x716B 0x2934A +0x716C 0x2934B +0x716D 0x29343 +0x716E 0x293E0 +0x716F 0x293E5 +0x7170 0x293E1 +0x7171 0x293E6 +0x7172 0x293E2 +0x7173 0x2940C +0x7174 0x29440 +0x7175 0x29549 +0x7176 0x2954A +0x7177 0x29554 +0x7178 0x2954C +0x7179 0x29555 +0x717A 0x29556 +0x717B 0x2963B +0x717C 0x2963D +0x717D 0x297A4 +0x717E 0x297A8 +0x7221 0x297C3 +0x7222 0x297BF +0x7223 0x297C8 +0x7224 0x297C2 +0x7225 0x297CA +0x7226 0x297CC +0x7227 0x297C9 +0x7228 0x297BE +0x7229 0x297CD +0x722A 0x297C7 +0x722B 0x297C5 +0x722C 0x2985D +0x722E 0x2996C +0x722F 0x2996B +0x7230 0x29970 +0x7231 0x2996D +0x7232 0x2996F +0x7233 0x29989 +0x7234 0x29984 +0x7235 0x29A8D +0x7236 0x29A8A +0x7237 0x29A8E +0x7238 0x29A91 +0x7239 0x29BB5 +0x723A 0x29BB1 +0x723B 0x29BAF +0x723C 0x29BB9 +0x723D 0x29BB7 +0x723E 0x29BB0 +0x7240 0x29C17 +0x7242 0x29C4F +0x7243 0x29D19 +0x7244 0x29D10 +0x7245 0x29D18 +0x7246 0x29D11 +0x7247 0x29D1C +0x7248 0x29D12 +0x7249 0x29E76 +0x724A 0x29E71 +0x724C 0x29E7A +0x724D 0x29E7F +0x724F 0x29E73 +0x7250 0x29EAB +0x7252 0x29E77 +0x7253 0x29E74 +0x7254 0x29E7E +0x7255 0x29E9B +0x7256 0x29E84 +0x7257 0x29E7C +0x7258 0x2A129 +0x7259 0x2A12B +0x725A 0x2A10E +0x725B 0x2A100 +0x725C 0x2A10B +0x725D 0x2A0FE +0x725E 0x2A0FA +0x725F 0x2A117 +0x7260 0x2A0FF +0x7261 0x2A10C +0x7262 0x2A10F +0x7264 0x2A102 +0x7265 0x2A101 +0x7266 0x2A0FC +0x7267 0x2A149 +0x7268 0x2A106 +0x7269 0x2A112 +0x726A 0x2A113 +0x726B 0x2A278 +0x726C 0x2A35B +0x726D 0x2A362 +0x726E 0x2A35F +0x726F 0x2A35D +0x7270 0x2A3AB +0x7271 0x2A3D5 +0x7272 0x2A3D4 +0x7273 0x2A3D3 +0x7274 0x2A407 +0x7275 0x2A46C +0x7276 0x2A470 +0x7277 0x2A46E +0x7278 0x2A468 +0x7279 0x2A46D +0x727A 0x2A477 +0x727B 0x2A46A +0x727C 0x2A4CE +0x727D 0x2A4EC +0x727E 0x2A569 +0x7321 0x2A568 +0x7322 0x2A5A6 +0x7323 0x2A5A9 +0x7324 0x2A5AA +0x7325 0x2A600 +0x7326 0x2A60D +0x7327 0x2A5F8 +0x7328 0x2A5FC +0x7329 0x2A60A +0x732A 0x2A5F7 +0x732B 0x2A601 +0x732C 0x2A6B6 +0x732D 0x2A6BB +0x732E 0x2A6B7 +0x732F 0x2A6B9 +0x7330 0x2A6CA +0x7331 0x20469 +0x7332 0x20625 +0x7333 0x21159 +0x7334 0x21507 +0x7335 0x21509 +0x7336 0x21922 +0x7337 0x21B07 +0x7338 0x21B04 +0x7339 0x2330F +0x733A 0x21CF8 +0x733B 0x21FC7 +0x733C 0x21FD1 +0x733D 0x2217E +0x733E 0x22308 +0x733F 0x2244A +0x7340 0x2F898 +0x7341 0x224B9 +0x7342 0x22E88 +0x7343 0x22E91 +0x7344 0x22E84 +0x7345 0x22E73 +0x7346 0x22E89 +0x7347 0x22E85 +0x7348 0x23033 +0x7349 0x23313 +0x734A 0x2381D +0x734B 0x2381F +0x734C 0x2381C +0x734D 0x23820 +0x734E 0x2381A +0x734F 0x2381B +0x7350 0x23939 +0x7351 0x239AF +0x7352 0x23AE5 +0x7353 0x23C3C +0x7354 0x24137 +0x7355 0x2413A +0x7356 0x244BB +0x7358 0x24710 +0x7359 0x2470D +0x735A 0x24BAF +0x735B 0x24C11 +0x735D 0x24F0D +0x735E 0x24F0C +0x735F 0x24F0B +0x7360 0x250D4 +0x7361 0x2533D +0x7362 0x2533E +0x7363 0x2533B +0x7364 0x25343 +0x7365 0x25340 +0x7366 0x25346 +0x7367 0x25411 +0x7368 0x255DD +0x7369 0x255DF +0x736A 0x255EA +0x736B 0x2574A +0x736C 0x25906 +0x736D 0x25DC1 +0x736E 0x25DB9 +0x736F 0x25DC6 +0x7370 0x25DB8 +0x7371 0x25DBB +0x7372 0x25DC8 +0x7373 0x25DC5 +0x7374 0x25DBF +0x7375 0x25DC7 +0x7376 0x25DC4 +0x7377 0x25F65 +0x7378 0x25F67 +0x7379 0x261D7 +0x737A 0x261DB +0x737B 0x261D4 +0x737C 0x261D6 +0x737D 0x263E8 +0x737E 0x2660A +0x7421 0x26ABD +0x7422 0x26ABE +0x7423 0x2711A +0x7424 0x2710D +0x7425 0x2710F +0x7426 0x2711B +0x7427 0x27110 +0x7428 0x27111 +0x7429 0x27113 +0x742A 0x27218 +0x742B 0x27520 +0x742C 0x2751F +0x742D 0x27523 +0x742E 0x2751D +0x742F 0x27537 +0x7430 0x27525 +0x7431 0x27524 +0x7432 0x2752A +0x7433 0x27527 +0x7434 0x27533 +0x7435 0x27528 +0x7436 0x27534 +0x7437 0x277BA +0x7439 0x2789D +0x743A 0x2794C +0x743B 0x27B5C +0x743C 0x27B6A +0x743D 0x27B5D +0x743E 0x27B65 +0x743F 0x27B63 +0x7440 0x27B5E +0x7441 0x27C19 +0x7442 0x27C97 +0x7443 0x27E3F +0x7444 0x27E33 +0x7445 0x27E32 +0x7446 0x27FA1 +0x7447 0x27FA5 +0x7448 0x27FA4 +0x7449 0x27FA2 +0x744A 0x281C1 +0x744C 0x281C7 +0x744D 0x281C4 +0x744E 0x281C6 +0x744F 0x281C5 +0x7450 0x281D4 +0x7451 0x281CA +0x7452 0x28653 +0x7453 0x288F1 +0x7454 0x28921 +0x7456 0x28BB7 +0x7457 0x28B92 +0x7458 0x28DD4 +0x7459 0x28F44 +0x745A 0x29198 +0x745B 0x2919B +0x745C 0x29191 +0x745D 0x29195 +0x745E 0x2919A +0x745F 0x29192 +0x7460 0x29353 +0x7461 0x29357 +0x7463 0x2935C +0x7464 0x2935D +0x7465 0x29364 +0x7466 0x293EA +0x7467 0x293ED +0x7468 0x29442 +0x7469 0x29443 +0x746A 0x29564 +0x746B 0x29561 +0x746C 0x29560 +0x746D 0x2967D +0x746E 0x297D4 +0x746F 0x297D5 +0x7470 0x297D9 +0x7471 0x29987 +0x7472 0x29999 +0x7473 0x2998C +0x7474 0x2998A +0x7475 0x2998F +0x7477 0x2998B +0x7478 0x29982 +0x7479 0x2999B +0x747B 0x29BC8 +0x747C 0x29BC4 +0x747D 0x29BCC +0x747E 0x29BC7 +0x7521 0x29BC3 +0x7522 0x29BC6 +0x7523 0x29BCB +0x7524 0x29BCA +0x7525 0x29BC9 +0x7526 0x29BCD +0x7527 0x29C53 +0x7528 0x29D21 +0x7529 0x29D29 +0x752A 0x29D1D +0x752B 0x29D24 +0x752C 0x29D28 +0x752E 0x29EB1 +0x752F 0x29EB2 +0x7530 0x29EB5 +0x7531 0x29ED6 +0x7532 0x29EAF +0x7533 0x29ECA +0x7534 0x29EB8 +0x7535 0x2FA12 +0x7536 0x2FA11 +0x7537 0x2A145 +0x7538 0x2A147 +0x7539 0x2A134 +0x753A 0x2A16E +0x753B 0x2A142 +0x753C 0x2A131 +0x753D 0x2A12E +0x753E 0x2A156 +0x753F 0x2A138 +0x7540 0x2A137 +0x7541 0x2A14B +0x7542 0x2A12D +0x7543 0x2A133 +0x7544 0x2A136 +0x7546 0x2A148 +0x7547 0x2A2DC +0x7549 0x2A366 +0x754A 0x2A36D +0x754B 0x2A363 +0x754C 0x2A364 +0x754E 0x2A367 +0x754F 0x2A3D9 +0x7550 0x2A40B +0x7551 0x2A47E +0x7552 0x2A48B +0x7553 0x2A526 +0x7554 0x2A52C +0x7555 0x2A529 +0x7556 0x2A56F +0x7557 0x2A56B +0x7558 0x2A56D +0x7559 0x2A56E +0x755A 0x2A61C +0x755B 0x2A611 +0x755C 0x2A610 +0x755D 0x2A624 +0x755E 0x2A612 +0x755F 0x2A615 +0x7560 0x2A617 +0x7562 0x2046F +0x7563 0x205AB +0x7564 0x2082E +0x7565 0x208C9 +0x7566 0x20B96 +0x7567 0x21185 +0x7568 0x216A0 +0x7569 0x2192B +0x756A 0x2230D +0x756B 0x23036 +0x756F 0x233B1 +0x7570 0x2384A +0x7571 0x23837 +0x7572 0x2383C +0x7573 0x23838 +0x7574 0x2383A +0x7575 0x2383E +0x7576 0x23849 +0x7579 0x23A80 +0x757A 0x23A7F +0x757B 0x23AE3 +0x757C 0x23C3F +0x757D 0x24152 +0x757E 0x2414E +0x7621 0x2414A +0x7622 0x2414B +0x7623 0x244D5 +0x7624 0x24AD8 +0x7625 0x24B20 +0x7626 0x24BB3 +0x7627 0x24BB1 +0x7628 0x24BB0 +0x7629 0x24F17 +0x762A 0x250D9 +0x762B 0x25349 +0x762C 0x25413 +0x762D 0x255ED +0x762E 0x255EB +0x762F 0x255EE +0x7630 0x2590A +0x7631 0x2590B +0x7632 0x25A4A +0x7633 0x25DD5 +0x7634 0x25DD7 +0x7635 0x25DDE +0x7636 0x25DDC +0x7637 0x25DEE +0x7638 0x25F70 +0x763A 0x261D9 +0x763B 0x263D7 +0x763C 0x268CB +0x763D 0x268C7 +0x763E 0x269FC +0x763F 0x2713B +0x7640 0x27139 +0x7641 0x2714B +0x7642 0x27143 +0x7643 0x27140 +0x7644 0x27146 +0x7645 0x2754D +0x7646 0x27543 +0x7647 0x27547 +0x7648 0x2754B +0x7649 0x27555 +0x764A 0x27552 +0x764B 0x27B5F +0x764D 0x27B7C +0x764E 0x27B7B +0x764F 0x27FA8 +0x7650 0x27FA9 +0x7651 0x281DE +0x7652 0x281D7 +0x7653 0x281DD +0x7654 0x281D6 +0x7655 0x281D8 +0x7656 0x2829B +0x7657 0x283E0 +0x7658 0x283E8 +0x7659 0x283E6 +0x765A 0x288F8 +0x765B 0x288FB +0x765C 0x28BBB +0x765E 0x28BB8 +0x7660 0x28CC1 +0x7661 0x28CC0 +0x7662 0x291A4 +0x7663 0x291AB +0x7664 0x2924D +0x7665 0x29365 +0x7666 0x29367 +0x7667 0x2936A +0x7668 0x29366 +0x7669 0x29369 +0x766A 0x29573 +0x766B 0x29580 +0x766C 0x2956F +0x766D 0x29571 +0x766E 0x297E4 +0x766F 0x297E6 +0x7670 0x297E7 +0x7671 0x299A0 +0x7672 0x299A4 +0x7673 0x29AA2 +0x7674 0x29AA7 +0x7675 0x29AA4 +0x7676 0x29BDE +0x7677 0x29BDB +0x7678 0x29C58 +0x7679 0x29C5C +0x767A 0x29D2F +0x767B 0x29D2E +0x767C 0x29EDD +0x767D 0x29EE4 +0x767E 0x29ED8 +0x7721 0x29EE7 +0x7722 0x29EDA +0x7723 0x29E75 +0x7725 0x2A179 +0x7726 0x2A180 +0x7727 0x2A17F +0x7728 0x2A17C +0x7729 0x2A175 +0x772A 0x2A17B +0x772B 0x2A182 +0x772D 0x2A189 +0x772E 0x2A174 +0x772F 0x2A17D +0x7730 0x2A17A +0x7731 0x2A186 +0x7732 0x2A1A8 +0x7733 0x2A172 +0x7735 0x2A18B +0x7736 0x2A191 +0x7737 0x2A1B3 +0x7738 0x2A181 +0x7739 0x2A282 +0x773A 0x2A2E1 +0x773B 0x2A2E3 +0x773C 0x2A2E2 +0x773D 0x2A376 +0x773E 0x2A374 +0x773F 0x2A372 +0x7740 0x2A375 +0x7741 0x2A40E +0x7742 0x2A40D +0x7743 0x2A494 +0x7744 0x2A492 +0x7745 0x2A493 +0x7746 0x2A491 +0x7747 0x2A48F +0x7748 0x2A495 +0x7749 0x2A4D0 +0x774A 0x2A4F7 +0x774B 0x2A576 +0x774C 0x2A5AF +0x774E 0x2A626 +0x774F 0x2A625 +0x7750 0x2A62D +0x7751 0x2A6A0 +0x7752 0x2A6C3 +0x7753 0x204D7 +0x7754 0x20ACC +0x7755 0x21179 +0x7756 0x2117A +0x7757 0x21515 +0x7758 0x21FDB +0x7759 0x22185 +0x775A 0x22970 +0x775B 0x2297B +0x775C 0x22EA5 +0x775D 0x22E9F +0x775E 0x23317 +0x775F 0x233B2 +0x7760 0x23839 +0x7761 0x23840 +0x7762 0x2384E +0x7763 0x2393E +0x7764 0x23AE8 +0x7765 0x23AE7 +0x7766 0x24166 +0x7767 0x24161 +0x7768 0x244DA +0x7769 0x24714 +0x776A 0x248DF +0x776B 0x24F18 +0x776C 0x25039 +0x776D 0x2503A +0x776E 0x25730 +0x776F 0x25732 +0x7770 0x2590E +0x7771 0x25A4C +0x7772 0x25DE8 +0x7773 0x25DF1 +0x7774 0x25DEB +0x7775 0x25DEC +0x7776 0x25F74 +0x7777 0x25F73 +0x7778 0x261F1 +0x7779 0x26342 +0x777A 0x2633E +0x777B 0x26341 +0x777C 0x2652C +0x777D 0x268D2 +0x777E 0x269BB +0x7821 0x27158 +0x7822 0x27157 +0x7823 0x27156 +0x7824 0x2715A +0x7826 0x27561 +0x7827 0x27568 +0x7828 0x27565 +0x7829 0x2755F +0x782A 0x27564 +0x782B 0x2755E +0x782C 0x2755B +0x782D 0x27567 +0x782E 0x277C3 +0x782F 0x278A2 +0x7830 0x27953 +0x7831 0x27B7D +0x7832 0x27C20 +0x7833 0x27FAE +0x7834 0x27FAF +0x7835 0x27FB0 +0x7836 0x281E7 +0x7837 0x281E6 +0x7838 0x281E9 +0x7839 0x283F1 +0x783A 0x283EB +0x783B 0x283EA +0x783C 0x283E9 +0x783D 0x28663 +0x783E 0x28902 +0x783F 0x288FE +0x7840 0x28BDE +0x7841 0x28CC2 +0x7842 0x28DE6 +0x7843 0x28F5D +0x7844 0x291AD +0x7845 0x29375 +0x7846 0x29372 +0x7847 0x29377 +0x7849 0x29651 +0x784A 0x297E8 +0x784B 0x297ED +0x784C 0x297EE +0x784D 0x299B9 +0x784E 0x299A1 +0x784F 0x299B6 +0x7850 0x29AAE +0x7851 0x29BE8 +0x7853 0x29C1E +0x7854 0x29D31 +0x7855 0x29D32 +0x7857 0x29F0E +0x7858 0x29F12 +0x7859 0x29F09 +0x785A 0x29F05 +0x785C 0x29F03 +0x785D 0x29F1F +0x785E 0x29F0D +0x785F 0x29F0C +0x7860 0x29F04 +0x7861 0x29F0A +0x7862 0x2A1C2 +0x7863 0x2A1BF +0x7864 0x2A1C9 +0x7865 0x2A1B2 +0x7866 0x2A1C1 +0x7867 0x2A1AF +0x7868 0x2A1B4 +0x7869 0x2A1B0 +0x786A 0x2A1B6 +0x786B 0x2A1B7 +0x786C 0x2A1BB +0x786D 0x2A1B1 +0x786E 0x2A2F0 +0x786F 0x2A378 +0x7870 0x2A37A +0x7871 0x2A379 +0x7872 0x2A3E4 +0x7873 0x2A3E6 +0x7874 0x2A49F +0x7875 0x2A49D +0x7876 0x2A498 +0x7877 0x2A499 +0x7878 0x2A4F9 +0x7879 0x2A530 +0x787A 0x2A582 +0x787B 0x2A581 +0x787C 0x2A5B3 +0x787D 0x2A57F +0x787E 0x2A63A +0x7921 0x2A63E +0x7922 0x2A648 +0x7923 0x21186 +0x7924 0x21936 +0x7925 0x21B13 +0x7926 0x21C22 +0x7927 0x21FDD +0x7928 0x225A7 +0x7929 0x2297D +0x792B 0x2331C +0x792C 0x23865 +0x792D 0x23860 +0x792E 0x23867 +0x7930 0x23B1A +0x7931 0x24AE3 +0x7932 0x25734 +0x7933 0x25918 +0x7934 0x25A52 +0x7935 0x25DFC +0x7936 0x25F79 +0x7937 0x25F78 +0x7938 0x25F76 +0x7939 0x261FA +0x793A 0x261F8 +0x793B 0x2652D +0x793C 0x268D6 +0x793D 0x269BD +0x793E 0x269BF +0x793F 0x269BE +0x7940 0x27144 +0x7941 0x27170 +0x7942 0x27162 +0x7943 0x2716E +0x7944 0x2756E +0x7945 0x2757C +0x7946 0x27574 +0x7947 0x27578 +0x7948 0x27570 +0x7949 0x27579 +0x794A 0x27571 +0x794B 0x277CC +0x794C 0x278A7 +0x794D 0x278A6 +0x794E 0x27B93 +0x794F 0x27C21 +0x7950 0x27C9C +0x7951 0x2829D +0x7952 0x283F4 +0x7953 0x283F3 +0x7954 0x28DF0 +0x7955 0x291B8 +0x7956 0x291B6 +0x7957 0x291BD +0x7958 0x29373 +0x7959 0x29382 +0x795A 0x29587 +0x795B 0x29656 +0x795C 0x29659 +0x795D 0x297F6 +0x795E 0x299C9 +0x795F 0x299C5 +0x7960 0x299C7 +0x7961 0x299CA +0x7962 0x299C2 +0x7963 0x299C4 +0x7964 0x29BF2 +0x7965 0x29BF0 +0x7966 0x29D3B +0x7967 0x29D3A +0x7968 0x29F26 +0x7969 0x29F28 +0x796A 0x29F34 +0x796B 0x29F2D +0x796C 0x2A1D7 +0x796D 0x2A1D2 +0x796E 0x2A1D6 +0x796F 0x2A1DC +0x7970 0x2A1D3 +0x7971 0x2A1D1 +0x7972 0x2A286 +0x7974 0x2A2EF +0x7975 0x2A2EE +0x7976 0x2A3E8 +0x7977 0x2A4AC +0x7978 0x2A4A9 +0x7979 0x2A4AA +0x797A 0x2A4AB +0x797B 0x2A4FB +0x797C 0x2A533 +0x797D 0x2A588 +0x797E 0x2A5B6 +0x7A21 0x2A5B7 +0x7A22 0x2A5D0 +0x7A23 0x2A5CF +0x7A24 0x2A64F +0x7A25 0x2A659 +0x7A26 0x2A64C +0x7A27 0x21B18 +0x7A28 0x21FE0 +0x7A29 0x23869 +0x7A2A 0x24173 +0x7A2B 0x24172 +0x7A2C 0x24AE8 +0x7A2D 0x255FB +0x7A2E 0x2591C +0x7A2F 0x25E09 +0x7A30 0x25E0A +0x7A31 0x25E08 +0x7A32 0x25F7D +0x7A33 0x25F7F +0x7A34 0x26267 +0x7A35 0x2717A +0x7A36 0x2717B +0x7A37 0x277D1 +0x7A38 0x2F9CB +0x7A39 0x27B9D +0x7A3A 0x27C9D +0x7A3B 0x281FC +0x7A3C 0x281FB +0x7A3D 0x281FD +0x7A3E 0x283F5 +0x7A3F 0x283F6 +0x7A40 0x28C0F +0x7A41 0x28C1D +0x7A42 0x291C7 +0x7A43 0x291C1 +0x7A44 0x291BF +0x7A45 0x29254 +0x7A46 0x2937F +0x7A47 0x293F5 +0x7A48 0x2958A +0x7A49 0x2958C +0x7A4A 0x2965C +0x7A4B 0x29865 +0x7A4C 0x299CF +0x7A4D 0x299D0 +0x7A4E 0x29AB8 +0x7A4F 0x29BFA +0x7A50 0x29C66 +0x7A51 0x29F40 +0x7A52 0x29F41 +0x7A54 0x2A1F7 +0x7A55 0x2A1F3 +0x7A56 0x2A1EF +0x7A57 0x2A1F4 +0x7A58 0x2A1ED +0x7A59 0x2A1F2 +0x7A5A 0x2A1F1 +0x7A5B 0x2A1F9 +0x7A5C 0x2A4B4 +0x7A5D 0x2A4FC +0x7A5E 0x2A5BC +0x7A5F 0x2A65E +0x7A60 0x2A65B +0x7A61 0x2A65F +0x7A62 0x2A65D +0x7A63 0x2A6CF +0x7A64 0x2A6CE +0x7A65 0x2193A +0x7A66 0x21FE1 +0x7A67 0x22315 +0x7A68 0x22314 +0x7A69 0x24178 +0x7A6A 0x24179 +0x7A6B 0x244E6 +0x7A6C 0x24BB8 +0x7A6D 0x24F22 +0x7A6E 0x255FE +0x7A6F 0x268DB +0x7A70 0x26A06 +0x7A71 0x26AC8 +0x7A72 0x27189 +0x7A73 0x27586 +0x7A74 0x278AD +0x7A75 0x27B99 +0x7A76 0x27BD8 +0x7A77 0x27C23 +0x7A78 0x27D23 +0x7A79 0x27FB5 +0x7A7A 0x283F9 +0x7A7B 0x28907 +0x7A7C 0x28C1E +0x7A7D 0x28DFB +0x7A7E 0x28F72 +0x7B21 0x28F73 +0x7B22 0x29387 +0x7B23 0x29449 +0x7B24 0x2965D +0x7B25 0x297F8 +0x7B26 0x29C03 +0x7B27 0x29F4E +0x7B28 0x29F4D +0x7B29 0x29F50 +0x7B2A 0x29F55 +0x7B2B 0x2A209 +0x7B2C 0x2A207 +0x7B2D 0x2A20C +0x7B2E 0x2A203 +0x7B2F 0x2A206 +0x7B30 0x2A20B +0x7B31 0x2A20A +0x7B32 0x2A289 +0x7B33 0x2A4BB +0x7B34 0x2A4FF +0x7B35 0x2A536 +0x7B36 0x2A58B +0x7B37 0x2A666 +0x7B38 0x2A669 +0x7B39 0x2A667 +0x7B3A 0x2A6C2 +0x7B3B 0x2A6D2 +0x7B3C 0x21FE2 +0x7B3E 0x22988 +0x7B3F 0x2335B +0x7B40 0x23876 +0x7B41 0x2417D +0x7B42 0x245A6 +0x7B43 0x2535A +0x7B44 0x25E17 +0x7B45 0x268DC +0x7B46 0x2718F +0x7B47 0x27594 +0x7B48 0x27595 +0x7B49 0x27FB6 +0x7B4A 0x28204 +0x7B4B 0x287EE +0x7B4C 0x2938A +0x7B4D 0x293F9 +0x7B4E 0x29C07 +0x7B4F 0x29C1F +0x7B50 0x29C2A +0x7B51 0x29D45 +0x7B52 0x29F5C +0x7B53 0x29F5B +0x7B54 0x29F61 +0x7B55 0x29F5D +0x7B56 0x2A218 +0x7B57 0x2A21F +0x7B58 0x2A383 +0x7B59 0x2A416 +0x7B5A 0x2A414 +0x7B5B 0x2A4BF +0x7B5C 0x2A4C0 +0x7B5D 0x2A673 +0x7B5E 0x2A6C0 +0x7B5F 0x21517 +0x7B60 0x22989 +0x7B61 0x2591E +0x7B62 0x2591F +0x7B63 0x25A54 +0x7B64 0x25E18 +0x7B65 0x26205 +0x7B66 0x27195 +0x7B67 0x27598 +0x7B68 0x2759B +0x7B69 0x27959 +0x7B6A 0x28208 +0x7B6B 0x28401 +0x7B6C 0x291CE +0x7B6D 0x293FA +0x7B6E 0x29ABE +0x7B6F 0x29D47 +0x7B70 0x29F6A +0x7B71 0x29F69 +0x7B72 0x29F68 +0x7B73 0x29F67 +0x7B74 0x2A225 +0x7B75 0x2A228 +0x7B76 0x2A4C4 +0x7B77 0x2A537 +0x7B78 0x2A58D +0x7B79 0x2A58C +0x7B7B 0x2F920 +0x7B7C 0x25E22 +0x7B7D 0x25F82 +0x7B7E 0x277D9 +0x7C21 0x28C38 +0x7C22 0x293FB +0x7C23 0x299E1 +0x7C24 0x29C72 +0x7C25 0x29D48 +0x7C26 0x29F6C +0x7C27 0x29F70 +0x7C28 0x2A231 +0x7C29 0x2A230 +0x7C2A 0x2A679 +0x7C2B 0x25E23 +0x7C2C 0x268F8 +0x7C2D 0x29C74 +0x7C2E 0x29F73 +0x7C2F 0x2A234 +0x7C30 0x2A387 +0x7C31 0x2A3B2 +0x7C32 0x2A5C2 +0x7C33 0x2A67D +0x7C34 0x21FE5 +0x7C35 0x2938C +0x7C36 0x29F77 +0x7C37 0x29F75 +0x7C38 0x2A238 +0x7C39 0x2A23A +0x7C3A 0x2A683 +0x7C3B 0x2A681 +0x7C3C 0x24180 +0x7C3D 0x27199 +0x7C3F 0x2944A +0x7C40 0x29D4A +0x7C41 0x2A23C +0x7C42 0x2A6C8 +0x7C43 0x25604 +0x7C44 0x278AF +0x7C45 0x2A689 +0x7C46 0x2A2FA +0x7C47 0x29661 +0x7C48 0x2A23F +0x7C49 0x27193 +0x7C4A 0x2A4C9 +0x7C4B 0x277DE +0x7C4C 0x29391 +0x7C4D 0x2A68E +0x7C4E 0x2A68D +0x7C4F 0x27198 +0x7C50 0x269C5 +0x7C51 0x2A6A5 diff --git a/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane6.surrogates b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane6.surrogates new file mode 100644 index 00000000000..f6c9f67160a --- /dev/null +++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane6.surrogates @@ -0,0 +1,6158 @@ +0x2121 0x2F802 +0x2122 0x20062 +0x2124 0x20088 +0x2125 0x200D0 +0x2126 0x200CF +0x2127 0x2011E +0x2128 0x2011F +0x2129 0x20120 +0x212A 0x2090E +0x212B 0x2092C +0x212C 0x20061 +0x212D 0x20004 +0x212E 0x20005 +0x212F 0x20003 +0x2131 0x2F801 +0x2132 0x2007D +0x2133 0x2008D +0x2134 0x201A3 +0x2135 0x201A4 +0x2136 0x204DB +0x2137 0x20500 +0x2138 0x2F81E +0x2139 0x206A3 +0x213A 0x20832 +0x213C 0x20AD4 +0x213D 0x20AD5 +0x213E 0x21C23 +0x213F 0x2232C +0x2140 0x2237A +0x2141 0x20503 +0x2142 0x20007 +0x2143 0x20008 +0x2144 0x2008F +0x2145 0x2009C +0x2146 0x200D5 +0x2147 0x20112 +0x2148 0x20113 +0x2149 0x20114 +0x214A 0x20121 +0x214B 0x201A8 +0x214C 0x201A6 +0x214D 0x20476 +0x214E 0x20501 +0x214F 0x2053D +0x2150 0x2F814 +0x2151 0x2053E +0x2152 0x20629 +0x2153 0x20677 +0x2154 0x20678 +0x2155 0x206A6 +0x2156 0x206A9 +0x2157 0x206AC +0x2158 0x20834 +0x2159 0x20504 +0x215A 0x2097B +0x215B 0x20A10 +0x215C 0x2062F +0x215D 0x20AD7 +0x215E 0x20B1C +0x215F 0x20B1F +0x2160 0x20B1A +0x2161 0x2F836 +0x2162 0x20B1E +0x2163 0x20B9E +0x2164 0x20B9A +0x2165 0x211A0 +0x2166 0x211A1 +0x2167 0x215D2 +0x2168 0x215D3 +0x2169 0x219B9 +0x216A 0x21B1D +0x216B 0x21B55 +0x216C 0x21CFF +0x216D 0x21FE7 +0x216F 0x22011 +0x2170 0x22013 +0x2171 0x22012 +0x2172 0x221AF +0x2173 0x221B1 +0x2174 0x2F890 +0x2175 0x2232D +0x2176 0x2237B +0x2177 0x2239D +0x2178 0x2239A +0x217A 0x2239F +0x217B 0x223A0 +0x217C 0x2239C +0x217D 0x224BD +0x2221 0x225AA +0x2222 0x2306C +0x2223 0x23091 +0x2224 0x23C74 +0x2225 0x2456A +0x2226 0x2F929 +0x2227 0x25605 +0x2228 0x2626B +0x2229 0x2626A +0x222A 0x200E0 +0x222B 0x20012 +0x222D 0x2007F +0x222E 0x200A0 +0x222F 0x20099 +0x2230 0x20095 +0x2231 0x2009E +0x2232 0x200DF +0x2233 0x200DE +0x2234 0x201AF +0x2235 0x201AD +0x2236 0x201B0 +0x2237 0x204DF +0x2238 0x20543 +0x2239 0x20541 +0x223A 0x20548 +0x223B 0x20575 +0x223C 0x2F81A +0x223D 0x20632 +0x223E 0x2067B +0x223F 0x20679 +0x2240 0x206B3 +0x2242 0x20BA7 +0x2243 0x206B2 +0x2244 0x206B0 +0x2245 0x206B4 +0x2246 0x2F829 +0x2247 0x208CD +0x2248 0x208CE +0x2249 0x2F82B +0x224A 0x20910 +0x224B 0x20980 +0x224C 0x209D3 +0x224D 0x20A30 +0x224E 0x20098 +0x224F 0x20A2F +0x2250 0x20A31 +0x2251 0x20ADA +0x2252 0x20AD9 +0x2253 0x20B27 +0x2254 0x20B28 +0x2255 0x20B21 +0x2256 0x20B25 +0x2257 0x20BA6 +0x2258 0x20BA2 +0x2259 0x20BA1 +0x225A 0x20BA4 +0x225B 0x2F839 +0x225C 0x20BAA +0x225D 0x20BA5 +0x225E 0x20BA3 +0x225F 0x20064 +0x2260 0x2123F +0x2261 0x21244 +0x2262 0x2151B +0x2263 0x21553 +0x2264 0x21584 +0x2265 0x21586 +0x2266 0x215D5 +0x2267 0x2F860 +0x2268 0x2193E +0x2269 0x21940 +0x226A 0x21BCA +0x226B 0x21BC9 +0x226C 0x21C26 +0x226D 0x21D00 +0x226E 0x21D31 +0x226F 0x21D3C +0x2270 0x21D30 +0x2271 0x21D33 +0x2272 0x21D32 +0x2273 0x21D38 +0x2274 0x22034 +0x2275 0x22053 +0x2276 0x22054 +0x2277 0x221B4 +0x2278 0x221B2 +0x2279 0x2232F +0x227A 0x223A5 +0x227B 0x223A7 +0x227C 0x223A4 +0x227D 0x223A8 +0x227E 0x223A9 +0x2321 0x223A2 +0x2322 0x223A3 +0x2323 0x223A6 +0x2324 0x22481 +0x2325 0x22480 +0x2326 0x225AD +0x2327 0x22A24 +0x2328 0x22A65 +0x2329 0x22A68 +0x232A 0x22A69 +0x232B 0x2313C +0x232C 0x2313B +0x232D 0x2335D +0x232E 0x23944 +0x232F 0x24182 +0x2330 0x244F1 +0x2331 0x2456B +0x2332 0x2471B +0x2333 0x248EB +0x2334 0x24BBA +0x2335 0x24BD3 +0x2336 0x24D13 +0x2337 0x25922 +0x2338 0x26AF4 +0x2339 0x2820F +0x233A 0x28210 +0x233B 0x20507 +0x233C 0x29C0B +0x233D 0x29C0A +0x233E 0x20019 +0x233F 0x2001A +0x2340 0x20018 +0x2341 0x20066 +0x2342 0x20082 +0x2343 0x200A8 +0x2344 0x200E5 +0x2345 0x200E7 +0x2346 0x200E4 +0x2347 0x20115 +0x2348 0x20123 +0x2349 0x20124 +0x234A 0x20143 +0x234B 0x201C3 +0x234C 0x201BC +0x234D 0x201BB +0x234F 0x201B7 +0x2350 0x201B9 +0x2351 0x201CF +0x2352 0x2F80D +0x2353 0x2047A +0x2354 0x2047B +0x2355 0x204E1 +0x2356 0x204E0 +0x2357 0x20509 +0x2358 0x2054D +0x2359 0x2F816 +0x235A 0x2054B +0x235B 0x20579 +0x235C 0x205B1 +0x235D 0x20636 +0x235E 0x20635 +0x235F 0x20637 +0x2360 0x20638 +0x2361 0x2067F +0x2362 0x20680 +0x2363 0x20681 +0x2364 0x26953 +0x2365 0x2067E +0x2366 0x206CD +0x2367 0x206BF +0x2368 0x206BE +0x2369 0x206C2 +0x236A 0x206B8 +0x236B 0x206C1 +0x236D 0x20931 +0x236E 0x2092F +0x236F 0x2096F +0x2370 0x20982 +0x2372 0x20987 +0x2373 0x20986 +0x2374 0x2098D +0x2375 0x20994 +0x2376 0x209D7 +0x2377 0x209D4 +0x2378 0x209D8 +0x2379 0x20A16 +0x237A 0x20A14 +0x237B 0x20A2E +0x237C 0x20A36 +0x237D 0x20A37 +0x237E 0x21FEE +0x2421 0x20AE0 +0x2422 0x20AE5 +0x2423 0x20ADF +0x2424 0x20B2B +0x2425 0x20B29 +0x2426 0x20B2D +0x2427 0x20B2F +0x2428 0x20BB7 +0x2429 0x20BC9 +0x242A 0x20BC1 +0x242B 0x20BCA +0x242C 0x20BB2 +0x242D 0x20BAC +0x242E 0x20BAE +0x242F 0x211B2 +0x2430 0x211A8 +0x2431 0x211B0 +0x2432 0x211A7 +0x2433 0x2F851 +0x2434 0x21252 +0x2435 0x2124A +0x2436 0x21556 +0x2437 0x21555 +0x2438 0x2155F +0x2439 0x2155E +0x243A 0x21588 +0x243B 0x2F85D +0x243C 0x215DD +0x243D 0x215E2 +0x243E 0x215E1 +0x243F 0x215DF +0x2440 0x215E0 +0x2441 0x216AF +0x2442 0x216B1 +0x2443 0x216BA +0x2444 0x21945 +0x2445 0x21943 +0x2446 0x219BD +0x2447 0x219C8 +0x2448 0x2F86C +0x2449 0x219BE +0x244A 0x219BF +0x244B 0x2F874 +0x244C 0x21B59 +0x244D 0x21C29 +0x244E 0x21C2C +0x244F 0x21C2F +0x2450 0x21C2D +0x2451 0x21C2E +0x2452 0x21D04 +0x2453 0x21D02 +0x2454 0x21D01 +0x2455 0x21D40 +0x2456 0x21D4A +0x2457 0x21D3F +0x2458 0x21D4F +0x2459 0x21D41 +0x245A 0x21D4E +0x245B 0x21FEB +0x245C 0x21FEC +0x245D 0x200AC +0x245E 0x2205B +0x245F 0x22063 +0x2460 0x2205A +0x2461 0x22059 +0x2462 0x221DC +0x2463 0x221DB +0x2464 0x221D9 +0x2465 0x221E0 +0x2466 0x221DD +0x2467 0x20020 +0x2468 0x223B0 +0x2469 0x223B1 +0x246A 0x223B2 +0x246B 0x223B6 +0x246C 0x22451 +0x246D 0x22452 +0x246E 0x22450 +0x246F 0x22484 +0x2471 0x22483 +0x2472 0x225C3 +0x2473 0x225B8 +0x2474 0x225B9 +0x2475 0x225B2 +0x2476 0x22990 +0x2477 0x22A26 +0x2478 0x22A29 +0x2479 0x22A6E +0x247A 0x23140 +0x247B 0x2313E +0x247C 0x23141 +0x247D 0x2335E +0x247E 0x233BB +0x2521 0x233BC +0x2522 0x233B9 +0x2523 0x2F8EF +0x2524 0x23880 +0x2526 0x23945 +0x2527 0x239BA +0x2528 0x239BD +0x2529 0x23C56 +0x252A 0x23C55 +0x252B 0x23C75 +0x252C 0x23C77 +0x252D 0x23C81 +0x252E 0x2F8FA +0x252F 0x23C83 +0x2530 0x23C8B +0x2531 0x23C84 +0x2532 0x24186 +0x2533 0x24183 +0x2534 0x2418B +0x2535 0x2456D +0x2536 0x24616 +0x2537 0x24728 +0x2538 0x248EA +0x2539 0x24BD4 +0x253A 0x24C03 +0x253B 0x24D15 +0x253C 0x24F3D +0x253D 0x24F3E +0x253E 0x25416 +0x253F 0x2F94C +0x2540 0x25606 +0x2541 0x2574D +0x2542 0x26222 +0x2543 0x26273 +0x2544 0x2626D +0x2545 0x2626E +0x2546 0x264B1 +0x2547 0x2054E +0x2548 0x2662D +0x254A 0x268F9 +0x254B 0x26952 +0x254C 0x26B00 +0x254D 0x26AFC +0x254E 0x26AFA +0x2550 0x26AF7 +0x2551 0x26AF8 +0x2552 0x2F990 +0x2553 0x2F9C4 +0x2554 0x27C27 +0x2555 0x28211 +0x2556 0x200AE +0x2557 0x28450 +0x2558 0x2844F +0x2559 0x2844D +0x255A 0x28671 +0x255B 0x2F9E2 +0x255C 0x28672 +0x255D 0x28E18 +0x255E 0x20A44 +0x255F 0x20021 +0x2560 0x20067 +0x2561 0x200AF +0x2562 0x200B0 +0x2563 0x20029 +0x2564 0x20117 +0x2565 0x20122 +0x2566 0x2F803 +0x2567 0x20025 +0x2568 0x20128 +0x2569 0x201FF +0x256A 0x201D9 +0x256B 0x201DB +0x256C 0x201DE +0x256D 0x201F2 +0x256E 0x201FE +0x256F 0x201F4 +0x2570 0x201DD +0x2572 0x2F804 +0x2573 0x20201 +0x2574 0x201DC +0x2575 0x2047D +0x2576 0x20481 +0x2577 0x2047E +0x2578 0x2047F +0x2579 0x204E5 +0x257A 0x2050F +0x257C 0x2050A +0x257E 0x2050B +0x2621 0x20551 +0x2622 0x20552 +0x2623 0x20550 +0x2624 0x205B8 +0x2625 0x2063D +0x2626 0x2063E +0x2627 0x2063C +0x2628 0x20687 +0x2629 0x206D7 +0x262A 0x206DB +0x262B 0x206CF +0x262C 0x206E0 +0x262D 0x2084C +0x262E 0x20842 +0x262F 0x208D4 +0x2630 0x20911 +0x2631 0x20914 +0x2632 0x20915 +0x2633 0x20912 +0x2634 0x20933 +0x2635 0x20935 +0x2637 0x20971 +0x2639 0x20991 +0x263A 0x20993 +0x263B 0x20995 +0x263C 0x209DC +0x263D 0x20A42 +0x263E 0x20A40 +0x263F 0x253A6 +0x2640 0x20AE6 +0x2641 0x2128F +0x2642 0x20B32 +0x2643 0x2F837 +0x2644 0x20B31 +0x2645 0x20BF5 +0x2646 0x20BCD +0x2647 0x20BDE +0x2648 0x20BD5 +0x2649 0x20BDA +0x264A 0x20BEE +0x264B 0x20BEC +0x264C 0x20BCF +0x264D 0x20BCE +0x264E 0x2F83D +0x264F 0x20BCC +0x2650 0x20BF3 +0x2651 0x211C1 +0x2652 0x211C4 +0x2653 0x211C6 +0x2654 0x211B4 +0x2655 0x211C3 +0x2656 0x211B8 +0x2657 0x211BB +0x2658 0x211B7 +0x2659 0x211BC +0x265A 0x211BF +0x265B 0x211C7 +0x265C 0x211BE +0x265D 0x21260 +0x265E 0x2125D +0x265F 0x21276 +0x2660 0x2126C +0x2661 0x21275 +0x2662 0x2125B +0x2663 0x21271 +0x2664 0x21273 +0x2665 0x21261 +0x2666 0x2125A +0x2667 0x21262 +0x2668 0x21272 +0x2669 0x2125F +0x266A 0x21258 +0x266B 0x2151E +0x266C 0x21558 +0x266D 0x2158B +0x266E 0x2158A +0x266F 0x215F4 +0x2670 0x215F0 +0x2671 0x216D2 +0x2672 0x216CD +0x2673 0x216CE +0x2674 0x216BC +0x2675 0x216D0 +0x2676 0x21946 +0x2677 0x21947 +0x267B 0x219CE +0x267C 0x219CF +0x267D 0x219CC +0x267E 0x219CB +0x2721 0x2F872 +0x2722 0x21B60 +0x2723 0x21B5F +0x2724 0x21B5D +0x2725 0x21BD4 +0x2726 0x21C3A +0x2727 0x21C38 +0x2728 0x21C3C +0x2729 0x21C36 +0x272A 0x21D08 +0x272B 0x21D7E +0x272C 0x21D5E +0x272D 0x21D6E +0x272E 0x21D53 +0x272F 0x21D70 +0x2730 0x21D57 +0x2731 0x21D5D +0x2732 0x21D63 +0x2733 0x21D7A +0x2734 0x21D79 +0x2735 0x21D93 +0x2736 0x2F881 +0x2737 0x2201D +0x2738 0x22068 +0x2739 0x22073 +0x273A 0x22074 +0x273B 0x22066 +0x273C 0x2206F +0x273D 0x22075 +0x273E 0x2207A +0x273F 0x22070 +0x2740 0x2206D +0x2741 0x22065 +0x2742 0x2218A +0x2743 0x221ED +0x2744 0x221E9 +0x2745 0x221E3 +0x2746 0x221EF +0x2748 0x221EA +0x2749 0x22331 +0x274A 0x2F891 +0x274B 0x22338 +0x274C 0x26B20 +0x274D 0x22335 +0x274E 0x2233A +0x274F 0x22381 +0x2750 0x22380 +0x2751 0x223B8 +0x2752 0x223C1 +0x2753 0x223BA +0x2754 0x22488 +0x2755 0x224CF +0x2756 0x224CA +0x2757 0x224C7 +0x2758 0x224C5 +0x2759 0x224C8 +0x275A 0x224D0 +0x275B 0x224C9 +0x275C 0x225BB +0x275D 0x225B6 +0x275E 0x225BD +0x275F 0x2F89D +0x2760 0x225B4 +0x2761 0x225C1 +0x2762 0x225D1 +0x2763 0x225D2 +0x2764 0x225CC +0x2765 0x225D4 +0x2766 0x225CB +0x2767 0x225CE +0x2768 0x225D5 +0x2769 0x225D8 +0x276A 0x22995 +0x276B 0x22993 +0x276C 0x22999 +0x276D 0x22996 +0x276F 0x22A89 +0x2770 0x22A94 +0x2771 0x22A91 +0x2772 0x22A8F +0x2773 0x22A84 +0x2774 0x22A97 +0x2775 0x22A86 +0x2776 0x22A85 +0x2777 0x22A8C +0x2778 0x22EF2 +0x2779 0x22EED +0x277A 0x22EEF +0x277B 0x230D9 +0x277C 0x23146 +0x277D 0x23147 +0x277E 0x2314B +0x2821 0x23150 +0x2822 0x2314A +0x2823 0x2314E +0x2824 0x2314C +0x2825 0x23148 +0x2826 0x23363 +0x2827 0x23361 +0x2828 0x23362 +0x2829 0x23360 +0x282A 0x233C3 +0x282B 0x233C5 +0x282C 0x233C1 +0x282D 0x233D0 +0x282E 0x2F8DC +0x282F 0x23882 +0x2831 0x23886 +0x2832 0x23884 +0x2833 0x2394C +0x2834 0x23948 +0x2835 0x239B8 +0x2836 0x239BF +0x2837 0x239C1 +0x2838 0x239C6 +0x2839 0x239C5 +0x283A 0x239C7 +0x283B 0x239C0 +0x283C 0x239C3 +0x283D 0x23AED +0x283E 0x23B03 +0x283F 0x23B22 +0x2840 0x23B21 +0x2841 0x23C9F +0x2842 0x23C90 +0x2843 0x23C9E +0x2845 0x23CA0 +0x2846 0x23C94 +0x2847 0x23C95 +0x2848 0x23CA1 +0x284B 0x2419A +0x284C 0x24190 +0x284D 0x244F2 +0x284E 0x244F3 +0x284F 0x2456E +0x2850 0x245AB +0x2851 0x245A9 +0x2852 0x2461A +0x2853 0x24618 +0x2854 0x2461B +0x2855 0x24760 +0x2856 0x2474C +0x2857 0x24742 +0x2858 0x24733 +0x2859 0x2473F +0x285A 0x2473E +0x285B 0x24738 +0x285C 0x24743 +0x285D 0x24746 +0x285E 0x24736 +0x285F 0x248EE +0x2860 0x248F5 +0x2861 0x248F4 +0x2863 0x24C1B +0x2865 0x24D2B +0x2866 0x24D29 +0x2867 0x24D2A +0x2868 0x24D2E +0x2869 0x2503F +0x286A 0x250E6 +0x286B 0x253A7 +0x286C 0x253A8 +0x286D 0x25418 +0x286E 0x25608 +0x286F 0x25750 +0x2870 0x25753 +0x2871 0x25A56 +0x2872 0x25A55 +0x2873 0x2626F +0x2874 0x2627F +0x2875 0x264B3 +0x2876 0x2663A +0x2877 0x26638 +0x2878 0x26637 +0x2879 0x26636 +0x287A 0x20554 +0x287B 0x2F980 +0x287C 0x268DD +0x287D 0x268FC +0x287E 0x268FA +0x2921 0x26933 +0x2922 0x26B04 +0x2923 0x26B07 +0x2924 0x26B08 +0x2925 0x26B06 +0x2926 0x26B09 +0x2927 0x2F991 +0x2928 0x2F993 +0x2929 0x2721E +0x292A 0x2F9D2 +0x292B 0x2840B +0x292C 0x28443 +0x292D 0x28452 +0x292E 0x28458 +0x292F 0x2845E +0x2930 0x28668 +0x2931 0x2868D +0x2932 0x28682 +0x2933 0x2867B +0x2934 0x28C58 +0x2936 0x2F800 +0x2937 0x2002C +0x2938 0x2002E +0x2939 0x2160B +0x293A 0x2002D +0x293B 0x20069 +0x293C 0x200B2 +0x293D 0x200B6 +0x293E 0x200A9 +0x293F 0x200ED +0x2940 0x20119 +0x2941 0x2014F +0x2942 0x20216 +0x2943 0x20203 +0x2944 0x2020E +0x2945 0x20204 +0x2946 0x20207 +0x2947 0x20210 +0x2948 0x20227 +0x2949 0x20228 +0x294A 0x2020D +0x294B 0x20229 +0x294C 0x2020F +0x294D 0x20222 +0x294E 0x20211 +0x294F 0x20485 +0x2950 0x20484 +0x2951 0x20483 +0x2952 0x2048A +0x2953 0x20486 +0x2954 0x20510 +0x2955 0x20558 +0x2956 0x2055A +0x2957 0x2070C +0x2958 0x205C4 +0x2959 0x205C5 +0x295A 0x20647 +0x295B 0x20649 +0x295C 0x2064A +0x295D 0x2064B +0x295E 0x221BB +0x295F 0x2068D +0x2960 0x2068B +0x2961 0x20707 +0x2962 0x20706 +0x2963 0x2F820 +0x2964 0x206EF +0x2965 0x206F0 +0x2966 0x206ED +0x2967 0x206F9 +0x2968 0x20702 +0x2969 0x206E7 +0x296A 0x206F4 +0x296B 0x206F7 +0x296C 0x206F1 +0x296D 0x20853 +0x296E 0x20855 +0x2970 0x208DA +0x2971 0x208D9 +0x2973 0x20938 +0x2974 0x20999 +0x2975 0x209A2 +0x2976 0x2099C +0x2977 0x2099A +0x2978 0x2099B +0x2979 0x209E5 +0x297A 0x209E3 +0x297B 0x209E1 +0x297C 0x209E0 +0x297D 0x209E2 +0x297E 0x209E4 +0x2A22 0x209E8 +0x2A23 0x2F82F +0x2A24 0x20A13 +0x2A25 0x20A56 +0x2A26 0x20A4B +0x2A27 0x20A4A +0x2A28 0x20A4D +0x2A29 0x20A4C +0x2A2B 0x20AEA +0x2A2C 0x20AE9 +0x2A2D 0x20AEB +0x2A2E 0x20AEC +0x2A2F 0x20B3A +0x2A30 0x20B3C +0x2A31 0x20B39 +0x2A32 0x20B3B +0x2A33 0x20C14 +0x2A34 0x20C0E +0x2A35 0x20C35 +0x2A36 0x20C0A +0x2A37 0x20C3F +0x2A38 0x20C38 +0x2A3A 0x20C4E +0x2A3B 0x20C17 +0x2A3C 0x2F83F +0x2A3D 0x20C1E +0x2A3E 0x211B6 +0x2A3F 0x211CE +0x2A40 0x211CA +0x2A41 0x211CB +0x2A42 0x211CC +0x2A43 0x211C9 +0x2A44 0x212B4 +0x2A45 0x212AC +0x2A46 0x21288 +0x2A47 0x21286 +0x2A48 0x2128C +0x2A49 0x21293 +0x2A4A 0x2128A +0x2A4B 0x212A4 +0x2A4C 0x21287 +0x2A4D 0x212A5 +0x2A4E 0x212A6 +0x2A4F 0x21285 +0x2A50 0x212A3 +0x2A51 0x2128E +0x2A52 0x2151F +0x2A53 0x21563 +0x2A54 0x2158D +0x2A55 0x215FA +0x2A56 0x215FB +0x2A57 0x21609 +0x2A58 0x215FE +0x2A59 0x215FF +0x2A5A 0x21602 +0x2A5B 0x21604 +0x2A5C 0x215FD +0x2A5D 0x21605 +0x2A5E 0x216F9 +0x2A5F 0x216F7 +0x2A60 0x216DB +0x2A61 0x216DA +0x2A62 0x21951 +0x2A63 0x21950 +0x2A64 0x21957 +0x2A65 0x219E2 +0x2A66 0x219D8 +0x2A67 0x219DA +0x2A68 0x219DC +0x2A69 0x21B20 +0x2A6A 0x21B1F +0x2A6B 0x21B69 +0x2A6C 0x21BDD +0x2A6D 0x21C40 +0x2A6E 0x21C41 +0x2A6F 0x21C43 +0x2A70 0x21D0D +0x2A71 0x21D0C +0x2A72 0x21D87 +0x2A73 0x21DA9 +0x2A74 0x21D92 +0x2A75 0x21D85 +0x2A77 0x21D8C +0x2A78 0x21DA2 +0x2A79 0x21D8F +0x2A7A 0x21D8A +0x2A7C 0x21D8D +0x2A7D 0x21FF1 +0x2A7E 0x22037 +0x2B21 0x2208B +0x2B22 0x22087 +0x2B23 0x22082 +0x2B24 0x2218E +0x2B25 0x221BC +0x2B26 0x221F8 +0x2B27 0x221FA +0x2B28 0x221EB +0x2B29 0x221F9 +0x2B2A 0x221FC +0x2B2B 0x22205 +0x2B2C 0x2231B +0x2B2D 0x2231D +0x2B2E 0x2231E +0x2B2F 0x2F892 +0x2B30 0x2233C +0x2B31 0x2233E +0x2B32 0x22384 +0x2B33 0x223C8 +0x2B34 0x223C9 +0x2B35 0x223D3 +0x2B36 0x223C7 +0x2B37 0x223D2 +0x2B38 0x22455 +0x2B39 0x2F896 +0x2B3A 0x2248C +0x2B3B 0x2248A +0x2B3C 0x224D5 +0x2B3D 0x224D3 +0x2B3F 0x224D8 +0x2B40 0x225D0 +0x2B41 0x225EE +0x2B42 0x225F1 +0x2B43 0x225FB +0x2B44 0x225D3 +0x2B45 0x225EC +0x2B46 0x225CD +0x2B47 0x22615 +0x2B48 0x22626 +0x2B49 0x2260E +0x2B4A 0x22627 +0x2B4B 0x2262A +0x2B4C 0x22600 +0x2B4D 0x22604 +0x2B4E 0x22628 +0x2B4F 0x22608 +0x2B50 0x22614 +0x2B51 0x2299B +0x2B53 0x229A1 +0x2B54 0x2299D +0x2B55 0x229A0 +0x2B56 0x2299E +0x2B57 0x229A2 +0x2B58 0x2299C +0x2B59 0x22A32 +0x2B5A 0x22A34 +0x2B5B 0x22A93 +0x2B5C 0x22A96 +0x2B5D 0x22A90 +0x2B5E 0x22AB4 +0x2B5F 0x22AB5 +0x2B60 0x2F8B6 +0x2B61 0x22AB6 +0x2B62 0x22AC2 +0x2B63 0x2F8B5 +0x2B64 0x22ABA +0x2B65 0x22A92 +0x2B66 0x22EFB +0x2B67 0x22F05 +0x2B68 0x22EF3 +0x2B69 0x22EFE +0x2B6A 0x22EFD +0x2B6B 0x2455D +0x2B6C 0x22EFA +0x2B6D 0x23043 +0x2B6E 0x23095 +0x2B6F 0x23094 +0x2B71 0x2316F +0x2B72 0x23173 +0x2B73 0x2315C +0x2B74 0x2315B +0x2B75 0x23166 +0x2B76 0x23174 +0x2B77 0x23163 +0x2B78 0x23167 +0x2B79 0x23160 +0x2B7A 0x23162 +0x2B7B 0x23171 +0x2B7C 0x23172 +0x2B7D 0x2315E +0x2B7E 0x23323 +0x2C21 0x23326 +0x2C22 0x23364 +0x2C23 0x2F8D6 +0x2C24 0x233F2 +0x2C25 0x23401 +0x2C26 0x233DD +0x2C27 0x233DC +0x2C28 0x233DB +0x2C29 0x233F3 +0x2C2A 0x233FD +0x2C2B 0x233D8 +0x2C2C 0x233F8 +0x2C2D 0x233FB +0x2C2E 0x23883 +0x2C2F 0x2388C +0x2C30 0x2388E +0x2C31 0x23949 +0x2C32 0x23954 +0x2C33 0x23952 +0x2C34 0x2394E +0x2C35 0x23958 +0x2C36 0x23951 +0x2C37 0x23955 +0x2C38 0x23953 +0x2C39 0x23957 +0x2C3A 0x23950 +0x2C3B 0x2394F +0x2C3C 0x2394D +0x2C3D 0x239D2 +0x2C3E 0x239D3 +0x2C3F 0x239C9 +0x2C40 0x239D4 +0x2C41 0x23AEF +0x2C42 0x2F8F8 +0x2C43 0x200B1 +0x2C44 0x23B05 +0x2C45 0x23B04 +0x2C46 0x23B2E +0x2C47 0x23B2D +0x2C48 0x23C45 +0x2C49 0x23C5B +0x2C4A 0x23C5A +0x2C4B 0x23C59 +0x2C4C 0x23C9D +0x2C4D 0x23C8E +0x2C4E 0x23CBC +0x2C4F 0x23CDD +0x2C50 0x23CBA +0x2C51 0x2F8FD +0x2C52 0x23CD8 +0x2C53 0x23CCB +0x2C54 0x23CD9 +0x2C55 0x23CDA +0x2C56 0x23CC4 +0x2C57 0x23CB8 +0x2C58 0x23CBF +0x2C59 0x23CDB +0x2C5A 0x23CC1 +0x2C5B 0x2F8FC +0x2C5C 0x23CC5 +0x2C5D 0x2F919 +0x2C5E 0x241B1 +0x2C5F 0x241AF +0x2C60 0x2F918 +0x2C61 0x244F7 +0x2C62 0x244F6 +0x2C63 0x244F8 +0x2C64 0x24550 +0x2C65 0x24551 +0x2C66 0x24571 +0x2C67 0x24570 +0x2C68 0x245B0 +0x2C69 0x245AF +0x2C6A 0x245AE +0x2C6B 0x245AD +0x2C6C 0x24625 +0x2C6D 0x2462C +0x2C6E 0x24622 +0x2C6F 0x24633 +0x2C70 0x24634 +0x2C72 0x2473A +0x2C73 0x24740 +0x2C74 0x24768 +0x2C76 0x24764 +0x2C77 0x2475C +0x2C78 0x24757 +0x2C79 0x24753 +0x2C7A 0x2474F +0x2C7B 0x24751 +0x2C7C 0x24754 +0x2C7D 0x24766 +0x2D22 0x2490D +0x2D23 0x24908 +0x2D24 0x2F92B +0x2D25 0x248FA +0x2D26 0x24AEA +0x2D27 0x24B2A +0x2D28 0x24BBB +0x2D29 0x24BD5 +0x2D2A 0x24BD7 +0x2D2B 0x21DA4 +0x2D2C 0x200F0 +0x2D2D 0x200B5 +0x2D2E 0x24C06 +0x2D2F 0x24C28 +0x2D30 0x24C22 +0x2D31 0x24C21 +0x2D32 0x22456 +0x2D33 0x24C23 +0x2D34 0x211CD +0x2D35 0x24D30 +0x2D36 0x24D34 +0x2D37 0x24FC9 +0x2D38 0x24FCA +0x2D39 0x24FC8 +0x2D3A 0x2F93D +0x2D3B 0x25044 +0x2D3C 0x250F3 +0x2D3D 0x2F941 +0x2D3E 0x250F8 +0x2D3F 0x250FC +0x2D40 0x250F6 +0x2D41 0x250FB +0x2D42 0x250F7 +0x2D43 0x25100 +0x2D44 0x25102 +0x2D45 0x2F940 +0x2D46 0x2F94D +0x2D47 0x25424 +0x2D48 0x2560D +0x2D4A 0x25762 +0x2D4B 0x25930 +0x2D4C 0x2592B +0x2D4D 0x2592A +0x2D4F 0x2592D +0x2D50 0x25ADA +0x2D51 0x25E28 +0x2D52 0x25F86 +0x2D53 0x26277 +0x2D54 0x2627C +0x2D55 0x26350 +0x2D56 0x2634E +0x2D57 0x263F2 +0x2D58 0x264B2 +0x2D59 0x264CE +0x2D5A 0x264CF +0x2D5B 0x264E5 +0x2D5C 0x23407 +0x2D5D 0x26535 +0x2D5E 0x26531 +0x2D5F 0x26613 +0x2D60 0x2662B +0x2D61 0x2662C +0x2D62 0x26645 +0x2D63 0x26660 +0x2D64 0x26641 +0x2D65 0x26658 +0x2D66 0x26647 +0x2D67 0x2665B +0x2D68 0x26650 +0x2D69 0x2F982 +0x2D6A 0x2665F +0x2D6B 0x2664A +0x2D6C 0x26656 +0x2D6D 0x26643 +0x2D6E 0x26644 +0x2D6F 0x26651 +0x2D70 0x268FD +0x2D71 0x26934 +0x2D72 0x26935 +0x2D73 0x26954 +0x2D74 0x26955 +0x2D75 0x26A0C +0x2D76 0x26A0B +0x2D77 0x26A0A +0x2D78 0x26AF9 +0x2D79 0x26B35 +0x2D7A 0x26B24 +0x2D7B 0x26B13 +0x2D7C 0x26B1C +0x2D7D 0x26B69 +0x2D7E 0x26B25 +0x2E21 0x26B21 +0x2E22 0x2F995 +0x2E23 0x2F996 +0x2E24 0x2F998 +0x2E25 0x27220 +0x2E26 0x275A9 +0x2E27 0x275A8 +0x2E28 0x275DE +0x2E29 0x27609 +0x2E2A 0x2760A +0x2E2B 0x2760B +0x2E2C 0x277E3 +0x2E2D 0x27807 +0x2E2E 0x278B2 +0x2E2F 0x278B3 +0x2E30 0x2795D +0x2E31 0x27E58 +0x2E32 0x27E86 +0x2E33 0x27E87 +0x2E34 0x27FB9 +0x2E35 0x27FB8 +0x2E36 0x2840C +0x2E37 0x28444 +0x2E38 0x28466 +0x2E39 0x28480 +0x2E3A 0x28475 +0x2E3B 0x2846D +0x2E3C 0x2847E +0x2E3D 0x28467 +0x2E3E 0x28481 +0x2E3F 0x28477 +0x2E40 0x286A8 +0x2E41 0x286A2 +0x2E42 0x286A5 +0x2E43 0x2869B +0x2E44 0x28C57 +0x2E45 0x28E0F +0x2E46 0x28E32 +0x2E47 0x28E2C +0x2E48 0x28E33 +0x2E49 0x291E7 +0x2E4A 0x2006E +0x2E4B 0x200B7 +0x2E4C 0x200F6 +0x2E4D 0x200F2 +0x2E4E 0x200F3 +0x2E4F 0x20517 +0x2E50 0x20130 +0x2E51 0x20154 +0x2E52 0x20153 +0x2E53 0x20252 +0x2E54 0x2023D +0x2E55 0x2023C +0x2E56 0x20234 +0x2E57 0x20233 +0x2E58 0x20254 +0x2E59 0x2022F +0x2E5B 0x20255 +0x2E5C 0x2023F +0x2E5D 0x20237 +0x2E5E 0x20256 +0x2E5F 0x20261 +0x2E60 0x20258 +0x2E61 0x2F806 +0x2E62 0x2023B +0x2E63 0x20232 +0x2E64 0x2022E +0x2E65 0x2023E +0x2E66 0x2003B +0x2E67 0x2048C +0x2E68 0x2048D +0x2E69 0x20513 +0x2E6A 0x20516 +0x2E6B 0x20512 +0x2E6C 0x2055B +0x2E6D 0x2058A +0x2E6E 0x205D7 +0x2E6F 0x205CE +0x2E70 0x20650 +0x2E71 0x20651 +0x2E72 0x2064F +0x2E73 0x2068E +0x2E74 0x2068F +0x2E75 0x206F2 +0x2E76 0x2F821 +0x2E77 0x20728 +0x2E78 0x2071A +0x2E79 0x20725 +0x2E7A 0x2071D +0x2E7B 0x20714 +0x2E7C 0x20720 +0x2E7D 0x2071F +0x2E7E 0x2071B +0x2F21 0x20717 +0x2F22 0x20715 +0x2F23 0x2071C +0x2F24 0x20713 +0x2F25 0x2F825 +0x2F26 0x20860 +0x2F28 0x20866 +0x2F29 0x208E3 +0x2F2A 0x208DE +0x2F2B 0x208E0 +0x2F2C 0x208E1 +0x2F2D 0x2091A +0x2F2E 0x2091B +0x2F2F 0x20918 +0x2F30 0x2091C +0x2F31 0x20919 +0x2F32 0x20942 +0x2F33 0x20940 +0x2F34 0x2093E +0x2F35 0x20944 +0x2F36 0x20974 +0x2F37 0x20943 +0x2F38 0x2F82D +0x2F39 0x209F2 +0x2F3A 0x20A1B +0x2F3B 0x20A19 +0x2F3C 0x20A1E +0x2F3D 0x2F830 +0x2F3E 0x20A5E +0x2F3F 0x20A66 +0x2F40 0x20A5D +0x2F41 0x20A5A +0x2F42 0x20A5F +0x2F43 0x20A60 +0x2F44 0x20A5B +0x2F45 0x20A5C +0x2F46 0x20A59 +0x2F47 0x20AF0 +0x2F48 0x20AF1 +0x2F49 0x20B43 +0x2F4A 0x20B40 +0x2F4B 0x20B42 +0x2F4C 0x20B41 +0x2F4D 0x20B3F +0x2F4E 0x20C57 +0x2F4F 0x20C69 +0x2F50 0x20C6F +0x2F51 0x20CAB +0x2F52 0x20C71 +0x2F53 0x20C93 +0x2F54 0x20C56 +0x2F55 0x20C90 +0x2F56 0x20C6D +0x2F57 0x20C6C +0x2F58 0x20C70 +0x2F59 0x20C66 +0x2F5A 0x20C67 +0x2F5B 0x211D7 +0x2F5C 0x211B5 +0x2F5D 0x211DB +0x2F5E 0x211D8 +0x2F5F 0x211D5 +0x2F60 0x211D4 +0x2F61 0x212BA +0x2F62 0x212B7 +0x2F63 0x212BE +0x2F64 0x212B9 +0x2F66 0x212E0 +0x2F67 0x212DD +0x2F68 0x212DE +0x2F69 0x24918 +0x2F6A 0x212D8 +0x2F6B 0x212BD +0x2F6C 0x212DB +0x2F6D 0x2151D +0x2F6E 0x21525 +0x2F6F 0x21721 +0x2F70 0x2170C +0x2F71 0x21729 +0x2F72 0x2172D +0x2F73 0x2171B +0x2F74 0x2170E +0x2F75 0x2171F +0x2F76 0x21704 +0x2F77 0x2171C +0x2F78 0x21705 +0x2F79 0x21706 +0x2F7A 0x21720 +0x2F7B 0x2170D +0x2F7C 0x2172A +0x2F7D 0x21723 +0x2F7E 0x21711 +0x3021 0x2195C +0x3022 0x21966 +0x3023 0x2195B +0x3024 0x2194F +0x3025 0x2195E +0x3026 0x2195D +0x3027 0x219F1 +0x3028 0x219EA +0x3029 0x219F4 +0x302A 0x219EB +0x302B 0x219F0 +0x302C 0x219FA +0x302D 0x219FB +0x302E 0x21B28 +0x302F 0x21B2C +0x3030 0x21B6B +0x3031 0x21B2A +0x3032 0x21B6A +0x3033 0x21B6F +0x3034 0x21BDB +0x3035 0x21BE0 +0x3036 0x24FD1 +0x3037 0x21BE3 +0x3038 0x21BE5 +0x3039 0x21BE7 +0x303A 0x21C4D +0x303B 0x21C55 +0x303C 0x21C54 +0x303D 0x21C53 +0x303E 0x21C52 +0x303F 0x21C4E +0x3040 0x21C60 +0x3041 0x221C0 +0x3042 0x21D0F +0x3043 0x21D11 +0x3044 0x21D13 +0x3045 0x21DC6 +0x3046 0x21DB3 +0x3047 0x21DC7 +0x3048 0x21DD2 +0x3049 0x21DB8 +0x304A 0x21DAC +0x304B 0x21DAE +0x304C 0x21DCF +0x304D 0x21DC5 +0x304E 0x2F87B +0x304F 0x21DCC +0x3050 0x21DAB +0x3051 0x21DC9 +0x3052 0x21DB9 +0x3053 0x21FFB +0x3054 0x21FF8 +0x3055 0x21FF7 +0x3056 0x21FF9 +0x3057 0x22020 +0x3058 0x2203B +0x3059 0x22039 +0x305A 0x2209E +0x305B 0x2209A +0x305C 0x220AA +0x305D 0x220AB +0x305E 0x220AF +0x305F 0x22096 +0x3060 0x220A9 +0x3061 0x220A6 +0x3062 0x22091 +0x3064 0x220AE +0x3065 0x2209F +0x3066 0x220AC +0x3067 0x220A0 +0x3068 0x22192 +0x3069 0x22191 +0x306A 0x221BF +0x306B 0x22217 +0x306C 0x2220A +0x306D 0x2220C +0x306E 0x2234A +0x306F 0x22346 +0x3070 0x22334 +0x3071 0x22345 +0x3072 0x22343 +0x3073 0x22344 +0x3074 0x2F893 +0x3075 0x22387 +0x3076 0x22386 +0x3077 0x2238A +0x3078 0x223DA +0x3079 0x223D8 +0x307B 0x20518 +0x307C 0x20134 +0x307D 0x223D6 +0x307E 0x223D4 +0x3121 0x22454 +0x3122 0x22459 +0x3123 0x2245A +0x3124 0x22457 +0x3126 0x224DD +0x3127 0x224E9 +0x3128 0x224E0 +0x3129 0x22605 +0x312A 0x22612 +0x312B 0x22613 +0x312C 0x22607 +0x312D 0x22616 +0x312E 0x22623 +0x312F 0x22602 +0x3130 0x2F8A1 +0x3131 0x2264A +0x3132 0x22636 +0x3133 0x22640 +0x3134 0x22656 +0x3135 0x22643 +0x3136 0x2F8A0 +0x3137 0x2264B +0x3138 0x22646 +0x3139 0x2263E +0x313A 0x22649 +0x313B 0x229A7 +0x313C 0x229B6 +0x313D 0x229A6 +0x313E 0x229A8 +0x313F 0x229AC +0x3140 0x229A9 +0x3141 0x229AB +0x3142 0x22A38 +0x3143 0x22A37 +0x3144 0x22A39 +0x3145 0x22A41 +0x3146 0x22A3E +0x3147 0x22AC0 +0x3148 0x22ABB +0x3149 0x22ABF +0x314A 0x22ABD +0x314B 0x22AFE +0x314C 0x22B1E +0x314D 0x22AEE +0x314E 0x22AFC +0x314F 0x2F8B7 +0x3150 0x22AF9 +0x3151 0x22B06 +0x3152 0x22AE4 +0x3153 0x22AE9 +0x3154 0x22AE5 +0x3155 0x22B03 +0x3156 0x22AFD +0x3157 0x22B49 +0x3158 0x22EBE +0x3159 0x22F0A +0x315A 0x25626 +0x315B 0x22F18 +0x315C 0x22F0D +0x315D 0x22F0F +0x315E 0x22F0E +0x315F 0x22F20 +0x3160 0x23071 +0x3161 0x23099 +0x3162 0x230E2 +0x3163 0x230DF +0x3164 0x230DE +0x3165 0x23178 +0x3166 0x23179 +0x3168 0x2317C +0x3169 0x2317D +0x316A 0x23184 +0x316B 0x2318B +0x316C 0x2318A +0x316D 0x2F8D2 +0x316E 0x23189 +0x316F 0x2332C +0x3170 0x23329 +0x3171 0x2336C +0x3173 0x23409 +0x3174 0x23408 +0x3175 0x2340C +0x3176 0x2340D +0x3177 0x23410 +0x3179 0x2389F +0x317A 0x23898 +0x317B 0x238A2 +0x317C 0x2389A +0x317D 0x239D5 +0x317E 0x239E2 +0x3221 0x239F0 +0x3222 0x239EA +0x3223 0x239EB +0x3224 0x239ED +0x3225 0x239E8 +0x3226 0x239E0 +0x3227 0x23A85 +0x3228 0x23A86 +0x3229 0x23AF0 +0x322A 0x21E46 +0x322B 0x23B45 +0x322C 0x23B38 +0x322D 0x23B3E +0x322E 0x23B42 +0x322F 0x23B40 +0x3230 0x23C47 +0x3231 0x23C5C +0x3232 0x23C5E +0x3233 0x23CB4 +0x3234 0x23CC2 +0x3235 0x23D14 +0x3236 0x23CE5 +0x3237 0x23D15 +0x3238 0x23D11 +0x3239 0x2F8FF +0x323A 0x23CEE +0x323B 0x23CE7 +0x323C 0x23CF5 +0x323D 0x23CF4 +0x323E 0x23CE8 +0x323F 0x23D01 +0x3240 0x23CEF +0x3241 0x23CF1 +0x3242 0x2F900 +0x3243 0x241DB +0x3244 0x241BF +0x3245 0x241DA +0x3246 0x241C7 +0x3247 0x241DD +0x3248 0x2F91A +0x3249 0x241EB +0x324A 0x241E1 +0x324B 0x241C1 +0x324C 0x241BD +0x324D 0x24507 +0x324E 0x244FD +0x324F 0x24501 +0x3250 0x2450A +0x3251 0x24503 +0x3252 0x24572 +0x3253 0x24574 +0x3254 0x24575 +0x3255 0x245B2 +0x3256 0x245B1 +0x3257 0x245B4 +0x3258 0x2464C +0x3259 0x24642 +0x325A 0x24640 +0x325B 0x24649 +0x325C 0x2463C +0x325D 0x2464D +0x325E 0x2464A +0x325F 0x2463B +0x3260 0x24761 +0x3261 0x24774 +0x3262 0x2F926 +0x3263 0x2477F +0x3264 0x2477A +0x3265 0x24788 +0x3266 0x2477C +0x3268 0x24770 +0x3269 0x2490F +0x326A 0x24928 +0x326B 0x24913 +0x326C 0x2492A +0x326D 0x24AED +0x326E 0x24AEF +0x326F 0x24B2E +0x3270 0x24BC1 +0x3271 0x24BDD +0x3272 0x20B47 +0x3273 0x24C2D +0x3274 0x24C2B +0x3275 0x24C35 +0x3276 0x24C2F +0x3277 0x24C31 +0x3278 0x24C34 +0x3279 0x2F935 +0x327A 0x24C30 +0x327B 0x24D3A +0x327C 0x24D39 +0x327D 0x24D37 +0x327E 0x24D4B +0x3321 0x24D54 +0x3322 0x24D4D +0x3323 0x24D51 +0x3324 0x24D47 +0x3325 0x24F27 +0x3326 0x24F50 +0x3327 0x24F4D +0x3328 0x24F4E +0x3329 0x24F54 +0x332A 0x24FD2 +0x332B 0x24FCE +0x332C 0x2504B +0x332D 0x25049 +0x332E 0x25105 +0x332F 0x2510F +0x3330 0x25119 +0x3331 0x2F943 +0x3332 0x25106 +0x3333 0x2510C +0x3334 0x25129 +0x3335 0x25104 +0x3336 0x25108 +0x3337 0x25125 +0x3339 0x25103 +0x333A 0x25127 +0x333B 0x25110 +0x333C 0x2510A +0x333D 0x2F942 +0x333E 0x26B5D +0x333F 0x253AA +0x3340 0x253AB +0x3341 0x253A9 +0x3342 0x25441 +0x3343 0x2543A +0x3344 0x2543C +0x3345 0x2542B +0x3346 0x25449 +0x3347 0x25615 +0x3349 0x25616 +0x334A 0x2F953 +0x334B 0x25631 +0x334C 0x23C4A +0x334D 0x2573C +0x334E 0x2577C +0x334F 0x2576D +0x3350 0x2576A +0x3351 0x25763 +0x3352 0x2576B +0x3353 0x2577B +0x3354 0x25764 +0x3355 0x2577A +0x3356 0x25769 +0x3357 0x2576F +0x3358 0x25937 +0x3359 0x25935 +0x335A 0x2593C +0x335B 0x25936 +0x335C 0x2593D +0x335D 0x2593E +0x335E 0x25AE1 +0x335F 0x25AE0 +0x3360 0x25E2D +0x3361 0x25E2B +0x3362 0x25F8D +0x3363 0x25F92 +0x3365 0x25F8E +0x3366 0x2F96B +0x3367 0x25F91 +0x3368 0x25F96 +0x3369 0x2627B +0x336A 0x26278 +0x336B 0x26281 +0x336C 0x26296 +0x336D 0x262A3 +0x336E 0x26295 +0x336F 0x26297 +0x3370 0x26354 +0x3371 0x26352 +0x3372 0x263F5 +0x3373 0x26400 +0x3374 0x263FB +0x3375 0x263F4 +0x3376 0x263F6 +0x3377 0x264E8 +0x3378 0x264EA +0x3379 0x2663E +0x337A 0x2663D +0x337B 0x2663B +0x337C 0x26680 +0x337E 0x26688 +0x3421 0x26681 +0x3422 0x26682 +0x3423 0x266CE +0x3424 0x26683 +0x3425 0x26677 +0x3426 0x26679 +0x3427 0x26673 +0x3428 0x2666D +0x3429 0x26670 +0x342A 0x2668D +0x342B 0x26675 +0x342C 0x2668C +0x342D 0x2666A +0x342E 0x26691 +0x342F 0x26689 +0x3430 0x2668E +0x3431 0x212DC +0x3432 0x268FF +0x3433 0x26959 +0x3434 0x269C7 +0x3435 0x26A12 +0x3436 0x26A14 +0x3437 0x26A13 +0x3438 0x26ACB +0x3439 0x26B42 +0x343B 0x26B3D +0x343D 0x26B40 +0x343E 0x26B44 +0x343F 0x26B62 +0x3440 0x26B43 +0x3441 0x26B3F +0x3442 0x26B45 +0x3443 0x26B3C +0x3444 0x2F997 +0x3445 0x26B46 +0x3446 0x26B47 +0x3447 0x2F9B3 +0x3448 0x2719E +0x3449 0x2719D +0x344A 0x2722C +0x344B 0x27229 +0x344C 0x2722F +0x344D 0x2722E +0x344E 0x27230 +0x344F 0x275E1 +0x3450 0x275E2 +0x3451 0x2760E +0x3452 0x27619 +0x3453 0x27612 +0x3454 0x278B4 +0x3455 0x27BDA +0x3456 0x27D26 +0x3457 0x27E59 +0x3458 0x27E5A +0x3459 0x27E88 +0x345A 0x27FC0 +0x345B 0x27FBA +0x345C 0x282A0 +0x345D 0x2F9DD +0x345E 0x282A2 +0x345F 0x28486 +0x3461 0x2849D +0x3462 0x28488 +0x3463 0x2848F +0x3464 0x2848E +0x3465 0x2849B +0x3466 0x286C1 +0x3467 0x286C3 +0x3468 0x286C4 +0x3469 0x28696 +0x346A 0x286C7 +0x346B 0x286C6 +0x346C 0x286BF +0x346E 0x2890F +0x346F 0x28E55 +0x3470 0x28E42 +0x3471 0x28E46 +0x3472 0x28E4B +0x3473 0x28E43 +0x3474 0x28E53 +0x3475 0x28E48 +0x3476 0x28E49 +0x3477 0x28E4A +0x3478 0x28E4E +0x3479 0x24BDE +0x347A 0x20691 +0x347B 0x2944B +0x347C 0x29680 +0x347D 0x29681 +0x347E 0x29683 +0x3521 0x2028A +0x3522 0x29682 +0x3523 0x22342 +0x3524 0x20922 +0x3525 0x20070 +0x3526 0x20071 +0x3527 0x200BC +0x3528 0x21D18 +0x3529 0x200BE +0x352A 0x200BA +0x352B 0x200F8 +0x352C 0x20137 +0x352D 0x20135 +0x352E 0x20AFC +0x352F 0x20156 +0x3530 0x20159 +0x3531 0x2015E +0x3532 0x2026D +0x3533 0x20291 +0x3534 0x20292 +0x3535 0x20268 +0x3536 0x20266 +0x3537 0x20273 +0x3539 0x20296 +0x353A 0x2028B +0x353B 0x2028C +0x353C 0x20496 +0x353D 0x204EE +0x353E 0x2051C +0x353F 0x2051A +0x3540 0x20519 +0x3541 0x2051B +0x3542 0x2055D +0x3543 0x2055E +0x3544 0x2F818 +0x3545 0x205DC +0x3546 0x205E2 +0x3547 0x20652 +0x3548 0x20692 +0x3549 0x20730 +0x354A 0x20752 +0x354B 0x20742 +0x354C 0x20741 +0x354D 0x20745 +0x354E 0x20737 +0x354F 0x20740 +0x3550 0x2073F +0x3551 0x2073D +0x3552 0x20738 +0x3553 0x2073A +0x3554 0x20749 +0x3555 0x2086B +0x3556 0x20878 +0x3557 0x20879 +0x3558 0x2F826 +0x3559 0x2086C +0x355A 0x208E9 +0x355B 0x208E6 +0x355C 0x208E5 +0x355D 0x208EA +0x355E 0x208E7 +0x355F 0x208E8 +0x3560 0x2091F +0x3561 0x2094B +0x3562 0x2094A +0x3563 0x20953 +0x3564 0x20976 +0x3565 0x209A3 +0x3566 0x209A4 +0x3567 0x209F6 +0x3568 0x209F3 +0x3569 0x209F9 +0x356A 0x209F7 +0x356B 0x209FC +0x356C 0x20A1D +0x356D 0x20A6D +0x356E 0x20A71 +0x356F 0x20A6C +0x3570 0x20A6E +0x3571 0x20A70 +0x3572 0x20A6F +0x3573 0x20A67 +0x3574 0x20A68 +0x3575 0x20AFA +0x3576 0x20AF9 +0x3577 0x20B4E +0x3579 0x20B4D +0x357A 0x20B4F +0x357B 0x20B4A +0x357C 0x20B4C +0x357E 0x2F842 +0x3621 0x20CEE +0x3622 0x20CB2 +0x3623 0x20CC0 +0x3624 0x20CC1 +0x3625 0x20CF4 +0x3626 0x20CC8 +0x3627 0x20CC5 +0x3628 0x20CC6 +0x3629 0x20CAD +0x362A 0x211E2 +0x362B 0x211EA +0x362C 0x211E3 +0x362D 0x211E1 +0x362E 0x212F7 +0x362F 0x21301 +0x3630 0x21312 +0x3631 0x212F6 +0x3632 0x212F1 +0x3633 0x2131F +0x3634 0x212EE +0x3635 0x2F852 +0x3636 0x212F3 +0x3637 0x21315 +0x3638 0x21316 +0x3639 0x21317 +0x363A 0x212F8 +0x363B 0x21319 +0x363C 0x212F2 +0x363D 0x212F4 +0x363E 0x212F5 +0x363F 0x21313 +0x3640 0x21306 +0x3641 0x21526 +0x3642 0x21524 +0x3643 0x2155A +0x3644 0x22EC8 +0x3645 0x21597 +0x3646 0x21595 +0x3647 0x2159A +0x3648 0x2161F +0x3649 0x20AFB +0x364A 0x21629 +0x364B 0x21620 +0x364C 0x2F862 +0x364D 0x2F863 +0x364E 0x2174C +0x364F 0x21730 +0x3650 0x21738 +0x3651 0x2173D +0x3652 0x21751 +0x3653 0x2174F +0x3654 0x2174A +0x3655 0x21734 +0x3656 0x21736 +0x3658 0x2196A +0x3659 0x21968 +0x365A 0x21A1C +0x365B 0x21A0E +0x365C 0x21A1E +0x365E 0x21A09 +0x365F 0x21A08 +0x3660 0x21A13 +0x3661 0x21A01 +0x3662 0x21A0F +0x3663 0x21A14 +0x3664 0x21A06 +0x3665 0x21A07 +0x3667 0x2F873 +0x3669 0x21B79 +0x366A 0x21BEA +0x366B 0x21BED +0x366C 0x21BE9 +0x366D 0x21BEE +0x366E 0x21C68 +0x366F 0x21C64 +0x3670 0x21C67 +0x3671 0x21C72 +0x3672 0x21C62 +0x3673 0x21C74 +0x3674 0x21C79 +0x3675 0x21D19 +0x3676 0x21D17 +0x3677 0x21D15 +0x3678 0x21D16 +0x3679 0x21DE6 +0x367A 0x262A4 +0x367B 0x21DEE +0x367D 0x21DDF +0x367E 0x21DE4 +0x3721 0x21DDA +0x3722 0x21DEA +0x3723 0x21DED +0x3724 0x21DE3 +0x3725 0x21DE9 +0x3726 0x21FFD +0x3727 0x20657 +0x3728 0x22021 +0x3729 0x220C6 +0x372A 0x220B8 +0x372B 0x220CB +0x372C 0x2F885 +0x372D 0x220BD +0x372E 0x220B5 +0x372F 0x220BB +0x3730 0x220BF +0x3731 0x220BE +0x3732 0x220B2 +0x3733 0x220C1 +0x3734 0x220C2 +0x3735 0x22199 +0x3736 0x221C6 +0x3737 0x2222C +0x3738 0x2222D +0x3739 0x22225 +0x373A 0x2221E +0x373B 0x2221F +0x373C 0x22223 +0x373D 0x22350 +0x373E 0x2234E +0x373F 0x2234D +0x3740 0x22352 +0x3741 0x223E9 +0x3742 0x223EC +0x3743 0x223E8 +0x3744 0x22458 +0x3745 0x2245C +0x3746 0x2245B +0x3747 0x2248F +0x3748 0x23972 +0x3749 0x224F6 +0x374A 0x22500 +0x374B 0x224FC +0x374C 0x224F8 +0x374D 0x224EA +0x374E 0x224FE +0x374F 0x224F7 +0x3750 0x224FD +0x3751 0x22670 +0x3752 0x22662 +0x3753 0x22644 +0x3755 0x2264D +0x3756 0x2264C +0x3757 0x2263F +0x3758 0x22666 +0x3759 0x22635 +0x375B 0x22634 +0x375C 0x2268D +0x375D 0x22684 +0x375F 0x22686 +0x3760 0x22689 +0x3761 0x22687 +0x3762 0x22683 +0x3763 0x22675 +0x3764 0x22679 +0x3765 0x226AF +0x3766 0x226B0 +0x3767 0x229B7 +0x3768 0x229BB +0x3769 0x229B9 +0x376A 0x22A46 +0x376B 0x22A47 +0x376C 0x22A45 +0x376D 0x22AEA +0x376E 0x22AF6 +0x376F 0x22B68 +0x3770 0x22B39 +0x3771 0x2F8B9 +0x3772 0x22B3D +0x3773 0x22B3B +0x3774 0x22B4D +0x3775 0x22B30 +0x3776 0x22B4A +0x3777 0x22B3E +0x3778 0x22B40 +0x3779 0x22B4C +0x377A 0x22B47 +0x377B 0x22B38 +0x377C 0x22B52 +0x377D 0x22B3A +0x377E 0x22B53 +0x3821 0x22EC4 +0x3822 0x22EC1 +0x3823 0x22F1C +0x3824 0x22F1D +0x3825 0x22F2A +0x3826 0x22F1E +0x3827 0x22F2F +0x3828 0x22F22 +0x3829 0x22F2E +0x382A 0x22F25 +0x382D 0x2304A +0x382E 0x2304B +0x382F 0x23076 +0x3831 0x230E8 +0x3832 0x230EF +0x3833 0x230E9 +0x3835 0x230EA +0x3836 0x2F8CC +0x3838 0x2319B +0x3839 0x2319E +0x383A 0x23193 +0x383B 0x231A7 +0x383C 0x2319C +0x383D 0x231A0 +0x383E 0x2319A +0x383F 0x231AB +0x3840 0x231BE +0x3841 0x231A9 +0x3842 0x2332D +0x3843 0x2336E +0x3844 0x23444 +0x3845 0x2343D +0x3846 0x2343A +0x3847 0x23468 +0x3848 0x2343C +0x3849 0x2346A +0x384A 0x2F8E0 +0x384B 0x23438 +0x384C 0x23465 +0x384D 0x23439 +0x384E 0x2346D +0x384F 0x23436 +0x3850 0x2F8E3 +0x3851 0x2343E +0x3852 0x2347E +0x3853 0x23437 +0x3854 0x23899 +0x3855 0x238A9 +0x3856 0x238AD +0x3857 0x238A7 +0x3858 0x238A8 +0x3859 0x23966 +0x385A 0x23969 +0x385B 0x2396D +0x385C 0x23967 +0x385D 0x2396B +0x385E 0x2396A +0x385F 0x239EE +0x3860 0x23A01 +0x3861 0x23A03 +0x3862 0x239F4 +0x3863 0x239FB +0x3865 0x239F6 +0x3866 0x239FC +0x3867 0x23AF4 +0x3868 0x23B08 +0x3869 0x23B0A +0x386A 0x23B09 +0x386B 0x23B6D +0x386C 0x23B62 +0x386D 0x23B41 +0x386E 0x23B5E +0x386F 0x23B5C +0x3870 0x23CF3 +0x3871 0x23D26 +0x3873 0x23D39 +0x3874 0x2F904 +0x3875 0x23D6C +0x3876 0x23D2B +0x3877 0x23D2E +0x3878 0x23D3B +0x3879 0x23D5E +0x387A 0x23DFB +0x387B 0x23D27 +0x387C 0x23D24 +0x387D 0x23D69 +0x387E 0x23D30 +0x3921 0x2F905 +0x3922 0x23D62 +0x3923 0x23D38 +0x3924 0x23D35 +0x3925 0x23D2A +0x3926 0x23D2C +0x3927 0x23D68 +0x3928 0x23D31 +0x3929 0x23D2F +0x392A 0x23D2D +0x392B 0x23D3A +0x392C 0x23D36 +0x392D 0x2F903 +0x392E 0x23D21 +0x392F 0x23D3C +0x3930 0x23D20 +0x3931 0x23D64 +0x3932 0x23D3E +0x3934 0x241F7 +0x3935 0x24212 +0x3936 0x241F1 +0x3937 0x241F5 +0x3938 0x24222 +0x3939 0x241F2 +0x393A 0x241DF +0x393B 0x24215 +0x393C 0x24216 +0x393D 0x2457A +0x393E 0x24576 +0x393F 0x245BE +0x3941 0x245BD +0x3942 0x24609 +0x3943 0x24608 +0x3944 0x24657 +0x3945 0x247A3 +0x3946 0x247BF +0x3947 0x247B8 +0x3948 0x247AF +0x3949 0x2479C +0x394A 0x247A5 +0x394B 0x24772 +0x394C 0x24775 +0x394D 0x2479D +0x394E 0x24799 +0x394F 0x247B9 +0x3950 0x2494E +0x3951 0x24939 +0x3952 0x2493B +0x3953 0x24935 +0x3954 0x2493C +0x3955 0x24955 +0x3956 0x24AF0 +0x3957 0x24AF3 +0x3958 0x24AF4 +0x3959 0x24B3B +0x395A 0x24B3C +0x395B 0x24B3A +0x395C 0x24B36 +0x395D 0x24C07 +0x395E 0x20CEB +0x395F 0x24C55 +0x3960 0x24C50 +0x3961 0x24C4F +0x3962 0x24C52 +0x3963 0x24C56 +0x3964 0x200BD +0x3965 0x24C32 +0x3966 0x24D63 +0x3967 0x24D6B +0x3968 0x24D66 +0x3969 0x24D57 +0x396A 0x24D5D +0x396C 0x24D6D +0x396D 0x24D61 +0x396E 0x24D69 +0x396F 0x24D5A +0x3970 0x24D5C +0x3971 0x24D62 +0x3972 0x24F2A +0x3973 0x24F29 +0x3974 0x24F58 +0x3975 0x24F5A +0x3976 0x24FD7 +0x3977 0x24FDB +0x3978 0x24FDC +0x3979 0x24FDD +0x397A 0x24FD8 +0x397B 0x25054 +0x397C 0x2505B +0x397D 0x2505C +0x397E 0x25053 +0x3A21 0x2504F +0x3A22 0x25056 +0x3A23 0x25050 +0x3A24 0x2505A +0x3A25 0x2506B +0x3A26 0x25136 +0x3A27 0x25153 +0x3A28 0x2513A +0x3A29 0x2513C +0x3A2A 0x2513E +0x3A2B 0x25149 +0x3A2C 0x25140 +0x3A2D 0x2F946 +0x3A2E 0x2F947 +0x3A2F 0x25364 +0x3A30 0x25365 +0x3A31 0x253B5 +0x3A32 0x253B6 +0x3A33 0x253B2 +0x3A34 0x25448 +0x3A35 0x2544A +0x3A36 0x25472 +0x3A37 0x25469 +0x3A38 0x2545A +0x3A39 0x2544C +0x3A3A 0x2562C +0x3A3B 0x25630 +0x3A3C 0x2564B +0x3A3D 0x25649 +0x3A3E 0x25642 +0x3A3F 0x25644 +0x3A40 0x2564A +0x3A41 0x2564F +0x3A42 0x25792 +0x3A43 0x2F957 +0x3A44 0x25797 +0x3A45 0x25780 +0x3A46 0x25782 +0x3A47 0x25786 +0x3A48 0x25953 +0x3A49 0x2595E +0x3A4A 0x25952 +0x3A4B 0x2595B +0x3A4C 0x2594E +0x3A4D 0x25A6D +0x3A4E 0x25A6E +0x3A4F 0x25AFA +0x3A50 0x25AF6 +0x3A51 0x25AFB +0x3A52 0x25E33 +0x3A53 0x25E3D +0x3A54 0x25E37 +0x3A55 0x25E3E +0x3A56 0x25E35 +0x3A57 0x25F9A +0x3A58 0x25FAB +0x3A59 0x25FA6 +0x3A5A 0x25FB0 +0x3A5B 0x25F99 +0x3A5C 0x25FA0 +0x3A5D 0x25F9E +0x3A5E 0x25FA8 +0x3A5F 0x25FA1 +0x3A60 0x25FAA +0x3A61 0x25FAD +0x3A62 0x25FBB +0x3A63 0x25F9C +0x3A64 0x25FA5 +0x3A65 0x200B3 +0x3A66 0x26227 +0x3A67 0x2628D +0x3A68 0x2628E +0x3A69 0x2628F +0x3A6A 0x26292 +0x3A6C 0x26291 +0x3A6D 0x262AD +0x3A6E 0x26357 +0x3A6F 0x26358 +0x3A70 0x2635E +0x3A71 0x2635D +0x3A72 0x2635C +0x3A73 0x2635B +0x3A75 0x2640A +0x3A76 0x26403 +0x3A77 0x2640E +0x3A78 0x264B8 +0x3A79 0x2654D +0x3A7A 0x2653F +0x3A7B 0x26547 +0x3A7C 0x2654B +0x3A7D 0x2654A +0x3A7E 0x2653D +0x3B22 0x26541 +0x3B23 0x2654C +0x3B25 0x26662 +0x3B26 0x26669 +0x3B27 0x26661 +0x3B29 0x266AA +0x3B2A 0x266A6 +0x3B2B 0x266AC +0x3B2C 0x266BD +0x3B2D 0x266BB +0x3B2E 0x266A4 +0x3B2F 0x266BA +0x3B30 0x2669A +0x3B32 0x266A1 +0x3B33 0x266C1 +0x3B34 0x268E0 +0x3B35 0x2690A +0x3B36 0x26903 +0x3B37 0x26906 +0x3B38 0x26939 +0x3B39 0x2693A +0x3B3A 0x26936 +0x3B3B 0x2695B +0x3B3C 0x2695F +0x3B3D 0x2695E +0x3B3E 0x26967 +0x3B3F 0x26961 +0x3B40 0x26962 +0x3B41 0x2695D +0x3B42 0x269CA +0x3B43 0x269CC +0x3B44 0x269CE +0x3B45 0x26A18 +0x3B46 0x26A1D +0x3B47 0x26A1F +0x3B48 0x26A20 +0x3B49 0x26A17 +0x3B4A 0x26A15 +0x3B4B 0x26B1F +0x3B4C 0x26B27 +0x3B4D 0x26B26 +0x3B4E 0x21E10 +0x3B4F 0x26B8B +0x3B50 0x26BAE +0x3B51 0x26B8A +0x3B52 0x2F999 +0x3B53 0x26B92 +0x3B54 0x26B89 +0x3B55 0x26B87 +0x3B57 0x26B8F +0x3B58 0x26B84 +0x3B59 0x26B83 +0x3B5A 0x26B8C +0x3B5B 0x26B93 +0x3B5C 0x26B8D +0x3B5D 0x26B98 +0x3B5E 0x26B7D +0x3B5F 0x26B7E +0x3B60 0x26BD2 +0x3B61 0x26B80 +0x3B62 0x26B99 +0x3B63 0x271AC +0x3B64 0x27250 +0x3B65 0x27255 +0x3B66 0x27242 +0x3B67 0x2723F +0x3B68 0x2723C +0x3B6A 0x2724C +0x3B6B 0x27249 +0x3B6C 0x27257 +0x3B6D 0x27258 +0x3B6E 0x2724F +0x3B6F 0x2725C +0x3B70 0x27247 +0x3B71 0x2F9B7 +0x3B72 0x275AB +0x3B74 0x275AF +0x3B75 0x275AD +0x3B76 0x275E8 +0x3B77 0x275E7 +0x3B78 0x27630 +0x3B79 0x27626 +0x3B7A 0x2762F +0x3B7B 0x27628 +0x3B7C 0x2762B +0x3B7D 0x2761D +0x3B7E 0x2762D +0x3C21 0x27620 +0x3C22 0x2762A +0x3C23 0x2762C +0x3C24 0x27635 +0x3C25 0x27621 +0x3C26 0x27623 +0x3C27 0x27624 +0x3C28 0x27636 +0x3C29 0x27637 +0x3C2A 0x277E9 +0x3C2B 0x278BA +0x3C2C 0x278B8 +0x3C2D 0x2F9CC +0x3C2E 0x2796D +0x3C2F 0x2796A +0x3C30 0x27968 +0x3C31 0x27969 +0x3C32 0x2796B +0x3C33 0x27961 +0x3C34 0x27BDC +0x3C35 0x27BDB +0x3C36 0x27C2D +0x3C37 0x27C2C +0x3C38 0x27CA2 +0x3C39 0x27D2B +0x3C3A 0x27D32 +0x3C3B 0x2F9D7 +0x3C3C 0x27E94 +0x3C3D 0x27E92 +0x3C3E 0x27E90 +0x3C3F 0x27FC9 +0x3C40 0x27FC4 +0x3C41 0x27FC1 +0x3C42 0x27FC3 +0x3C43 0x27FCD +0x3C44 0x28214 +0x3C45 0x282A7 +0x3C46 0x282AF +0x3C47 0x282AA +0x3C48 0x2840D +0x3C49 0x28454 +0x3C4A 0x2845B +0x3C4B 0x28461 +0x3C4C 0x284AE +0x3C4D 0x284B3 +0x3C4E 0x284C0 +0x3C4F 0x284C4 +0x3C50 0x284BF +0x3C51 0x284CB +0x3C52 0x284AD +0x3C53 0x284A7 +0x3C54 0x284A4 +0x3C55 0x284BD +0x3C56 0x284AF +0x3C57 0x284B2 +0x3C58 0x284A5 +0x3C59 0x286E7 +0x3C5A 0x286E0 +0x3C5B 0x286CE +0x3C5C 0x286DE +0x3C5D 0x286D5 +0x3C5E 0x286DF +0x3C5F 0x286D9 +0x3C60 0x287F2 +0x3C61 0x28923 +0x3C62 0x28940 +0x3C64 0x2893E +0x3C66 0x28CCF +0x3C67 0x20B54 +0x3C68 0x28E5B +0x3C69 0x28E58 +0x3C6A 0x28E62 +0x3C6B 0x28E5F +0x3C6C 0x28E67 +0x3C6D 0x28E63 +0x3C6E 0x28E5E +0x3C6F 0x28E60 +0x3C70 0x28F85 +0x3C71 0x28F86 +0x3C72 0x28F87 +0x3C73 0x291E8 +0x3C74 0x291E6 +0x3C75 0x29671 +0x3C76 0x29685 +0x3C77 0x2FA02 +0x3C78 0x29686 +0x3C79 0x29810 +0x3C7A 0x209F8 +0x3C7B 0x200BF +0x3C7C 0x20B61 +0x3C7D 0x200FE +0x3C7E 0x200FC +0x3D21 0x20139 +0x3D22 0x20161 +0x3D23 0x20160 +0x3D24 0x202E2 +0x3D25 0x202EA +0x3D26 0x202E3 +0x3D27 0x202B4 +0x3D28 0x202AE +0x3D29 0x202BE +0x3D2A 0x202B8 +0x3D2B 0x202A8 +0x3D2C 0x202AA +0x3D2D 0x202A9 +0x3D2E 0x202B3 +0x3D2F 0x202D5 +0x3D30 0x202AD +0x3D31 0x202B9 +0x3D32 0x202BB +0x3D33 0x202B1 +0x3D34 0x202C2 +0x3D35 0x2F808 +0x3D36 0x202EB +0x3D37 0x202BA +0x3D38 0x202D2 +0x3D39 0x202D4 +0x3D3A 0x204F1 +0x3D3B 0x2051D +0x3D3C 0x2F812 +0x3D3D 0x20562 +0x3D3E 0x2058C +0x3D3F 0x205E6 +0x3D40 0x205E7 +0x3D41 0x2065A +0x3D42 0x20658 +0x3D43 0x20659 +0x3D44 0x20696 +0x3D45 0x20697 +0x3D46 0x20761 +0x3D47 0x20767 +0x3D48 0x20771 +0x3D49 0x20765 +0x3D4A 0x2077D +0x3D4B 0x2077E +0x3D4C 0x2087D +0x3D4D 0x20884 +0x3D4E 0x2087C +0x3D4F 0x2087E +0x3D50 0x2087F +0x3D51 0x20880 +0x3D52 0x208EF +0x3D53 0x208F4 +0x3D54 0x2091E +0x3D55 0x2094E +0x3D56 0x209FB +0x3D57 0x209FA +0x3D58 0x209FD +0x3D59 0x2F831 +0x3D5A 0x2F832 +0x3D5B 0x20A79 +0x3D5C 0x20A7C +0x3D5D 0x20A7D +0x3D5E 0x20A84 +0x3D5F 0x20A7B +0x3D60 0x20A78 +0x3D62 0x20B5E +0x3D63 0x20B5A +0x3D64 0x20B5C +0x3D65 0x20B59 +0x3D66 0x20B55 +0x3D67 0x20B63 +0x3D68 0x20B56 +0x3D69 0x20B5F +0x3D6A 0x20B60 +0x3D6B 0x20B5B +0x3D6C 0x20D4A +0x3D6D 0x20D65 +0x3D6E 0x20DB3 +0x3D6F 0x20D2C +0x3D70 0x20D77 +0x3D71 0x20D3D +0x3D72 0x20D52 +0x3D73 0x20D61 +0x3D74 0x20D2A +0x3D75 0x20D3E +0x3D76 0x20D34 +0x3D77 0x20D29 +0x3D78 0x20DB2 +0x3D79 0x20DAD +0x3D7A 0x20D40 +0x3D7B 0x20D53 +0x3D7C 0x2F844 +0x3D7D 0x20D3F +0x3D7E 0x20D41 +0x3E21 0x20D72 +0x3E22 0x211F6 +0x3E23 0x211F5 +0x3E24 0x211F4 +0x3E25 0x211F2 +0x3E26 0x211F9 +0x3E27 0x21327 +0x3E28 0x21354 +0x3E29 0x21355 +0x3E2A 0x2132E +0x3E2B 0x2F854 +0x3E2C 0x2F853 +0x3E2D 0x2132C +0x3E2E 0x21338 +0x3E2F 0x21339 +0x3E30 0x21331 +0x3E31 0x2134F +0x3E32 0x21373 +0x3E33 0x21330 +0x3E34 0x2132B +0x3E35 0x21351 +0x3E36 0x2152C +0x3E37 0x2155B +0x3E38 0x2155C +0x3E39 0x21568 +0x3E3A 0x2156C +0x3E3B 0x2156B +0x3E3C 0x21569 +0x3E3D 0x2159F +0x3E3E 0x21638 +0x3E3F 0x2163C +0x3E40 0x2163A +0x3E41 0x21635 +0x3E43 0x21639 +0x3E44 0x21636 +0x3E45 0x2163B +0x3E46 0x21760 +0x3E47 0x21761 +0x3E48 0x21763 +0x3E49 0x21764 +0x3E4A 0x21794 +0x3E4B 0x21793 +0x3E4C 0x2175E +0x3E4D 0x21768 +0x3E4E 0x2176A +0x3E4F 0x21765 +0x3E50 0x2F866 +0x3E51 0x21790 +0x3E52 0x2175F +0x3E53 0x21772 +0x3E54 0x2F865 +0x3E55 0x21A3C +0x3E56 0x21A27 +0x3E57 0x21A24 +0x3E58 0x21A26 +0x3E59 0x21A25 +0x3E5B 0x21A28 +0x3E5C 0x21A36 +0x3E5D 0x21B31 +0x3E5E 0x21B30 +0x3E5F 0x21B34 +0x3E60 0x21B81 +0x3E61 0x21B7D +0x3E62 0x21B82 +0x3E63 0x21B80 +0x3E65 0x202D3 +0x3E66 0x21BF2 +0x3E67 0x21C66 +0x3E68 0x21C8C +0x3E69 0x21C7B +0x3E6A 0x21C83 +0x3E6C 0x21C8E +0x3E6D 0x21C7A +0x3E6E 0x21C92 +0x3E6F 0x21C91 +0x3E70 0x21C82 +0x3E71 0x21D1B +0x3E72 0x21D1C +0x3E73 0x21E27 +0x3E74 0x21E21 +0x3E77 0x21E43 +0x3E79 0x21E18 +0x3E7A 0x21E7B +0x3E7B 0x21E1A +0x3E7C 0x21E4B +0x3E7D 0x21E4A +0x3E7E 0x21E4D +0x3F21 0x21E4F +0x3F22 0x21E19 +0x3F23 0x21E35 +0x3F24 0x21E13 +0x3F25 0x21E52 +0x3F26 0x21E14 +0x3F27 0x21E1E +0x3F28 0x21E2C +0x3F29 0x21E20 +0x3F2A 0x21E22 +0x3F2B 0x21E12 +0x3F2C 0x21E1F +0x3F2D 0x22000 +0x3F2E 0x22023 +0x3F2F 0x22040 +0x3F30 0x22043 +0x3F31 0x220E4 +0x3F32 0x220DB +0x3F33 0x220EA +0x3F34 0x220DD +0x3F35 0x220CC +0x3F36 0x220D9 +0x3F37 0x220E8 +0x3F38 0x220F6 +0x3F39 0x220E3 +0x3F3A 0x220D3 +0x3F3B 0x220DA +0x3F3C 0x220D6 +0x3F3D 0x220E7 +0x3F3E 0x2223A +0x3F3F 0x2223F +0x3F40 0x22240 +0x3F41 0x22248 +0x3F42 0x22259 +0x3F43 0x22237 +0x3F44 0x22244 +0x3F45 0x2F88C +0x3F46 0x2F88B +0x3F47 0x22255 +0x3F48 0x22239 +0x3F49 0x22354 +0x3F4A 0x22355 +0x3F4B 0x22356 +0x3F4C 0x22357 +0x3F4D 0x22358 +0x3F4E 0x22359 +0x3F4F 0x2238D +0x3F50 0x223F2 +0x3F51 0x223F8 +0x3F52 0x223F5 +0x3F53 0x223F6 +0x3F54 0x223FC +0x3F55 0x223FE +0x3F56 0x223F1 +0x3F57 0x223FD +0x3F58 0x2245E +0x3F59 0x22496 +0x3F5A 0x22497 +0x3F5B 0x2249C +0x3F5C 0x2249B +0x3F5D 0x22495 +0x3F5E 0x2F89A +0x3F5F 0x2251A +0x3F60 0x22509 +0x3F61 0x22504 +0x3F62 0x2250E +0x3F63 0x2251C +0x3F64 0x22518 +0x3F65 0x2250D +0x3F66 0x22510 +0x3F67 0x2250C +0x3F68 0x22503 +0x3F69 0x2267B +0x3F6A 0x226A6 +0x3F6B 0x22677 +0x3F6C 0x22688 +0x3F6D 0x22674 +0x3F6E 0x226DA +0x3F6F 0x22676 +0x3F70 0x22678 +0x3F71 0x2268A +0x3F72 0x2268F +0x3F73 0x2267D +0x3F74 0x22690 +0x3F75 0x226ED +0x3F76 0x226D9 +0x3F77 0x226D0 +0x3F78 0x2271A +0x3F79 0x226D7 +0x3F7A 0x226E2 +0x3F7B 0x226E1 +0x3F7C 0x226C5 +0x3F7D 0x226E0 +0x3F7E 0x226CA +0x4021 0x22725 +0x4022 0x226CC +0x4023 0x2F8B3 +0x4024 0x229C6 +0x4025 0x229C1 +0x4026 0x22A4D +0x4027 0x22B4B +0x4028 0x22B64 +0x4029 0x22B95 +0x402A 0x22B99 +0x402B 0x2F8BC +0x402C 0x22B94 +0x402D 0x22BA2 +0x402E 0x22BAE +0x402F 0x22B9E +0x4030 0x22BA7 +0x4031 0x22B86 +0x4033 0x22BA4 +0x4034 0x22B91 +0x4035 0x22B93 +0x4036 0x2F8BB +0x4037 0x22B88 +0x4038 0x22ECD +0x4039 0x22ECA +0x403A 0x22F3F +0x403B 0x22F40 +0x403C 0x22F46 +0x403D 0x22F41 +0x403E 0x22F45 +0x403F 0x22F58 +0x4040 0x22F3B +0x4041 0x22F48 +0x4042 0x2304E +0x4043 0x23052 +0x4044 0x2304F +0x4045 0x2307B +0x4046 0x2307A +0x4047 0x230A0 +0x4048 0x2309F +0x4049 0x230FB +0x404A 0x230F7 +0x404B 0x231B8 +0x404C 0x231B9 +0x404D 0x231BB +0x404E 0x231B7 +0x4050 0x231BA +0x4052 0x231DA +0x4053 0x231B5 +0x4054 0x231BF +0x4055 0x231BC +0x4056 0x231C0 +0x4057 0x2F8D3 +0x4058 0x2F8D9 +0x4059 0x23375 +0x405A 0x23379 +0x405B 0x23376 +0x405C 0x23435 +0x405D 0x23440 +0x405E 0x234C0 +0x405F 0x23481 +0x4060 0x234AD +0x4061 0x234AF +0x4062 0x234AC +0x4063 0x2348F +0x4064 0x234A8 +0x4065 0x234AA +0x4066 0x234A9 +0x4067 0x23488 +0x4068 0x2347F +0x4069 0x23480 +0x406A 0x234BC +0x406B 0x238AE +0x406C 0x238BB +0x406D 0x238BD +0x406F 0x23978 +0x4070 0x23974 +0x4071 0x23A0C +0x4072 0x23A11 +0x4073 0x23A08 +0x4074 0x23A06 +0x4075 0x23A10 +0x4076 0x23A8F +0x4077 0x23A90 +0x4078 0x23A8D +0x4079 0x23A8E +0x407A 0x23A96 +0x407B 0x23A95 +0x407C 0x23B0B +0x407D 0x23B0C +0x407E 0x23B7C +0x4121 0x23B73 +0x4122 0x23B75 +0x4123 0x23B76 +0x4124 0x23B7D +0x4125 0x23B78 +0x4126 0x23B71 +0x4127 0x23C4B +0x4128 0x23C4E +0x4129 0x23D33 +0x412A 0x23D32 +0x412C 0x23D91 +0x412D 0x23DE7 +0x412E 0x23DE9 +0x412F 0x23DA2 +0x4130 0x23D94 +0x4131 0x23D87 +0x4132 0x23DA3 +0x4133 0x23DDD +0x4134 0x23D7B +0x4135 0x23D83 +0x4136 0x23D81 +0x4137 0x23DDF +0x4138 0x23D7C +0x4139 0x23DE4 +0x413A 0x23DE2 +0x413B 0x23D93 +0x413C 0x23D7D +0x413D 0x23DBF +0x413E 0x23D9B +0x413F 0x23D8E +0x4140 0x23D9F +0x4142 0x23D8C +0x4143 0x23D7F +0x4144 0x23D9C +0x4145 0x23D84 +0x4146 0x23D42 +0x4147 0x23DE6 +0x4148 0x24251 +0x4149 0x2424A +0x414A 0x24264 +0x414B 0x24225 +0x414C 0x2422F +0x414D 0x2422E +0x414E 0x2422B +0x414F 0x24228 +0x4150 0x24232 +0x4151 0x2422D +0x4152 0x24231 +0x4153 0x24239 +0x4154 0x2422C +0x4155 0x24261 +0x4156 0x24511 +0x4157 0x24510 +0x4158 0x24512 +0x4159 0x24553 +0x415A 0x24555 +0x415B 0x2457B +0x415C 0x24581 +0x415D 0x2457D +0x415E 0x2457C +0x415F 0x245C2 +0x4160 0x245C5 +0x4161 0x2F922 +0x4162 0x245C4 +0x4163 0x2F923 +0x4164 0x2466B +0x4165 0x24668 +0x4167 0x2465C +0x4168 0x2465D +0x4169 0x2466A +0x416A 0x2F924 +0x416B 0x24C76 +0x416C 0x24776 +0x416E 0x247C4 +0x416F 0x247CB +0x4170 0x247C8 +0x4171 0x247D4 +0x4172 0x247D5 +0x4173 0x247C9 +0x4174 0x247D7 +0x4176 0x24978 +0x4177 0x2495A +0x4178 0x2495B +0x4179 0x2495C +0x417A 0x24956 +0x417B 0x24958 +0x417C 0x24971 +0x417D 0x269D4 +0x417E 0x24B40 +0x4221 0x2F933 +0x4222 0x24B3F +0x4223 0x24B43 +0x4224 0x24B41 +0x4225 0x24BE2 +0x4226 0x24BE0 +0x4227 0x24BE3 +0x4228 0x24C66 +0x4229 0x24C73 +0x422A 0x24C6C +0x422B 0x24C71 +0x422C 0x24C6A +0x422D 0x24C6D +0x422E 0x24C6E +0x422F 0x24C6B +0x4230 0x24D8C +0x4231 0x24D77 +0x4232 0x2F93A +0x4233 0x24D7F +0x4234 0x24D89 +0x4235 0x24D7A +0x4236 0x24D85 +0x4237 0x24D78 +0x4238 0x24D8A +0x4239 0x24D86 +0x423A 0x24F2C +0x423B 0x24F67 +0x423C 0x24F5B +0x423D 0x24FE5 +0x423E 0x24FE1 +0x423F 0x25061 +0x4240 0x25069 +0x4241 0x2506A +0x4242 0x25165 +0x4243 0x2516D +0x4244 0x25163 +0x4245 0x25186 +0x4246 0x2515C +0x4247 0x25162 +0x4248 0x2F948 +0x4249 0x25179 +0x424A 0x25169 +0x424B 0x25170 +0x424C 0x25176 +0x424D 0x2515D +0x424E 0x25187 +0x424F 0x2516E +0x4250 0x25171 +0x4251 0x2517C +0x4252 0x25173 +0x4253 0x2515B +0x4254 0x2516B +0x4255 0x253BF +0x4256 0x253C1 +0x4257 0x253BD +0x4258 0x253C9 +0x4259 0x253BC +0x425A 0x253C2 +0x425B 0x253C0 +0x425C 0x25492 +0x425D 0x254A9 +0x425E 0x2548F +0x425F 0x25476 +0x4260 0x2547B +0x4261 0x25475 +0x4262 0x254A4 +0x4263 0x25664 +0x4264 0x2573D +0x4265 0x257AF +0x4268 0x2579D +0x4269 0x25799 +0x426A 0x257B1 +0x426B 0x25963 +0x426C 0x25962 +0x426D 0x25964 +0x426E 0x25969 +0x4270 0x25A75 +0x4271 0x25A73 +0x4272 0x25A71 +0x4273 0x25A74 +0x4274 0x25B0C +0x4275 0x25B16 +0x4277 0x25B11 +0x4278 0x25B1F +0x4279 0x25B1A +0x427A 0x25B0D +0x427B 0x25B1B +0x427C 0x25B13 +0x427D 0x25E4E +0x427E 0x25E55 +0x4321 0x25E50 +0x4323 0x25FD2 +0x4324 0x25FD3 +0x4325 0x25FD1 +0x4326 0x25FF1 +0x4327 0x25FDC +0x4328 0x25FC8 +0x4329 0x25FCC +0x432A 0x25FD0 +0x432B 0x25FCF +0x432C 0x25FDF +0x432D 0x2622B +0x432E 0x2622E +0x432F 0x2622D +0x4330 0x2629D +0x4331 0x2629E +0x4332 0x2629F +0x4333 0x262A9 +0x4334 0x262A0 +0x4335 0x26298 +0x4336 0x262A1 +0x4337 0x262AB +0x4338 0x262AF +0x4339 0x2636E +0x433A 0x2635F +0x433B 0x2635A +0x433D 0x26365 +0x433E 0x26368 +0x433F 0x26372 +0x4340 0x26417 +0x4341 0x26416 +0x4342 0x26418 +0x4343 0x26419 +0x4344 0x2641A +0x4345 0x26422 +0x4346 0x2641B +0x4347 0x2641C +0x4348 0x264BE +0x4349 0x264EE +0x434A 0x2655A +0x434B 0x26550 +0x434C 0x26558 +0x434D 0x26554 +0x434E 0x26557 +0x434F 0x26556 +0x4350 0x26615 +0x4351 0x2669B +0x4352 0x26693 +0x4353 0x26692 +0x4354 0x26672 +0x4355 0x26698 +0x4356 0x26699 +0x4357 0x266DF +0x4359 0x266D5 +0x435B 0x266D4 +0x435C 0x266F3 +0x435D 0x266F4 +0x435E 0x266E7 +0x435F 0x266E1 +0x4360 0x266E6 +0x4361 0x266EB +0x4362 0x266EC +0x4363 0x202DB +0x4365 0x2690D +0x4366 0x2690C +0x4367 0x21B2F +0x4368 0x26968 +0x4369 0x26965 +0x436A 0x2696B +0x436B 0x26969 +0x436C 0x269D1 +0x436D 0x269D3 +0x436E 0x26A27 +0x436F 0x26A28 +0x4372 0x26A24 +0x4373 0x26AD7 +0x4374 0x26BCA +0x4375 0x26BC7 +0x4376 0x2F99E +0x4377 0x26BD8 +0x4378 0x26BE1 +0x4379 0x26BC6 +0x437A 0x26BF8 +0x437B 0x26BC3 +0x437C 0x26BF4 +0x437D 0x26C17 +0x437E 0x26BEA +0x4421 0x26BCB +0x4422 0x26B86 +0x4423 0x26BC4 +0x4424 0x26BD9 +0x4425 0x26C19 +0x4426 0x26BC2 +0x4427 0x26BE2 +0x4429 0x26BDE +0x442A 0x26BED +0x442B 0x2F99C +0x442D 0x26C1D +0x442E 0x26BDD +0x442F 0x26BDB +0x4430 0x26BE8 +0x4431 0x26BE9 +0x4432 0x26BBF +0x4433 0x26BE0 +0x4434 0x26BD1 +0x4435 0x26BDC +0x4436 0x26BCE +0x4437 0x26C1E +0x4438 0x26BCC +0x4439 0x26BF2 +0x443A 0x26BF3 +0x443B 0x2F99F +0x443C 0x2F9A2 +0x443D 0x2F9A3 +0x443E 0x2F9A1 +0x443F 0x271AB +0x4440 0x271AA +0x4441 0x271A7 +0x4442 0x271A9 +0x4443 0x27288 +0x4444 0x27275 +0x4445 0x27260 +0x4446 0x2726C +0x4447 0x27273 +0x4449 0x2726E +0x444A 0x27274 +0x444B 0x27276 +0x444C 0x27268 +0x444D 0x27277 +0x444E 0x27286 +0x444F 0x275EA +0x4450 0x27651 +0x4451 0x27650 +0x4452 0x27658 +0x4453 0x2764D +0x4454 0x2764F +0x4455 0x2764E +0x4456 0x2765C +0x4457 0x27652 +0x4458 0x27644 +0x4459 0x2764A +0x445A 0x2764B +0x445B 0x277EA +0x445C 0x27810 +0x445D 0x27811 +0x445E 0x278CD +0x445F 0x278BF +0x4460 0x278C4 +0x4461 0x278D0 +0x4462 0x278CE +0x4463 0x278C0 +0x4464 0x278C2 +0x4465 0x278CF +0x4466 0x278C9 +0x4467 0x278BB +0x4468 0x27997 +0x4469 0x27992 +0x446A 0x2796F +0x446B 0x2797E +0x446C 0x2799A +0x446E 0x27986 +0x446F 0x27973 +0x4471 0x27977 +0x4472 0x2798F +0x4473 0x27970 +0x4474 0x27981 +0x4475 0x27982 +0x4476 0x27999 +0x4477 0x2797D +0x4478 0x2797F +0x4479 0x2797B +0x447A 0x27987 +0x447B 0x27BB2 +0x447C 0x27C2F +0x447D 0x27C34 +0x447E 0x27C2E +0x4521 0x27C32 +0x4523 0x27CAA +0x4525 0x27CA9 +0x4526 0x27D38 +0x4527 0x27D36 +0x4528 0x27D37 +0x4529 0x27D47 +0x452A 0x27D33 +0x452B 0x27D39 +0x452C 0x27D35 +0x452D 0x27D44 +0x452E 0x27EA5 +0x452F 0x27EA6 +0x4530 0x27E9E +0x4531 0x27FE3 +0x4532 0x27FDF +0x4533 0x27FD3 +0x4534 0x27FF1 +0x4535 0x27FE4 +0x4536 0x27FE0 +0x4537 0x27FD6 +0x4539 0x27FE6 +0x453A 0x27FD8 +0x453B 0x27FDE +0x453C 0x27FDB +0x453D 0x27FDC +0x453E 0x2821B +0x453F 0x2821F +0x4540 0x2821D +0x4541 0x2821C +0x4542 0x2821E +0x4543 0x28220 +0x4544 0x28221 +0x4546 0x282B6 +0x4547 0x282BC +0x4548 0x282C6 +0x4549 0x282C7 +0x454A 0x282BA +0x454B 0x282BE +0x454C 0x282BD +0x454D 0x282B5 +0x454E 0x282B4 +0x454F 0x2840F +0x4550 0x28462 +0x4551 0x284EB +0x4552 0x284D9 +0x4553 0x284E4 +0x4554 0x284D7 +0x4555 0x284D8 +0x4556 0x284D6 +0x4557 0x284CE +0x4558 0x284DD +0x4559 0x284E7 +0x455A 0x284D2 +0x455B 0x284C5 +0x455C 0x284C9 +0x455D 0x284DB +0x455E 0x28692 +0x455F 0x2868A +0x4560 0x2868B +0x4561 0x28689 +0x4562 0x28708 +0x4563 0x28703 +0x4564 0x28706 +0x4565 0x28705 +0x4566 0x286F5 +0x4567 0x2870B +0x4568 0x286FB +0x4569 0x287FC +0x456A 0x28801 +0x456B 0x28802 +0x456C 0x287FA +0x456D 0x28808 +0x456E 0x287F7 +0x456F 0x28800 +0x4570 0x287FF +0x4571 0x28806 +0x4572 0x287F6 +0x4573 0x287FB +0x4574 0x2880A +0x4575 0x28925 +0x4576 0x28943 +0x4577 0x28944 +0x4578 0x28C64 +0x4579 0x28C62 +0x457A 0x28C5E +0x457B 0x28C5B +0x457C 0x28CD6 +0x457D 0x20072 +0x457E 0x200C2 +0x4621 0x28E77 +0x4622 0x28E82 +0x4623 0x28E7C +0x4624 0x28E7D +0x4625 0x28E86 +0x4626 0x28E81 +0x4627 0x28E84 +0x4628 0x28E76 +0x4629 0x28E83 +0x462A 0x28E7F +0x462B 0x28E7E +0x462C 0x28F88 +0x462D 0x28F8D +0x462E 0x28F8B +0x462F 0x28F91 +0x4630 0x28F8F +0x4631 0x2907C +0x4632 0x29079 +0x4633 0x2907A +0x4634 0x291EA +0x4635 0x2944C +0x4636 0x29599 +0x4637 0x202D1 +0x4638 0x2968B +0x4639 0x2968D +0x463A 0x2968A +0x463B 0x2968E +0x463C 0x29811 +0x463D 0x22256 +0x463E 0x2FA15 +0x463F 0x20074 +0x4640 0x200C3 +0x4641 0x200C4 +0x4642 0x2011B +0x4643 0x2015F +0x4644 0x2016A +0x4645 0x20169 +0x4646 0x2016B +0x4647 0x2030C +0x4648 0x202F6 +0x4649 0x202ED +0x464A 0x20329 +0x464B 0x202FE +0x464C 0x202F1 +0x464D 0x20317 +0x464E 0x202FF +0x464F 0x202EE +0x4650 0x202FD +0x4651 0x2031C +0x4652 0x202FC +0x4653 0x20300 +0x4654 0x20320 +0x4656 0x202F9 +0x4657 0x20367 +0x4658 0x20308 +0x4659 0x2049E +0x465A 0x204F3 +0x465B 0x20525 +0x465C 0x20527 +0x465D 0x2051F +0x465E 0x20565 +0x465F 0x20563 +0x4660 0x20594 +0x4661 0x20597 +0x4662 0x205F1 +0x4663 0x2065F +0x4664 0x20662 +0x4666 0x20660 +0x4667 0x2F822 +0x4668 0x2078C +0x4669 0x20782 +0x466A 0x20790 +0x466B 0x2078B +0x466C 0x2078D +0x466D 0x20781 +0x466E 0x2079D +0x466F 0x2088E +0x4670 0x2088F +0x4671 0x20892 +0x4672 0x20923 +0x4673 0x20952 +0x4674 0x2F82E +0x4675 0x20A00 +0x4676 0x20A01 +0x4677 0x20A02 +0x4678 0x20A1F +0x4679 0x20A8C +0x467A 0x20A89 +0x467B 0x20A8B +0x467C 0x20A88 +0x467D 0x20A8D +0x467E 0x20A8F +0x4721 0x26385 +0x4722 0x20B00 +0x4723 0x20B05 +0x4724 0x20B01 +0x4725 0x20B68 +0x4726 0x20B6E +0x4727 0x20B67 +0x4728 0x20B75 +0x472A 0x2F845 +0x472B 0x20DD7 +0x472C 0x2F846 +0x472D 0x20048 +0x472E 0x20DD4 +0x472F 0x20DD8 +0x4730 0x2F847 +0x4731 0x2F848 +0x4732 0x20DBA +0x4733 0x2F849 +0x4734 0x20DDB +0x4735 0x20DBF +0x4736 0x20E35 +0x4737 0x20DBC +0x4738 0x20DD9 +0x473A 0x20DDD +0x473B 0x20E00 +0x473C 0x20DD5 +0x473D 0x20E30 +0x473E 0x20DBD +0x473F 0x20DDC +0x4740 0x211FD +0x4741 0x211FE +0x4742 0x21207 +0x4743 0x24517 +0x4744 0x2136F +0x4745 0x21369 +0x4746 0x21370 +0x4747 0x21367 +0x4748 0x213A9 +0x4749 0x21395 +0x474A 0x21390 +0x474B 0x2136C +0x474C 0x21397 +0x474D 0x21371 +0x474F 0x21374 +0x4750 0x2136D +0x4751 0x2138E +0x4752 0x2152F +0x4753 0x2A31B +0x4754 0x215A9 +0x4755 0x2164E +0x4756 0x2F85F +0x4757 0x2165A +0x4758 0x21648 +0x4759 0x21655 +0x475A 0x2164C +0x475B 0x21649 +0x475C 0x2164F +0x475D 0x2164A +0x475E 0x217D6 +0x475F 0x217A0 +0x4760 0x217A9 +0x4761 0x2F867 +0x4762 0x2179D +0x4763 0x217D4 +0x4764 0x217A4 +0x4765 0x217A8 +0x4766 0x217A6 +0x4767 0x217E6 +0x4768 0x2197D +0x4769 0x21977 +0x476A 0x2197A +0x476B 0x21A41 +0x476C 0x21A49 +0x476D 0x21A59 +0x476E 0x21A45 +0x476F 0x21A48 +0x4770 0x21A40 +0x4771 0x21B8E +0x4772 0x21B95 +0x4773 0x21B90 +0x4774 0x21BF7 +0x4775 0x21BF8 +0x4776 0x21BF6 +0x4777 0x21BFB +0x4778 0x21C9E +0x4779 0x21C9D +0x477A 0x21C99 +0x477B 0x2F877 +0x477C 0x21CA3 +0x477D 0x21CA9 +0x477E 0x21C98 +0x4821 0x21CA0 +0x4822 0x21C96 +0x4823 0x21C94 +0x4824 0x21C95 +0x4825 0x21C9F +0x4826 0x21CA1 +0x4827 0x21D21 +0x4828 0x21D1D +0x4829 0x21D1F +0x482A 0x21E6D +0x482B 0x2F87C +0x482C 0x21E9A +0x482D 0x21E92 +0x482E 0x21E7A +0x482F 0x21E7D +0x4830 0x21EA1 +0x4831 0x21E9D +0x4832 0x21E99 +0x4833 0x21E6B +0x4834 0x21E6E +0x4835 0x2F87D +0x4836 0x22045 +0x4837 0x2F884 +0x4838 0x220FB +0x4839 0x220EB +0x483A 0x220F2 +0x483B 0x220F9 +0x483C 0x2F886 +0x483D 0x220F8 +0x483E 0x220ED +0x483F 0x22101 +0x4840 0x220F7 +0x4841 0x22106 +0x4842 0x2219B +0x4843 0x221CA +0x4846 0x2226B +0x4847 0x2226C +0x4848 0x22274 +0x4849 0x22267 +0x484A 0x2225B +0x484B 0x22260 +0x484C 0x22276 +0x484D 0x22263 +0x484E 0x22261 +0x484F 0x22328 +0x4850 0x2235B +0x4851 0x2235E +0x4852 0x22360 +0x4853 0x2235D +0x4854 0x2235C +0x4855 0x223F4 +0x4856 0x22400 +0x4857 0x22408 +0x4858 0x22407 +0x4859 0x22401 +0x485A 0x22405 +0x485B 0x22464 +0x485C 0x22463 +0x485D 0x2249E +0x485E 0x224A0 +0x485F 0x224A1 +0x4860 0x2249F +0x4861 0x22526 +0x4862 0x2252D +0x4863 0x22528 +0x4864 0x2251D +0x4865 0x226EC +0x4866 0x226E3 +0x4867 0x226EB +0x4868 0x22716 +0x4869 0x226C8 +0x486A 0x2661B +0x486B 0x226E9 +0x486C 0x226E4 +0x486D 0x22724 +0x486E 0x226D1 +0x4870 0x226DD +0x4871 0x226C2 +0x4872 0x226CB +0x4873 0x226C7 +0x4874 0x226E7 +0x4876 0x226EA +0x4877 0x2274B +0x4878 0x2F8A5 +0x4879 0x22760 +0x487A 0x2277D +0x487B 0x2273E +0x487C 0x2F8A4 +0x487D 0x22752 +0x487E 0x2274E +0x4921 0x2273C +0x4922 0x22732 +0x4923 0x22730 +0x4924 0x22723 +0x4925 0x229CA +0x4926 0x229CB +0x4927 0x229C9 +0x4928 0x229C8 +0x4929 0x229CD +0x492A 0x22B98 +0x492B 0x22BA0 +0x492C 0x22B9F +0x492D 0x22B9C +0x492E 0x22BA3 +0x492F 0x22B97 +0x4930 0x2F8BE +0x4931 0x22BF1 +0x4932 0x22C09 +0x4933 0x22C03 +0x4934 0x22BEA +0x4935 0x22C45 +0x4936 0x22BED +0x4937 0x22C05 +0x4938 0x22C1A +0x4939 0x22C15 +0x493A 0x22C01 +0x493B 0x22BEC +0x493C 0x22C0E +0x493D 0x22C17 +0x493E 0x22C42 +0x493F 0x22C12 +0x4940 0x22C10 +0x4941 0x22BEF +0x4942 0x22BFF +0x4943 0x22C00 +0x4944 0x22C0C +0x4945 0x22C0F +0x4946 0x22C04 +0x4947 0x22C08 +0x4948 0x22C14 +0x4949 0x22C43 +0x494A 0x2F8BD +0x494B 0x22C1B +0x494C 0x22C11 +0x494D 0x22C13 +0x494E 0x22ECF +0x494F 0x22ECE +0x4950 0x22F6F +0x4951 0x22F6E +0x4952 0x22F7A +0x4953 0x22F70 +0x4954 0x22F64 +0x4955 0x22F5E +0x4956 0x22F6C +0x4957 0x2F8C9 +0x4958 0x22F5B +0x4959 0x22F61 +0x495A 0x22F65 +0x495B 0x2307F +0x495C 0x23080 +0x495D 0x2307C +0x495E 0x230A7 +0x495F 0x230A6 +0x4960 0x230A1 +0x4962 0x230A8 +0x4963 0x230A3 +0x4964 0x230A2 +0x4965 0x230AD +0x4966 0x230A5 +0x4967 0x23101 +0x4968 0x230FF +0x4969 0x230FC +0x496A 0x23100 +0x496B 0x23135 +0x496C 0x231EE +0x496D 0x231EF +0x496E 0x231F6 +0x496F 0x231E8 +0x4970 0x231EA +0x4971 0x231E3 +0x4972 0x2321F +0x4974 0x231E4 +0x4975 0x231FA +0x4976 0x231F1 +0x4977 0x231FB +0x4978 0x2F8D4 +0x4979 0x2333D +0x497A 0x2333C +0x497C 0x23378 +0x497D 0x23377 +0x4A21 0x234D1 +0x4A22 0x234C7 +0x4A23 0x234DF +0x4A24 0x234D0 +0x4A25 0x234E0 +0x4A26 0x234D6 +0x4A27 0x234D8 +0x4A28 0x23516 +0x4A29 0x2350E +0x4A2A 0x234D9 +0x4A2B 0x2350F +0x4A2C 0x23511 +0x4A2D 0x234CD +0x4A2E 0x23489 +0x4A2F 0x234CE +0x4A30 0x23514 +0x4A31 0x234DA +0x4A32 0x23512 +0x4A33 0x234D3 +0x4A34 0x234C2 +0x4A35 0x234E1 +0x4A36 0x234E9 +0x4A37 0x234EA +0x4A38 0x234DE +0x4A39 0x23515 +0x4A3A 0x238D9 +0x4A3B 0x238D6 +0x4A3C 0x238CD +0x4A3D 0x238D0 +0x4A3E 0x238D3 +0x4A3F 0x2F8F0 +0x4A40 0x23982 +0x4A41 0x23985 +0x4A42 0x2397F +0x4A43 0x2397D +0x4A44 0x23981 +0x4A45 0x23983 +0x4A46 0x23984 +0x4A47 0x284A0 +0x4A48 0x23A28 +0x4A49 0x23A0F +0x4A4A 0x23A17 +0x4A4B 0x23A1A +0x4A4C 0x23A25 +0x4A4D 0x2F8F7 +0x4A4E 0x23A9B +0x4A4F 0x23A99 +0x4A50 0x23B92 +0x4A51 0x23B8C +0x4A52 0x23B95 +0x4A53 0x23B8D +0x4A54 0x23BA3 +0x4A55 0x23B93 +0x4A56 0x23B91 +0x4A57 0x23DDB +0x4A58 0x23D99 +0x4A59 0x23D9A +0x4A5A 0x23E08 +0x4A5B 0x23E4C +0x4A5C 0x23E0D +0x4A5D 0x23E01 +0x4A5E 0x23E4E +0x4A5F 0x23E02 +0x4A60 0x23E4D +0x4A61 0x23E21 +0x4A62 0x23DFC +0x4A63 0x2F909 +0x4A64 0x23D8A +0x4A65 0x2F908 +0x4A66 0x23D95 +0x4A67 0x23E11 +0x4A68 0x23E12 +0x4A69 0x23E46 +0x4A6A 0x23E1C +0x4A6B 0x23E49 +0x4A6C 0x23E0C +0x4A6E 0x23E13 +0x4A6F 0x23E16 +0x4A70 0x23DFD +0x4A71 0x23E0F +0x4A72 0x23E1F +0x4A73 0x24230 +0x4A74 0x2426E +0x4A75 0x2426B +0x4A76 0x2429B +0x4A77 0x2427B +0x4A78 0x24263 +0x4A79 0x24297 +0x4A7A 0x2426D +0x4A7B 0x2429C +0x4A7C 0x24298 +0x4A7D 0x2426F +0x4A7E 0x24267 +0x4B21 0x24269 +0x4B22 0x24515 +0x4B23 0x24563 +0x4B24 0x24586 +0x4B25 0x2458A +0x4B26 0x24587 +0x4B27 0x24588 +0x4B28 0x24585 +0x4B29 0x24589 +0x4B2A 0x245CA +0x4B2B 0x245C7 +0x4B2C 0x245CB +0x4B2D 0x245CC +0x4B2E 0x245C9 +0x4B2F 0x2460D +0x4B30 0x24683 +0x4B31 0x24684 +0x4B32 0x24678 +0x4B33 0x24682 +0x4B34 0x24673 +0x4B35 0x24679 +0x4B36 0x2468C +0x4B37 0x247D0 +0x4B38 0x247CF +0x4B39 0x247D2 +0x4B3A 0x247D9 +0x4B3B 0x247CC +0x4B3C 0x247EB +0x4B3D 0x247FD +0x4B3E 0x247EC +0x4B3F 0x247E8 +0x4B40 0x247F8 +0x4B41 0x247FA +0x4B42 0x2F927 +0x4B44 0x247E1 +0x4B45 0x247FB +0x4B46 0x248E7 +0x4B47 0x2F92E +0x4B48 0x249A5 +0x4B49 0x24991 +0x4B4A 0x249A6 +0x4B4B 0x2497C +0x4B4C 0x24992 +0x4B4D 0x249A2 +0x4B4E 0x249A0 +0x4B4F 0x24AFC +0x4B50 0x24AFE +0x4B51 0x24B57 +0x4B52 0x24B53 +0x4B53 0x24B58 +0x4B54 0x24BE7 +0x4B55 0x24C8E +0x4B56 0x2F938 +0x4B57 0x24C83 +0x4B58 0x24C8B +0x4B59 0x24C84 +0x4B5B 0x24DA2 +0x4B5C 0x24DB7 +0x4B5D 0x24DA9 +0x4B5E 0x24DA5 +0x4B5F 0x24D9F +0x4B60 0x24DAA +0x4B61 0x24D97 +0x4B62 0x24DA1 +0x4B63 0x24D9E +0x4B64 0x24DAB +0x4B65 0x24D99 +0x4B66 0x24DA3 +0x4B67 0x24F30 +0x4B68 0x24F32 +0x4B69 0x24F2F +0x4B6A 0x24F70 +0x4B6B 0x24F6C +0x4B6C 0x24F6F +0x4B6D 0x24FE8 +0x4B6E 0x24FEE +0x4B6F 0x24FEA +0x4B70 0x2506D +0x4B71 0x25076 +0x4B72 0x25070 +0x4B73 0x25071 +0x4B74 0x2506C +0x4B75 0x251EB +0x4B76 0x251B5 +0x4B77 0x25196 +0x4B78 0x25190 +0x4B79 0x2518D +0x4B7A 0x2F949 +0x4B7B 0x251A2 +0x4B7C 0x251B0 +0x4B7D 0x25192 +0x4B7E 0x251A0 +0x4C21 0x25193 +0x4C22 0x251C3 +0x4C23 0x2518E +0x4C24 0x251B6 +0x4C25 0x2519D +0x4C26 0x25195 +0x4C27 0x251B3 +0x4C28 0x251A4 +0x4C29 0x25370 +0x4C2A 0x253D4 +0x4C2C 0x253CF +0x4C2D 0x20170 +0x4C2E 0x25494 +0x4C30 0x254C0 +0x4C31 0x254B4 +0x4C32 0x254C1 +0x4C34 0x254BD +0x4C35 0x254AF +0x4C36 0x25677 +0x4C37 0x25678 +0x4C38 0x2566B +0x4C39 0x2566D +0x4C3A 0x2566E +0x4C3B 0x25672 +0x4C3C 0x2566F +0x4C3D 0x25671 +0x4C3E 0x230AB +0x4C3F 0x2568C +0x4C40 0x2573F +0x4C41 0x257B6 +0x4C42 0x257B7 +0x4C44 0x257BB +0x4C45 0x257B8 +0x4C46 0x2079C +0x4C47 0x257B9 +0x4C49 0x2598B +0x4C4A 0x2597A +0x4C4B 0x25984 +0x4C4C 0x25988 +0x4C4D 0x25991 +0x4C4E 0x25979 +0x4C4F 0x2598E +0x4C50 0x25980 +0x4C51 0x25982 +0x4C52 0x2597C +0x4C54 0x25A84 +0x4C55 0x25A7F +0x4C57 0x25B3B +0x4C58 0x25B71 +0x4C59 0x25B3D +0x4C5A 0x25B30 +0x4C5C 0x25B3E +0x4C5D 0x25B38 +0x4C5E 0x25E5E +0x4C5F 0x25E64 +0x4C61 0x25E5D +0x4C62 0x25E6D +0x4C63 0x25E4F +0x4C64 0x25E62 +0x4C65 0x25E5F +0x4C66 0x25FEC +0x4C67 0x25FF2 +0x4C68 0x25FF4 +0x4C69 0x25FF7 +0x4C6A 0x25FF6 +0x4C6B 0x26007 +0x4C6C 0x25FED +0x4C6D 0x25FEA +0x4C6E 0x25FF0 +0x4C6F 0x25FF8 +0x4C70 0x25FF3 +0x4C72 0x2F972 +0x4C73 0x26231 +0x4C74 0x2622F +0x4C75 0x262B6 +0x4C76 0x262AE +0x4C77 0x262AA +0x4C78 0x262BF +0x4C79 0x262CC +0x4C7A 0x262C7 +0x4C7B 0x26C83 +0x4C7C 0x26380 +0x4C7D 0x2637B +0x4C7E 0x2637F +0x4D21 0x2637D +0x4D22 0x26383 +0x4D23 0x2F978 +0x4D24 0x26446 +0x4D25 0x2642D +0x4D26 0x26425 +0x4D27 0x26426 +0x4D28 0x2642C +0x4D29 0x26437 +0x4D2A 0x26431 +0x4D2B 0x26433 +0x4D2C 0x26432 +0x4D2D 0x26427 +0x4D2E 0x2642A +0x4D2F 0x2642E +0x4D30 0x2642F +0x4D31 0x264C0 +0x4D32 0x26571 +0x4D33 0x26561 +0x4D34 0x26562 +0x4D35 0x26566 +0x4D36 0x26618 +0x4D37 0x266C5 +0x4D38 0x266C3 +0x4D39 0x266C4 +0x4D3A 0x266C2 +0x4D3B 0x266AE +0x4D3C 0x26710 +0x4D3D 0x26708 +0x4D3E 0x2671F +0x4D3F 0x2673A +0x4D40 0x2673B +0x4D41 0x26736 +0x4D42 0x2670C +0x4D43 0x26706 +0x4D44 0x2672A +0x4D45 0x26757 +0x4D46 0x26750 +0x4D47 0x26720 +0x4D48 0x2F985 +0x4D49 0x2672C +0x4D4A 0x26721 +0x4D4B 0x2670B +0x4D4C 0x26719 +0x4D4D 0x26735 +0x4D4E 0x26718 +0x4D4F 0x2670F +0x4D50 0x26713 +0x4D51 0x26755 +0x4D52 0x26739 +0x4D53 0x2671A +0x4D55 0x26717 +0x4D56 0x268E4 +0x4D57 0x268E9 +0x4D58 0x2458B +0x4D59 0x26910 +0x4D5A 0x26912 +0x4D5B 0x2693F +0x4D5C 0x2696E +0x4D5D 0x24518 +0x4D5E 0x2F98C +0x4D5F 0x269D6 +0x4D60 0x269D5 +0x4D61 0x269D7 +0x4D62 0x20B02 +0x4D64 0x26A31 +0x4D65 0x26A30 +0x4D66 0x26A3A +0x4D67 0x26B85 +0x4D68 0x26B6B +0x4D69 0x26C48 +0x4D6A 0x26C4B +0x4D6B 0x26C37 +0x4D6C 0x26C7B +0x4D6D 0x26C6C +0x4D6E 0x26C85 +0x4D6F 0x26C65 +0x4D70 0x26C36 +0x4D71 0x26C86 +0x4D72 0x26C34 +0x4D73 0x26C68 +0x4D74 0x26C5A +0x4D75 0x26C58 +0x4D76 0x26C72 +0x4D77 0x26C6A +0x4D78 0x26BD3 +0x4D79 0x26C3C +0x4D7A 0x26C33 +0x4D7B 0x26C3B +0x4D7C 0x26C4D +0x4D7D 0x26C4F +0x4D7E 0x26C7C +0x4E21 0x26CB0 +0x4E22 0x26C5B +0x4E23 0x26C55 +0x4E24 0x26C64 +0x4E25 0x26C6B +0x4E26 0x26C53 +0x4E28 0x26C57 +0x4E29 0x26C5E +0x4E2A 0x26C6D +0x4E2B 0x26C35 +0x4E2C 0x26C69 +0x4E2D 0x26C59 +0x4E2E 0x26C66 +0x4E2F 0x26C50 +0x4E30 0x26C51 +0x4E31 0x26C5C +0x4E32 0x26D5D +0x4E33 0x26C87 +0x4E34 0x26C78 +0x4E35 0x26C49 +0x4E36 0x26C4E +0x4E37 0x26BF1 +0x4E38 0x26C73 +0x4E39 0x26C88 +0x4E3A 0x26BCF +0x4E3B 0x2F9A4 +0x4E3C 0x271B1 +0x4E3D 0x271B3 +0x4E3E 0x2729C +0x4E3F 0x272A4 +0x4E40 0x27290 +0x4E41 0x272B8 +0x4E42 0x272A0 +0x4E43 0x2729D +0x4E44 0x272A8 +0x4E45 0x272A9 +0x4E46 0x2F9B9 +0x4E47 0x272B1 +0x4E48 0x27293 +0x4E49 0x2729B +0x4E4A 0x272A2 +0x4E4B 0x272A1 +0x4E4C 0x272B0 +0x4E4D 0x272A7 +0x4E4E 0x275B3 +0x4E50 0x275B4 +0x4E51 0x275F1 +0x4E52 0x275ED +0x4E53 0x275EC +0x4E54 0x27668 +0x4E55 0x27675 +0x4E56 0x2766A +0x4E57 0x27662 +0x4E58 0x27667 +0x4E59 0x27660 +0x4E5A 0x27677 +0x4E5B 0x2765F +0x4E5C 0x27679 +0x4E5D 0x27823 +0x4E5E 0x27821 +0x4E5F 0x2781C +0x4E61 0x2781F +0x4E62 0x2781E +0x4E63 0x278D6 +0x4E64 0x278D3 +0x4E65 0x278D9 +0x4E66 0x278D7 +0x4E67 0x278D4 +0x4E68 0x278DC +0x4E69 0x278D8 +0x4E6A 0x279A3 +0x4E6C 0x279BE +0x4E6D 0x279A9 +0x4E6E 0x279A1 +0x4E6F 0x279A0 +0x4E70 0x279AB +0x4E71 0x279A2 +0x4E72 0x279BA +0x4E73 0x279C2 +0x4E74 0x2799C +0x4E75 0x279BB +0x4E76 0x279AA +0x4E77 0x279AC +0x4E78 0x279A5 +0x4E79 0x279C1 +0x4E7B 0x27BE2 +0x4E7C 0x27C36 +0x4E7D 0x27C3D +0x4E7E 0x27C3A +0x4F21 0x22461 +0x4F22 0x27C48 +0x4F23 0x27C3C +0x4F24 0x27CB7 +0x4F25 0x27CAC +0x4F26 0x27CB3 +0x4F27 0x27CB6 +0x4F28 0x27CB2 +0x4F2A 0x27D5D +0x4F2B 0x27D49 +0x4F2C 0x27D4E +0x4F2D 0x27D4F +0x4F2E 0x27D4D +0x4F2F 0x27D5C +0x4F30 0x27E5D +0x4F31 0x27EBB +0x4F32 0x27ECE +0x4F33 0x27EBF +0x4F34 0x27EBA +0x4F35 0x27EC3 +0x4F37 0x28006 +0x4F38 0x27FF8 +0x4F39 0x27FFE +0x4F3A 0x28013 +0x4F3B 0x27FF6 +0x4F3D 0x28234 +0x4F3E 0x2822D +0x4F3F 0x2822A +0x4F40 0x28235 +0x4F41 0x2822C +0x4F42 0x282D4 +0x4F43 0x282DA +0x4F44 0x282D3 +0x4F45 0x282D2 +0x4F46 0x282CE +0x4F47 0x282CF +0x4F49 0x284FD +0x4F4A 0x2850B +0x4F4B 0x284FE +0x4F4C 0x284F8 +0x4F4D 0x284F7 +0x4F4E 0x28517 +0x4F4F 0x284FA +0x4F50 0x284F9 +0x4F51 0x28500 +0x4F52 0x284F5 +0x4F53 0x284F1 +0x4F54 0x28503 +0x4F55 0x28505 +0x4F56 0x2851C +0x4F57 0x286AC +0x4F58 0x2869A +0x4F59 0x286AD +0x4F5A 0x286A0 +0x4F5B 0x2871B +0x4F5C 0x28725 +0x4F5D 0x28724 +0x4F5E 0x28726 +0x4F5F 0x28727 +0x4F60 0x28728 +0x4F61 0x2872A +0x4F62 0x2871A +0x4F63 0x2872E +0x4F64 0x28715 +0x4F65 0x28815 +0x4F66 0x28814 +0x4F67 0x28817 +0x4F68 0x28818 +0x4F69 0x2880F +0x4F6A 0x28813 +0x4F6B 0x2880B +0x4F6C 0x28822 +0x4F6D 0x2137A +0x4F6E 0x28926 +0x4F70 0x28951 +0x4F71 0x2894D +0x4F72 0x2894E +0x4F73 0x2894A +0x4F74 0x2894B +0x4F75 0x2894C +0x4F76 0x28950 +0x4F77 0x28962 +0x4F78 0x2894F +0x4F79 0x28952 +0x4F7A 0x28C68 +0x4F7B 0x28C69 +0x4F7C 0x28CE5 +0x4F7D 0x28CF0 +0x4F7E 0x28CE1 +0x5021 0x28CE2 +0x5022 0x2F9F2 +0x5023 0x28EA5 +0x5024 0x28EA9 +0x5025 0x28EA4 +0x5026 0x28EAF +0x5027 0x28EAC +0x5028 0x28EAE +0x5029 0x28EAA +0x502A 0x28F95 +0x502B 0x28F99 +0x502C 0x28F93 +0x502D 0x28F9D +0x502E 0x28F98 +0x502F 0x28F9C +0x5030 0x28F97 +0x5032 0x29089 +0x5033 0x29087 +0x5034 0x291D7 +0x5035 0x291ED +0x5036 0x291F1 +0x5037 0x291F0 +0x5038 0x29205 +0x5039 0x29203 +0x503A 0x29204 +0x503B 0x2925F +0x503C 0x29457 +0x503D 0x2959C +0x503E 0x295A1 +0x503F 0x2959A +0x5040 0x2968F +0x5041 0x29693 +0x5042 0x2969E +0x5043 0x296A3 +0x5044 0x29698 +0x5045 0x29699 +0x5046 0x29695 +0x5047 0x2986E +0x5048 0x2986A +0x5049 0x29AF4 +0x504A 0x29AF7 +0x504B 0x29C79 +0x504C 0x29F8F +0x504D 0x29F91 +0x504E 0x2A00B +0x504F 0x2A502 +0x5050 0x20084 +0x5051 0x20104 +0x5052 0x20180 +0x5053 0x2032F +0x5054 0x2033F +0x5055 0x2033B +0x5056 0x20362 +0x5057 0x20344 +0x5058 0x20333 +0x5059 0x2035F +0x505A 0x2032B +0x505B 0x2F809 +0x505C 0x20339 +0x505D 0x20336 +0x505E 0x20348 +0x505F 0x20335 +0x5060 0x2036C +0x5061 0x20358 +0x5062 0x2033A +0x5063 0x204A8 +0x5064 0x204F4 +0x5065 0x20529 +0x5066 0x2059A +0x5067 0x20600 +0x5068 0x207BB +0x5069 0x207BD +0x506A 0x207B7 +0x506B 0x207B2 +0x506D 0x207A8 +0x506E 0x207AB +0x506F 0x207A6 +0x5070 0x207BC +0x5071 0x20897 +0x5072 0x20896 +0x5073 0x208F8 +0x5075 0x20951 +0x5077 0x209B5 +0x5078 0x209B4 +0x5079 0x209B6 +0x507B 0x209B7 +0x507C 0x20A05 +0x507D 0x20A23 +0x507E 0x20A95 +0x5121 0x20A98 +0x5123 0x20A94 +0x5124 0x20A93 +0x5125 0x20B07 +0x5126 0x20B73 +0x5127 0x20B71 +0x5128 0x20B72 +0x5129 0x20B78 +0x512A 0x20E5F +0x512B 0x20E6A +0x512C 0x20E67 +0x512D 0x20E6B +0x512E 0x20E69 +0x512F 0x20E8E +0x5130 0x20E49 +0x5131 0x20E80 +0x5133 0x20E44 +0x5134 0x20E8F +0x5135 0x20E45 +0x5136 0x2F84C +0x5137 0x20E4F +0x5138 0x20E63 +0x5139 0x20E36 +0x513A 0x20E48 +0x513B 0x20E5C +0x513C 0x20E93 +0x513D 0x20E61 +0x513E 0x20E60 +0x513F 0x20E4E +0x5140 0x20E5E +0x5141 0x20E3F +0x5142 0x20EA4 +0x5144 0x20E68 +0x5145 0x2120B +0x5146 0x21211 +0x5147 0x2120D +0x5148 0x2120E +0x5149 0x213C2 +0x514A 0x2F857 +0x514B 0x213B0 +0x514C 0x213C3 +0x514D 0x213C8 +0x514E 0x21365 +0x514F 0x213D7 +0x5150 0x213BD +0x5151 0x213B8 +0x5152 0x213B6 +0x5153 0x213C7 +0x5154 0x213BC +0x5155 0x213B1 +0x5156 0x213AF +0x5157 0x2F85B +0x5158 0x21535 +0x5159 0x21530 +0x515A 0x2155D +0x515B 0x20B76 +0x515C 0x2156F +0x515D 0x215B0 +0x515E 0x2F85E +0x515F 0x215B4 +0x5160 0x2165C +0x5161 0x2165D +0x5162 0x21808 +0x5163 0x217EE +0x5164 0x2180B +0x5165 0x217F2 +0x5166 0x217FD +0x5167 0x217F1 +0x5168 0x21810 +0x5169 0x2F868 +0x516A 0x21814 +0x516B 0x2198B +0x516C 0x2198C +0x516D 0x21985 +0x516E 0x21A7A +0x516F 0x21A6C +0x5170 0x21A60 +0x5171 0x21A67 +0x5172 0x21A66 +0x5173 0x21A6A +0x5174 0x21A5F +0x5175 0x21A6D +0x5176 0x21A68 +0x5177 0x21A64 +0x5178 0x21B3A +0x5179 0x21B3B +0x517A 0x21B39 +0x517B 0x21C02 +0x517C 0x21C04 +0x517D 0x21C03 +0x517E 0x21CB4 +0x5221 0x21CB3 +0x5222 0x21CBB +0x5223 0x21CAC +0x5224 0x21CB6 +0x5225 0x21CB1 +0x5226 0x21CAF +0x5227 0x21CB5 +0x5228 0x21CBE +0x5229 0x21CB2 +0x522A 0x21D24 +0x522B 0x21EB6 +0x522C 0x21EB9 +0x522D 0x21EAC +0x522E 0x21EB0 +0x522F 0x21ED7 +0x5230 0x21EBB +0x5231 0x21EFE +0x5232 0x21ECB +0x5233 0x2F87F +0x5235 0x21EB3 +0x5236 0x21EBE +0x5237 0x21ECD +0x5238 0x21EBC +0x5239 0x21EBA +0x523A 0x21EC7 +0x523B 0x22116 +0x523C 0x2211B +0x523D 0x22117 +0x523E 0x22115 +0x523F 0x2219F +0x5240 0x2F88E +0x5241 0x22282 +0x5242 0x22283 +0x5243 0x2228E +0x5244 0x2226A +0x5245 0x22289 +0x5246 0x22294 +0x5247 0x22286 +0x5248 0x22290 +0x5249 0x22362 +0x524A 0x22390 +0x524B 0x2240C +0x524C 0x2240F +0x524E 0x224A5 +0x524F 0x224A7 +0x5250 0x224A6 +0x5251 0x224A4 +0x5252 0x22535 +0x5253 0x22538 +0x5254 0x22536 +0x5255 0x22543 +0x5256 0x22547 +0x5257 0x22537 +0x5258 0x22743 +0x5259 0x227A2 +0x525A 0x22751 +0x525B 0x22772 +0x525C 0x2276D +0x525D 0x2272F +0x525E 0x22754 +0x525F 0x2276E +0x5260 0x22755 +0x5261 0x22737 +0x5262 0x2274F +0x5263 0x22750 +0x5265 0x2279E +0x5266 0x2F8A8 +0x5267 0x227B3 +0x5268 0x227A7 +0x526A 0x227F9 +0x526B 0x22791 +0x526C 0x2F8A7 +0x526D 0x227B6 +0x526E 0x227DD +0x526F 0x22799 +0x5270 0x229DF +0x5271 0x229D5 +0x5272 0x247F5 +0x5273 0x22C28 +0x5274 0x22C40 +0x5275 0x22C71 +0x5276 0x22C98 +0x5277 0x22C95 +0x5278 0x22C65 +0x5279 0x22C78 +0x527A 0x22C7F +0x527B 0x22C60 +0x527C 0x22C7C +0x527D 0x22C96 +0x527E 0x22C6A +0x5321 0x22C79 +0x5322 0x22C73 +0x5323 0x22C72 +0x5324 0x22C7B +0x5325 0x22C70 +0x5326 0x22ED5 +0x5327 0x22ED7 +0x5328 0x22F8F +0x5329 0x22F89 +0x532A 0x22F9E +0x532B 0x22F87 +0x532C 0x22FA0 +0x532D 0x22F8D +0x532E 0x22F88 +0x532F 0x22F7F +0x5330 0x22F8C +0x5331 0x22F93 +0x5332 0x23059 +0x5333 0x295B0 +0x5334 0x230B1 +0x5335 0x251F4 +0x5336 0x230AF +0x5337 0x230B2 +0x5338 0x23108 +0x5339 0x2310A +0x533A 0x23136 +0x533B 0x23137 +0x533C 0x2F8CF +0x533E 0x23236 +0x533F 0x23229 +0x5340 0x2324A +0x5341 0x23226 +0x5342 0x23228 +0x5343 0x23224 +0x5344 0x2322A +0x5345 0x23248 +0x5346 0x23344 +0x5347 0x23384 +0x5348 0x2338C +0x5349 0x234C4 +0x534A 0x234DC +0x534B 0x23587 +0x534C 0x23553 +0x534D 0x2357F +0x534E 0x23531 +0x534F 0x23551 +0x5350 0x2354B +0x5351 0x23552 +0x5352 0x23580 +0x5353 0x235A5 +0x5354 0x23581 +0x5355 0x23543 +0x5356 0x23534 +0x5357 0x23536 +0x5358 0x23532 +0x5359 0x23548 +0x535A 0x23549 +0x535B 0x2353C +0x535C 0x2354D +0x535D 0x2354A +0x535E 0x2F8E6 +0x535F 0x2358A +0x5360 0x23546 +0x5361 0x2353E +0x5362 0x23583 +0x5363 0x23550 +0x5364 0x235B4 +0x5365 0x238F0 +0x5366 0x238E4 +0x5367 0x238E3 +0x5368 0x238E5 +0x5369 0x238E6 +0x536A 0x238E7 +0x536B 0x238E1 +0x536C 0x238EF +0x536D 0x238E8 +0x536E 0x238DD +0x536F 0x23903 +0x5370 0x23988 +0x5371 0x23A26 +0x5372 0x23A16 +0x5373 0x23A3B +0x5374 0x23A2F +0x5375 0x23A39 +0x5376 0x23A34 +0x5377 0x2F8F4 +0x5378 0x23A35 +0x5379 0x23A31 +0x537A 0x23A38 +0x537B 0x20B81 +0x537C 0x23AAA +0x537D 0x23AA3 +0x537E 0x23AA4 +0x5421 0x23AA0 +0x5422 0x23AA1 +0x5423 0x23AA9 +0x5424 0x23AA5 +0x5425 0x23BAF +0x5426 0x23BB1 +0x5427 0x23BAB +0x5428 0x23BAE +0x5429 0x23BB0 +0x542A 0x23BB3 +0x542B 0x23BAC +0x542C 0x23BA9 +0x542D 0x23BB2 +0x542E 0x23BA8 +0x542F 0x23BB4 +0x5430 0x23BC2 +0x5431 0x23C4F +0x5432 0x23C66 +0x5433 0x23E1E +0x5434 0x23E15 +0x5435 0x23E10 +0x5436 0x23E7F +0x5437 0x23E7E +0x5438 0x23E60 +0x5439 0x23ECC +0x543A 0x23EB2 +0x543B 0x23E62 +0x543C 0x23E8D +0x543D 0x23E8E +0x543E 0x23E77 +0x543F 0x23E7C +0x5440 0x23E8F +0x5441 0x23E5D +0x5442 0x23E6D +0x5443 0x23E63 +0x5444 0x23EAF +0x5445 0x23E90 +0x5446 0x23E7D +0x5447 0x23E7A +0x5448 0x23E06 +0x5449 0x2F90B +0x544A 0x23E68 +0x544B 0x23EB4 +0x544C 0x23E78 +0x544D 0x23EB1 +0x544F 0x2F90C +0x5451 0x242E8 +0x5452 0x242E9 +0x5453 0x242C0 +0x5455 0x242EA +0x5456 0x242B7 +0x5457 0x242BA +0x5458 0x242B5 +0x5459 0x2F91D +0x545A 0x242B4 +0x545B 0x242BC +0x545C 0x242C6 +0x545D 0x242B8 +0x545E 0x242BD +0x545F 0x242C2 +0x5460 0x2434D +0x5461 0x242F0 +0x5462 0x242C7 +0x5463 0x242C1 +0x5464 0x242C3 +0x5465 0x242F1 +0x5466 0x242EC +0x5468 0x2451C +0x5469 0x24520 +0x546A 0x24558 +0x546B 0x24565 +0x546C 0x24564 +0x546D 0x2458C +0x546E 0x2458D +0x546F 0x245D9 +0x5470 0x245E0 +0x5471 0x24610 +0x5472 0x24694 +0x5473 0x24692 +0x5474 0x24696 +0x5475 0x24695 +0x5476 0x246BF +0x5477 0x246A0 +0x5479 0x247F4 +0x547A 0x247F6 +0x547B 0x247DC +0x547D 0x24816 +0x547E 0x24815 +0x5521 0x2481C +0x5522 0x2480F +0x5523 0x2482C +0x5524 0x24814 +0x5525 0x24825 +0x5526 0x24817 +0x5527 0x24812 +0x5528 0x2481E +0x5529 0x24980 +0x552A 0x249A8 +0x552B 0x249AF +0x552C 0x249D6 +0x552D 0x249E2 +0x552E 0x249B4 +0x552F 0x249B3 +0x5530 0x249B0 +0x5531 0x249B2 +0x5532 0x249A1 +0x5533 0x24B60 +0x5534 0x24B66 +0x5535 0x24B61 +0x5536 0x24B4E +0x5537 0x24B5D +0x5538 0x24B63 +0x5539 0x24BE6 +0x553A 0x24BEF +0x553B 0x24BEC +0x553C 0x24C98 +0x553D 0x24CA7 +0x553E 0x24C94 +0x553F 0x24C95 +0x5540 0x24C91 +0x5541 0x24C9D +0x5542 0x24C99 +0x5543 0x24C9B +0x5544 0x24C9C +0x5545 0x24D1D +0x5546 0x24D1C +0x5547 0x24DD0 +0x5548 0x24DE0 +0x5549 0x24DCB +0x554A 0x24DDB +0x554B 0x24DDA +0x554C 0x24DC2 +0x554D 0x24DD3 +0x554E 0x24DE5 +0x554F 0x24F7D +0x5550 0x24F7B +0x5551 0x24FFF +0x5553 0x24FF9 +0x5554 0x25077 +0x5555 0x2507C +0x5556 0x25078 +0x5557 0x2507B +0x5558 0x2507A +0x5559 0x251D2 +0x555A 0x251CB +0x555B 0x251C9 +0x555C 0x251CE +0x555D 0x251E4 +0x555E 0x251CA +0x555F 0x251D0 +0x5560 0x22FA5 +0x5562 0x251D9 +0x5563 0x251EE +0x5564 0x251DD +0x5565 0x25200 +0x5566 0x251E1 +0x5567 0x253DE +0x5568 0x253E2 +0x5569 0x253DA +0x556A 0x254CE +0x556B 0x2F94F +0x556C 0x254CF +0x556D 0x254DA +0x556E 0x254D1 +0x556F 0x254D4 +0x5570 0x254ED +0x5571 0x254CB +0x5572 0x254D5 +0x5573 0x254F1 +0x5574 0x2569C +0x5575 0x25688 +0x5576 0x25741 +0x5577 0x257D0 +0x5578 0x257F7 +0x5579 0x257CF +0x557A 0x257D1 +0x557B 0x257DB +0x557C 0x257DE +0x557D 0x257F8 +0x557E 0x257DC +0x5621 0x257D9 +0x5622 0x259A0 +0x5623 0x259B2 +0x5624 0x259A1 +0x5625 0x259AA +0x5626 0x259A9 +0x5628 0x259A6 +0x5629 0x2599C +0x562A 0x259B5 +0x562B 0x259A7 +0x562C 0x25A8E +0x562D 0x25A90 +0x562E 0x25A91 +0x562F 0x25B85 +0x5630 0x25B5B +0x5631 0x25B70 +0x5632 0x25B64 +0x5633 0x25B67 +0x5634 0x25B63 +0x5635 0x25B77 +0x5636 0x25B68 +0x5637 0x25B65 +0x5638 0x25B6A +0x5639 0x25B78 +0x563A 0x25B66 +0x563B 0x25E88 +0x563C 0x25E9E +0x563D 0x25E74 +0x563E 0x25E7A +0x563F 0x25E79 +0x5640 0x25E8B +0x5641 0x25E7F +0x5642 0x26013 +0x5643 0x2601E +0x5644 0x26017 +0x5645 0x2601A +0x5646 0x26022 +0x5647 0x26043 +0x5648 0x26019 +0x5649 0x2601F +0x564A 0x26027 +0x564B 0x26012 +0x564C 0x26024 +0x564D 0x26025 +0x564E 0x2035E +0x564F 0x26235 +0x5650 0x26234 +0x5651 0x262D1 +0x5652 0x262C4 +0x5653 0x262CA +0x5654 0x262C6 +0x5655 0x262CB +0x5656 0x262CD +0x5657 0x262E2 +0x5658 0x26389 +0x5659 0x2638B +0x565A 0x26386 +0x565B 0x26388 +0x565C 0x2638D +0x565D 0x2643B +0x565E 0x2643C +0x565F 0x2643D +0x5660 0x264F5 +0x5661 0x26579 +0x5662 0x26575 +0x5663 0x26582 +0x5664 0x2657F +0x5665 0x26585 +0x5666 0x26576 +0x5667 0x2657C +0x5668 0x2657E +0x5669 0x2657B +0x566A 0x26580 +0x566B 0x2657A +0x566C 0x22548 +0x566E 0x2661D +0x566F 0x266F6 +0x5670 0x266F7 +0x5671 0x266F9 +0x5672 0x26763 +0x5673 0x2676C +0x5674 0x2676E +0x5675 0x26714 +0x5677 0x26767 +0x5678 0x2676F +0x5679 0x26769 +0x567A 0x26776 +0x567B 0x26795 +0x567C 0x26771 +0x567D 0x26761 +0x567E 0x26778 +0x5721 0x2676B +0x5722 0x26785 +0x5723 0x26784 +0x5724 0x26914 +0x5725 0x26976 +0x5726 0x259B6 +0x5727 0x26975 +0x5728 0x26974 +0x5729 0x269E2 +0x572A 0x26A3F +0x572B 0x26A44 +0x572C 0x26A3D +0x572D 0x26A47 +0x572E 0x26A48 +0x572F 0x26ADB +0x5730 0x26ADC +0x5731 0x26ADD +0x5732 0x26BE5 +0x5733 0x26BE6 +0x5734 0x26CC2 +0x5735 0x26D2E +0x5736 0x26D1D +0x5737 0x26CF8 +0x5738 0x26CF0 +0x5739 0x26CF6 +0x573A 0x26CC5 +0x573B 0x26CC6 +0x573C 0x26CFC +0x573D 0x26D52 +0x573E 0x26D2F +0x573F 0x26D10 +0x5740 0x26CF3 +0x5741 0x26CD2 +0x5742 0x26CEA +0x5743 0x26CDC +0x5744 0x26D1B +0x5745 0x26CFB +0x5746 0x26CC3 +0x5747 0x26D16 +0x5748 0x26D07 +0x5749 0x26CC9 +0x574A 0x26CD8 +0x574B 0x26D30 +0x574C 0x26D13 +0x574D 0x26D31 +0x574E 0x26CFA +0x574F 0x26CF2 +0x5750 0x26DE3 +0x5751 0x26CD5 +0x5752 0x26D01 +0x5753 0x26CF1 +0x5754 0x26D1C +0x5755 0x26CD6 +0x5756 0x26D08 +0x5757 0x26D0B +0x5758 0x26D17 +0x5759 0x26D20 +0x575A 0x26CCA +0x575B 0x26D32 +0x575C 0x26D05 +0x575D 0x26CE4 +0x575E 0x26CCE +0x575F 0x26D33 +0x5760 0x26D02 +0x5761 0x26D19 +0x5762 0x26D1E +0x5763 0x26CD3 +0x5764 0x26CF7 +0x5765 0x26CE8 +0x5766 0x26D1F +0x5767 0x26CF4 +0x5768 0x26DD8 +0x5769 0x271BF +0x576A 0x271BE +0x576B 0x271BD +0x576C 0x272DC +0x576D 0x272DD +0x576E 0x272AB +0x576F 0x272C9 +0x5770 0x272C8 +0x5771 0x272DF +0x5772 0x272D9 +0x5773 0x272DB +0x5774 0x272CC +0x5775 0x272E0 +0x5776 0x272EF +0x5777 0x272F3 +0x5778 0x272AE +0x5779 0x27301 +0x577A 0x275B7 +0x577B 0x275B9 +0x577C 0x275B6 +0x577D 0x275B8 +0x577E 0x275F6 +0x5821 0x275F3 +0x5822 0x275F5 +0x5823 0x275F2 +0x5824 0x27691 +0x5825 0x2769D +0x5826 0x2769B +0x5827 0x27692 +0x5828 0x2768D +0x5829 0x2769E +0x582A 0x2768C +0x582C 0x2F9C7 +0x582D 0x27695 +0x582E 0x2F9C6 +0x582F 0x2768A +0x5830 0x2768E +0x5831 0x2769C +0x5832 0x277EF +0x5833 0x2782D +0x5834 0x27852 +0x5835 0x27835 +0x5836 0x27828 +0x5837 0x2782E +0x5838 0x278E5 +0x5839 0x279EA +0x583A 0x279F1 +0x583B 0x279EB +0x583C 0x279D8 +0x583D 0x279D0 +0x583E 0x279F3 +0x583F 0x279DB +0x5840 0x279CE +0x5842 0x279DA +0x5843 0x279D7 +0x5844 0x279E1 +0x5845 0x279F2 +0x5846 0x279C8 +0x5847 0x279D9 +0x5848 0x279DE +0x5849 0x279D1 +0x584A 0x279E7 +0x584B 0x279CF +0x584C 0x27BB7 +0x584D 0x27C47 +0x584E 0x27C42 +0x584F 0x27C43 +0x5850 0x2F9D3 +0x5851 0x27CC3 +0x5852 0x27CC1 +0x5853 0x27CC7 +0x5854 0x27D64 +0x5855 0x27D6A +0x5856 0x27D66 +0x5857 0x27D50 +0x5858 0x27D6E +0x5859 0x27D65 +0x585A 0x238EC +0x585B 0x27D7F +0x585C 0x2F9D5 +0x585D 0x27D9A +0x585E 0x27D69 +0x585F 0x27D72 +0x5860 0x27D6F +0x5861 0x27D7D +0x5862 0x27D70 +0x5863 0x27E60 +0x5864 0x27EC2 +0x5865 0x27EE7 +0x5866 0x27ED1 +0x5867 0x27EEB +0x5868 0x27ED4 +0x5869 0x27EDC +0x586A 0x27EDB +0x586B 0x28037 +0x586C 0x28025 +0x586D 0x2801F +0x586E 0x2801E +0x586F 0x28021 +0x5870 0x2801B +0x5871 0x28017 +0x5872 0x28022 +0x5873 0x2802A +0x5874 0x2801A +0x5875 0x2802D +0x5876 0x28023 +0x5877 0x28026 +0x5878 0x28036 +0x5879 0x27FFF +0x587A 0x2823A +0x587B 0x28240 +0x587C 0x28242 +0x587D 0x28238 +0x587E 0x2823B +0x5921 0x2823C +0x5922 0x28243 +0x5923 0x282E8 +0x5925 0x282F9 +0x5926 0x282EB +0x5927 0x282F1 +0x5928 0x282E9 +0x5929 0x282EC +0x592A 0x28415 +0x592B 0x28447 +0x592C 0x28446 +0x592D 0x28445 +0x592E 0x28524 +0x592F 0x28556 +0x5930 0x28521 +0x5931 0x28527 +0x5932 0x2854D +0x5933 0x28531 +0x5934 0x2851E +0x5935 0x2852C +0x5936 0x2854F +0x5937 0x2852B +0x5938 0x28553 +0x5939 0x28551 +0x593A 0x28554 +0x593B 0x28529 +0x593C 0x28550 +0x593D 0x2851F +0x593E 0x28532 +0x593F 0x2852A +0x5940 0x2851D +0x5941 0x28528 +0x5942 0x2852E +0x5943 0x2852D +0x5944 0x286BC +0x5945 0x286BB +0x5946 0x286BD +0x5947 0x2F9E4 +0x5948 0x28747 +0x5949 0x28741 +0x594A 0x2F9E5 +0x594B 0x28749 +0x594D 0x2882E +0x594E 0x28827 +0x594F 0x2896A +0x5950 0x2897B +0x5951 0x28973 +0x5952 0x28975 +0x5953 0x28969 +0x5954 0x28979 +0x5955 0x28972 +0x5956 0x28C76 +0x5957 0x28C77 +0x5958 0x28C74 +0x5959 0x28C73 +0x595A 0x28D02 +0x595B 0x28CFE +0x595C 0x28D01 +0x595D 0x28CF9 +0x595E 0x28CF4 +0x595F 0x28ED3 +0x5960 0x28ED5 +0x5961 0x28ED8 +0x5962 0x28EC3 +0x5963 0x28ECA +0x5964 0x28ED0 +0x5965 0x28ECB +0x5966 0x28ECE +0x5967 0x28EC5 +0x5968 0x28EE6 +0x5969 0x28EC4 +0x596A 0x28EC0 +0x596B 0x28ED4 +0x596C 0x28EE8 +0x596D 0x28F76 +0x596E 0x28FA2 +0x596F 0x28FAE +0x5970 0x28FA8 +0x5971 0x28FA3 +0x5972 0x28FA7 +0x5973 0x28F96 +0x5974 0x28FA9 +0x5975 0x28FA5 +0x5976 0x28FAF +0x5977 0x28FA4 +0x5978 0x28FAB +0x5979 0x28FAA +0x597A 0x28FA6 +0x597B 0x28FA0 +0x597C 0x29098 +0x597D 0x291DB +0x597E 0x291F6 +0x5A21 0x291F5 +0x5A22 0x2920C +0x5A23 0x2920A +0x5A25 0x29268 +0x5A26 0x29263 +0x5A27 0x29266 +0x5A29 0x29264 +0x5A2A 0x2926A +0x5A2B 0x29269 +0x5A2C 0x29395 +0x5A2D 0x29402 +0x5A2E 0x2946A +0x5A2F 0x2945E +0x5A30 0x29468 +0x5A31 0x29469 +0x5A32 0x29465 +0x5A33 0x2F9FE +0x5A34 0x295A7 +0x5A35 0x295AE +0x5A36 0x295A8 +0x5A37 0x295B3 +0x5A38 0x2969C +0x5A39 0x296A9 +0x5A3A 0x296B6 +0x5A3B 0x296B3 +0x5A3C 0x296B2 +0x5A3D 0x2FA03 +0x5A3E 0x296B8 +0x5A3F 0x296C0 +0x5A40 0x296BF +0x5A41 0x296BA +0x5A42 0x296A8 +0x5A43 0x2983C +0x5A44 0x29872 +0x5A45 0x29871 +0x5A46 0x29875 +0x5A47 0x29873 +0x5A48 0x29A17 +0x5A49 0x29A15 +0x5A4A 0x29A16 +0x5A4B 0x29A1B +0x5A4C 0x29AFA +0x5A4D 0x29AF9 +0x5A4E 0x29C2C +0x5A4F 0x29C85 +0x5A50 0x29C82 +0x5A51 0x29C7F +0x5A52 0x29C7D +0x5A53 0x29C88 +0x5A54 0x242F3 +0x5A55 0x29D4E +0x5A56 0x29D50 +0x5A57 0x29F93 +0x5A58 0x29F97 +0x5A59 0x29F98 +0x5A5A 0x29F9B +0x5A5B 0x29F9C +0x5A5C 0x29F96 +0x5A5D 0x2A28B +0x5A5E 0x2A2FD +0x5A5F 0x2A2FC +0x5A60 0x2FA17 +0x5A61 0x2398B +0x5A62 0x20108 +0x5A63 0x20107 +0x5A64 0x20373 +0x5A65 0x203A2 +0x5A66 0x203AF +0x5A67 0x20382 +0x5A68 0x2037B +0x5A69 0x20374 +0x5A6A 0x203B0 +0x5A6B 0x20376 +0x5A6C 0x203B9 +0x5A6D 0x2039E +0x5A6E 0x203B1 +0x5A6F 0x203A1 +0x5A70 0x203B2 +0x5A71 0x2036E +0x5A72 0x2F80B +0x5A74 0x20378 +0x5A75 0x2037A +0x5A76 0x20383 +0x5A77 0x2039A +0x5A78 0x204F8 +0x5A79 0x20531 +0x5A7A 0x20569 +0x5A7B 0x20568 +0x5A7C 0x2059C +0x5A7D 0x20604 +0x5A7E 0x20699 +0x5B21 0x207C7 +0x5B22 0x207C6 +0x5B23 0x207DC +0x5B24 0x207C4 +0x5B25 0x207D8 +0x5B26 0x207D4 +0x5B27 0x207DF +0x5B28 0x207D1 +0x5B29 0x207D0 +0x5B2A 0x207D6 +0x5B2B 0x207CF +0x5B2C 0x208AD +0x5B2D 0x208AF +0x5B2E 0x208A7 +0x5B2F 0x208FD +0x5B30 0x2095B +0x5B31 0x2095A +0x5B32 0x20A07 +0x5B33 0x20A9D +0x5B34 0x20A9B +0x5B35 0x20AAB +0x5B36 0x20AA4 +0x5B37 0x20A9C +0x5B38 0x20A9E +0x5B39 0x20AA5 +0x5B3A 0x20AAA +0x5B3B 0x20AA6 +0x5B3C 0x20B0E +0x5B3D 0x20B7E +0x5B3E 0x20B7C +0x5B3F 0x20EEE +0x5B40 0x20ED5 +0x5B41 0x20EE9 +0x5B42 0x20E42 +0x5B43 0x20EE2 +0x5B44 0x20F23 +0x5B45 0x20ED9 +0x5B46 0x20ED4 +0x5B47 0x20EE3 +0x5B48 0x20F15 +0x5B49 0x20EEF +0x5B4A 0x20EF0 +0x5B4B 0x20ED6 +0x5B4C 0x20EDD +0x5B4D 0x20EF6 +0x5B4E 0x20F1C +0x5B4F 0x20ED8 +0x5B50 0x20EDB +0x5B51 0x20EDA +0x5B52 0x20EED +0x5B53 0x21411 +0x5B54 0x21215 +0x5B55 0x21218 +0x5B56 0x2121A +0x5B57 0x2121F +0x5B58 0x21216 +0x5B59 0x2F84D +0x5B5A 0x21219 +0x5B5B 0x2F84B +0x5B5C 0x213F0 +0x5B5D 0x21409 +0x5B5E 0x2141B +0x5B5F 0x27BE7 +0x5B60 0x213F6 +0x5B61 0x213F4 +0x5B62 0x213B5 +0x5B63 0x21410 +0x5B64 0x213F2 +0x5B65 0x21415 +0x5B66 0x213F3 +0x5B67 0x213F8 +0x5B68 0x21539 +0x5B69 0x2153B +0x5B6A 0x21536 +0x5B6B 0x2140E +0x5B6C 0x21572 +0x5B6D 0x21574 +0x5B6E 0x215B9 +0x5B6F 0x215B7 +0x5B70 0x215B8 +0x5B71 0x21672 +0x5B72 0x2166B +0x5B73 0x2181D +0x5B74 0x21837 +0x5B75 0x21822 +0x5B76 0x21843 +0x5B77 0x2184D +0x5B78 0x21838 +0x5B79 0x2185B +0x5B7A 0x21879 +0x5B7B 0x2181B +0x5B7C 0x217F3 +0x5B7D 0x21991 +0x5B7E 0x21A7B +0x5C21 0x21A94 +0x5C22 0x2F86F +0x5C23 0x21A96 +0x5C24 0x21A7F +0x5C25 0x21A8F +0x5C26 0x21A84 +0x5C27 0x21A7C +0x5C28 0x21A8E +0x5C29 0x21A90 +0x5C2A 0x21A98 +0x5C2B 0x21A83 +0x5C2C 0x21A80 +0x5C2D 0x21A93 +0x5C2E 0x21A82 +0x5C30 0x21B3D +0x5C31 0x21B41 +0x5C32 0x21BA1 +0x5C33 0x21B9F +0x5C34 0x21C0A +0x5C35 0x21C0D +0x5C36 0x21CC8 +0x5C37 0x21CC9 +0x5C38 0x21CC7 +0x5C39 0x21CCD +0x5C3A 0x21D25 +0x5C3B 0x21EB1 +0x5C3C 0x21EDC +0x5C3D 0x2F880 +0x5C3E 0x21EE5 +0x5C3F 0x21EF4 +0x5C40 0x21EBF +0x5C41 0x21EDB +0x5C42 0x21EEA +0x5C43 0x21EF2 +0x5C45 0x21EF1 +0x5C46 0x21EED +0x5C47 0x21EE6 +0x5C48 0x22002 +0x5C49 0x2F882 +0x5C4A 0x22125 +0x5C4B 0x22118 +0x5C4C 0x2211F +0x5C4D 0x22120 +0x5C4E 0x221CF +0x5C4F 0x2229D +0x5C50 0x22299 +0x5C51 0x222A8 +0x5C52 0x22368 +0x5C53 0x22366 +0x5C54 0x22367 +0x5C55 0x22391 +0x5C56 0x22413 +0x5C57 0x22415 +0x5C58 0x2241D +0x5C59 0x22416 +0x5C5A 0x22419 +0x5C5B 0x2246B +0x5C5C 0x22468 +0x5C5D 0x2246A +0x5C5E 0x2246D +0x5C5F 0x22469 +0x5C60 0x224AA +0x5C61 0x22557 +0x5C62 0x22552 +0x5C63 0x22550 +0x5C64 0x2255F +0x5C65 0x22567 +0x5C66 0x2254F +0x5C68 0x2255B +0x5C69 0x2255C +0x5C6A 0x2255D +0x5C6B 0x2281F +0x5C6C 0x2279D +0x5C6D 0x227B1 +0x5C6E 0x227B0 +0x5C6F 0x22794 +0x5C70 0x227C3 +0x5C71 0x227AF +0x5C72 0x227A8 +0x5C73 0x227DC +0x5C74 0x22798 +0x5C75 0x227C4 +0x5C76 0x227A4 +0x5C77 0x227AB +0x5C78 0x227AA +0x5C79 0x227A5 +0x5C7A 0x22821 +0x5C7B 0x227EB +0x5C7C 0x227E6 +0x5C7D 0x227F7 +0x5C7E 0x227F8 +0x5D21 0x227FC +0x5D22 0x227FA +0x5D23 0x227E0 +0x5D24 0x2F8AA +0x5D25 0x227F6 +0x5D26 0x2F8A9 +0x5D27 0x227E1 +0x5D28 0x229EC +0x5D29 0x229E2 +0x5D2A 0x229E4 +0x5D2B 0x229F9 +0x5D2C 0x22C6F +0x5D2D 0x23A4C +0x5D2E 0x22CBB +0x5D2F 0x22CE1 +0x5D30 0x22D00 +0x5D31 0x22CD8 +0x5D33 0x22CD6 +0x5D34 0x22CE2 +0x5D35 0x22CC3 +0x5D36 0x22CB3 +0x5D37 0x22CD2 +0x5D38 0x2F8C1 +0x5D39 0x22CCE +0x5D3A 0x22CD0 +0x5D3B 0x22CD5 +0x5D3C 0x22CB9 +0x5D3D 0x22CBA +0x5D3E 0x22CCF +0x5D3F 0x22CBD +0x5D40 0x22EDB +0x5D41 0x22FAA +0x5D42 0x22FAD +0x5D43 0x22FB8 +0x5D44 0x22FB6 +0x5D45 0x22FB5 +0x5D46 0x22FAF +0x5D47 0x22FB4 +0x5D48 0x22FB7 +0x5D49 0x22FA8 +0x5D4A 0x22FB9 +0x5D4B 0x22FBE +0x5D4C 0x23082 +0x5D4D 0x230BC +0x5D4E 0x230B8 +0x5D4F 0x230B6 +0x5D50 0x230B9 +0x5D52 0x23110 +0x5D53 0x23227 +0x5D54 0x23269 +0x5D55 0x23270 +0x5D56 0x23256 +0x5D57 0x2326B +0x5D58 0x2327A +0x5D59 0x2326C +0x5D5A 0x2326D +0x5D5B 0x2F8D5 +0x5D5C 0x267C1 +0x5D5D 0x2338D +0x5D5E 0x23390 +0x5D5F 0x235B6 +0x5D60 0x23610 +0x5D61 0x23612 +0x5D62 0x235BA +0x5D63 0x235BD +0x5D64 0x23605 +0x5D65 0x235C2 +0x5D66 0x23607 +0x5D67 0x235F5 +0x5D68 0x2F8E9 +0x5D69 0x235AF +0x5D6A 0x235F4 +0x5D6B 0x235F7 +0x5D6C 0x235F8 +0x5D6D 0x23611 +0x5D6E 0x238F6 +0x5D6F 0x238F5 +0x5D70 0x238FB +0x5D71 0x23901 +0x5D72 0x23900 +0x5D73 0x23902 +0x5D74 0x238FE +0x5D75 0x238FA +0x5D76 0x238FD +0x5D78 0x23A37 +0x5D79 0x23A49 +0x5D7A 0x23A4B +0x5D7B 0x23A46 +0x5D7C 0x23A47 +0x5D7D 0x23AB3 +0x5D7E 0x23AB2 +0x5E21 0x23AB0 +0x5E22 0x23AB7 +0x5E23 0x23B11 +0x5E24 0x23BCC +0x5E25 0x23BDF +0x5E26 0x23BD3 +0x5E27 0x23BD5 +0x5E28 0x23BDB +0x5E29 0x23BC5 +0x5E2A 0x23BC8 +0x5E2B 0x23BC9 +0x5E2C 0x23BE2 +0x5E2D 0x23BCA +0x5E2E 0x23BD1 +0x5E2F 0x23BD2 +0x5E30 0x23BDD +0x5E31 0x23E6C +0x5E32 0x23E73 +0x5E33 0x23F21 +0x5E34 0x23EF0 +0x5E35 0x23F1F +0x5E36 0x23F3B +0x5E37 0x23F22 +0x5E38 0x23F23 +0x5E39 0x23EE8 +0x5E3A 0x23EDD +0x5E3C 0x23F1B +0x5E3D 0x23EED +0x5E3E 0x2F90E +0x5E3F 0x23EF2 +0x5E41 0x23EDC +0x5E42 0x23EE9 +0x5E43 0x23F1D +0x5E44 0x23EDA +0x5E45 0x23EE6 +0x5E46 0x24313 +0x5E47 0x24315 +0x5E48 0x24316 +0x5E49 0x2433C +0x5E4A 0x2430B +0x5E4B 0x2431C +0x5E4C 0x2433A +0x5E4D 0x2433D +0x5E4E 0x2439A +0x5E4F 0x2431D +0x5E50 0x24309 +0x5E51 0x24308 +0x5E52 0x2433B +0x5E53 0x24522 +0x5E54 0x24526 +0x5E55 0x24525 +0x5E56 0x24524 +0x5E57 0x2039B +0x5E58 0x2458F +0x5E59 0x24590 +0x5E5A 0x245E6 +0x5E5B 0x245E3 +0x5E5C 0x245E5 +0x5E5D 0x24611 +0x5E5E 0x2F925 +0x5E5F 0x246AE +0x5E60 0x246BE +0x5E61 0x246B4 +0x5E62 0x246B3 +0x5E63 0x246AF +0x5E64 0x24691 +0x5E65 0x246C2 +0x5E66 0x246B6 +0x5E67 0x246B2 +0x5E68 0x24857 +0x5E69 0x2483B +0x5E6A 0x24858 +0x5E6B 0x24851 +0x5E6C 0x24841 +0x5E6D 0x24839 +0x5E6F 0x24859 +0x5E70 0x24845 +0x5E71 0x24861 +0x5E72 0x248E8 +0x5E73 0x249FA +0x5E74 0x249EA +0x5E75 0x249EF +0x5E76 0x249F2 +0x5E77 0x249F0 +0x5E78 0x24B08 +0x5E79 0x24B70 +0x5E7A 0x24B6A +0x5E7B 0x24B73 +0x5E7C 0x24B68 +0x5E7D 0x24BC8 +0x5E7E 0x24BF2 +0x5F21 0x20B7B +0x5F22 0x24CAE +0x5F23 0x24CAB +0x5F24 0x24CB5 +0x5F25 0x24CAF +0x5F26 0x24CB2 +0x5F27 0x24CB6 +0x5F28 0x24CB0 +0x5F29 0x24D1E +0x5F2A 0x24E03 +0x5F2B 0x24E06 +0x5F2C 0x24E1F +0x5F2E 0x24E0F +0x5F2F 0x24E02 +0x5F30 0x24E19 +0x5F31 0x24E18 +0x5F32 0x24E22 +0x5F33 0x24E15 +0x5F34 0x24E07 +0x5F35 0x24E0D +0x5F36 0x24E24 +0x5F37 0x24E0C +0x5F38 0x24E1E +0x5F39 0x24F89 +0x5F3A 0x24F8A +0x5F3B 0x2500A +0x5F3C 0x2500B +0x5F3D 0x25007 +0x5F3E 0x25004 +0x5F3F 0x25009 +0x5F40 0x25084 +0x5F41 0x25083 +0x5F42 0x25218 +0x5F43 0x25214 +0x5F44 0x25205 +0x5F45 0x25216 +0x5F46 0x2520E +0x5F47 0x25211 +0x5F48 0x25208 +0x5F49 0x2520B +0x5F4A 0x25215 +0x5F4B 0x25085 +0x5F4C 0x25237 +0x5F4D 0x2522A +0x5F4E 0x2520D +0x5F4F 0x2520F +0x5F50 0x2537E +0x5F51 0x25376 +0x5F52 0x25377 +0x5F53 0x253EC +0x5F54 0x254FC +0x5F55 0x25508 +0x5F56 0x254FF +0x5F57 0x25503 +0x5F58 0x25510 +0x5F59 0x25505 +0x5F5A 0x25506 +0x5F5B 0x254FA +0x5F5C 0x256C7 +0x5F5D 0x256C0 +0x5F5E 0x256C3 +0x5F5F 0x256A7 +0x5F60 0x256A8 +0x5F61 0x256AB +0x5F62 0x256C1 +0x5F63 0x256AA +0x5F64 0x256C8 +0x5F65 0x25743 +0x5F66 0x25802 +0x5F67 0x2580E +0x5F68 0x25801 +0x5F69 0x257FE +0x5F6A 0x25803 +0x5F6C 0x25822 +0x5F6D 0x25821 +0x5F6E 0x25807 +0x5F6F 0x25808 +0x5F70 0x2580C +0x5F71 0x259CA +0x5F72 0x259BC +0x5F73 0x259BE +0x5F74 0x259BD +0x5F75 0x2F95C +0x5F76 0x259BB +0x5F77 0x259B9 +0x5F79 0x259C5 +0x5F7A 0x25A99 +0x5F7B 0x25B6B +0x5F7C 0x25B93 +0x5F7D 0x25B94 +0x5F7E 0x25BA9 +0x6021 0x25BA0 +0x6022 0x25BA6 +0x6023 0x2F961 +0x6024 0x25BAB +0x6025 0x25B9E +0x6026 0x25B9B +0x6027 0x25B91 +0x6028 0x25B99 +0x6029 0x25EB6 +0x602A 0x25EB8 +0x602B 0x25E9A +0x602D 0x25E98 +0x602E 0x25E9B +0x602F 0x25EB3 +0x6030 0x25EA2 +0x6031 0x222AA +0x6032 0x25EA0 +0x6033 0x25E9F +0x6034 0x2605B +0x6035 0x26070 +0x6036 0x26054 +0x6037 0x26071 +0x6038 0x26065 +0x6039 0x26051 +0x603A 0x2609D +0x603B 0x26061 +0x603C 0x2605A +0x603D 0x26074 +0x603E 0x2604C +0x603F 0x2604B +0x6040 0x2605E +0x6041 0x26058 +0x6042 0x26053 +0x6043 0x26052 +0x6044 0x2623B +0x6045 0x26239 +0x6046 0x262D6 +0x6047 0x262E7 +0x6048 0x262D7 +0x6049 0x262D8 +0x604A 0x262D9 +0x604B 0x262DA +0x604C 0x262DB +0x604D 0x262DC +0x604E 0x262E0 +0x604F 0x262E4 +0x6050 0x262DD +0x6051 0x262F5 +0x6052 0x262F1 +0x6053 0x26398 +0x6054 0x2639D +0x6055 0x26399 +0x6056 0x26450 +0x6057 0x26449 +0x6059 0x26462 +0x605A 0x264D7 +0x605B 0x26501 +0x605C 0x264F7 +0x605D 0x2F97D +0x605E 0x2658C +0x605F 0x2659C +0x6061 0x2661F +0x6062 0x2661E +0x6063 0x2673D +0x6064 0x2673F +0x6065 0x26711 +0x6066 0x26759 +0x6067 0x2673E +0x6068 0x26758 +0x6069 0x26800 +0x606A 0x2679E +0x606B 0x267B6 +0x606C 0x267AA +0x606D 0x267AF +0x606E 0x267AC +0x6070 0x267C0 +0x6071 0x267A9 +0x6072 0x20B10 +0x6073 0x268EE +0x6074 0x26977 +0x6075 0x26979 +0x6076 0x2697A +0x6077 0x2697D +0x6078 0x2697F +0x6079 0x26983 +0x607A 0x26978 +0x607B 0x2697E +0x607C 0x269E4 +0x607D 0x269E6 +0x607E 0x269E5 +0x6122 0x26A4E +0x6123 0x26A59 +0x6125 0x2F98E +0x6126 0x26A4F +0x6127 0x26A4A +0x6128 0x26AE3 +0x6129 0x26ADE +0x612A 0x26AE2 +0x612B 0x26C74 +0x612C 0x26CAC +0x612D 0x26C61 +0x612E 0x26C62 +0x612F 0x26C76 +0x6130 0x26C7A +0x6131 0x26C79 +0x6132 0x26C60 +0x6133 0x26D64 +0x6134 0x26E81 +0x6135 0x26DDF +0x6136 0x26D84 +0x6137 0x26D8A +0x6138 0x26D92 +0x6139 0x26D79 +0x613A 0x26DDE +0x613B 0x26D98 +0x613C 0x26D6C +0x613D 0x26DE1 +0x613E 0x2F9A5 +0x613F 0x26D7C +0x6140 0x26D72 +0x6141 0x26D81 +0x6142 0x26DE0 +0x6143 0x26D65 +0x6145 0x26D6A +0x6146 0x26D97 +0x6147 0x26DAA +0x6148 0x26DD3 +0x6149 0x26DAB +0x614A 0x26D6E +0x614B 0x26DAC +0x614C 0x26D76 +0x614D 0x26D7B +0x614E 0x26DAD +0x614F 0x2F9A6 +0x6150 0x26D94 +0x6151 0x26DD7 +0x6152 0x26D70 +0x6153 0x26DD5 +0x6154 0x26DF1 +0x6155 0x26D7A +0x6156 0x26D68 +0x6157 0x26D96 +0x6159 0x26D73 +0x615A 0x26DAE +0x615B 0x26DDD +0x615C 0x26DDA +0x615D 0x26DAF +0x615E 0x26DB0 +0x615F 0x26DDB +0x6160 0x26D62 +0x6161 0x26DF8 +0x6162 0x271C2 +0x6163 0x271C7 +0x6164 0x271C8 +0x6165 0x271C5 +0x6166 0x271C3 +0x6167 0x271C6 +0x6168 0x272DE +0x616A 0x27311 +0x616B 0x27315 +0x616C 0x27328 +0x616D 0x27321 +0x616E 0x2732D +0x616F 0x27351 +0x6170 0x2732B +0x6171 0x27316 +0x6172 0x27324 +0x6173 0x27335 +0x6174 0x2731F +0x6175 0x27312 +0x6176 0x27310 +0x6177 0x27380 +0x6178 0x2733B +0x6179 0x27329 +0x617A 0x2732A +0x617B 0x2731B +0x617C 0x27318 +0x617D 0x27320 +0x617E 0x2733F +0x6221 0x2731C +0x6222 0x27326 +0x6223 0x2730B +0x6224 0x275BE +0x6225 0x275C4 +0x6226 0x275BD +0x6227 0x275FA +0x6228 0x275FB +0x6229 0x276B1 +0x622A 0x276B2 +0x622B 0x276B0 +0x622C 0x276B9 +0x622D 0x276A6 +0x622E 0x276BD +0x622F 0x276B6 +0x6230 0x276B8 +0x6231 0x276B4 +0x6232 0x276B3 +0x6233 0x276A7 +0x6234 0x276AE +0x6235 0x276BC +0x6236 0x277F2 +0x6237 0x277F3 +0x6238 0x277F4 +0x6239 0x2783B +0x623A 0x27840 +0x623B 0x27846 +0x623C 0x278F0 +0x623D 0x278EE +0x623E 0x278E8 +0x623F 0x278F1 +0x6240 0x278EB +0x6241 0x278EF +0x6242 0x279FC +0x6243 0x27A20 +0x6244 0x27A09 +0x6245 0x27A06 +0x6246 0x27A03 +0x6247 0x2F9CF +0x6248 0x27A19 +0x6249 0x27A24 +0x624A 0x27A1B +0x624B 0x27A1D +0x624C 0x279FD +0x624D 0x27A1E +0x624E 0x279F4 +0x624F 0x27A01 +0x6250 0x27A08 +0x6251 0x27A05 +0x6252 0x27A23 +0x6253 0x279FF +0x6254 0x27BEA +0x6255 0x27C4D +0x6256 0x27C4E +0x6257 0x27C56 +0x6258 0x27C57 +0x6259 0x27C51 +0x625A 0x27C55 +0x625B 0x27C54 +0x625C 0x27CCB +0x625D 0x27CD4 +0x625E 0x27CD1 +0x625F 0x27CCF +0x6260 0x27CD2 +0x6261 0x27CCA +0x6262 0x27CD6 +0x6263 0x27D8B +0x6264 0x27D88 +0x6265 0x27D85 +0x6266 0x27D89 +0x6267 0x21A9B +0x6268 0x27DBB +0x6269 0x27D8C +0x626B 0x27D99 +0x626C 0x27D8A +0x626D 0x27EEC +0x626E 0x27EEF +0x626F 0x27EF9 +0x6270 0x27F09 +0x6271 0x27EF8 +0x6272 0x27EF3 +0x6273 0x27F00 +0x6274 0x27F1D +0x6276 0x27EFD +0x6277 0x28048 +0x6278 0x2805C +0x6279 0x28055 +0x627A 0x2805E +0x627B 0x28049 +0x627C 0x28063 +0x627D 0x28060 +0x627E 0x28053 +0x6321 0x28062 +0x6322 0x28040 +0x6323 0x28249 +0x6324 0x2824A +0x6325 0x2824C +0x6326 0x2824D +0x6327 0x2830A +0x6328 0x28306 +0x6329 0x2832F +0x632A 0x28321 +0x632B 0x28307 +0x632C 0x28309 +0x632D 0x28302 +0x632E 0x28316 +0x632F 0x28303 +0x6330 0x2830B +0x6331 0x2830F +0x6332 0x28560 +0x6333 0x28568 +0x6334 0x2855E +0x6335 0x2855D +0x6336 0x28563 +0x6337 0x2855F +0x6338 0x28564 +0x6339 0x28578 +0x633A 0x28561 +0x633B 0x28569 +0x633C 0x28565 +0x633D 0x286DA +0x633E 0x286E6 +0x633F 0x286DB +0x6340 0x286DC +0x6341 0x28739 +0x6342 0x28757 +0x6343 0x28755 +0x6344 0x28765 +0x6345 0x28761 +0x6346 0x28754 +0x6347 0x28845 +0x6348 0x28841 +0x6349 0x2883E +0x634A 0x28837 +0x634B 0x28912 +0x634C 0x28913 +0x634D 0x2892C +0x634E 0x28996 +0x634F 0x2F9E9 +0x6350 0x2899C +0x6351 0x2899D +0x6352 0x28985 +0x6353 0x2F9E8 +0x6354 0x2899F +0x6355 0x289A3 +0x6356 0x28C82 +0x6357 0x28C83 +0x6358 0x2F9EE +0x6359 0x28D1D +0x635A 0x28D14 +0x635B 0x28D1F +0x635C 0x28D20 +0x635D 0x28E47 +0x635E 0x28E80 +0x635F 0x28EC9 +0x6360 0x28EF9 +0x6361 0x28F06 +0x6362 0x28EF0 +0x6363 0x28EF8 +0x6364 0x28EEF +0x6365 0x28EFD +0x6366 0x28EF1 +0x6367 0x28EFE +0x6368 0x28FB8 +0x6369 0x28FC0 +0x636A 0x28FC3 +0x636B 0x28FB5 +0x636C 0x28FB6 +0x636D 0x28FC9 +0x636E 0x2F9F3 +0x636F 0x28FBD +0x6370 0x28FBA +0x6371 0x28FBF +0x6372 0x28FB3 +0x6373 0x28FC6 +0x6374 0x28FB2 +0x6375 0x28FBC +0x6376 0x28FB7 +0x6377 0x28FB9 +0x6378 0x28FC8 +0x6379 0x290B5 +0x637A 0x290B3 +0x637C 0x290AC +0x637D 0x290A9 +0x637E 0x290AD +0x6421 0x29211 +0x6422 0x2920D +0x6423 0x29216 +0x6424 0x29289 +0x6425 0x2927C +0x6426 0x2928B +0x6427 0x2927B +0x6428 0x29288 +0x6429 0x29284 +0x642A 0x2939D +0x642B 0x29398 +0x642C 0x29488 +0x642D 0x29486 +0x642E 0x29482 +0x642F 0x2948B +0x6430 0x2F9FF +0x6431 0x29471 +0x6432 0x29472 +0x6433 0x29481 +0x6434 0x2948C +0x6435 0x29480 +0x6436 0x29489 +0x6437 0x295BB +0x6438 0x295C1 +0x6439 0x295BE +0x643A 0x2FA01 +0x643B 0x295BD +0x643C 0x296C1 +0x643D 0x296B4 +0x643E 0x296B7 +0x643F 0x296C8 +0x6441 0x296D3 +0x6442 0x296D0 +0x6443 0x296B0 +0x6444 0x296CA +0x6445 0x296CD +0x6446 0x29815 +0x6447 0x29819 +0x6448 0x29817 +0x6449 0x2983F +0x644A 0x29840 +0x644B 0x29844 +0x644C 0x2987C +0x644D 0x29878 +0x644E 0x29879 +0x644F 0x29888 +0x6450 0x2FA06 +0x6451 0x29889 +0x6452 0x2987D +0x6453 0x29A23 +0x6454 0x29A24 +0x6455 0x29A26 +0x6456 0x29A22 +0x6457 0x29A27 +0x6458 0x29A1F +0x6459 0x29AC9 +0x645A 0x29AC3 +0x645B 0x29B0A +0x645C 0x29B0B +0x645D 0x29B04 +0x645F 0x29B03 +0x6460 0x29B01 +0x6461 0x29B09 +0x6462 0x29C0F +0x6463 0x29C2E +0x6464 0x29C2D +0x6465 0x29C91 +0x6466 0x29C99 +0x6467 0x29C9E +0x6468 0x29C90 +0x6469 0x29C94 +0x646A 0x29C9D +0x646B 0x29C98 +0x646C 0x29C9B +0x646D 0x29C9C +0x646E 0x29C9A +0x646F 0x29D54 +0x6470 0x29F9D +0x6471 0x29F9F +0x6472 0x29FA3 +0x6473 0x29FA4 +0x6474 0x29FA5 +0x6475 0x2A302 +0x6476 0x2A417 +0x6477 0x2A41B +0x6478 0x2A419 +0x6479 0x2A4D1 +0x647A 0x21537 diff --git a/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane7.surrogates b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane7.surrogates new file mode 100644 index 00000000000..1ce4ff48d10 --- /dev/null +++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane7.surrogates @@ -0,0 +1,6388 @@ +0x2121 0x20055 +0x2122 0x20182 +0x2123 0x20189 +0x2124 0x20187 +0x2125 0x203BE +0x2126 0x203BD +0x2127 0x203CA +0x2128 0x203D4 +0x2129 0x203BC +0x212A 0x203C4 +0x212B 0x203C1 +0x212C 0x203C2 +0x212D 0x203D7 +0x212E 0x20370 +0x212F 0x203BA +0x2130 0x203E3 +0x2131 0x203BB +0x2132 0x204B1 +0x2133 0x204B6 +0x2134 0x204B0 +0x2135 0x2056C +0x2136 0x2060D +0x2137 0x20607 +0x2138 0x207F1 +0x2139 0x207F5 +0x213A 0x207ED +0x213B 0x207EF +0x213C 0x207EB +0x213D 0x207EC +0x213E 0x207EE +0x213F 0x20807 +0x2140 0x209C4 +0x2141 0x20A08 +0x2142 0x20AB3 +0x2143 0x20AAD +0x2144 0x20AB0 +0x2145 0x20B11 +0x2146 0x2018A +0x2147 0x20F83 +0x2148 0x20F7A +0x2149 0x20F82 +0x214A 0x20F68 +0x214B 0x20F71 +0x214C 0x20FB0 +0x214D 0x20FAF +0x214F 0x20F6C +0x2150 0x20F6F +0x2151 0x20F62 +0x2152 0x20F65 +0x2153 0x20F81 +0x2154 0x20F7F +0x2155 0x20F64 +0x2156 0x20F73 +0x2157 0x20F6E +0x2158 0x20F67 +0x2159 0x20F74 +0x215A 0x20F7D +0x215B 0x20F78 +0x215C 0x20F85 +0x215D 0x20FAA +0x215E 0x20F88 +0x215F 0x20FA6 +0x2160 0x2F84E +0x2161 0x20F8A +0x2162 0x20F84 +0x2164 0x21224 +0x2165 0x21222 +0x2166 0x21223 +0x2167 0x21432 +0x2168 0x2145B +0x2169 0x2144F +0x216B 0x21426 +0x216C 0x2143E +0x216D 0x21442 +0x216E 0x21447 +0x216F 0x21422 +0x2170 0x2069B +0x2171 0x2144A +0x2172 0x2141F +0x2173 0x21449 +0x2174 0x2142B +0x2175 0x21433 +0x2176 0x2F858 +0x2177 0x2142A +0x2178 0x21428 +0x2179 0x2153D +0x217A 0x2153C +0x217B 0x215BF +0x217C 0x21679 +0x217D 0x21680 +0x217E 0x2167C +0x2221 0x2167A +0x2222 0x21678 +0x2223 0x21882 +0x2224 0x2185C +0x2225 0x2185A +0x2226 0x2184B +0x2227 0x2187C +0x2228 0x2187F +0x2229 0x2181F +0x222A 0x21889 +0x222B 0x2188B +0x222C 0x21857 +0x222D 0x2187E +0x222E 0x2187D +0x222F 0x21853 +0x2230 0x21A9F +0x2231 0x21ABC +0x2232 0x21AA5 +0x2233 0x21A86 +0x2234 0x21ADC +0x2235 0x21AA4 +0x2236 0x21AB6 +0x2237 0x21AA2 +0x2238 0x21AB4 +0x2239 0x21B48 +0x223A 0x21B46 +0x223B 0x21BA7 +0x223C 0x21C14 +0x223D 0x21C12 +0x223E 0x21C11 +0x223F 0x21CE1 +0x2240 0x21CD0 +0x2241 0x21D26 +0x2242 0x21D28 +0x2243 0x21D29 +0x2244 0x21F2F +0x2245 0x21F0D +0x2246 0x21F25 +0x2247 0x21F14 +0x2248 0x21F3C +0x2249 0x21F0B +0x224A 0x21F11 +0x224B 0x21F30 +0x224C 0x21F18 +0x224D 0x21F19 +0x224E 0x21F36 +0x224F 0x21F17 +0x2250 0x21F10 +0x2251 0x21F15 +0x2252 0x22003 +0x2253 0x22029 +0x2254 0x2204C +0x2255 0x2213F +0x2256 0x2213E +0x2257 0x22134 +0x2258 0x22142 +0x2259 0x22135 +0x225A 0x207F3 +0x225B 0x221CD +0x225C 0x221D1 +0x225D 0x221D2 +0x225E 0x222AD +0x225F 0x222BA +0x2260 0x222C1 +0x2261 0x222BB +0x2262 0x222B4 +0x2263 0x222BC +0x2264 0x2236C +0x2265 0x22392 +0x2266 0x22421 +0x2267 0x22424 +0x2268 0x23F19 +0x2269 0x224AD +0x226A 0x224AE +0x226B 0x224AB +0x226C 0x224AC +0x226D 0x22570 +0x226E 0x22576 +0x226F 0x22571 +0x2270 0x22577 +0x2272 0x227EC +0x2273 0x2281C +0x2274 0x227FB +0x2275 0x227EE +0x2276 0x228E2 +0x2277 0x227FD +0x2278 0x2281E +0x2279 0x2283B +0x227A 0x2284A +0x227B 0x2F8AE +0x227D 0x2287D +0x227E 0x22856 +0x2321 0x22844 +0x2322 0x2284B +0x2323 0x229FA +0x2324 0x229E8 +0x2325 0x229F8 +0x2326 0x229FF +0x2327 0x229F7 +0x2328 0x229F6 +0x2329 0x229FE +0x232A 0x22A07 +0x232B 0x22A5D +0x232C 0x22CD4 +0x232D 0x2F8C3 +0x232E 0x22CC8 +0x232F 0x22CC5 +0x2330 0x2F8C0 +0x2331 0x22CC9 +0x2332 0x22D4D +0x2333 0x22D20 +0x2334 0x22D36 +0x2335 0x22D35 +0x2336 0x22D88 +0x2337 0x22D25 +0x2338 0x22D21 +0x2339 0x22D26 +0x233B 0x22D3F +0x233C 0x22D3B +0x233D 0x22D24 +0x233E 0x22D43 +0x233F 0x22D4E +0x2340 0x22D4F +0x2341 0x22D44 +0x2342 0x22D40 +0x2343 0x22D41 +0x2344 0x22D39 +0x2345 0x22D2B +0x2346 0x22EDD +0x2347 0x22EDE +0x2348 0x22FCD +0x2349 0x22FCB +0x234A 0x22FDB +0x234B 0x22FD8 +0x234C 0x22FD9 +0x234D 0x22FD2 +0x234E 0x22FCA +0x234F 0x22FD1 +0x2350 0x22FD4 +0x2351 0x22FF9 +0x2352 0x22FD0 +0x2353 0x2305E +0x2354 0x2305D +0x2355 0x2308A +0x2356 0x23114 +0x2357 0x23283 +0x2358 0x23284 +0x2359 0x2329B +0x235A 0x23282 +0x235B 0x2327D +0x235C 0x2327C +0x235D 0x23299 +0x235E 0x2327E +0x235F 0x2329A +0x2360 0x23295 +0x2361 0x2327B +0x2362 0x23286 +0x2363 0x23348 +0x2364 0x23392 +0x2365 0x235B2 +0x2366 0x23642 +0x2367 0x23672 +0x2368 0x23615 +0x2369 0x23630 +0x236A 0x23643 +0x236B 0x2365B +0x236C 0x2361D +0x236D 0x23673 +0x236E 0x2362D +0x2370 0x23621 +0x2371 0x2361C +0x2372 0x2F8EA +0x2373 0x23629 +0x2374 0x2361E +0x2375 0x23633 +0x2376 0x23910 +0x2377 0x2390E +0x2378 0x2F8F1 +0x2379 0x2390D +0x237A 0x23911 +0x237B 0x23912 +0x237C 0x23917 +0x237D 0x23909 +0x237E 0x2390F +0x2421 0x23998 +0x2422 0x23994 +0x2423 0x23996 +0x2424 0x23999 +0x2425 0x23995 +0x2426 0x23997 +0x2427 0x23A50 +0x2428 0x23A52 +0x2429 0x23A4D +0x242A 0x23A57 +0x242B 0x23A53 +0x242C 0x23A56 +0x242D 0x23AB8 +0x242E 0x23B12 +0x242F 0x23BF1 +0x2430 0x23BF0 +0x2431 0x23BEE +0x2432 0x23BEF +0x2433 0x23BE5 +0x2434 0x23BEB +0x2435 0x23BE7 +0x2436 0x23BF2 +0x2437 0x23BE6 +0x2438 0x23BF7 +0x2439 0x23C09 +0x243A 0x23C6B +0x243B 0x23C6A +0x243C 0x23E79 +0x243D 0x23ECD +0x243E 0x23EEF +0x243F 0x23EE4 +0x2440 0x23EE3 +0x2441 0x23F6C +0x2442 0x23F67 +0x2443 0x23F62 +0x2444 0x23F58 +0x2445 0x23F69 +0x2446 0x23FAB +0x2447 0x23F57 +0x2448 0x23FAD +0x2449 0x23F54 +0x244A 0x23FAE +0x244B 0x23F76 +0x244C 0x23F49 +0x244D 0x23F45 +0x244E 0x23F4F +0x244F 0x2F90F +0x2450 0x23F50 +0x2451 0x23F7D +0x2452 0x23F44 +0x2453 0x23F66 +0x2454 0x23F48 +0x2455 0x23FA3 +0x2456 0x23F51 +0x2457 0x23F53 +0x2458 0x2F910 +0x2459 0x23F60 +0x245A 0x23F47 +0x245B 0x23F5E +0x245C 0x23F85 +0x245D 0x23FAC +0x245E 0x23F6D +0x245F 0x23F75 +0x2460 0x23FA8 +0x2462 0x23F43 +0x2463 0x23F4E +0x2464 0x23F5C +0x2465 0x23F56 +0x2466 0x23F6E +0x2467 0x23F63 +0x2468 0x23F6A +0x2469 0x24356 +0x246A 0x24312 +0x246B 0x2435C +0x246C 0x24358 +0x246D 0x24355 +0x246E 0x2437E +0x246F 0x243A8 +0x2470 0x24311 +0x2471 0x24359 +0x2472 0x2435A +0x2473 0x24367 +0x2474 0x24354 +0x2475 0x2435B +0x2476 0x243F0 +0x2477 0x24529 +0x2478 0x2452C +0x2479 0x2452A +0x247A 0x24527 +0x247B 0x24567 +0x247C 0x24568 +0x247D 0x24593 +0x247E 0x24595 +0x2521 0x2459A +0x2522 0x245EE +0x2523 0x245F1 +0x2524 0x245ED +0x2525 0x245E9 +0x2526 0x246CB +0x2527 0x246DF +0x2528 0x246DB +0x2529 0x2483C +0x252A 0x2484E +0x252B 0x2486C +0x252C 0x2487B +0x252D 0x2487C +0x252E 0x24883 +0x252F 0x2486B +0x2530 0x24866 +0x2531 0x24863 +0x2532 0x248A0 +0x2533 0x24885 +0x2534 0x24868 +0x2535 0x248A2 +0x2536 0x249EC +0x2538 0x249E7 +0x2539 0x24A10 +0x253A 0x24A18 +0x253B 0x24A3A +0x253C 0x24A1A +0x253D 0x24A38 +0x253E 0x24A41 +0x253F 0x24A1B +0x2540 0x24A14 +0x2541 0x24A1C +0x2542 0x24A1D +0x2543 0x24B12 +0x2544 0x24B0D +0x2545 0x24B07 +0x2546 0x24B7E +0x2547 0x24B7F +0x2548 0x20AB9 +0x2549 0x24B80 +0x254A 0x24B7A +0x254B 0x24BF3 +0x254C 0x24CB9 +0x254D 0x24CBB +0x254E 0x24CBA +0x254F 0x24CBD +0x2550 0x24CB7 +0x2551 0x24CBF +0x2552 0x24D21 +0x2553 0x24E3A +0x2554 0x24E3D +0x2555 0x24E36 +0x2556 0x24E49 +0x2557 0x24E81 +0x2559 0x24E3F +0x255A 0x24E4D +0x255B 0x24E3E +0x255D 0x24E30 +0x255E 0x24E4F +0x255F 0x24F37 +0x2560 0x24F98 +0x2561 0x24F99 +0x2562 0x25011 +0x2563 0x2500D +0x2564 0x25088 +0x2565 0x2508A +0x2566 0x2521C +0x2567 0x25255 +0x2568 0x25256 +0x2569 0x25262 +0x256A 0x25257 +0x256B 0x25242 +0x256C 0x25210 +0x256D 0x2524D +0x256E 0x2525A +0x256F 0x25266 +0x2570 0x25246 +0x2571 0x2287E +0x2572 0x2524F +0x2573 0x262F9 +0x2574 0x25387 +0x2575 0x25384 +0x2576 0x253F4 +0x2577 0x253F5 +0x2578 0x253F2 +0x2579 0x253F7 +0x257A 0x25545 +0x257B 0x2F950 +0x257C 0x25549 +0x257D 0x25535 +0x257E 0x254FD +0x2621 0x25530 +0x2622 0x25543 +0x2623 0x25546 +0x2625 0x25533 +0x2626 0x256C6 +0x2627 0x2F956 +0x2628 0x256D4 +0x2629 0x271D8 +0x262A 0x256E0 +0x262B 0x20FA7 +0x262C 0x25744 +0x262D 0x20398 +0x262E 0x25854 +0x262F 0x2583E +0x2630 0x25835 +0x2631 0x2583A +0x2633 0x25834 +0x2634 0x25839 +0x2635 0x25846 +0x2636 0x2585A +0x2637 0x2585B +0x2638 0x2583C +0x2639 0x259DC +0x263A 0x259D6 +0x263B 0x259D0 +0x263C 0x2F95E +0x263D 0x25AAC +0x263E 0x2F95D +0x263F 0x25AA5 +0x2640 0x25BF4 +0x2641 0x25C24 +0x2642 0x25BE0 +0x2643 0x25BFD +0x2644 0x25BF2 +0x2645 0x25BFC +0x2646 0x25C02 +0x2647 0x25BF1 +0x2648 0x25BFF +0x2649 0x25BD2 +0x264A 0x25BD8 +0x264B 0x25BD3 +0x264C 0x25BF9 +0x264D 0x2F963 +0x264E 0x25BED +0x264F 0x25BF7 +0x2650 0x25BF0 +0x2651 0x25BD7 +0x2652 0x25C09 +0x2653 0x25BF5 +0x2654 0x25EC2 +0x2655 0x25EC5 +0x2656 0x25ECF +0x2658 0x25EC1 +0x2659 0x25EC6 +0x265A 0x25ED4 +0x265B 0x25ECE +0x265C 0x2609B +0x265D 0x26099 +0x265E 0x2608F +0x265F 0x260B7 +0x2660 0x26082 +0x2661 0x26093 +0x2662 0x260B4 +0x2663 0x260C1 +0x2664 0x26090 +0x2665 0x2609A +0x2666 0x26094 +0x2667 0x2609C +0x2668 0x260B5 +0x2669 0x2F96F +0x266A 0x2F96E +0x266B 0x2609F +0x266C 0x2608E +0x266D 0x2609E +0x266E 0x2623C +0x266F 0x26247 +0x2670 0x26241 +0x2671 0x262EB +0x2672 0x262EC +0x2673 0x262ED +0x2674 0x262EE +0x2675 0x262DF +0x2676 0x262F2 +0x2677 0x2630D +0x2678 0x2630E +0x2679 0x20186 +0x267A 0x263A9 +0x267B 0x263A4 +0x267C 0x263A5 +0x267D 0x2645F +0x267E 0x2645A +0x2721 0x26466 +0x2722 0x26468 +0x2723 0x2646A +0x2724 0x26464 +0x2725 0x26465 +0x2726 0x264C1 +0x2727 0x264D8 +0x2728 0x2F97B +0x2729 0x264D9 +0x272A 0x26509 +0x272B 0x265AA +0x272C 0x265A3 +0x272D 0x265B9 +0x272E 0x259E2 +0x272F 0x265A5 +0x2730 0x265AB +0x2731 0x26620 +0x2732 0x26789 +0x2733 0x2678B +0x2734 0x267DB +0x2735 0x267E4 +0x2736 0x267EF +0x2737 0x267E2 +0x2738 0x267E9 +0x2739 0x267F0 +0x273A 0x267F3 +0x273B 0x267DD +0x273C 0x2681E +0x273D 0x2691D +0x273E 0x26946 +0x273F 0x2697C +0x2740 0x26980 +0x2741 0x26981 +0x2742 0x26982 +0x2743 0x26987 +0x2744 0x26988 +0x2745 0x2698A +0x2746 0x2698C +0x2747 0x269E7 +0x2748 0x269EB +0x2749 0x269EA +0x274A 0x26A68 +0x274B 0x26A6B +0x274C 0x26A69 +0x274D 0x26A66 +0x274E 0x26A6A +0x274F 0x26A65 +0x2750 0x26AE5 +0x2751 0x26AE4 +0x2752 0x26AE6 +0x2753 0x26D18 +0x2754 0x26E24 +0x2755 0x26E48 +0x2756 0x26E2F +0x2757 0x26E7E +0x2758 0x26D89 +0x2759 0x26E1E +0x275A 0x26E49 +0x275B 0x26E26 +0x275C 0x26E09 +0x275D 0x26E34 +0x275E 0x26E2D +0x275F 0x26E4A +0x2760 0x26E15 +0x2761 0x2F9A9 +0x2762 0x26E33 +0x2763 0x26E28 +0x2764 0x26E27 +0x2765 0x26E20 +0x2766 0x26E2B +0x2767 0x26E29 +0x2768 0x26E6A +0x2769 0x26E0B +0x276A 0x26E0E +0x276B 0x26E1C +0x276C 0x26DFF +0x276D 0x2F9AA +0x276E 0x26E35 +0x276F 0x26E11 +0x2770 0x26E4B +0x2771 0x26E4C +0x2772 0x26E1F +0x2773 0x26E0F +0x2774 0x26E39 +0x2775 0x26E68 +0x2776 0x26E1D +0x2777 0x26E08 +0x2778 0x26E0C +0x2779 0x26E0D +0x277A 0x26E62 +0x277B 0x26EAF +0x277C 0x26E32 +0x277D 0x26E2C +0x277E 0x26E64 +0x2821 0x26E04 +0x2822 0x26E16 +0x2823 0x26E4D +0x2824 0x26E07 +0x2825 0x26EAE +0x2826 0x271D4 +0x2827 0x271D1 +0x2828 0x271D5 +0x2829 0x271D0 +0x282A 0x27371 +0x282B 0x2735D +0x282C 0x2735B +0x282D 0x2737A +0x282E 0x2F9BD +0x282F 0x2737F +0x2830 0x27379 +0x2831 0x27367 +0x2832 0x2739E +0x2833 0x27394 +0x2834 0x27364 +0x2835 0x2735E +0x2836 0x27381 +0x2837 0x2735A +0x2838 0x27357 +0x2839 0x2737C +0x283A 0x27398 +0x283B 0x27366 +0x283C 0x2737E +0x283D 0x27382 +0x283E 0x27368 +0x283F 0x2735F +0x2840 0x27363 +0x2841 0x27397 +0x2843 0x27353 +0x2844 0x2737B +0x2845 0x2737D +0x2846 0x27378 +0x2847 0x27406 +0x2848 0x275C0 +0x2849 0x275C2 +0x284A 0x275C3 +0x284B 0x276DC +0x284C 0x276E6 +0x284D 0x276EC +0x284E 0x276F2 +0x284F 0x276E8 +0x2850 0x276EB +0x2851 0x276EA +0x2852 0x276E5 +0x2853 0x276E0 +0x2854 0x276D0 +0x2855 0x276D8 +0x2856 0x276D5 +0x2857 0x276D3 +0x2858 0x276E4 +0x2859 0x276F3 +0x285A 0x276DB +0x285B 0x2772F +0x285C 0x277F9 +0x285D 0x2785D +0x285E 0x2785B +0x285F 0x2784C +0x2860 0x27858 +0x2861 0x27860 +0x2862 0x27853 +0x2863 0x27850 +0x2864 0x27907 +0x2865 0x27908 +0x2866 0x278F4 +0x2867 0x278F6 +0x2868 0x27904 +0x2869 0x278FD +0x286A 0x27905 +0x286B 0x27A28 +0x286C 0x27A56 +0x286D 0x27A42 +0x286E 0x27A5C +0x286F 0x27A3D +0x2870 0x27A2F +0x2871 0x27A2B +0x2872 0x27A58 +0x2873 0x27A61 +0x2874 0x27A2C +0x2875 0x27A51 +0x2876 0x27A50 +0x2877 0x27A3C +0x2878 0x27A36 +0x287A 0x27A60 +0x287B 0x27A5B +0x287C 0x27A2E +0x287D 0x27A40 +0x287E 0x27A5F +0x2921 0x27A26 +0x2922 0x27A2D +0x2923 0x27A5E +0x2924 0x27A3B +0x2925 0x27BEF +0x2926 0x27BF3 +0x2927 0x27BEE +0x2928 0x27BED +0x2929 0x27C5A +0x292A 0x27C62 +0x292B 0x27C5B +0x292C 0x27C5F +0x292D 0x27C5E +0x292E 0x27C64 +0x292F 0x27CE0 +0x2930 0x27CE1 +0x2931 0x27CE5 +0x2932 0x27DA5 +0x2933 0x27D9B +0x2934 0x27D9F +0x2935 0x27D9C +0x2937 0x27DAA +0x2938 0x27DA4 +0x2939 0x27DA3 +0x293A 0x27E67 +0x293B 0x27F26 +0x293C 0x27F1A +0x293E 0x27F1C +0x293F 0x27F15 +0x2940 0x27F1B +0x2941 0x27F18 +0x2942 0x27F1E +0x2943 0x27F25 +0x2944 0x2F9DC +0x2945 0x2807B +0x2946 0x28075 +0x2947 0x28093 +0x2948 0x2808F +0x2949 0x2807C +0x294A 0x2809B +0x294B 0x28088 +0x294C 0x28091 +0x294D 0x2807E +0x294F 0x28086 +0x2950 0x2825B +0x2951 0x28254 +0x2952 0x28335 +0x2953 0x28340 +0x2954 0x28337 +0x2955 0x28329 +0x2956 0x28326 +0x2957 0x28323 +0x2958 0x28330 +0x2959 0x28320 +0x295A 0x28328 +0x295B 0x28332 +0x295C 0x2832A +0x295D 0x28331 +0x295E 0x28324 +0x295F 0x28341 +0x2960 0x28342 +0x2961 0x28343 +0x2962 0x28325 +0x2963 0x28338 +0x2964 0x2841C +0x2965 0x2841D +0x2966 0x2841E +0x2967 0x284F6 +0x2968 0x285A5 +0x2969 0x28589 +0x296A 0x2859D +0x296B 0x2858A +0x296C 0x28587 +0x296D 0x285AB +0x296E 0x28586 +0x296F 0x2859E +0x2970 0x28593 +0x2971 0x285A1 +0x2972 0x28588 +0x2973 0x285A3 +0x2974 0x2859F +0x2975 0x285A0 +0x2976 0x286FF +0x2977 0x28700 +0x2978 0x28702 +0x2979 0x286F8 +0x297A 0x286F7 +0x297B 0x28701 +0x297C 0x28787 +0x297D 0x28789 +0x297E 0x28776 +0x2A21 0x2876E +0x2A22 0x28777 +0x2A23 0x28782 +0x2A24 0x28785 +0x2A25 0x28783 +0x2A26 0x28784 +0x2A27 0x28857 +0x2A28 0x2884B +0x2A29 0x28856 +0x2A2A 0x2885D +0x2A2B 0x28860 +0x2A2C 0x2884D +0x2A2D 0x28855 +0x2A2E 0x28854 +0x2A2F 0x28853 +0x2A30 0x28850 +0x2A31 0x28863 +0x2A32 0x28862 +0x2A33 0x28917 +0x2A34 0x28916 +0x2A35 0x2892D +0x2A36 0x289D9 +0x2A37 0x289BF +0x2A39 0x289B2 +0x2A3A 0x289AC +0x2A3B 0x289B0 +0x2A3C 0x289CF +0x2A3D 0x289B8 +0x2A3F 0x289D3 +0x2A40 0x289B1 +0x2A41 0x289AF +0x2A42 0x289CE +0x2A43 0x289B4 +0x2A44 0x289B7 +0x2A45 0x289D5 +0x2A47 0x28D38 +0x2A48 0x28D28 +0x2A49 0x28D3F +0x2A4A 0x28D40 +0x2A4B 0x28D41 +0x2A4C 0x28D33 +0x2A4D 0x28D2B +0x2A4E 0x28D2E +0x2A4F 0x28F11 +0x2A50 0x28F18 +0x2A51 0x28F17 +0x2A52 0x28F19 +0x2A53 0x28F16 +0x2A55 0x28F0D +0x2A56 0x28F26 +0x2A57 0x28F79 +0x2A58 0x28FD8 +0x2A59 0x28FF3 +0x2A5A 0x28FD7 +0x2A5B 0x28FCC +0x2A5C 0x28FCF +0x2A5D 0x28FCB +0x2A5E 0x28FD1 +0x2A5F 0x28FCE +0x2A60 0x28FD4 +0x2A61 0x28FD5 +0x2A62 0x28FD3 +0x2A63 0x28FD6 +0x2A64 0x28FCD +0x2A65 0x28FDA +0x2A66 0x28FD2 +0x2A67 0x28FDE +0x2A68 0x290CC +0x2A69 0x290B8 +0x2A6A 0x290B7 +0x2A6B 0x290C2 +0x2A6C 0x290C3 +0x2A6D 0x291FA +0x2A6E 0x291F9 +0x2A6F 0x2921F +0x2A70 0x2921D +0x2A71 0x24382 +0x2A72 0x292A6 +0x2A73 0x29290 +0x2A74 0x2929E +0x2A75 0x29298 +0x2A76 0x29293 +0x2A77 0x29292 +0x2A78 0x292A5 +0x2A79 0x29295 +0x2A7A 0x293A9 +0x2A7B 0x293A8 +0x2A7C 0x293AA +0x2A7D 0x293AB +0x2A7E 0x293AC +0x2B21 0x2941F +0x2B22 0x29422 +0x2B23 0x294AA +0x2B24 0x29496 +0x2B25 0x29491 +0x2B26 0x294AB +0x2B27 0x294A2 +0x2B28 0x294A4 +0x2B29 0x2949D +0x2B2A 0x29497 +0x2B2B 0x2947D +0x2B2C 0x2949F +0x2B2D 0x2949C +0x2B2E 0x29499 +0x2B2F 0x294A6 +0x2B30 0x29492 +0x2B31 0x294A7 +0x2B32 0x295C9 +0x2B33 0x295C8 +0x2B34 0x295C7 +0x2B35 0x295CB +0x2B36 0x29674 +0x2B37 0x296C9 +0x2B39 0x296D2 +0x2B3A 0x296DB +0x2B3B 0x296EB +0x2B3C 0x296E9 +0x2B3D 0x296EF +0x2B3E 0x296EE +0x2B3F 0x296F9 +0x2B40 0x296DE +0x2B41 0x29816 +0x2B42 0x29845 +0x2B43 0x2987F +0x2B44 0x29898 +0x2B45 0x2989F +0x2B46 0x29886 +0x2B47 0x29890 +0x2B48 0x2989A +0x2B49 0x2989D +0x2B4A 0x2988D +0x2B4B 0x2989C +0x2B4C 0x298A0 +0x2B4D 0x298A7 +0x2B4E 0x2988F +0x2B4F 0x29A41 +0x2B50 0x29A35 +0x2B51 0x29A37 +0x2B52 0x29A30 +0x2B53 0x29A3A +0x2B54 0x29A36 +0x2B55 0x2FA08 +0x2B56 0x29ACA +0x2B57 0x29B12 +0x2B58 0x29B15 +0x2B59 0x29B22 +0x2B5A 0x29B13 +0x2B5B 0x29B18 +0x2B5C 0x29B21 +0x2B5D 0x29C10 +0x2B5E 0x29C20 +0x2B5F 0x29C2F +0x2B60 0x29CA5 +0x2B61 0x29CA3 +0x2B62 0x29CB6 +0x2B63 0x29CAB +0x2B64 0x29D68 +0x2B65 0x29D67 +0x2B66 0x29D6F +0x2B67 0x29D77 +0x2B68 0x29D64 +0x2B69 0x29D78 +0x2B6B 0x29D76 +0x2B6C 0x29D6E +0x2B6E 0x29FD0 +0x2B6F 0x29FB3 +0x2B70 0x29FCB +0x2B71 0x29FD6 +0x2B72 0x29FB1 +0x2B73 0x29FB4 +0x2B74 0x29FD7 +0x2B75 0x29FC6 +0x2B76 0x29FBA +0x2B77 0x29FD1 +0x2B78 0x29FD2 +0x2B79 0x29FB5 +0x2B7A 0x29FC4 +0x2B7B 0x29FCC +0x2B7C 0x29FBB +0x2B7D 0x29FB2 +0x2B7E 0x2A25B +0x2C21 0x2A25A +0x2C22 0x2A259 +0x2C23 0x2A299 +0x2C24 0x2A294 +0x2C25 0x2A296 +0x2C26 0x2A293 +0x2C27 0x2A291 +0x2C28 0x2A28F +0x2C29 0x2A298 +0x2C2A 0x2A30C +0x2C2B 0x2A30A +0x2C2C 0x2A30E +0x2C2D 0x2A312 +0x2C2E 0x2A311 +0x2C2F 0x2A30B +0x2C30 0x2A39A +0x2C32 0x2A3B4 +0x2C34 0x2A41C +0x2C35 0x2A420 +0x2C36 0x2A421 +0x2C37 0x2A4D3 +0x2C38 0x2A4D2 +0x2C39 0x2A538 +0x2C3B 0x24CCF +0x2C3C 0x2011D +0x2C3D 0x20192 +0x2C3E 0x2018F +0x2C3F 0x2018C +0x2C40 0x203EA +0x2C41 0x204B9 +0x2C42 0x2056E +0x2C43 0x205A0 +0x2C44 0x291DD +0x2C45 0x20612 +0x2C46 0x20617 +0x2C47 0x2066D +0x2C48 0x20805 +0x2C49 0x207FB +0x2C4A 0x207FD +0x2C4B 0x20806 +0x2C4C 0x20800 +0x2C4D 0x207FF +0x2C4E 0x207FE +0x2C4F 0x208B6 +0x2C50 0x20905 +0x2C51 0x20907 +0x2C52 0x20ABC +0x2C53 0x20ABB +0x2C54 0x20B8B +0x2C55 0x20B87 +0x2C56 0x27BFB +0x2C57 0x20FE7 +0x2C58 0x20FE6 +0x2C59 0x20FE2 +0x2C5A 0x285D3 +0x2C5B 0x20FD9 +0x2C5C 0x20FCA +0x2C5D 0x21012 +0x2C5E 0x21010 +0x2C5F 0x20FDC +0x2C60 0x20FD0 +0x2C61 0x20F8B +0x2C62 0x21013 +0x2C63 0x22A10 +0x2C64 0x20FDA +0x2C65 0x2F84F +0x2C66 0x20FFD +0x2C67 0x20FE5 +0x2C68 0x20FCC +0x2C69 0x21039 +0x2C6A 0x20FC7 +0x2C6B 0x20FD8 +0x2C6C 0x21460 +0x2C6D 0x21464 +0x2C6E 0x21486 +0x2C6F 0x2145E +0x2C70 0x21466 +0x2C71 0x2145F +0x2C72 0x21477 +0x2C73 0x21482 +0x2C74 0x21496 +0x2C75 0x2153E +0x2C76 0x21579 +0x2C77 0x2157A +0x2C78 0x21688 +0x2C79 0x21689 +0x2C7A 0x2168C +0x2C7B 0x243E0 +0x2C7C 0x2167B +0x2C7D 0x21686 +0x2C7E 0x21894 +0x2D21 0x21897 +0x2D22 0x218B7 +0x2D23 0x218B5 +0x2D24 0x218B8 +0x2D25 0x21893 +0x2D26 0x218B2 +0x2D27 0x218B4 +0x2D28 0x21899 +0x2D29 0x218C3 +0x2D2A 0x2189D +0x2D2B 0x2189B +0x2D2C 0x218A3 +0x2D2E 0x2199F +0x2D2F 0x2199E +0x2D30 0x219A3 +0x2D31 0x219A0 +0x2D32 0x219A1 +0x2D33 0x21AC5 +0x2D34 0x21AC6 +0x2D35 0x21ABE +0x2D36 0x21AC4 +0x2D37 0x21ABF +0x2D38 0x21B4C +0x2D39 0x21B4A +0x2D3A 0x21BB1 +0x2D3B 0x21C15 +0x2D3C 0x21C17 +0x2D3D 0x21C10 +0x2D3E 0x21C18 +0x2D3F 0x21CE0 +0x2D40 0x21CDF +0x2D41 0x21D27 +0x2D42 0x21F43 +0x2D43 0x21F48 +0x2D44 0x21F1D +0x2D45 0x21F50 +0x2D46 0x21F58 +0x2D47 0x21F47 +0x2D48 0x21F54 +0x2D49 0x21F53 +0x2D4A 0x21F40 +0x2D4B 0x21F55 +0x2D4D 0x21F5A +0x2D4E 0x22470 +0x2D4F 0x2215B +0x2D50 0x2214D +0x2D51 0x22156 +0x2D52 0x2214F +0x2D53 0x2F887 +0x2D54 0x22159 +0x2D55 0x2F888 +0x2D56 0x22154 +0x2D57 0x22153 +0x2D58 0x22150 +0x2D59 0x222B3 +0x2D5A 0x2236E +0x2D5C 0x2236F +0x2D5D 0x22393 +0x2D5E 0x22429 +0x2D5F 0x22425 +0x2D60 0x22428 +0x2D61 0x2246F +0x2D62 0x232B8 +0x2D63 0x2F897 +0x2D64 0x224B3 +0x2D65 0x22579 +0x2D66 0x2257E +0x2D67 0x2257C +0x2D68 0x22583 +0x2D69 0x2F8AC +0x2D6A 0x22800 +0x2D6B 0x22834 +0x2D6C 0x22865 +0x2D6D 0x22836 +0x2D6E 0x228A7 +0x2D6F 0x22859 +0x2D70 0x22858 +0x2D71 0x22831 +0x2D72 0x22862 +0x2D73 0x22838 +0x2D74 0x22873 +0x2D75 0x2283E +0x2D76 0x22855 +0x2D77 0x22854 +0x2D78 0x22895 +0x2D79 0x2F8AD +0x2D7A 0x228A5 +0x2D7B 0x22894 +0x2D7C 0x2289A +0x2D7D 0x2289B +0x2D7E 0x22899 +0x2E21 0x2289F +0x2E22 0x22853 +0x2E23 0x22A12 +0x2E24 0x22A0A +0x2E25 0x22A09 +0x2E26 0x22A0C +0x2E27 0x22A0B +0x2E28 0x22A0E +0x2E29 0x22A0D +0x2E2A 0x22A08 +0x2E2B 0x22D38 +0x2E2C 0x22D3A +0x2E2D 0x22D37 +0x2E2E 0x22D3D +0x2E2F 0x22D2D +0x2E30 0x22D82 +0x2E31 0x22D95 +0x2E32 0x22D87 +0x2E33 0x22D9D +0x2E34 0x22DB5 +0x2E35 0x22D81 +0x2E36 0x22DC7 +0x2E37 0x22D9B +0x2E38 0x22D98 +0x2E39 0x22D94 +0x2E3A 0x22D86 +0x2E3B 0x22D90 +0x2E3C 0x22D34 +0x2E3D 0x22D8E +0x2E3E 0x22D85 +0x2E3F 0x22DA6 +0x2E40 0x22D96 +0x2E41 0x22FEA +0x2E42 0x22FDF +0x2E43 0x232BD +0x2E44 0x22FF7 +0x2E45 0x22FEB +0x2E46 0x22FE0 +0x2E47 0x22FE8 +0x2E48 0x22FE1 +0x2E49 0x22FE9 +0x2E4A 0x22FEE +0x2E4B 0x22FE5 +0x2E4C 0x22FEC +0x2E4D 0x23063 +0x2E4E 0x230C6 +0x2E4F 0x230C2 +0x2E50 0x230C1 +0x2E51 0x230C0 +0x2E52 0x230C3 +0x2E53 0x23118 +0x2E54 0x232AE +0x2E55 0x232A3 +0x2E56 0x232C5 +0x2E57 0x232A0 +0x2E58 0x232B4 +0x2E59 0x232A5 +0x2E5B 0x232A4 +0x2E5C 0x232A8 +0x2E5D 0x232A6 +0x2E5E 0x236A8 +0x2E5F 0x2368D +0x2E60 0x23682 +0x2E61 0x2369E +0x2E62 0x23689 +0x2E63 0x23683 +0x2E64 0x23691 +0x2E65 0x236A6 +0x2E66 0x2369A +0x2E67 0x23690 +0x2E68 0x23685 +0x2E69 0x2367D +0x2E6A 0x2F8EC +0x2E6B 0x2369B +0x2E6C 0x236A5 +0x2E6D 0x236F0 +0x2E6E 0x23696 +0x2E6F 0x23688 +0x2E70 0x236D6 +0x2E71 0x236D8 +0x2E72 0x23686 +0x2E73 0x236A4 +0x2E74 0x23697 +0x2E75 0x2391C +0x2E76 0x23919 +0x2E77 0x2399E +0x2E78 0x2399F +0x2E79 0x2399D +0x2E7A 0x2399C +0x2E7B 0x23A5D +0x2E7C 0x23A5E +0x2E7D 0x23A73 +0x2E7E 0x23A63 +0x2F21 0x23ABE +0x2F22 0x23AC1 +0x2F23 0x23ABC +0x2F24 0x23ABF +0x2F25 0x23ABB +0x2F26 0x23ABD +0x2F27 0x23B13 +0x2F28 0x23B14 +0x2F29 0x23BF8 +0x2F2A 0x23BFA +0x2F2B 0x23C06 +0x2F2C 0x23BFE +0x2F2D 0x23C51 +0x2F2E 0x2400B +0x2F2F 0x23FF1 +0x2F30 0x23FA9 +0x2F31 0x23FD5 +0x2F32 0x23FDC +0x2F33 0x23FCB +0x2F34 0x23FF2 +0x2F35 0x2405F +0x2F36 0x23FDB +0x2F37 0x23FD6 +0x2F38 0x23FD9 +0x2F39 0x23FD1 +0x2F3A 0x23FCF +0x2F3B 0x23FD8 +0x2F3C 0x23FE0 +0x2F3D 0x23FD4 +0x2F3E 0x23FF3 +0x2F3F 0x24005 +0x2F40 0x23FCE +0x2F41 0x23FF4 +0x2F42 0x2F912 +0x2F43 0x23FDA +0x2F44 0x2400E +0x2F45 0x24006 +0x2F46 0x23FD7 +0x2F47 0x23FCD +0x2F48 0x24007 +0x2F49 0x23FE1 +0x2F4A 0x24008 +0x2F4B 0x243BE +0x2F4C 0x243EF +0x2F4D 0x243D9 +0x2F4E 0x243DA +0x2F50 0x243A0 +0x2F51 0x243DF +0x2F52 0x2439E +0x2F53 0x243BF +0x2F54 0x243AF +0x2F55 0x243A7 +0x2F56 0x243AA +0x2F57 0x243F4 +0x2F58 0x243AE +0x2F59 0x243B5 +0x2F5A 0x243B8 +0x2F5B 0x243DB +0x2F5C 0x243C0 +0x2F5D 0x243B7 +0x2F5E 0x243A2 +0x2F5F 0x243DD +0x2F60 0x243A1 +0x2F61 0x243A5 +0x2F62 0x243B4 +0x2F63 0x243A6 +0x2F64 0x243AB +0x2F65 0x243AC +0x2F66 0x2439F +0x2F67 0x243B1 +0x2F68 0x243FC +0x2F69 0x2452E +0x2F6A 0x24530 +0x2F6B 0x24599 +0x2F6C 0x245F8 +0x2F6D 0x245F6 +0x2F6E 0x246F4 +0x2F6F 0x246EB +0x2F70 0x246E1 +0x2F71 0x246E4 +0x2F72 0x24875 +0x2F73 0x24869 +0x2F75 0x24899 +0x2F76 0x2489E +0x2F77 0x24894 +0x2F78 0x24893 +0x2F79 0x24891 +0x2F7A 0x24A19 +0x2F7B 0x24A17 +0x2F7C 0x24A49 +0x2F7D 0x24A47 +0x2F7E 0x24A48 +0x3021 0x24A52 +0x3022 0x24A40 +0x3023 0x24A63 +0x3024 0x24A46 +0x3025 0x24A5F +0x3026 0x24B0E +0x3027 0x24B85 +0x3028 0x24B87 +0x3029 0x24BCB +0x302A 0x24BCC +0x302B 0x24BC9 +0x302C 0x24CCB +0x302D 0x21CE7 +0x302E 0x24D20 +0x302F 0x24E5F +0x3030 0x24E60 +0x3031 0x24E6A +0x3032 0x24E76 +0x3033 0x24E73 +0x3034 0x24E71 +0x3035 0x24E66 +0x3037 0x24E6B +0x3038 0x24E79 +0x3039 0x24E7B +0x303A 0x24F3C +0x303B 0x24F9E +0x303C 0x24F9C +0x303D 0x2501C +0x303E 0x2501E +0x303F 0x25021 +0x3040 0x25096 +0x3041 0x250A1 +0x3042 0x250B6 +0x3043 0x250A0 +0x3044 0x25094 +0x3045 0x25097 +0x3046 0x25281 +0x3047 0x25286 +0x3048 0x252C0 +0x3049 0x2528A +0x304A 0x2F94B +0x304B 0x25285 +0x304C 0x25295 +0x304D 0x25249 +0x304E 0x25282 +0x304F 0x25284 +0x3050 0x22878 +0x3051 0x25290 +0x3052 0x252B1 +0x3053 0x253FE +0x3054 0x253FB +0x3055 0x25550 +0x3056 0x25556 +0x3057 0x2555A +0x3058 0x2554C +0x305A 0x25557 +0x305B 0x256E1 +0x305C 0x256D9 +0x305D 0x256DB +0x305E 0x256F4 +0x305F 0x25745 +0x3060 0x25747 +0x3061 0x25874 +0x3062 0x2586B +0x3063 0x25868 +0x3064 0x25869 +0x3065 0x25879 +0x3066 0x2F95B +0x3067 0x25880 +0x3068 0x25881 +0x3069 0x25861 +0x306A 0x25870 +0x306B 0x2586F +0x306C 0x25873 +0x306D 0x2585D +0x306E 0x259FA +0x3070 0x259F3 +0x3071 0x25A0A +0x3072 0x25A17 +0x3073 0x2F95F +0x3074 0x25AB0 +0x3075 0x25C3E +0x3076 0x25C46 +0x3077 0x25C4F +0x3078 0x25C44 +0x3079 0x25C69 +0x307A 0x25C33 +0x307B 0x25C2F +0x307C 0x25C4E +0x307D 0x25C3A +0x307E 0x25C2B +0x3121 0x25CA9 +0x3122 0x25C50 +0x3123 0x25C45 +0x3124 0x25C37 +0x3125 0x25C25 +0x3126 0x25C2C +0x3127 0x25C3F +0x3128 0x25C34 +0x3129 0x25C29 +0x312A 0x25C1E +0x312B 0x25C3D +0x312C 0x25EED +0x312D 0x2F966 +0x312E 0x25EF3 +0x312F 0x25EEA +0x3130 0x25EEB +0x3131 0x260CC +0x3132 0x260CE +0x3133 0x260D0 +0x3134 0x260E3 +0x3135 0x260E0 +0x3136 0x260D1 +0x3137 0x260DC +0x3138 0x260DD +0x3139 0x260F0 +0x313A 0x260DB +0x313B 0x260E5 +0x313C 0x260F1 +0x313D 0x260C9 +0x313E 0x260E8 +0x313F 0x260E7 +0x3140 0x260C8 +0x3141 0x260DE +0x3142 0x260CD +0x3143 0x260C5 +0x3144 0x260C6 +0x3145 0x260E4 +0x3146 0x260C3 +0x3147 0x262FB +0x3148 0x262FC +0x3149 0x262FE +0x314A 0x26303 +0x314B 0x26300 +0x314C 0x262FD +0x314D 0x26305 +0x314E 0x26313 +0x314F 0x263A7 +0x3150 0x263B4 +0x3151 0x26470 +0x3152 0x26474 +0x3153 0x26471 +0x3154 0x26475 +0x3155 0x2647D +0x3156 0x26473 +0x3157 0x264C4 +0x3158 0x264C3 +0x3159 0x264DE +0x315A 0x264DD +0x315B 0x26511 +0x315C 0x2650F +0x315D 0x26510 +0x315E 0x265C3 +0x315F 0x265C2 +0x3160 0x265CA +0x3161 0x265C1 +0x3162 0x26623 +0x3163 0x267B1 +0x3164 0x26824 +0x3165 0x26811 +0x3166 0x26825 +0x3167 0x2680A +0x3168 0x2681F +0x3169 0x26820 +0x316A 0x26814 +0x316B 0x26828 +0x316C 0x26803 +0x316D 0x26812 +0x316E 0x2680B +0x316F 0x26817 +0x3170 0x22A11 +0x3171 0x26949 +0x3172 0x26989 +0x3173 0x26990 +0x3174 0x2698F +0x3175 0x26996 +0x3176 0x26995 +0x3177 0x26993 +0x3178 0x269ED +0x3179 0x269F0 +0x317A 0x243DE +0x317B 0x26A85 +0x317C 0x26A77 +0x317D 0x26A7A +0x317E 0x26A84 +0x3221 0x26A79 +0x3222 0x26A7D +0x3223 0x26A7B +0x3224 0x26AED +0x3225 0x26AEC +0x3226 0x26DF6 +0x3227 0x26D9B +0x3228 0x26E9D +0x3229 0x26F11 +0x322A 0x26EC4 +0x322B 0x26EC8 +0x322C 0x26EDF +0x322D 0x26EBF +0x322E 0x26EB3 +0x322F 0x26EBA +0x3230 0x26F10 +0x3231 0x26F06 +0x3232 0x26E88 +0x3233 0x26E9A +0x3234 0x26EE0 +0x3235 0x26ECC +0x3236 0x26EB5 +0x3237 0x26EE1 +0x3238 0x26EBC +0x3239 0x26EC6 +0x323A 0x26F0B +0x323B 0x26EA4 +0x323C 0x26E95 +0x323D 0x26EA3 +0x323E 0x26EE2 +0x323F 0x26ECD +0x3240 0x26EE3 +0x3241 0x26EAB +0x3242 0x26ECB +0x3243 0x26E8F +0x3244 0x2F9AB +0x3245 0x26EA9 +0x3246 0x26F24 +0x3247 0x26EE4 +0x3248 0x26F12 +0x3249 0x26EE5 +0x324A 0x26F67 +0x324B 0x26EAA +0x324C 0x26EA0 +0x324D 0x26EE6 +0x324E 0x26EC1 +0x324F 0x26EE7 +0x3250 0x26F0D +0x3251 0x26E86 +0x3252 0x26EB0 +0x3253 0x26E8B +0x3254 0x26EE8 +0x3255 0x26EC9 +0x3256 0x26F19 +0x3257 0x26EC0 +0x3258 0x26F0C +0x3259 0x26EE9 +0x325A 0x26EEA +0x325B 0x271ED +0x325C 0x271E3 +0x325D 0x271E4 +0x325E 0x271E8 +0x325F 0x271D2 +0x3260 0x271E2 +0x3262 0x273CF +0x3263 0x273D1 +0x3264 0x273C3 +0x3265 0x273C9 +0x3266 0x273EA +0x3267 0x273B4 +0x3268 0x273DC +0x3269 0x273BD +0x326A 0x273E6 +0x326B 0x273C8 +0x326C 0x273EC +0x326D 0x273B2 +0x326E 0x273A9 +0x326F 0x273D3 +0x3270 0x273C0 +0x3271 0x273E9 +0x3272 0x273D5 +0x3274 0x273C5 +0x3276 0x273CB +0x3277 0x273D0 +0x3278 0x273D2 +0x3279 0x273E4 +0x327A 0x273E8 +0x327B 0x273CD +0x327C 0x273B6 +0x327D 0x273AA +0x327E 0x273D4 +0x3321 0x28449 +0x3322 0x273C1 +0x3323 0x273DD +0x3324 0x273CE +0x3325 0x275C9 +0x3326 0x275CA +0x3327 0x276FD +0x3328 0x276D9 +0x3329 0x276FF +0x332A 0x27704 +0x332B 0x276FA +0x332C 0x27706 +0x332D 0x27715 +0x332E 0x27711 +0x332F 0x27707 +0x3330 0x2770B +0x3331 0x277FC +0x3332 0x277FD +0x3333 0x2786D +0x3334 0x27865 +0x3335 0x27914 +0x3336 0x27913 +0x3337 0x2790C +0x3338 0x2790B +0x3339 0x27918 +0x333A 0x27922 +0x333B 0x27A7D +0x333C 0x27A6F +0x333D 0x27A75 +0x333E 0x27A7B +0x333F 0x27A80 +0x3340 0x27A7F +0x3341 0x27A96 +0x3342 0x27A6D +0x3343 0x27A6B +0x3344 0x27A86 +0x3345 0x27A73 +0x3346 0x27A62 +0x3347 0x27A77 +0x3348 0x27A81 +0x3349 0x27A69 +0x334A 0x27A82 +0x334B 0x27A97 +0x334C 0x27A84 +0x334E 0x27A78 +0x334F 0x2F9D0 +0x3350 0x27A7A +0x3351 0x27A6A +0x3352 0x27A65 +0x3353 0x27A7E +0x3354 0x27A94 +0x3355 0x27BC2 +0x3356 0x27BC1 +0x3357 0x27BF9 +0x3358 0x27C71 +0x3359 0x27C6B +0x335A 0x27C6D +0x335B 0x27C6F +0x335C 0x27C6E +0x335D 0x27CF2 +0x335E 0x27CE8 +0x335F 0x27CEF +0x3360 0x27CE9 +0x3361 0x27CEA +0x3362 0x27CED +0x3363 0x27CF3 +0x3364 0x27CE6 +0x3365 0x27DC9 +0x3366 0x27DB4 +0x3367 0x27DB3 +0x3368 0x27DB9 +0x3369 0x27DCA +0x336A 0x27DB1 +0x336B 0x27DB6 +0x336C 0x27DC7 +0x336D 0x27DC4 +0x336E 0x27DB7 +0x336F 0x27E6F +0x3370 0x27F33 +0x3371 0x27F32 +0x3372 0x27F1F +0x3373 0x2F9D9 +0x3374 0x27F2B +0x3375 0x27F30 +0x3376 0x27F36 +0x3377 0x27F42 +0x3378 0x27F41 +0x3379 0x2F9D8 +0x337A 0x280A5 +0x337B 0x280AB +0x337C 0x280A9 +0x337D 0x280B3 +0x337E 0x280A7 +0x3421 0x280A0 +0x3422 0x280D2 +0x3423 0x280A8 +0x3424 0x280B6 +0x3425 0x280AC +0x3426 0x280AE +0x3427 0x280E6 +0x3428 0x28265 +0x3429 0x28347 +0x342A 0x28363 +0x342B 0x2834D +0x342C 0x2835F +0x342D 0x2834B +0x342E 0x28360 +0x342F 0x28349 +0x3430 0x28353 +0x3431 0x2F9DF +0x3433 0x28357 +0x3434 0x2834E +0x3435 0x28352 +0x3436 0x28354 +0x3437 0x28420 +0x3438 0x28422 +0x3439 0x285C1 +0x343A 0x285D7 +0x343B 0x285D5 +0x343C 0x285C4 +0x343D 0x285D0 +0x343E 0x285BB +0x343F 0x285E2 +0x3440 0x285CB +0x3441 0x285B8 +0x3442 0x285BF +0x3443 0x285D8 +0x3444 0x285C0 +0x3445 0x285BA +0x3446 0x285B4 +0x3447 0x285BC +0x3448 0x285D4 +0x3449 0x285ED +0x344A 0x285C2 +0x344B 0x285D9 +0x344C 0x285CC +0x344D 0x2872F +0x344E 0x28723 +0x344F 0x28796 +0x3450 0x2878D +0x3451 0x2879E +0x3452 0x28799 +0x3453 0x28883 +0x3455 0x2886A +0x3456 0x28869 +0x3457 0x28875 +0x3458 0x2886C +0x3459 0x28880 +0x345A 0x2886E +0x345B 0x28881 +0x345C 0x28877 +0x345D 0x28876 +0x345E 0x28873 +0x345F 0x28870 +0x3460 0x28884 +0x3461 0x28919 +0x3462 0x289F2 +0x3464 0x289EC +0x3465 0x289EB +0x3466 0x289F6 +0x3467 0x289EF +0x3468 0x289F4 +0x3469 0x289EE +0x346A 0x289F3 +0x346B 0x289ED +0x346C 0x28C9B +0x346D 0x28C98 +0x346E 0x28C94 +0x346F 0x2147A +0x3470 0x28C9A +0x3471 0x2F9F0 +0x3472 0x28D4C +0x3474 0x28D57 +0x3475 0x28D51 +0x3476 0x28D62 +0x3477 0x28D52 +0x3478 0x28D5C +0x3479 0x28D53 +0x347A 0x2F9EF +0x347B 0x28E85 +0x347C 0x28F2D +0x347D 0x28F3E +0x347E 0x28F30 +0x3521 0x28F7D +0x3522 0x28FE6 +0x3523 0x28FF6 +0x3524 0x28FE4 +0x3525 0x28FE9 +0x3526 0x28FEC +0x3527 0x28FF2 +0x3528 0x28FE8 +0x3529 0x28FE3 +0x352A 0x28FEB +0x352B 0x28FF0 +0x352C 0x28FEA +0x352D 0x28FE7 +0x352E 0x28FFD +0x352F 0x28FE5 +0x3530 0x28FEE +0x3531 0x28FF5 +0x3532 0x28FF9 +0x3533 0x28FF1 +0x3534 0x28FF4 +0x3535 0x2F9F4 +0x3536 0x29011 +0x3537 0x290DE +0x3538 0x290D8 +0x3539 0x290DD +0x353A 0x290DB +0x353B 0x290D3 +0x353C 0x290E1 +0x353D 0x291DE +0x353E 0x291FC +0x353F 0x29228 +0x3540 0x292B7 +0x3541 0x292B8 +0x3542 0x292C7 +0x3543 0x292B2 +0x3544 0x292A9 +0x3545 0x292B9 +0x3546 0x292BC +0x3547 0x292B3 +0x3548 0x292D1 +0x3549 0x293B0 +0x354A 0x293B1 +0x354B 0x293B6 +0x354C 0x29404 +0x354D 0x2942C +0x354E 0x294C1 +0x354F 0x2949E +0x3550 0x294BA +0x3552 0x294D1 +0x3553 0x294D3 +0x3554 0x294D4 +0x3555 0x294D5 +0x3556 0x294C5 +0x3557 0x294B6 +0x3558 0x294B2 +0x3559 0x294B5 +0x355A 0x294C3 +0x355B 0x294B9 +0x355C 0x294C6 +0x355D 0x295D6 +0x355E 0x295E0 +0x355F 0x295DB +0x3560 0x295D7 +0x3561 0x295DD +0x3562 0x29715 +0x3563 0x2970C +0x3564 0x2970F +0x3565 0x2970E +0x3566 0x296FE +0x3567 0x29704 +0x3568 0x2970B +0x3569 0x29702 +0x356A 0x296FF +0x356B 0x29708 +0x356C 0x29710 +0x356D 0x29717 +0x356E 0x29713 +0x356F 0x29706 +0x3570 0x29709 +0x3571 0x29824 +0x3572 0x29826 +0x3573 0x29825 +0x3574 0x29848 +0x3575 0x298B5 +0x3576 0x298D2 +0x3577 0x298D5 +0x3578 0x298C4 +0x3579 0x298AF +0x357A 0x298AD +0x357B 0x298C1 +0x357C 0x298C0 +0x357D 0x298CC +0x357E 0x298CD +0x3621 0x298C3 +0x3622 0x298C8 +0x3623 0x298C5 +0x3624 0x298BA +0x3625 0x298D0 +0x3626 0x298C2 +0x3627 0x298CE +0x3629 0x29A43 +0x362A 0x29A42 +0x362B 0x29A40 +0x362C 0x29A31 +0x362D 0x29ACF +0x362E 0x29ACE +0x362F 0x29B30 +0x3630 0x29B34 +0x3631 0x29B32 +0x3632 0x29B43 +0x3633 0x29B3C +0x3634 0x29C11 +0x3635 0x29C35 +0x3636 0x29C34 +0x3637 0x29C37 +0x3638 0x29C31 +0x3639 0x29CBF +0x363A 0x29CBC +0x363B 0x29CC2 +0x363C 0x29CC9 +0x363D 0x29D83 +0x363E 0x29D8B +0x363F 0x29DA0 +0x3640 0x29D8D +0x3641 0x29D8C +0x3642 0x29D9A +0x3643 0x29D8A +0x3644 0x29D91 +0x3645 0x29FF1 +0x3646 0x2A00F +0x3647 0x2A001 +0x3648 0x2A007 +0x3649 0x2A00C +0x364B 0x29FDC +0x364C 0x29FEE +0x364D 0x29FF7 +0x364E 0x29FF2 +0x364F 0x29FF8 +0x3650 0x29FEB +0x3652 0x29FE6 +0x3653 0x29FED +0x3654 0x29FE9 +0x3655 0x2A008 +0x3656 0x2A000 +0x3657 0x29FE5 +0x3658 0x29FFC +0x3659 0x2A261 +0x365A 0x2A25E +0x365B 0x2A25F +0x365D 0x2A29B +0x365E 0x2A316 +0x365F 0x2A315 +0x3660 0x2A320 +0x3661 0x2A314 +0x3662 0x2A31A +0x3663 0x2A317 +0x3664 0x2A39C +0x3666 0x2A3F1 +0x3668 0x2A3F0 +0x3669 0x2A428 +0x366A 0x2A424 +0x366B 0x2A42A +0x366C 0x2A42B +0x366D 0x2A4D5 +0x366E 0x2A504 +0x366F 0x2A505 +0x3670 0x2A591 +0x3671 0x2A592 +0x3672 0x2A6A6 +0x3673 0x20109 +0x3674 0x20422 +0x3675 0x2041A +0x3676 0x2040E +0x3677 0x2041B +0x3678 0x20408 +0x3679 0x250B3 +0x367A 0x2F81C +0x367B 0x2069D +0x367C 0x20812 +0x367D 0x2081E +0x367E 0x208BB +0x3721 0x208BF +0x3722 0x208BC +0x3723 0x20908 +0x3724 0x20909 +0x3725 0x20963 +0x3726 0x209C8 +0x3727 0x23728 +0x3728 0x20B8E +0x3729 0x20B8D +0x372A 0x21043 +0x372B 0x2104D +0x372C 0x2106D +0x372D 0x21042 +0x372E 0x21052 +0x372F 0x21051 +0x3730 0x21069 +0x3731 0x21050 +0x3732 0x21056 +0x3733 0x2106C +0x3734 0x21044 +0x3735 0x21045 +0x3736 0x2106B +0x3738 0x21068 +0x3739 0x21057 +0x373A 0x2122E +0x373B 0x21231 +0x373C 0x2122D +0x373D 0x2148B +0x373E 0x214B2 +0x373F 0x2148D +0x3740 0x214A3 +0x3741 0x214A4 +0x3742 0x21490 +0x3743 0x21489 +0x3744 0x2148E +0x3745 0x21492 +0x3746 0x2157B +0x3747 0x21690 +0x3748 0x2168F +0x3749 0x218E9 +0x374A 0x218CD +0x374B 0x218C5 +0x374C 0x218D0 +0x374D 0x218C9 +0x374E 0x218D1 +0x374F 0x218C7 +0x3750 0x218D2 +0x3751 0x2185F +0x3752 0x218E1 +0x3753 0x218CC +0x3754 0x218C6 +0x3755 0x218E4 +0x3756 0x219A9 +0x3757 0x21AD3 +0x3758 0x21ADA +0x3759 0x21AD2 +0x375A 0x21ADB +0x375B 0x21B4D +0x375C 0x21B4E +0x375D 0x21C1C +0x375E 0x21CE8 +0x375F 0x21F6C +0x3760 0x21F5F +0x3761 0x21F66 +0x3762 0x21F64 +0x3763 0x21F78 +0x3764 0x21F65 +0x3765 0x21F6D +0x3766 0x21F61 +0x3767 0x21F7A +0x3768 0x22007 +0x3769 0x22166 +0x376A 0x22168 +0x376B 0x22162 +0x376C 0x222D3 +0x376D 0x222D4 +0x376E 0x222D1 +0x376F 0x222DC +0x3770 0x22373 +0x3771 0x22372 +0x3772 0x2242D +0x3773 0x2242C +0x3774 0x2242F +0x3775 0x22472 +0x3776 0x224B4 +0x3777 0x22589 +0x3778 0x228CD +0x3779 0x228A6 +0x377A 0x228A2 +0x377B 0x228A0 +0x377C 0x22846 +0x377D 0x228A1 +0x377E 0x26857 +0x3821 0x228A3 +0x3822 0x228B1 +0x3823 0x228DB +0x3824 0x228F6 +0x3825 0x228DC +0x3826 0x228D6 +0x3827 0x22A13 +0x3828 0x22D9C +0x3829 0x22D97 +0x382A 0x22DD8 +0x382B 0x22DE4 +0x382C 0x22DD4 +0x382D 0x22DE5 +0x382E 0x22DDB +0x382F 0x22DD0 +0x3830 0x22DDA +0x3831 0x22DCC +0x3832 0x22DDC +0x3833 0x22DED +0x3834 0x22DD3 +0x3835 0x22DD1 +0x3836 0x22DCE +0x3837 0x22DD9 +0x3838 0x22DDD +0x3839 0x2F8C6 +0x383A 0x22EE6 +0x383B 0x22EE5 +0x383C 0x22EE9 +0x383D 0x22FFF +0x383E 0x22FFE +0x383F 0x2300E +0x3840 0x2308C +0x3841 0x230CA +0x3842 0x230CB +0x3843 0x2311A +0x3844 0x232D7 +0x3845 0x232CF +0x3846 0x232D0 +0x3847 0x232C9 +0x3848 0x232CC +0x3849 0x232D3 +0x384A 0x233A4 +0x384B 0x233A3 +0x384C 0x23681 +0x384D 0x23726 +0x384E 0x236F3 +0x384F 0x23727 +0x3850 0x236F2 +0x3851 0x236FF +0x3852 0x236F5 +0x3853 0x236FC +0x3854 0x2370E +0x3856 0x236F6 +0x3857 0x23700 +0x3858 0x23723 +0x3859 0x23705 +0x385A 0x23725 +0x385B 0x23708 +0x385C 0x23750 +0x385D 0x23925 +0x385E 0x23920 +0x385F 0x23923 +0x3860 0x23921 +0x3861 0x239A1 +0x3862 0x23A69 +0x3863 0x23A6C +0x3864 0x23A68 +0x3865 0x23A6B +0x3866 0x23ACC +0x3867 0x23ACD +0x3868 0x23C10 +0x3869 0x23C0D +0x386A 0x23C0A +0x386B 0x23C16 +0x386C 0x23C14 +0x386D 0x23C52 +0x386E 0x24028 +0x386F 0x2402E +0x3870 0x2402C +0x3871 0x2404D +0x3872 0x24049 +0x3873 0x24031 +0x3874 0x24030 +0x3875 0x24033 +0x3876 0x2402D +0x3877 0x24036 +0x3878 0x2403E +0x3879 0x2402F +0x387A 0x24027 +0x387B 0x24034 +0x387C 0x2404C +0x387D 0x243FE +0x387E 0x24412 +0x3921 0x2441F +0x3922 0x24417 +0x3923 0x243F5 +0x3924 0x24415 +0x3925 0x243F7 +0x3927 0x21F7D +0x3928 0x243FA +0x3929 0x243F9 +0x392A 0x2444B +0x392B 0x2459C +0x392C 0x2459D +0x392E 0x246F0 +0x392F 0x246F6 +0x3930 0x246EF +0x3931 0x2489D +0x3932 0x2489A +0x3933 0x248A7 +0x3934 0x248AF +0x3935 0x248AA +0x3936 0x24A64 +0x3937 0x24A86 +0x3938 0x24A75 +0x3939 0x24A70 +0x393A 0x24A84 +0x393B 0x24A6B +0x393C 0x24A85 +0x393D 0x24A6C +0x393E 0x24B17 +0x393F 0x24B94 +0x3940 0x24B93 +0x3941 0x24CD2 +0x3942 0x24CD7 +0x3943 0x24CD4 +0x3944 0x24EA6 +0x3945 0x24EA7 +0x3946 0x24E9C +0x3947 0x24E8B +0x3948 0x24E8D +0x3949 0x24E98 +0x394A 0x24EB9 +0x394B 0x24E9B +0x394C 0x24E9D +0x394D 0x24E99 +0x394E 0x24EA8 +0x394F 0x24E91 +0x3950 0x24E87 +0x3951 0x24E9A +0x3952 0x24FA6 +0x3953 0x2501F +0x3954 0x250A7 +0x3955 0x250B1 +0x3956 0x250B2 +0x3957 0x250B7 +0x3958 0x252D0 +0x3959 0x252B3 +0x395A 0x252B5 +0x395B 0x252C4 +0x395C 0x252C3 +0x395D 0x252BC +0x395E 0x252B2 +0x395F 0x252BA +0x3960 0x252BB +0x3961 0x252C2 +0x3962 0x252CD +0x3963 0x252BE +0x3964 0x252B7 +0x3965 0x2538F +0x3966 0x25403 +0x3967 0x25404 +0x3968 0x25571 +0x3969 0x25577 +0x396A 0x25574 +0x396B 0x2558B +0x396C 0x2557A +0x396D 0x2F951 +0x396E 0x2558C +0x396F 0x25573 +0x3970 0x256FF +0x3971 0x256FB +0x3972 0x256FD +0x3973 0x256F0 +0x3974 0x256F3 +0x3975 0x256FC +0x3976 0x256F2 +0x3977 0x25892 +0x3978 0x2589E +0x3979 0x258AE +0x397A 0x25896 +0x397B 0x25A14 +0x397C 0x25A12 +0x397D 0x25A13 +0x397E 0x25A16 +0x3A21 0x25A0F +0x3A22 0x25AB6 +0x3A23 0x25ABD +0x3A24 0x25C8C +0x3A25 0x25CAE +0x3A26 0x25CAC +0x3A27 0x25CAB +0x3A28 0x25C99 +0x3A29 0x25C92 +0x3A2A 0x25CBB +0x3A2B 0x25C9E +0x3A2C 0x25C7E +0x3A2D 0x25CAF +0x3A2E 0x25CBC +0x3A2F 0x25C98 +0x3A30 0x25F01 +0x3A31 0x25F09 +0x3A32 0x25F06 +0x3A33 0x2F967 +0x3A34 0x25F07 +0x3A35 0x25F08 +0x3A36 0x260CF +0x3A37 0x2610E +0x3A38 0x26132 +0x3A3A 0x26112 +0x3A3B 0x26116 +0x3A3C 0x26117 +0x3A3D 0x2611B +0x3A3E 0x26115 +0x3A3F 0x26131 +0x3A40 0x26118 +0x3A41 0x2611A +0x3A42 0x26110 +0x3A43 0x2610A +0x3A44 0x26109 +0x3A45 0x2624F +0x3A46 0x2F973 +0x3A47 0x2630F +0x3A48 0x26310 +0x3A49 0x2F975 +0x3A4A 0x26328 +0x3A4B 0x26311 +0x3A4C 0x26316 +0x3A4D 0x26317 +0x3A4E 0x26302 +0x3A4F 0x263BB +0x3A50 0x263BA +0x3A51 0x263C3 +0x3A52 0x263BC +0x3A53 0x2648A +0x3A54 0x26484 +0x3A55 0x26486 +0x3A56 0x264E0 +0x3A57 0x26517 +0x3A58 0x26518 +0x3A59 0x2651E +0x3A5A 0x26515 +0x3A5B 0x265D3 +0x3A5C 0x265DA +0x3A5D 0x265D9 +0x3A5E 0x267E6 +0x3A5F 0x267F4 +0x3A60 0x267E1 +0x3A61 0x26869 +0x3A62 0x26840 +0x3A63 0x26858 +0x3A64 0x2686C +0x3A65 0x2684D +0x3A66 0x26921 +0x3A67 0x26999 +0x3A68 0x269F1 +0x3A69 0x23F68 +0x3A6A 0x26A86 +0x3A6B 0x26F5B +0x3A6C 0x26F5C +0x3A6D 0x26F77 +0x3A6E 0x26F2C +0x3A6F 0x2F9AD +0x3A70 0x26F58 +0x3A71 0x26F64 +0x3A72 0x26F61 +0x3A73 0x26F48 +0x3A74 0x26F97 +0x3A75 0x26F59 +0x3A76 0x26F29 +0x3A77 0x26F62 +0x3A78 0x26F2E +0x3A79 0x26F68 +0x3A7A 0x26F90 +0x3A7B 0x26F3A +0x3A7C 0x26F3D +0x3A7D 0x26F5E +0x3A7E 0x26F46 +0x3B21 0x26F69 +0x3B22 0x26F65 +0x3B23 0x26F3E +0x3B24 0x26F49 +0x3B25 0x26F56 +0x3B26 0x26FE1 +0x3B27 0x26F78 +0x3B28 0x26F79 +0x3B29 0x26F66 +0x3B2A 0x26F4A +0x3B2B 0x26F35 +0x3B2C 0x26F7A +0x3B2D 0x26F92 +0x3B2E 0x26F60 +0x3B2F 0x26F36 +0x3B30 0x26F51 +0x3B31 0x26F42 +0x3B33 0x26F3F +0x3B34 0x26F7B +0x3B35 0x26F5D +0x3B36 0x26F94 +0x3B37 0x26F6A +0x3B38 0x2F9B5 +0x3B39 0x271F2 +0x3B3A 0x273BB +0x3B3B 0x2741B +0x3B3C 0x2741A +0x3B3D 0x27433 +0x3B3E 0x27417 +0x3B3F 0x2740A +0x3B40 0x27415 +0x3B41 0x27412 +0x3B42 0x27401 +0x3B43 0x2742D +0x3B44 0x273FD +0x3B45 0x27423 +0x3B46 0x27405 +0x3B47 0x27411 +0x3B48 0x27400 +0x3B49 0x2741C +0x3B4A 0x27435 +0x3B4B 0x2742E +0x3B4C 0x27436 +0x3B4D 0x20ABF +0x3B4E 0x2742F +0x3B4F 0x2740C +0x3B50 0x27409 +0x3B51 0x27431 +0x3B52 0x273FC +0x3B53 0x2740F +0x3B54 0x27418 +0x3B55 0x27402 +0x3B56 0x27600 +0x3B57 0x2771F +0x3B58 0x27737 +0x3B5A 0x27738 +0x3B5B 0x2772B +0x3B5C 0x2772E +0x3B5D 0x27721 +0x3B5E 0x27730 +0x3B5F 0x27729 +0x3B60 0x27731 +0x3B61 0x2F9C9 +0x3B62 0x27701 +0x3B63 0x2772C +0x3B64 0x27722 +0x3B65 0x277FF +0x3B66 0x27877 +0x3B67 0x27867 +0x3B68 0x2787F +0x3B69 0x2787D +0x3B6A 0x2787B +0x3B6B 0x2787E +0x3B6C 0x2791E +0x3B6D 0x2791C +0x3B6E 0x27921 +0x3B6F 0x27926 +0x3B70 0x27927 +0x3B71 0x27929 +0x3B72 0x2792C +0x3B73 0x2791D +0x3B74 0x2792B +0x3B75 0x27ABF +0x3B76 0x27AA4 +0x3B77 0x27AAA +0x3B78 0x27AAE +0x3B79 0x27A9F +0x3B7A 0x27AD0 +0x3B7B 0x27AB1 +0x3B7C 0x27AAD +0x3B7D 0x27A9B +0x3B7E 0x27AB2 +0x3C21 0x27AA9 +0x3C22 0x27AB3 +0x3C23 0x27AB4 +0x3C24 0x27ABA +0x3C25 0x27AA5 +0x3C26 0x27AB7 +0x3C27 0x27AAC +0x3C28 0x27ACB +0x3C29 0x27ACF +0x3C2A 0x27BC6 +0x3C2B 0x27C01 +0x3C2C 0x27BFF +0x3C2D 0x27BFD +0x3C2E 0x27C77 +0x3C2F 0x27C78 +0x3C30 0x27C76 +0x3C31 0x27CF7 +0x3C32 0x27DCC +0x3C34 0x27DD4 +0x3C35 0x27DD7 +0x3C36 0x27DD5 +0x3C37 0x27DD6 +0x3C38 0x27DD3 +0x3C39 0x27F5D +0x3C3A 0x27F55 +0x3C3B 0x280E0 +0x3C3C 0x28148 +0x3C3D 0x280EE +0x3C3E 0x280DB +0x3C3F 0x280E7 +0x3C40 0x280D6 +0x3C41 0x280E5 +0x3C42 0x280E1 +0x3C43 0x280DD +0x3C44 0x280E2 +0x3C45 0x28270 +0x3C46 0x28266 +0x3C47 0x2826F +0x3C48 0x2826E +0x3C49 0x28381 +0x3C4A 0x28369 +0x3C4B 0x2836E +0x3C4C 0x2836D +0x3C4D 0x2836C +0x3C4E 0x28384 +0x3C4F 0x28385 +0x3C50 0x28371 +0x3C51 0x28373 +0x3C52 0x2836A +0x3C53 0x2836F +0x3C54 0x2837B +0x3C55 0x2856A +0x3C56 0x2857C +0x3C57 0x2857D +0x3C58 0x28581 +0x3C59 0x285FA +0x3C5A 0x28605 +0x3C5B 0x285EB +0x3C5C 0x285FB +0x3C5D 0x285E9 +0x3C5E 0x285EF +0x3C5F 0x285FC +0x3C60 0x285E7 +0x3C61 0x2F9E1 +0x3C62 0x285EE +0x3C63 0x285FD +0x3C64 0x28732 +0x3C65 0x287A7 +0x3C66 0x287B5 +0x3C67 0x287B1 +0x3C68 0x287B9 +0x3C69 0x287A8 +0x3C6A 0x287B3 +0x3C6B 0x2F9E6 +0x3C6C 0x2888A +0x3C6D 0x28891 +0x3C6E 0x2888D +0x3C6F 0x28899 +0x3C71 0x2889A +0x3C72 0x2889B +0x3C73 0x28892 +0x3C74 0x2888F +0x3C75 0x288AB +0x3C76 0x24CDB +0x3C78 0x28A75 +0x3C79 0x28A31 +0x3C7A 0x28A38 +0x3C7C 0x28A35 +0x3C7D 0x28A69 +0x3C7E 0x28A3B +0x3D21 0x28A3D +0x3D22 0x28A6C +0x3D23 0x28A79 +0x3D24 0x28A3C +0x3D25 0x28A3E +0x3D26 0x28C97 +0x3D27 0x28CA5 +0x3D28 0x28CA2 +0x3D29 0x28C9D +0x3D2A 0x28CA1 +0x3D2B 0x28D68 +0x3D2C 0x28D6F +0x3D2D 0x28D6D +0x3D2E 0x28D72 +0x3D2F 0x28D75 +0x3D30 0x28D77 +0x3D31 0x28D79 +0x3D32 0x28EB5 +0x3D33 0x28EEA +0x3D34 0x28EAB +0x3D35 0x28F43 +0x3D36 0x28F41 +0x3D37 0x28F42 +0x3D38 0x29009 +0x3D39 0x29008 +0x3D3A 0x29006 +0x3D3B 0x29001 +0x3D3C 0x29003 +0x3D3D 0x29000 +0x3D3E 0x29004 +0x3D3F 0x2900A +0x3D40 0x2900E +0x3D41 0x2900D +0x3D42 0x29007 +0x3D43 0x2900F +0x3D44 0x29014 +0x3D45 0x29002 +0x3D46 0x29015 +0x3D47 0x2900C +0x3D48 0x29010 +0x3D49 0x29005 +0x3D4A 0x290FD +0x3D4B 0x290FF +0x3D4C 0x29104 +0x3D4D 0x29100 +0x3D4E 0x29109 +0x3D4F 0x2922B +0x3D50 0x2F9F7 +0x3D51 0x29231 +0x3D52 0x292DB +0x3D53 0x292C5 +0x3D54 0x292D3 +0x3D55 0x292CE +0x3D57 0x292C9 +0x3D58 0x292BF +0x3D59 0x292CB +0x3D5A 0x292C0 +0x3D5B 0x292D0 +0x3D5C 0x292D4 +0x3D5D 0x293C1 +0x3D5E 0x293B9 +0x3D5F 0x293BB +0x3D60 0x293C3 +0x3D61 0x293C9 +0x3D62 0x29407 +0x3D63 0x2942D +0x3D64 0x294F8 +0x3D65 0x294E1 +0x3D66 0x294FA +0x3D67 0x294EF +0x3D68 0x294FD +0x3D6A 0x294EB +0x3D6B 0x294F1 +0x3D6C 0x294ED +0x3D6D 0x294FE +0x3D6E 0x295F8 +0x3D6F 0x29603 +0x3D70 0x295EE +0x3D71 0x295E8 +0x3D72 0x29601 +0x3D73 0x296EC +0x3D74 0x29722 +0x3D75 0x29714 +0x3D76 0x29734 +0x3D77 0x2972F +0x3D78 0x29739 +0x3D79 0x29741 +0x3D7A 0x2973C +0x3D7B 0x29749 +0x3D7C 0x29758 +0x3D7D 0x2973A +0x3D7E 0x29742 +0x3E21 0x2973F +0x3E22 0x29822 +0x3E23 0x29823 +0x3E24 0x2984A +0x3E25 0x298DC +0x3E26 0x298D9 +0x3E27 0x298DB +0x3E28 0x298E2 +0x3E29 0x2FA07 +0x3E2A 0x298DF +0x3E2B 0x298E0 +0x3E2C 0x298D7 +0x3E2D 0x29A4F +0x3E2E 0x29A46 +0x3E2F 0x29A53 +0x3E30 0x29A55 +0x3E31 0x29A4E +0x3E32 0x29A4A +0x3E33 0x29A4C +0x3E34 0x29A63 +0x3E35 0x29B51 +0x3E36 0x29B53 +0x3E37 0x29B58 +0x3E38 0x29B4D +0x3E39 0x29B5A +0x3E3A 0x29B49 +0x3E3B 0x29B5D +0x3E3C 0x29C12 +0x3E3D 0x29C3C +0x3E3E 0x29CD1 +0x3E3F 0x29CDF +0x3E40 0x29CD6 +0x3E41 0x29CD8 +0x3E42 0x29CE0 +0x3E43 0x29CD9 +0x3E44 0x29DB1 +0x3E45 0x29DAC +0x3E46 0x29DAA +0x3E47 0x29DEE +0x3E48 0x29DBD +0x3E4A 0x29DC3 +0x3E4B 0x29DA8 +0x3E4C 0x29DAE +0x3E4D 0x29DAB +0x3E4E 0x2A01D +0x3E4F 0x2A027 +0x3E50 0x2A038 +0x3E51 0x2A012 +0x3E52 0x2A048 +0x3E53 0x2A02B +0x3E54 0x2A016 +0x3E55 0x2A019 +0x3E56 0x2A03D +0x3E57 0x2A023 +0x3E58 0x2A02A +0x3E59 0x2A264 +0x3E5A 0x2A2AD +0x3E5B 0x2A2AC +0x3E5C 0x2FA14 +0x3E5D 0x2A2B1 +0x3E5E 0x2A2AF +0x3E5F 0x2A32C +0x3E60 0x2A324 +0x3E61 0x2A325 +0x3E62 0x2A328 +0x3E63 0x2A3F9 +0x3E64 0x2A3F7 +0x3E65 0x2A3FD +0x3E66 0x2A3FE +0x3E67 0x2A439 +0x3E68 0x2A433 +0x3E69 0x2A4D7 +0x3E6A 0x2A4D8 +0x3E6B 0x2A4E4 +0x3E6C 0x214A1 +0x3E6D 0x2A50E +0x3E6E 0x2A53B +0x3E6F 0x2A544 +0x3E70 0x2A542 +0x3E71 0x2A594 +0x3E72 0x2A593 +0x3E73 0x2A5D5 +0x3E74 0x2A6A7 +0x3E75 0x20431 +0x3E76 0x20423 +0x3E77 0x20428 +0x3E78 0x20427 +0x3E79 0x204C6 +0x3E7A 0x205A3 +0x3E7B 0x20621 +0x3E7C 0x2081B +0x3E7E 0x208C1 +0x3F21 0x208C3 +0x3F22 0x2092A +0x3F23 0x20969 +0x3F24 0x20A27 +0x3F25 0x210B6 +0x3F26 0x210A7 +0x3F27 0x210A4 +0x3F28 0x210A6 +0x3F29 0x21090 +0x3F2A 0x2109E +0x3F2B 0x21094 +0x3F2C 0x210A8 +0x3F2D 0x210A5 +0x3F2E 0x210A2 +0x3F2F 0x21091 +0x3F31 0x214BC +0x3F32 0x214BD +0x3F33 0x214B4 +0x3F34 0x214B0 +0x3F35 0x214E4 +0x3F36 0x21545 +0x3F37 0x2154B +0x3F38 0x2157E +0x3F39 0x2157F +0x3F3A 0x2157D +0x3F3B 0x215C3 +0x3F3C 0x218FC +0x3F3D 0x218F7 +0x3F3E 0x218F0 +0x3F3F 0x218ED +0x3F40 0x218F1 +0x3F41 0x218F8 +0x3F42 0x21AE9 +0x3F43 0x21CEB +0x3F45 0x21F90 +0x3F46 0x21F8D +0x3F47 0x21F86 +0x3F48 0x21F91 +0x3F49 0x21F8A +0x3F4A 0x22008 +0x3F4B 0x22050 +0x3F4C 0x222EA +0x3F4D 0x222E6 +0x3F4E 0x222E2 +0x3F4F 0x222E7 +0x3F50 0x222ED +0x3F51 0x222E1 +0x3F52 0x22434 +0x3F53 0x22476 +0x3F54 0x22475 +0x3F55 0x22473 +0x3F56 0x224B5 +0x3F57 0x22590 +0x3F58 0x22592 +0x3F59 0x228E1 +0x3F5A 0x228DF +0x3F5B 0x228D5 +0x3F5C 0x228F2 +0x3F5D 0x228FE +0x3F5E 0x22913 +0x3F5F 0x2292E +0x3F60 0x22A19 +0x3F61 0x22E08 +0x3F63 0x22E05 +0x3F64 0x22E09 +0x3F65 0x22E06 +0x3F66 0x22E03 +0x3F67 0x22DFD +0x3F68 0x22DFC +0x3F69 0x22E02 +0x3F6A 0x22E42 +0x3F6B 0x2301A +0x3F6C 0x23011 +0x3F6D 0x23015 +0x3F6E 0x23016 +0x3F6F 0x230CC +0x3F70 0x230CF +0x3F71 0x230D0 +0x3F72 0x23122 +0x3F73 0x2311E +0x3F74 0x23121 +0x3F75 0x232E5 +0x3F77 0x23354 +0x3F78 0x232EF +0x3F79 0x23353 +0x3F7A 0x23351 +0x3F7B 0x233AD +0x3F7C 0x23767 +0x3F7D 0x23768 +0x3F7E 0x237A4 +0x4021 0x23777 +0x4022 0x23789 +0x4023 0x23744 +0x4024 0x2378B +0x4025 0x23779 +0x4026 0x2375B +0x4027 0x23743 +0x4028 0x23757 +0x4029 0x2374A +0x402A 0x2377C +0x402B 0x23746 +0x402C 0x2377B +0x402D 0x23756 +0x402E 0x239A8 +0x402F 0x23A76 +0x4030 0x23A72 +0x4031 0x23AD6 +0x4032 0x23AD8 +0x4033 0x23AD1 +0x4034 0x23C22 +0x4035 0x23C20 +0x4036 0x23C23 +0x4037 0x23C1E +0x4038 0x23C6E +0x4039 0x240A3 +0x403A 0x24077 +0x403B 0x240A6 +0x403C 0x2406D +0x403D 0x240A2 +0x403E 0x2407C +0x403F 0x24084 +0x4040 0x24068 +0x4041 0x24074 +0x4042 0x24086 +0x4043 0x240A5 +0x4044 0x2407B +0x4045 0x2407A +0x4046 0x24069 +0x4047 0x24072 +0x4048 0x24076 +0x4049 0x2444A +0x404A 0x24437 +0x404B 0x2442A +0x404C 0x2442D +0x404D 0x24446 +0x404E 0x24428 +0x404F 0x24426 +0x4050 0x24442 +0x4051 0x2442C +0x4052 0x24438 +0x4053 0x2442B +0x4054 0x24433 +0x4055 0x24445 +0x4056 0x24539 +0x4057 0x246F9 +0x4058 0x246FA +0x4059 0x248B8 +0x405A 0x248B7 +0x405B 0x248BB +0x405C 0x248B9 +0x405D 0x248B4 +0x405E 0x24A6F +0x405F 0x24A87 +0x4060 0x24A8F +0x4061 0x24AA2 +0x4062 0x24AA3 +0x4063 0x2F931 +0x4064 0x24B9B +0x4065 0x24B9D +0x4066 0x24BCE +0x4068 0x24EBD +0x4069 0x24EBF +0x406A 0x24E92 +0x406C 0x24EEF +0x406D 0x24EC9 +0x406E 0x24FA4 +0x406F 0x24FA8 +0x4070 0x24FAA +0x4071 0x25028 +0x4072 0x25024 +0x4073 0x25025 +0x4074 0x25026 +0x4075 0x250A9 +0x4076 0x250BA +0x4077 0x250BE +0x4078 0x250BC +0x4079 0x250C0 +0x407A 0x252F0 +0x407B 0x252DF +0x407C 0x252E0 +0x407D 0x252ED +0x407E 0x252DB +0x4121 0x252FB +0x4122 0x252B9 +0x4123 0x252DA +0x4124 0x252EB +0x4125 0x252EC +0x4126 0x2559A +0x4127 0x2559F +0x4128 0x2559B +0x4129 0x25597 +0x412A 0x255A1 +0x412B 0x2570F +0x412C 0x25705 +0x412D 0x25748 +0x412F 0x258BC +0x4130 0x258BA +0x4131 0x25ABF +0x4132 0x25D01 +0x4133 0x25CE8 +0x4134 0x25CEF +0x4135 0x25CE4 +0x4136 0x25CE6 +0x4137 0x25D02 +0x4138 0x25CEB +0x4139 0x25CE0 +0x413A 0x25CED +0x413B 0x25CD9 +0x413C 0x2F964 +0x413D 0x25D14 +0x413E 0x25CEE +0x4140 0x25D13 +0x4141 0x25CF9 +0x4142 0x25CF8 +0x4143 0x25F25 +0x4144 0x2F969 +0x4145 0x25F19 +0x4146 0x25F20 +0x4147 0x25F43 +0x4148 0x25F3F +0x4149 0x26145 +0x414A 0x2614C +0x414B 0x26149 +0x414C 0x2614F +0x414D 0x26141 +0x414E 0x2613E +0x414F 0x2614D +0x4150 0x26152 +0x4151 0x2614A +0x4152 0x2614E +0x4153 0x26173 +0x4154 0x26142 +0x4155 0x26151 +0x4156 0x26155 +0x4157 0x26150 +0x4158 0x2616C +0x415A 0x2616A +0x415B 0x26153 +0x415C 0x26168 +0x415D 0x26255 +0x415E 0x26256 +0x415F 0x2631C +0x4160 0x2631D +0x4162 0x2631E +0x4163 0x26323 +0x4164 0x2631F +0x4165 0x263E1 +0x4166 0x263CD +0x4167 0x263CB +0x4168 0x263CC +0x4169 0x263C8 +0x416A 0x263C9 +0x416B 0x2649B +0x416C 0x26494 +0x416D 0x26492 +0x416E 0x26496 +0x416F 0x26493 +0x4170 0x26495 +0x4171 0x2648F +0x4172 0x2651D +0x4173 0x26522 +0x4174 0x26521 +0x4175 0x265E9 +0x4176 0x265EF +0x4177 0x265E0 +0x4178 0x265E6 +0x4179 0x265E4 +0x417A 0x26829 +0x417B 0x2682C +0x417C 0x26876 +0x417D 0x26883 +0x417E 0x26878 +0x4221 0x2683C +0x4222 0x24443 +0x4223 0x2687A +0x4225 0x268F2 +0x4226 0x2699E +0x4227 0x2699B +0x4228 0x2699A +0x4229 0x269F6 +0x422A 0x269F5 +0x422B 0x26AA5 +0x422C 0x26A93 +0x422D 0x26AA4 +0x422E 0x26E82 +0x422F 0x26EC7 +0x4230 0x26FB7 +0x4231 0x2701D +0x4232 0x26FE2 +0x4233 0x26FD7 +0x4234 0x26FE3 +0x4235 0x26FE4 +0x4236 0x26FBC +0x4237 0x26FD3 +0x4239 0x26F5A +0x423A 0x26FD2 +0x423B 0x26F2D +0x423C 0x2F9AF +0x423D 0x26FC4 +0x423E 0x26FD0 +0x423F 0x26FE5 +0x4240 0x27005 +0x4241 0x27007 +0x4242 0x26FE6 +0x4243 0x2701B +0x4244 0x26FE7 +0x4245 0x26FD8 +0x4246 0x26FBE +0x4247 0x27017 +0x4248 0x26FB4 +0x4249 0x26FD9 +0x424A 0x26FE8 +0x424B 0x26FAD +0x424C 0x26FAF +0x424D 0x26FC8 +0x424E 0x26FE9 +0x424F 0x26FEA +0x4250 0x271FE +0x4251 0x271FB +0x4252 0x27200 +0x4253 0x27472 +0x4254 0x27470 +0x4255 0x27446 +0x4256 0x27459 +0x4257 0x2745E +0x4258 0x27448 +0x4259 0x2744F +0x425A 0x27471 +0x425B 0x27460 +0x425C 0x2745F +0x425D 0x2746E +0x425E 0x27473 +0x425F 0x2F9C0 +0x4260 0x2F9BF +0x4261 0x27447 +0x4262 0x2746D +0x4263 0x2746F +0x4264 0x27481 +0x4265 0x2746C +0x4266 0x27478 +0x4267 0x27483 +0x4268 0x27449 +0x4269 0x27468 +0x426A 0x27474 +0x426B 0x27463 +0x426C 0x2746A +0x426D 0x26885 +0x426E 0x27465 +0x426F 0x27462 +0x4270 0x274C8 +0x4271 0x275D0 +0x4272 0x275D4 +0x4273 0x275D1 +0x4274 0x27603 +0x4275 0x27742 +0x4276 0x27763 +0x4277 0x27756 +0x4278 0x2775B +0x4279 0x27755 +0x427A 0x27750 +0x427B 0x2772D +0x427C 0x27744 +0x427D 0x27748 +0x427E 0x27745 +0x4321 0x27782 +0x4323 0x27762 +0x4324 0x27885 +0x4325 0x2788D +0x4326 0x27936 +0x4327 0x2792F +0x4328 0x27931 +0x4329 0x27937 +0x432A 0x27AA7 +0x432B 0x27AD9 +0x432C 0x27AF0 +0x432D 0x27AF2 +0x432E 0x27AFD +0x432F 0x27AE8 +0x4330 0x27AEB +0x4331 0x27AEE +0x4332 0x27AE0 +0x4333 0x27AE9 +0x4334 0x27AED +0x4335 0x27AD6 +0x4336 0x27AF8 +0x4337 0x27AD4 +0x4338 0x27ADF +0x4339 0x27AE7 +0x433A 0x27AD8 +0x433B 0x27AE3 +0x433C 0x27AEF +0x433D 0x27B0F +0x433E 0x27BCA +0x433F 0x21546 +0x4340 0x27C05 +0x4341 0x27C0C +0x4342 0x27C0D +0x4343 0x27C7F +0x4344 0x27C80 +0x4345 0x27C81 +0x4346 0x27D01 +0x4347 0x27D03 +0x4348 0x27DF2 +0x4349 0x27DE2 +0x434A 0x27DE3 +0x434B 0x27DDE +0x434C 0x27DE9 +0x434D 0x27DE8 +0x434E 0x27DE0 +0x434F 0x27E01 +0x4350 0x27DF5 +0x4351 0x27DE4 +0x4353 0x27E77 +0x4354 0x27F74 +0x4355 0x27F6F +0x4356 0x27F62 +0x4357 0x27F61 +0x4358 0x27F6D +0x4359 0x27F73 +0x435A 0x27F6A +0x435B 0x27F69 +0x435C 0x28112 +0x435D 0x2812D +0x435E 0x28114 +0x435F 0x2810F +0x4360 0x28129 +0x4361 0x28116 +0x4362 0x28103 +0x4363 0x28146 +0x4364 0x2815C +0x4365 0x28111 +0x4366 0x28106 +0x4367 0x280DC +0x4368 0x2812B +0x4369 0x2812A +0x436A 0x2812C +0x436B 0x28127 +0x436C 0x2827A +0x436D 0x2839C +0x436E 0x28399 +0x436F 0x28395 +0x4370 0x2838B +0x4371 0x28398 +0x4372 0x28396 +0x4373 0x28432 +0x4374 0x285A4 +0x4375 0x285AA +0x4376 0x2861B +0x4378 0x2860D +0x4379 0x2861C +0x437A 0x2860A +0x437B 0x28620 +0x437C 0x28608 +0x437D 0x2861A +0x437E 0x28613 +0x4421 0x28611 +0x4422 0x2875D +0x4423 0x2875F +0x4424 0x2875E +0x4425 0x28760 +0x4426 0x287BB +0x4427 0x287BC +0x4428 0x287C1 +0x4429 0x287C0 +0x442A 0x287C8 +0x442B 0x287CE +0x442C 0x288A7 +0x442D 0x288B2 +0x442E 0x288B6 +0x442F 0x288A5 +0x4430 0x288BA +0x4431 0x288B5 +0x4432 0x288AD +0x4433 0x288A4 +0x4434 0x288D3 +0x4435 0x288B0 +0x4436 0x288B1 +0x4437 0x2891D +0x4438 0x28A8D +0x443A 0x28A91 +0x443B 0x28AB6 +0x443C 0x28AB7 +0x443D 0x28ABD +0x443E 0x28ABC +0x443F 0x28A96 +0x4440 0x28A94 +0x4441 0x28AA0 +0x4442 0x28CA8 +0x4443 0x28CA6 +0x4444 0x28D84 +0x4445 0x28D96 +0x4446 0x28D88 +0x4447 0x28D9A +0x4448 0x28ED1 +0x4449 0x28ECF +0x444A 0x28F50 +0x444B 0x28F51 +0x444C 0x28F4E +0x444D 0x28F80 +0x444E 0x28F81 +0x444F 0x2901B +0x4450 0x29017 +0x4451 0x29020 +0x4452 0x29019 +0x4453 0x2901A +0x4454 0x29021 +0x4455 0x2901E +0x4456 0x29018 +0x4457 0x2901D +0x4459 0x2912D +0x445A 0x29124 +0x445B 0x29127 +0x445C 0x2912E +0x445D 0x29125 +0x445E 0x2911C +0x445F 0x29119 +0x4461 0x29123 +0x4462 0x2911F +0x4463 0x2911A +0x4464 0x2912B +0x4465 0x2911E +0x4466 0x291E0 +0x4467 0x29233 +0x4468 0x292E6 +0x4469 0x292FC +0x446A 0x292E5 +0x446B 0x292F8 +0x446C 0x292F6 +0x446D 0x292EA +0x446E 0x292F2 +0x446F 0x292ED +0x4470 0x292EB +0x4471 0x292F0 +0x4472 0x292F1 +0x4473 0x293C6 +0x4474 0x293C8 +0x4475 0x293CE +0x4476 0x293C5 +0x4478 0x293CB +0x4479 0x29513 +0x447A 0x29514 +0x447B 0x29507 +0x447C 0x2950C +0x447D 0x2961A +0x4521 0x29617 +0x4522 0x29606 +0x4523 0x29616 +0x4524 0x29607 +0x4525 0x29610 +0x4526 0x29609 +0x4527 0x29619 +0x4528 0x29615 +0x4529 0x2976E +0x452A 0x2973B +0x452B 0x2973E +0x452C 0x2976C +0x452D 0x29765 +0x452E 0x29764 +0x452F 0x29759 +0x4530 0x2977C +0x4531 0x29770 +0x4532 0x29779 +0x4533 0x2982C +0x4534 0x29852 +0x4535 0x29851 +0x4536 0x2984C +0x4537 0x29900 +0x4538 0x29910 +0x4539 0x29913 +0x453A 0x298FF +0x453B 0x298FE +0x453C 0x298ED +0x453D 0x29A5A +0x453E 0x29A58 +0x453F 0x29A5C +0x4540 0x29ADA +0x4541 0x29B78 +0x4542 0x29B5E +0x4543 0x29B67 +0x4544 0x29B64 +0x4545 0x29C13 +0x4546 0x29C23 +0x4547 0x29C41 +0x4548 0x29C3F +0x4549 0x29C40 +0x454A 0x29CED +0x454B 0x29CE3 +0x454C 0x29CEA +0x454D 0x29CF0 +0x454E 0x29CE6 +0x454F 0x29CE9 +0x4550 0x29CF1 +0x4551 0x29CEE +0x4552 0x29DD4 +0x4553 0x29DD1 +0x4554 0x29DDC +0x4555 0x29DEC +0x4556 0x2A069 +0x4557 0x2A06D +0x4558 0x2A057 +0x4559 0x2A066 +0x455A 0x2A0F9 +0x455B 0x2A04A +0x455C 0x2A060 +0x455D 0x2A056 +0x455E 0x2A059 +0x455F 0x2A04C +0x4560 0x2A06A +0x4561 0x2A062 +0x4562 0x2A063 +0x4563 0x2A070 +0x4564 0x2A05F +0x4565 0x2FA0D +0x4566 0x2A064 +0x4567 0x2A05D +0x4568 0x2A068 +0x4569 0x2A09F +0x456A 0x2A2BA +0x456B 0x2A2B8 +0x456C 0x2A2BC +0x456D 0x2A2B9 +0x456E 0x2A2B4 +0x456F 0x2A33B +0x4570 0x2A32D +0x4571 0x2A338 +0x4572 0x2A32F +0x4573 0x2A332 +0x4574 0x2A441 +0x4575 0x2A4CB +0x4576 0x2A4DE +0x4577 0x2A4DD +0x4578 0x2A4DA +0x4579 0x2A4DC +0x457A 0x2A510 +0x457B 0x2A54F +0x457C 0x2A549 +0x457D 0x2A598 +0x457E 0x2A596 +0x4621 0x2A597 +0x4622 0x2A5C7 +0x4623 0x2019C +0x4624 0x2A5DA +0x4625 0x2A5D8 +0x4626 0x2A6A8 +0x4627 0x2010A +0x4628 0x2019D +0x4629 0x204CB +0x462A 0x20538 +0x462B 0x20539 +0x462C 0x205A6 +0x462D 0x20823 +0x462E 0x20822 +0x462F 0x20821 +0x4630 0x209CE +0x4631 0x20B92 +0x4632 0x20B91 +0x4633 0x210EC +0x4634 0x210E0 +0x4635 0x210ED +0x4636 0x21108 +0x4637 0x210E5 +0x4638 0x210EE +0x4639 0x210E4 +0x463A 0x210EB +0x463B 0x210E3 +0x463C 0x210EA +0x463D 0x2110A +0x463E 0x2F859 +0x463F 0x214D1 +0x4640 0x214E3 +0x4641 0x214D4 +0x4642 0x214D0 +0x4643 0x214D9 +0x4646 0x214DA +0x4647 0x214D3 +0x4648 0x2154C +0x4649 0x2154D +0x464A 0x2157C +0x464B 0x21580 +0x464C 0x215CC +0x464D 0x218FF +0x464E 0x21908 +0x464F 0x2A508 +0x4650 0x21901 +0x4651 0x2F86B +0x4652 0x21900 +0x4653 0x21AED +0x4654 0x21AF3 +0x4655 0x21AEE +0x4656 0x21AF1 +0x4657 0x21AF0 +0x4658 0x21ADE +0x4659 0x21B51 +0x465A 0x21F82 +0x465B 0x21FA9 +0x465C 0x21F98 +0x465D 0x21F9D +0x465E 0x21F9A +0x465F 0x21F9E +0x4660 0x21F9F +0x4661 0x21FA6 +0x4662 0x21FA7 +0x4663 0x22009 +0x4664 0x2202F +0x4665 0x22171 +0x4666 0x2216D +0x4667 0x22172 +0x4668 0x222EF +0x4669 0x222F0 +0x466A 0x2243B +0x466B 0x22439 +0x466C 0x2243C +0x466D 0x22438 +0x466E 0x24BFD +0x466F 0x2243A +0x4670 0x22478 +0x4671 0x22479 +0x4672 0x22477 +0x4673 0x22598 +0x4674 0x2259C +0x4675 0x22599 +0x4676 0x2259A +0x4677 0x22911 +0x4678 0x2290A +0x4679 0x228FD +0x467A 0x2290F +0x467B 0x22919 +0x467C 0x22903 +0x467D 0x22915 +0x467E 0x2290C +0x4721 0x22909 +0x4722 0x22912 +0x4723 0x22934 +0x4724 0x2292A +0x4725 0x22908 +0x4726 0x2292D +0x4727 0x22928 +0x4728 0x2F8B1 +0x4729 0x2292C +0x472A 0x22926 +0x472B 0x22933 +0x472D 0x22A1A +0x472E 0x22A1E +0x472F 0x22E07 +0x4730 0x22E2C +0x4731 0x22E32 +0x4732 0x22E28 +0x4733 0x22E31 +0x4734 0x22E29 +0x4735 0x22E30 +0x4736 0x22E2A +0x4737 0x22E44 +0x4738 0x22E2E +0x4739 0x230D1 +0x473A 0x23124 +0x473B 0x232F7 +0x473C 0x232F4 +0x473D 0x232F3 +0x473E 0x232F8 +0x473F 0x237B5 +0x4740 0x23796 +0x4741 0x23798 +0x4742 0x23795 +0x4743 0x23791 +0x4744 0x237B2 +0x4745 0x2379E +0x4746 0x23759 +0x4747 0x237A3 +0x4748 0x2379A +0x4749 0x2379B +0x474B 0x26183 +0x474C 0x23ADA +0x474D 0x23ADF +0x474E 0x23B16 +0x474F 0x23C1F +0x4750 0x23C2D +0x4751 0x23C2E +0x4752 0x23C2B +0x4753 0x240B8 +0x4754 0x240BB +0x4755 0x240BF +0x4756 0x240BA +0x4757 0x240D5 +0x4758 0x240E3 +0x4759 0x240C1 +0x475A 0x240BE +0x475B 0x240BD +0x475C 0x240B4 +0x475D 0x240C2 +0x475E 0x240A1 +0x475F 0x24087 +0x4760 0x240D7 +0x4761 0x240CA +0x4762 0x240B5 +0x4763 0x240DA +0x4764 0x240D9 +0x4765 0x240B3 +0x4766 0x240D8 +0x4767 0x24467 +0x4768 0x24471 +0x4769 0x24462 +0x476A 0x2445C +0x476B 0x24468 +0x476C 0x24452 +0x476D 0x24456 +0x476E 0x21109 +0x476F 0x20442 +0x4770 0x245A0 +0x4771 0x24700 +0x4772 0x246FE +0x4773 0x246FF +0x4774 0x248CB +0x4775 0x2F928 +0x4776 0x248CA +0x4777 0x248A9 +0x4778 0x248C8 +0x4779 0x24AB4 +0x477A 0x24AAC +0x477B 0x24AAA +0x477C 0x24AA9 +0x477D 0x24C0E +0x477E 0x24CE9 +0x4821 0x24CED +0x4822 0x24CF2 +0x4823 0x24CEB +0x4824 0x24CEE +0x4825 0x24EE8 +0x4826 0x24EDB +0x4827 0x24ED7 +0x4828 0x24EE3 +0x4829 0x24EE5 +0x482A 0x24EEE +0x482B 0x24ED5 +0x482C 0x24FB3 +0x482D 0x2502D +0x482E 0x250C1 +0x482F 0x250C3 +0x4830 0x2530C +0x4831 0x2530E +0x4832 0x25307 +0x4833 0x25317 +0x4834 0x25309 +0x4835 0x25316 +0x4836 0x2539A +0x4837 0x2539C +0x4838 0x255B4 +0x4839 0x255B7 +0x483A 0x255B3 +0x483B 0x2154E +0x483C 0x25713 +0x483D 0x25714 +0x483E 0x258E6 +0x483F 0x258DC +0x4840 0x258E8 +0x4841 0x258E5 +0x4842 0x25A2E +0x4843 0x25A2C +0x4844 0x25A2B +0x4845 0x25ACD +0x4846 0x25D3D +0x4847 0x25D32 +0x4848 0x25D2D +0x4849 0x25D45 +0x484A 0x25D3E +0x484B 0x25D50 +0x484C 0x25D25 +0x484D 0x25D53 +0x484E 0x25D23 +0x484F 0x25F37 +0x4850 0x25F38 +0x4851 0x25F47 +0x4852 0x25F3D +0x4853 0x25F3E +0x4854 0x25F49 +0x4855 0x25F4A +0x4856 0x25F1D +0x4858 0x261A5 +0x4859 0x2618C +0x485A 0x2618D +0x485B 0x26189 +0x485C 0x26196 +0x485D 0x26185 +0x485E 0x2618F +0x485F 0x26177 +0x4860 0x2618E +0x4861 0x26182 +0x4862 0x2618A +0x4863 0x26188 +0x4864 0x2617B +0x4865 0x26197 +0x4866 0x2617D +0x4867 0x26179 +0x4868 0x26259 +0x4869 0x26324 +0x486A 0x2632D +0x486B 0x2632E +0x486C 0x2632B +0x486D 0x2F976 +0x486E 0x263DA +0x486F 0x263D8 +0x4870 0x263D6 +0x4871 0x26487 +0x4872 0x264A0 +0x4873 0x26528 +0x4874 0x26525 +0x4875 0x2651F +0x4876 0x265F3 +0x4877 0x265F7 +0x4878 0x265F6 +0x4879 0x2682B +0x487A 0x2685B +0x487B 0x26848 +0x487D 0x2685C +0x487E 0x2686D +0x4921 0x2689D +0x4922 0x26899 +0x4923 0x2688C +0x4924 0x26891 +0x4925 0x2689B +0x4926 0x2689A +0x4927 0x2689C +0x4928 0x26895 +0x4929 0x2688D +0x492A 0x26896 +0x492B 0x268A5 +0x492C 0x2692A +0x492D 0x269A1 +0x492E 0x269A4 +0x492F 0x269AD +0x4930 0x26AA9 +0x4931 0x26AAE +0x4932 0x26AB0 +0x4933 0x2700D +0x4934 0x26F63 +0x4935 0x26F71 +0x4936 0x27051 +0x4937 0x27054 +0x4938 0x2702A +0x4939 0x27044 +0x493A 0x27055 +0x493B 0x27099 +0x493C 0x27039 +0x493D 0x2703F +0x493E 0x2703E +0x493F 0x2704F +0x4940 0x2704D +0x4941 0x27035 +0x4942 0x27040 +0x4943 0x27031 +0x4944 0x26FD5 +0x4945 0x2702B +0x4946 0x27033 +0x4947 0x27041 +0x4948 0x27056 +0x4949 0x2704C +0x494A 0x27046 +0x494B 0x2703C +0x494C 0x27045 +0x494D 0x27043 +0x494E 0x2703D +0x494F 0x27070 +0x4950 0x27057 +0x4951 0x27038 +0x4952 0x27058 +0x4954 0x27037 +0x4955 0x27207 +0x4956 0x27206 +0x4957 0x27209 +0x4958 0x274AB +0x4959 0x27490 +0x495A 0x27493 +0x495B 0x274BC +0x495C 0x274A9 +0x495D 0x2749E +0x495E 0x274BF +0x495F 0x274AA +0x4960 0x27491 +0x4961 0x274A4 +0x4962 0x2749A +0x4963 0x274A7 +0x4964 0x274A1 +0x4965 0x2749C +0x4966 0x274A2 +0x4967 0x2749B +0x4968 0x2749F +0x4969 0x27494 +0x496A 0x2748F +0x496B 0x272F0 +0x496C 0x27492 +0x496D 0x27495 +0x496E 0x274A5 +0x496F 0x274A6 +0x4970 0x27604 +0x4971 0x2779C +0x4972 0x27779 +0x4973 0x2777A +0x4974 0x2777E +0x4975 0x2777B +0x4976 0x27771 +0x4977 0x27781 +0x4978 0x2777F +0x4979 0x2777C +0x497A 0x2777D +0x497B 0x27775 +0x497C 0x27776 +0x497D 0x2788E +0x497E 0x2788F +0x4A21 0x2793E +0x4A22 0x2793F +0x4A23 0x27940 +0x4A24 0x27941 +0x4A26 0x27B0D +0x4A27 0x27B17 +0x4A28 0x27B10 +0x4A29 0x27B0E +0x4A2A 0x27AEA +0x4A2B 0x27B1D +0x4A2C 0x27B03 +0x4A2D 0x27B22 +0x4A2E 0x27B04 +0x4A2F 0x27B00 +0x4A30 0x27B20 +0x4A31 0x27B21 +0x4A32 0x27B23 +0x4A33 0x27B13 +0x4A34 0x27B09 +0x4A35 0x27B11 +0x4A36 0x27BCB +0x4A37 0x27BCE +0x4A38 0x27BD0 +0x4A39 0x27BCC +0x4A3A 0x27BD4 +0x4A3B 0x214DB +0x4A3C 0x27C09 +0x4A3D 0x27C0B +0x4A3E 0x27C85 +0x4A3F 0x27D06 +0x4A40 0x27D0D +0x4A42 0x27D14 +0x4A43 0x27D0F +0x4A44 0x27E09 +0x4A45 0x27E14 +0x4A46 0x27E0B +0x4A47 0x27DFC +0x4A48 0x27E04 +0x4A49 0x27E0A +0x4A4A 0x27E00 +0x4A4B 0x27DFD +0x4A4C 0x27E07 +0x4A4D 0x27E06 +0x4A4E 0x27E11 +0x4A4F 0x27E79 +0x4A50 0x27E78 +0x4A51 0x27F88 +0x4A52 0x27F80 +0x4A53 0x27F8B +0x4A54 0x28159 +0x4A55 0x28161 +0x4A56 0x28175 +0x4A58 0x28155 +0x4A59 0x2815B +0x4A5A 0x2815F +0x4A5B 0x28152 +0x4A5C 0x28162 +0x4A5D 0x28172 +0x4A5E 0x2815D +0x4A5F 0x28168 +0x4A60 0x28171 +0x4A61 0x28165 +0x4A62 0x28166 +0x4A63 0x28167 +0x4A64 0x28176 +0x4A65 0x2814C +0x4A66 0x28160 +0x4A67 0x28174 +0x4A68 0x28150 +0x4A69 0x2828A +0x4A6A 0x28281 +0x4A6B 0x28286 +0x4A6C 0x2827F +0x4A6D 0x28280 +0x4A6E 0x283A5 +0x4A6F 0x283A7 +0x4A70 0x283A8 +0x4A71 0x283A6 +0x4A72 0x283AF +0x4A73 0x26195 +0x4A74 0x283B1 +0x4A75 0x28435 +0x4A76 0x28439 +0x4A77 0x285C3 +0x4A78 0x28630 +0x4A79 0x2862A +0x4A7A 0x2862B +0x4A7B 0x2862D +0x4A7C 0x2862E +0x4A7D 0x2862C +0x4A7E 0x28623 +0x4B21 0x28621 +0x4B22 0x28622 +0x4B23 0x2876C +0x4B24 0x28781 +0x4B25 0x2878F +0x4B26 0x28780 +0x4B27 0x287D0 +0x4B28 0x287CD +0x4B29 0x287D5 +0x4B2A 0x287D4 +0x4B2B 0x288D1 +0x4B2C 0x288BE +0x4B2D 0x288CB +0x4B2E 0x288CE +0x4B2F 0x288BD +0x4B30 0x288D0 +0x4B31 0x28B04 +0x4B32 0x28AD5 +0x4B33 0x28AD0 +0x4B34 0x28AD3 +0x4B35 0x28AFB +0x4B36 0x28AD8 +0x4B37 0x28AD1 +0x4B38 0x28AFD +0x4B39 0x28AD9 +0x4B3A 0x28AD6 +0x4B3B 0x28AE6 +0x4B3C 0x28AF9 +0x4B3D 0x28DA1 +0x4B3E 0x28D9D +0x4B3F 0x28D9E +0x4B41 0x28EFF +0x4B42 0x28F5F +0x4B43 0x28F57 +0x4B44 0x28F60 +0x4B45 0x28F59 +0x4B46 0x2902C +0x4B47 0x29025 +0x4B48 0x29027 +0x4B49 0x29030 +0x4B4A 0x29024 +0x4B4B 0x29026 +0x4B4C 0x2902D +0x4B4D 0x2902E +0x4B4E 0x29029 +0x4B4F 0x29031 +0x4B50 0x29145 +0x4B51 0x29147 +0x4B52 0x29152 +0x4B53 0x2914A +0x4B54 0x29150 +0x4B55 0x29146 +0x4B56 0x2914F +0x4B57 0x2914E +0x4B58 0x29153 +0x4B59 0x29321 +0x4B5A 0x29309 +0x4B5B 0x2931A +0x4B5C 0x2931B +0x4B5D 0x25315 +0x4B5E 0x29310 +0x4B5F 0x2F9F9 +0x4B60 0x29314 +0x4B61 0x2930E +0x4B62 0x29312 +0x4B63 0x2930B +0x4B64 0x293CF +0x4B65 0x293D2 +0x4B66 0x293D0 +0x4B67 0x293D4 +0x4B68 0x293D3 +0x4B69 0x293D1 +0x4B6A 0x20B18 +0x4B6B 0x2F9FB +0x4B6C 0x29409 +0x4B6D 0x2951C +0x4B6E 0x29527 +0x4B6F 0x29525 +0x4B70 0x2951B +0x4B71 0x29529 +0x4B72 0x2951F +0x4B73 0x29530 +0x4B74 0x29524 +0x4B75 0x29528 +0x4B76 0x29519 +0x4B77 0x2952F +0x4B78 0x29624 +0x4B79 0x29621 +0x4B7A 0x29625 +0x4B7B 0x29626 +0x4B7C 0x29627 +0x4B7D 0x29676 +0x4B7E 0x29766 +0x4C21 0x29775 +0x4C22 0x29769 +0x4C23 0x2977E +0x4C24 0x2978F +0x4C25 0x29774 +0x4C26 0x27210 +0x4C27 0x297AD +0x4C28 0x2982B +0x4C29 0x2982A +0x4C2A 0x29858 +0x4C2B 0x29922 +0x4C2C 0x2991D +0x4C2D 0x2992B +0x4C2E 0x2992C +0x4C2F 0x2992D +0x4C30 0x29933 +0x4C31 0x2991B +0x4C32 0x29927 +0x4C33 0x2992A +0x4C34 0x29928 +0x4C35 0x2993B +0x4C36 0x29A7E +0x4C37 0x29A71 +0x4C38 0x29A79 +0x4C39 0x29A78 +0x4C3A 0x29A70 +0x4C3B 0x29A6D +0x4C3C 0x29A7D +0x4C3D 0x29A75 +0x4C3E 0x29A76 +0x4C3F 0x29ADE +0x4C40 0x29B66 +0x4C41 0x29B83 +0x4C42 0x29B87 +0x4C43 0x29B7B +0x4C44 0x29B89 +0x4C45 0x29B86 +0x4C46 0x29B82 +0x4C47 0x29B7C +0x4C48 0x29B81 +0x4C49 0x29C43 +0x4C4A 0x29C45 +0x4C4B 0x29CF7 +0x4C4C 0x29CF9 +0x4C4D 0x29CFA +0x4C4E 0x29E05 +0x4C4F 0x29DFE +0x4C50 0x29E0F +0x4C51 0x29DFF +0x4C52 0x29DFA +0x4C53 0x29E09 +0x4C54 0x29E20 +0x4C55 0x29E0C +0x4C56 0x29E3C +0x4C57 0x29E22 +0x4C58 0x29DF8 +0x4C59 0x29E0A +0x4C5A 0x29E08 +0x4C5B 0x29DF7 +0x4C5C 0x2A08E +0x4C5D 0x2A077 +0x4C5E 0x2A08B +0x4C5F 0x2A0B4 +0x4C60 0x2A08A +0x4C61 0x2A09A +0x4C62 0x2A079 +0x4C63 0x2A083 +0x4C64 0x2A07F +0x4C65 0x2A0A1 +0x4C66 0x2A08F +0x4C67 0x2A0A3 +0x4C68 0x2A081 +0x4C69 0x2A094 +0x4C6A 0x2A07E +0x4C6B 0x2A082 +0x4C6C 0x2A090 +0x4C6D 0x2A0A5 +0x4C6E 0x2A0AD +0x4C6F 0x2A09D +0x4C70 0x2A267 +0x4C71 0x2A269 +0x4C72 0x2A2CB +0x4C73 0x2A2C8 +0x4C74 0x2A2D1 +0x4C75 0x2A340 +0x4C76 0x2A34B +0x4C77 0x2A349 +0x4C78 0x2A346 +0x4C79 0x2A33E +0x4C7A 0x2A343 +0x4C7B 0x2A33F +0x4C7C 0x2A3A5 +0x4C7D 0x2A3A7 +0x4C7E 0x2A44E +0x4D21 0x2A44D +0x4D22 0x2259B +0x4D23 0x2A4E5 +0x4D24 0x2A4E1 +0x4D25 0x2A4E2 +0x4D26 0x2A516 +0x4D27 0x2A514 +0x4D28 0x2FA1B +0x4D29 0x2A559 +0x4D2A 0x2A551 +0x4D2B 0x2A55F +0x4D2C 0x2A54A +0x4D2D 0x2A557 +0x4D2E 0x2A558 +0x4D2F 0x2A5CA +0x4D30 0x2A5DB +0x4D31 0x2A5DE +0x4D32 0x2A5E0 +0x4D33 0x2A5E1 +0x4D34 0x2A5DF +0x4D35 0x2A5E2 +0x4D36 0x2A5E3 +0x4D37 0x2A692 +0x4D38 0x2A6BF +0x4D39 0x2A6BE +0x4D3A 0x2010B +0x4D3B 0x20452 +0x4D3C 0x2044E +0x4D3E 0x2F813 +0x4D3F 0x205A7 +0x4D40 0x20826 +0x4D41 0x20827 +0x4D42 0x208C6 +0x4D43 0x2090B +0x4D44 0x2096A +0x4D45 0x20978 +0x4D46 0x2111A +0x4D47 0x21116 +0x4D48 0x21119 +0x4D49 0x21117 +0x4D4A 0x2111B +0x4D4B 0x21118 +0x4D4C 0x21120 +0x4D4D 0x21237 +0x4D4E 0x214EC +0x4D4F 0x21581 +0x4D50 0x2923D +0x4D51 0x2190F +0x4D52 0x219AD +0x4D53 0x21AFB +0x4D54 0x21B52 +0x4D55 0x21FAF +0x4D56 0x21FB7 +0x4D57 0x21FB2 +0x4D58 0x22178 +0x4D59 0x221AC +0x4D5A 0x22300 +0x4D5B 0x222FE +0x4D5C 0x22302 +0x4D5D 0x222FD +0x4D5E 0x22303 +0x4D5F 0x22440 +0x4D60 0x22443 +0x4D61 0x22442 +0x4D62 0x224B7 +0x4D63 0x225A2 +0x4D64 0x22900 +0x4D65 0x22935 +0x4D66 0x22941 +0x4D67 0x22905 +0x4D68 0x20453 +0x4D69 0x22950 +0x4D6A 0x2294E +0x4D6B 0x22953 +0x4D6C 0x22E53 +0x4D6D 0x22E50 +0x4D6E 0x22E57 +0x4D6F 0x22E5F +0x4D70 0x22E55 +0x4D71 0x22EEA +0x4D72 0x23026 +0x4D73 0x29830 +0x4D74 0x2302A +0x4D75 0x23028 +0x4D76 0x2302C +0x4D77 0x2302D +0x4D78 0x230D4 +0x4D79 0x23307 +0x4D7A 0x23358 +0x4D7B 0x23359 +0x4D7C 0x237C5 +0x4D7D 0x237CD +0x4D7E 0x237C7 +0x4E21 0x237E8 +0x4E23 0x23932 +0x4E24 0x2A697 +0x4E25 0x23ADE +0x4E26 0x23C32 +0x4E27 0x20AC8 +0x4E28 0x2F915 +0x4E29 0x240F1 +0x4E2A 0x240F0 +0x4E2B 0x240EC +0x4E2C 0x24109 +0x4E2D 0x240F9 +0x4E2E 0x240F5 +0x4E2F 0x240FE +0x4E30 0x24474 +0x4E31 0x24481 +0x4E32 0x2447C +0x4E33 0x24475 +0x4E34 0x24489 +0x4E35 0x24482 +0x4E36 0x24497 +0x4E37 0x24486 +0x4E38 0x2447D +0x4E39 0x24493 +0x4E3A 0x2449C +0x4E3B 0x24476 +0x4E3C 0x24480 +0x4E3D 0x24545 +0x4E3E 0x206A1 +0x4E3F 0x24703 +0x4E40 0x248C9 +0x4E41 0x248CD +0x4E42 0x248D0 +0x4E43 0x24AAD +0x4E44 0x24AC5 +0x4E45 0x24BA2 +0x4E46 0x24CEC +0x4E47 0x24CF6 +0x4E48 0x24CF3 +0x4E49 0x24EF3 +0x4E4A 0x24EFA +0x4E4B 0x24EF9 +0x4E4C 0x24EF5 +0x4E4D 0x24EF4 +0x4E4E 0x24EF8 +0x4E4F 0x24FB6 +0x4E50 0x24FB4 +0x4E51 0x25032 +0x4E52 0x250CD +0x4E53 0x250C8 +0x4E54 0x250CE +0x4E55 0x250CA +0x4E56 0x2532A +0x4E57 0x25321 +0x4E58 0x2531D +0x4E59 0x255BD +0x4E5A 0x255BE +0x4E5B 0x255C2 +0x4E5D 0x255C9 +0x4E5E 0x2571F +0x4E5F 0x258F1 +0x4E60 0x258ED +0x4E61 0x258F2 +0x4E62 0x258E0 +0x4E63 0x258F7 +0x4E64 0x25A30 +0x4E65 0x25A37 +0x4E66 0x25A31 +0x4E67 0x25A36 +0x4E68 0x25AC8 +0x4E69 0x25D6D +0x4E6A 0x25D69 +0x4E6B 0x25D7D +0x4E6C 0x25D61 +0x4E6D 0x25D70 +0x4E6E 0x25D71 +0x4E6F 0x25D73 +0x4E70 0x25D76 +0x4E71 0x25D75 +0x4E72 0x25D78 +0x4E73 0x25D79 +0x4E74 0x25D64 +0x4E75 0x25D6E +0x4E76 0x25F51 +0x4E77 0x25F4F +0x4E78 0x25F22 +0x4E79 0x261AF +0x4E7A 0x261AA +0x4E7B 0x261A3 +0x4E7C 0x2619D +0x4E7D 0x2619C +0x4E7E 0x261A1 +0x4F21 0x261B6 +0x4F22 0x261AC +0x4F23 0x261A2 +0x4F24 0x261A7 +0x4F25 0x261B0 +0x4F26 0x261A9 +0x4F27 0x261C3 +0x4F28 0x26331 +0x4F29 0x26332 +0x4F2A 0x26333 +0x4F2B 0x26334 +0x4F2C 0x26337 +0x4F2D 0x2633C +0x4F2E 0x263D9 +0x4F2F 0x263DD +0x4F30 0x263DE +0x4F31 0x263DF +0x4F32 0x263E0 +0x4F33 0x264A5 +0x4F34 0x264AA +0x4F35 0x264A2 +0x4F36 0x264A3 +0x4F37 0x26604 +0x4F38 0x26603 +0x4F39 0x265FE +0x4F3A 0x26628 +0x4F3B 0x268AF +0x4F3C 0x268AD +0x4F3D 0x268A6 +0x4F3E 0x269AC +0x4F3F 0x269A5 +0x4F40 0x269B0 +0x4F41 0x269B1 +0x4F42 0x26A01 +0x4F43 0x26AB2 +0x4F44 0x26AD2 +0x4F45 0x26AF1 +0x4F46 0x26FD1 +0x4F47 0x27047 +0x4F48 0x270C9 +0x4F49 0x270A7 +0x4F4A 0x270C8 +0x4F4B 0x27095 +0x4F4C 0x2708E +0x4F4D 0x27091 +0x4F4E 0x2707D +0x4F4F 0x270EE +0x4F50 0x2708D +0x4F51 0x2708C +0x4F52 0x270B0 +0x4F53 0x27096 +0x4F54 0x27042 +0x4F55 0x2707C +0x4F56 0x270B1 +0x4F57 0x270B2 +0x4F58 0x27084 +0x4F59 0x2709D +0x4F5A 0x270A1 +0x4F5B 0x27098 +0x4F5C 0x270B3 +0x4F5D 0x27022 +0x4F5E 0x2707B +0x4F5F 0x2708A +0x4F60 0x270CE +0x4F61 0x27080 +0x4F62 0x27097 +0x4F63 0x270B4 +0x4F64 0x270B5 +0x4F65 0x2709A +0x4F66 0x2709F +0x4F67 0x27093 +0x4F68 0x27212 +0x4F69 0x2720B +0x4F6A 0x2720E +0x4F6B 0x274A3 +0x4F6C 0x274CC +0x4F6D 0x274DC +0x4F6E 0x274E1 +0x4F6F 0x274DE +0x4F70 0x274D2 +0x4F71 0x274DB +0x4F72 0x274D9 +0x4F73 0x274D7 +0x4F74 0x274D4 +0x4F75 0x274C9 +0x4F76 0x274EB +0x4F77 0x274DA +0x4F78 0x274D1 +0x4F79 0x27504 +0x4F7A 0x274CA +0x4F7B 0x274E2 +0x4F7C 0x275D7 +0x4F7D 0x2778C +0x4F7E 0x27799 +0x5021 0x277A2 +0x5022 0x27796 +0x5023 0x27794 +0x5024 0x2779F +0x5026 0x2778E +0x5027 0x27803 +0x5028 0x27894 +0x5029 0x27893 +0x502A 0x27944 +0x502B 0x27B2F +0x502C 0x27B35 +0x502D 0x27B2B +0x502E 0x27B32 +0x502F 0x27B2D +0x5030 0x27B36 +0x5032 0x27B31 +0x5033 0x27B12 +0x5034 0x27B33 +0x5035 0x27B1F +0x5036 0x27B34 +0x5037 0x27B40 +0x5038 0x27B3F +0x5039 0x27B41 +0x503A 0x27BD3 +0x503B 0x27C89 +0x503C 0x27D18 +0x503D 0x27D10 +0x503E 0x27E1A +0x503F 0x27E25 +0x5040 0x27E1E +0x5041 0x27F92 +0x5042 0x27F95 +0x5043 0x27F93 +0x5044 0x28184 +0x5045 0x2819A +0x5046 0x28189 +0x5047 0x2818D +0x5048 0x28188 +0x5049 0x28191 +0x504A 0x2819B +0x504B 0x2819C +0x504C 0x29548 +0x504D 0x2828E +0x504E 0x28292 +0x504F 0x283C5 +0x5050 0x283C1 +0x5051 0x283B8 +0x5052 0x283BE +0x5053 0x283B5 +0x5054 0x283C7 +0x5055 0x2843C +0x5057 0x285EC +0x5058 0x2863F +0x5059 0x28639 +0x505A 0x28637 +0x505B 0x287A1 +0x505C 0x28794 +0x505D 0x287A0 +0x505E 0x287DE +0x505F 0x287DB +0x5060 0x287DF +0x5061 0x287DC +0x5062 0x288D6 +0x5063 0x288DC +0x5064 0x288DD +0x5065 0x288E0 +0x5066 0x288E3 +0x5067 0x288E1 +0x5068 0x28B18 +0x5069 0x28B19 +0x506A 0x28B53 +0x506B 0x2F9EC +0x506C 0x28B44 +0x506D 0x28B0E +0x506E 0x28B0F +0x506F 0x28B47 +0x5070 0x28B17 +0x5071 0x28B1D +0x5072 0x28B11 +0x5073 0x28CB4 +0x5074 0x28CB6 +0x5075 0x28DB7 +0x5076 0x28DBE +0x5077 0x28DC2 +0x5078 0x28DB4 +0x5079 0x28F31 +0x507A 0x28F15 +0x507B 0x28F83 +0x507C 0x2903B +0x507D 0x29036 +0x507E 0x29042 +0x5121 0x29050 +0x5122 0x29040 +0x5123 0x29034 +0x5124 0x29038 +0x5125 0x2903D +0x5126 0x2903E +0x5127 0x29035 +0x5128 0x2903A +0x5129 0x29046 +0x512A 0x29037 +0x512B 0x29039 +0x512C 0x29045 +0x512D 0x29177 +0x512E 0x2915D +0x512F 0x2916A +0x5130 0x29176 +0x5131 0x2916B +0x5132 0x2916C +0x5133 0x29165 +0x5134 0x29164 +0x5135 0x29171 +0x5136 0x2915F +0x5137 0x29172 +0x5138 0x291FE +0x5139 0x291FF +0x513A 0x2923E +0x513B 0x2932B +0x513C 0x29336 +0x513D 0x2932D +0x513E 0x29339 +0x513F 0x2933F +0x5140 0x2933B +0x5141 0x29333 +0x5142 0x29342 +0x5143 0x2933A +0x5144 0x293D5 +0x5145 0x293D8 +0x5146 0x293D9 +0x5147 0x2940D +0x5148 0x2940A +0x5149 0x29439 +0x514A 0x2943A +0x514B 0x2953D +0x514C 0x29545 +0x514D 0x2953A +0x514E 0x29537 +0x514F 0x2953E +0x5150 0x29542 +0x5151 0x29787 +0x5152 0x2978C +0x5153 0x29782 +0x5154 0x2976B +0x5155 0x297A0 +0x5156 0x2979A +0x5157 0x29790 +0x5158 0x2978E +0x5159 0x297A1 +0x515A 0x297BD +0x515B 0x297B2 +0x515C 0x297B5 +0x515D 0x297B7 +0x515E 0x297AA +0x515F 0x297A2 +0x5160 0x297A5 +0x5161 0x297AE +0x5162 0x297AB +0x5163 0x297BC +0x5164 0x29832 +0x5165 0x2985A +0x5166 0x29964 +0x5167 0x2995C +0x5168 0x2994D +0x5169 0x2993F +0x516A 0x2993E +0x516B 0x29952 +0x516C 0x29958 +0x516D 0x29957 +0x516E 0x2995E +0x516F 0x29953 +0x5170 0x29954 +0x5171 0x29956 +0x5172 0x28F65 +0x5173 0x29A84 +0x5174 0x29A85 +0x5175 0x29A86 +0x5176 0x29B97 +0x5177 0x29BA1 +0x5178 0x29BA2 +0x517A 0x2FA0A +0x517B 0x29BA3 +0x517C 0x29BA6 +0x517E 0x29C15 +0x5221 0x29C24 +0x5222 0x29C4A +0x5223 0x29C49 +0x5224 0x29C48 +0x5225 0x29C4B +0x5226 0x29D0E +0x5227 0x29962 +0x5228 0x29D0B +0x5229 0x29D0A +0x522A 0x29D08 +0x522B 0x29D06 +0x522C 0x29E43 +0x522D 0x29E47 +0x522E 0x29E3F +0x522F 0x29E46 +0x5230 0x29E50 +0x5232 0x29E4B +0x5234 0x29E52 +0x5235 0x2A0D7 +0x5236 0x2A0BF +0x5237 0x2A0D8 +0x5238 0x2A0E0 +0x5239 0x2A0E7 +0x523A 0x2A0B8 +0x523B 0x2A0D5 +0x523C 0x2A0EF +0x523D 0x2A0E6 +0x523E 0x2A0E4 +0x523F 0x2A0D4 +0x5240 0x2A0D6 +0x5241 0x2A0EA +0x5243 0x2A0BB +0x5244 0x2A0E9 +0x5245 0x2FA10 +0x5246 0x2A26D +0x5247 0x2A270 +0x5248 0x2A273 +0x5249 0x2A272 +0x524A 0x2A2D4 +0x524B 0x2A2CE +0x524C 0x2A2D5 +0x524D 0x2A35A +0x524E 0x2A358 +0x524F 0x2A352 +0x5250 0x2A350 +0x5251 0x2A355 +0x5252 0x2A34E +0x5253 0x2A34D +0x5254 0x2A3CB +0x5255 0x2A3CC +0x5256 0x2A3CD +0x5257 0x2A3D1 +0x5258 0x2A458 +0x5259 0x2A463 +0x525A 0x2A45E +0x525B 0x2A454 +0x525C 0x2A45B +0x525D 0x2A4E9 +0x525E 0x2A4E7 +0x525F 0x2A4E8 +0x5260 0x2A51D +0x5261 0x2A567 +0x5262 0x2A55A +0x5263 0x2A55C +0x5264 0x2A55B +0x5265 0x2A561 +0x5266 0x2A5A1 +0x5268 0x2A5A4 +0x5269 0x2A5E9 +0x526A 0x2A5EF +0x526B 0x2A5E5 +0x526C 0x2A5F5 +0x526D 0x2A5EB +0x526E 0x2A5ED +0x526F 0x2A696 +0x5270 0x2A695 +0x5271 0x2A6B3 +0x5272 0x2A6B5 +0x5273 0x2A6B1 +0x5275 0x2044D +0x5276 0x20624 +0x5277 0x2082B +0x5278 0x209CF +0x5279 0x20AC9 +0x527A 0x21136 +0x527B 0x21131 +0x527C 0x21154 +0x527D 0x2113A +0x527E 0x21138 +0x5321 0x21239 +0x5322 0x21238 +0x5323 0x214F4 +0x5324 0x214F3 +0x5325 0x214F6 +0x5326 0x214FC +0x5327 0x214F5 +0x5328 0x214F1 +0x5329 0x2169C +0x532A 0x21918 +0x532B 0x2191A +0x532C 0x21AFC +0x532D 0x21AFE +0x532E 0x21B03 +0x532F 0x21B53 +0x5330 0x21D2B +0x5331 0x21FC6 +0x5332 0x21FC1 +0x5333 0x2217B +0x5334 0x22306 +0x5335 0x22449 +0x5336 0x224B8 +0x5337 0x225A3 +0x5338 0x22952 +0x5339 0x2294D +0x533A 0x2295F +0x533B 0x2295E +0x533C 0x22961 +0x533D 0x22A23 +0x533E 0x22E8C +0x533F 0x22E6F +0x5340 0x22E75 +0x5341 0x22E74 +0x5342 0x22E71 +0x5343 0x22E70 +0x5344 0x22E6C +0x5345 0x23126 +0x5346 0x23308 +0x5348 0x237F0 +0x5349 0x237EF +0x534A 0x237FB +0x534B 0x23810 +0x534C 0x2380C +0x534D 0x237F6 +0x534E 0x237FE +0x534F 0x23A7C +0x5350 0x23AE1 +0x5351 0x23C38 +0x5352 0x23C6F +0x5353 0x24118 +0x5354 0x24115 +0x5355 0x2411C +0x5356 0x24110 +0x5357 0x24135 +0x5358 0x2F917 +0x5359 0x24117 +0x535A 0x2411D +0x535B 0x24126 +0x535C 0x24128 +0x535D 0x24129 +0x535E 0x2412A +0x535F 0x2411A +0x5360 0x2F916 +0x5361 0x22307 +0x5362 0x244AB +0x5363 0x244AC +0x5364 0x244A1 +0x5365 0x244AE +0x5366 0x244A3 +0x5367 0x244A7 +0x5368 0x24548 +0x5369 0x24604 +0x536A 0x246FD +0x536C 0x24708 +0x536D 0x248D2 +0x536E 0x24AC6 +0x536F 0x24ABE +0x5370 0x24B1C +0x5371 0x24BA6 +0x5372 0x24BA7 +0x5373 0x24BAB +0x5374 0x24C00 +0x5375 0x24CFB +0x5376 0x24CFC +0x5377 0x24CF9 +0x5378 0x24D01 +0x5379 0x24F06 +0x537A 0x24F04 +0x537B 0x2F93C +0x537C 0x25034 +0x537D 0x25336 +0x537E 0x25332 +0x5421 0x25342 +0x5422 0x2532D +0x5423 0x25335 +0x5424 0x255D8 +0x5425 0x25723 +0x5426 0x25720 +0x5427 0x25901 +0x5428 0x25900 +0x5429 0x25903 +0x542A 0x2A6BC +0x542B 0x25A3C +0x542C 0x25A41 +0x542D 0x25A35 +0x542E 0x25AC9 +0x542F 0x25D8E +0x5430 0x25D9E +0x5431 0x25D99 +0x5432 0x25DB4 +0x5433 0x25DAA +0x5434 0x25D9F +0x5435 0x25D96 +0x5436 0x25D9D +0x5437 0x25DC3 +0x5438 0x25D74 +0x5439 0x25DAB +0x543B 0x25F63 +0x543C 0x25F5B +0x543D 0x25F5A +0x543E 0x261C5 +0x543F 0x261C4 +0x5440 0x261CF +0x5441 0x261C8 +0x5442 0x261A4 +0x5443 0x261BD +0x5444 0x261D3 +0x5445 0x26260 +0x5446 0x2633B +0x5447 0x263E3 +0x5448 0x263E7 +0x5449 0x264A8 +0x544A 0x264AC +0x544B 0x264A9 +0x544C 0x2652A +0x544D 0x26608 +0x544E 0x26609 +0x544F 0x268B9 +0x5450 0x26AC1 +0x5451 0x26AC2 +0x5452 0x26AB8 +0x5453 0x270E1 +0x5454 0x270EB +0x5455 0x270E5 +0x5456 0x270FA +0x5457 0x270E4 +0x5458 0x2710B +0x5459 0x270D7 +0x545A 0x270EF +0x545B 0x270E0 +0x545C 0x270EC +0x545D 0x270FB +0x545E 0x2F9B0 +0x545F 0x270D3 +0x5460 0x270E6 +0x5461 0x270FC +0x5462 0x270E3 +0x5463 0x270CF +0x5464 0x270DA +0x5465 0x270DC +0x5466 0x270D2 +0x5467 0x270A4 +0x5469 0x27217 +0x546A 0x27216 +0x546B 0x274F2 +0x546C 0x274FC +0x546D 0x27518 +0x546E 0x274F6 +0x546F 0x274FE +0x5470 0x274F3 +0x5471 0x274F7 +0x5472 0x27501 +0x5473 0x274F9 +0x5474 0x27506 +0x5475 0x274F5 +0x5476 0x27510 +0x5477 0x274DF +0x5478 0x27503 +0x5479 0x27508 +0x547A 0x275D8 +0x547B 0x27605 +0x547C 0x27797 +0x547D 0x277B3 +0x547E 0x277AE +0x5521 0x277AF +0x5522 0x277A7 +0x5523 0x277B1 +0x5524 0x277A8 +0x5525 0x277AC +0x5526 0x277AB +0x5527 0x27804 +0x5528 0x2789A +0x5529 0x2794A +0x552A 0x27B42 +0x552B 0x27B58 +0x552C 0x27B4B +0x552D 0x27B45 +0x552E 0x27B49 +0x552F 0x27B4C +0x5530 0x27B59 +0x5531 0x27B56 +0x5533 0x27B46 +0x5534 0x27B44 +0x5535 0x27B5B +0x5536 0x27B69 +0x5537 0x27C8E +0x5538 0x27C8F +0x5539 0x27D1E +0x553A 0x268BC +0x553B 0x27E2F +0x553C 0x27F9E +0x553D 0x27F9D +0x553E 0x27F9F +0x553F 0x27F9C +0x5540 0x281B4 +0x5541 0x281AE +0x5542 0x281AB +0x5543 0x281B3 +0x5544 0x281AF +0x5545 0x281C2 +0x5546 0x28293 +0x5547 0x28295 +0x5548 0x28296 +0x5549 0x28297 +0x554A 0x283CF +0x554B 0x283CE +0x554C 0x283CB +0x554D 0x2844B +0x554E 0x28646 +0x554F 0x28643 +0x5550 0x28645 +0x5551 0x28651 +0x5552 0x287AE +0x5553 0x287AF +0x5554 0x287B0 +0x5555 0x287B8 +0x5556 0x287E2 +0x5557 0x287E3 +0x5558 0x287E6 +0x5559 0x288ED +0x555A 0x288EA +0x555B 0x2893A +0x555C 0x28B59 +0x555D 0x28B84 +0x555E 0x28B5F +0x555F 0x28B7C +0x5560 0x28B5C +0x5561 0x28B58 +0x5562 0x28B55 +0x5563 0x28B5D +0x5564 0x28B7E +0x5565 0x28B80 +0x5566 0x28B83 +0x5567 0x28B57 +0x5569 0x28B5E +0x556A 0x28CBA +0x556B 0x28DD5 +0x556C 0x28F58 +0x556D 0x28F68 +0x556E 0x28F67 +0x556F 0x2904A +0x5570 0x2904C +0x5571 0x29052 +0x5572 0x29049 +0x5573 0x2904E +0x5574 0x29047 +0x5575 0x2904D +0x5576 0x2904B +0x5577 0x2904F +0x5578 0x2917E +0x5579 0x29187 +0x557A 0x29183 +0x557B 0x29189 +0x557C 0x24ACA +0x557D 0x29186 +0x557E 0x29188 +0x5621 0x29247 +0x5622 0x29242 +0x5623 0x29249 +0x5624 0x29248 +0x5628 0x29344 +0x5629 0x29351 +0x562A 0x29346 +0x562B 0x29347 +0x562C 0x293E4 +0x562D 0x2940F +0x562E 0x2943F +0x562F 0x2954B +0x5630 0x29557 +0x5631 0x29552 +0x5633 0x29551 +0x5634 0x29558 +0x5635 0x2955E +0x5636 0x29553 +0x5637 0x2955D +0x5638 0x2954D +0x5639 0x2963C +0x563A 0x2963F +0x563B 0x29646 +0x563C 0x2963E +0x563D 0x29644 +0x563E 0x29645 +0x563F 0x29641 +0x5640 0x29638 +0x5641 0x29642 +0x5642 0x29643 +0x5643 0x2967A +0x5644 0x297A3 +0x5645 0x297BA +0x5646 0x297C0 +0x5647 0x297C4 +0x5648 0x297C6 +0x5649 0x297CB +0x564A 0x29861 +0x564B 0x2997A +0x564C 0x29973 +0x564D 0x29972 +0x564E 0x29974 +0x564F 0x29980 +0x5650 0x29981 +0x5652 0x29A95 +0x5653 0x29A8F +0x5654 0x29A90 +0x5655 0x29A92 +0x5656 0x29A94 +0x5657 0x29A8B +0x5658 0x29AE6 +0x5659 0x29BB2 +0x565A 0x29BB8 +0x565B 0x29BBD +0x565C 0x29BBE +0x565D 0x29BCE +0x565E 0x29BBA +0x565F 0x29C16 +0x5660 0x29C26 +0x5661 0x29C25 +0x5662 0x29C4C +0x5663 0x29C50 +0x5664 0x29C4E +0x5665 0x29C51 +0x5666 0x29C52 +0x5667 0x29D14 +0x5668 0x29D15 +0x5669 0x29D1B +0x566A 0x29E82 +0x566B 0x29E99 +0x566C 0x29E9A +0x566D 0x29E7D +0x566E 0x29E85 +0x566F 0x29E86 +0x5670 0x29E9C +0x5671 0x29E79 +0x5672 0x29E7B +0x5673 0x29E80 +0x5674 0x29E83 +0x5675 0x29E81 +0x5676 0x2A11E +0x5677 0x2A11B +0x5678 0x2A12A +0x5679 0x2A0FB +0x567A 0x2A105 +0x567B 0x2A120 +0x567C 0x2A111 +0x567D 0x2A104 +0x567E 0x2A0FD +0x5721 0x2A103 +0x5722 0x2A110 +0x5723 0x2A118 +0x5724 0x2A10A +0x5725 0x2A14E +0x5726 0x2A109 +0x5727 0x2A107 +0x5728 0x2A11C +0x572A 0x2A277 +0x572B 0x2A276 +0x572C 0x2A2D8 +0x572D 0x2A2D9 +0x572E 0x2A361 +0x572F 0x2A35C +0x5730 0x2A35E +0x5731 0x2A360 +0x5732 0x2A3AA +0x5733 0x2A3D6 +0x5734 0x2A3D8 +0x5735 0x2A409 +0x5736 0x2A408 +0x5737 0x2A46B +0x5738 0x2A465 +0x5739 0x2A473 +0x573A 0x2A474 +0x573B 0x2A4ED +0x573C 0x2A524 +0x573D 0x2A525 +0x573E 0x2A56A +0x573F 0x2A5A7 +0x5740 0x2A5A8 +0x5741 0x2A60B +0x5742 0x2A5FA +0x5743 0x2A5F9 +0x5744 0x2A5FF +0x5745 0x2A604 +0x5746 0x2A5F6 +0x5747 0x2A605 +0x5748 0x2A699 +0x5749 0x2A6AB +0x574A 0x2A6BD +0x574B 0x2A6B8 +0x574D 0x20464 +0x574E 0x2045A +0x574F 0x20572 +0x5750 0x2097A +0x5751 0x20B95 +0x5752 0x2115F +0x5753 0x21161 +0x5754 0x2115E +0x5755 0x2115A +0x5756 0x2115C +0x5757 0x2115D +0x5758 0x2116E +0x5759 0x21157 +0x575A 0x21158 +0x575B 0x21502 +0x575C 0x2150B +0x575D 0x21508 +0x575E 0x21551 +0x575F 0x21925 +0x5760 0x21928 +0x5761 0x21923 +0x5762 0x21921 +0x5763 0x21924 +0x5764 0x21929 +0x5765 0x21B06 +0x5766 0x21B0A +0x5767 0x21FCA +0x5768 0x21FCC +0x5769 0x21FCB +0x576A 0x21FCF +0x576B 0x2217F +0x576C 0x2217C +0x576D 0x221D6 +0x576E 0x22309 +0x576F 0x2230B +0x5770 0x22376 +0x5771 0x2247D +0x5772 0x225A5 +0x5773 0x2295B +0x5774 0x2295C +0x5775 0x2295D +0x5776 0x22965 +0x5777 0x22E6D +0x5778 0x22E82 +0x5779 0x22E83 +0x577A 0x22E87 +0x577B 0x22E95 +0x577C 0x22E8A +0x577D 0x230D6 +0x577E 0x23128 +0x5821 0x2330D +0x5822 0x2382E +0x5823 0x2F8EE +0x5824 0x2382D +0x5825 0x23821 +0x5826 0x23819 +0x5827 0x2393B +0x5828 0x2393C +0x5829 0x2393A +0x582A 0x23A7E +0x582B 0x23C3B +0x582C 0x24147 +0x582D 0x24139 +0x582E 0x24134 +0x582F 0x24136 +0x5830 0x24146 +0x5831 0x2413B +0x5832 0x24141 +0x5833 0x24145 +0x5834 0x244C0 +0x5835 0x244C4 +0x5836 0x244BA +0x5837 0x244BD +0x5838 0x244BE +0x5839 0x245A3 +0x583A 0x2470C +0x583B 0x248D9 +0x583C 0x24ACD +0x583D 0x24BAE +0x583E 0x24CFF +0x583F 0x24D24 +0x5840 0x24FBB +0x5841 0x24FBC +0x5842 0x25036 +0x5843 0x250D5 +0x5844 0x250D3 +0x5845 0x250D6 +0x5846 0x2533C +0x5847 0x2533F +0x5848 0x255DE +0x5849 0x255E3 +0x584A 0x25727 +0x584B 0x25729 +0x584D 0x25905 +0x584E 0x25907 +0x584F 0x2590C +0x5850 0x25AD0 +0x5851 0x25DBE +0x5852 0x25DBC +0x5853 0x25DD0 +0x5854 0x25DC2 +0x5855 0x25DB5 +0x5856 0x25DC9 +0x5857 0x25F66 +0x5859 0x261D5 +0x585A 0x261E2 +0x585B 0x261DC +0x585C 0x261E3 +0x585D 0x261DA +0x585E 0x261C2 +0x585F 0x261E8 +0x5860 0x263E9 +0x5861 0x264AF +0x5862 0x264AD +0x5863 0x264AE +0x5864 0x2660B +0x5865 0x268C1 +0x5866 0x269B6 +0x5867 0x269B9 +0x5868 0x26AC0 +0x5869 0x270A5 +0x586A 0x27128 +0x586B 0x27122 +0x586C 0x27129 +0x586D 0x27118 +0x586E 0x2711F +0x586F 0x2711C +0x5870 0x27112 +0x5871 0x2712A +0x5873 0x27121 +0x5874 0x2712B +0x5875 0x27117 +0x5876 0x270F0 +0x5877 0x27116 +0x5878 0x27123 +0x5879 0x2752B +0x587A 0x27526 +0x587B 0x2753D +0x587C 0x27522 +0x587D 0x2753A +0x587E 0x27531 +0x5921 0x27532 +0x5922 0x27554 +0x5923 0x27521 +0x5924 0x27535 +0x5926 0x2752E +0x5927 0x27530 +0x5928 0x2752F +0x5929 0x27536 +0x592A 0x275DA +0x592B 0x275D9 +0x592C 0x277BB +0x592D 0x277BC +0x592E 0x277B7 +0x592F 0x277C2 +0x5930 0x277BD +0x5931 0x277B2 +0x5933 0x25344 +0x5934 0x25DD1 +0x5935 0x27B52 +0x5936 0x27B6B +0x5937 0x27B67 +0x5939 0x27B61 +0x593A 0x27B6C +0x593B 0x27B51 +0x593C 0x27B74 +0x593D 0x27B77 +0x593E 0x27B6F +0x593F 0x27B6D +0x5940 0x27B68 +0x5941 0x2F9D1 +0x5942 0x27B84 +0x5943 0x27C90 +0x5944 0x27C92 +0x5945 0x27C93 +0x5946 0x27D1F +0x5947 0x27E31 +0x5948 0x27E38 +0x5949 0x27E39 +0x594A 0x27E37 +0x594B 0x27FAB +0x594C 0x281C3 +0x594D 0x281C8 +0x594E 0x281CB +0x594F 0x281CF +0x5950 0x28298 +0x5951 0x283D4 +0x5952 0x283D3 +0x5953 0x283D8 +0x5954 0x283D9 +0x5955 0x283DD +0x5956 0x283D1 +0x5957 0x283D6 +0x5958 0x2843E +0x5959 0x28658 +0x595A 0x28657 +0x595B 0x28655 +0x595C 0x287C4 +0x595D 0x287E4 +0x595E 0x288EE +0x595F 0x288EF +0x5960 0x288F3 +0x5961 0x288F2 +0x5962 0x288F0 +0x5963 0x28BAB +0x5964 0x28B9A +0x5965 0x28BAF +0x5966 0x28B97 +0x5969 0x28BBF +0x596A 0x28B94 +0x596B 0x28B93 +0x596C 0x28CBE +0x596D 0x28CBB +0x596E 0x28CBC +0x596F 0x28DD9 +0x5970 0x28F6C +0x5971 0x29053 +0x5972 0x29054 +0x5973 0x2905B +0x5974 0x29058 +0x5975 0x29056 +0x5976 0x29057 +0x5977 0x2919F +0x5978 0x29194 +0x5979 0x29196 +0x597A 0x29197 +0x597B 0x2924A +0x597C 0x2924B +0x597D 0x29355 +0x597E 0x2935A +0x5A21 0x2935E +0x5A22 0x2935F +0x5A23 0x29359 +0x5A24 0x2935B +0x5A25 0x29358 +0x5A26 0x29354 +0x5A27 0x293E8 +0x5A28 0x293EB +0x5A29 0x293EC +0x5A2A 0x29413 +0x5A2B 0x29566 +0x5A2C 0x2956B +0x5A2D 0x29562 +0x5A2E 0x29569 +0x5A2F 0x29563 +0x5A30 0x2955F +0x5A31 0x2954E +0x5A32 0x29648 +0x5A33 0x2964A +0x5A34 0x297E3 +0x5A35 0x297DB +0x5A36 0x297D8 +0x5A37 0x297D6 +0x5A38 0x29986 +0x5A39 0x29990 +0x5A3A 0x29991 +0x5A3B 0x29988 +0x5A3C 0x29994 +0x5A3D 0x29983 +0x5A3F 0x2999C +0x5A40 0x2998D +0x5A41 0x29985 +0x5A42 0x29A98 +0x5A43 0x29A9A +0x5A44 0x29A9C +0x5A45 0x29AE7 +0x5A46 0x29BC5 +0x5A47 0x29BD0 +0x5A48 0x29BD1 +0x5A49 0x29C19 +0x5A4A 0x29C27 +0x5A4C 0x29C54 +0x5A4D 0x29D2D +0x5A4E 0x29D22 +0x5A50 0x29D1F +0x5A51 0x29EBD +0x5A52 0x29EAE +0x5A53 0x29EBB +0x5A54 0x29EAD +0x5A55 0x29EBC +0x5A56 0x29EB9 +0x5A57 0x29EB4 +0x5A58 0x29ECB +0x5A59 0x29EB7 +0x5A5A 0x29EB3 +0x5A5B 0x29EBA +0x5A5C 0x29EB6 +0x5A5D 0x29ECD +0x5A5E 0x29EBE +0x5A5F 0x29EC9 +0x5A60 0x2FA0B +0x5A61 0x2A15F +0x5A62 0x2A13B +0x5A63 0x2A161 +0x5A64 0x2A15C +0x5A65 0x2A18A +0x5A66 0x2A15A +0x5A67 0x2A14D +0x5A68 0x2A146 +0x5A69 0x2A144 +0x5A6A 0x2A13D +0x5A6B 0x2A140 +0x5A6C 0x2A13C +0x5A6D 0x2A18C +0x5A6E 0x2A141 +0x5A6F 0x2A14C +0x5A70 0x2A13E +0x5A71 0x2A14A +0x5A72 0x2A27C +0x5A73 0x2A27A +0x5A74 0x2A365 +0x5A75 0x2A36E +0x5A76 0x2A369 +0x5A77 0x2A36A +0x5A78 0x2A36F +0x5A79 0x2A36C +0x5A7A 0x2A370 +0x5A7B 0x2A368 +0x5A7C 0x2A36B +0x5A7E 0x2A3AC +0x5B21 0x2A3DE +0x5B22 0x2A3DD +0x5B23 0x2A3DC +0x5B24 0x244C5 +0x5B25 0x2A48C +0x5B26 0x2A483 +0x5B27 0x2A482 +0x5B28 0x2A488 +0x5B29 0x2A485 +0x5B2A 0x2A481 +0x5B2B 0x2A4F5 +0x5B2C 0x2A4EF +0x5B2D 0x2A4F4 +0x5B2E 0x2A4F2 +0x5B2F 0x2A4F6 +0x5B30 0x2A4F3 +0x5B31 0x2A4F0 +0x5B32 0x2A4F1 +0x5B33 0x2A52B +0x5B34 0x2A527 +0x5B35 0x2A528 +0x5B36 0x2A56C +0x5B37 0x2A5AE +0x5B38 0x2A60E +0x5B39 0x2A61B +0x5B3A 0x2A616 +0x5B3B 0x2A61F +0x5B3C 0x2A622 +0x5B3D 0x2A620 +0x5B3E 0x2A621 +0x5B3F 0x2A614 +0x5B40 0x2A613 +0x5B41 0x2A69D +0x5B42 0x2A69C +0x5B43 0x2A69E +0x5B44 0x2A69F +0x5B45 0x2046B +0x5B46 0x208C8 +0x5B47 0x21178 +0x5B48 0x21176 +0x5B49 0x21170 +0x5B4A 0x21171 +0x5B4B 0x2150A +0x5B4C 0x2192C +0x5B4D 0x22311 +0x5B4E 0x2247E +0x5B4F 0x22957 +0x5B50 0x22966 +0x5B51 0x22969 +0x5B52 0x22967 +0x5B53 0x22968 +0x5B54 0x22971 +0x5B55 0x2296F +0x5B56 0x2A3AE +0x5B57 0x22E8B +0x5B58 0x22E96 +0x5B59 0x23035 +0x5B5A 0x2303A +0x5B5B 0x2306B +0x5B5C 0x23316 +0x5B5D 0x23843 +0x5B5E 0x23846 +0x5B5F 0x2383F +0x5B60 0x2383B +0x5B61 0x2383D +0x5B62 0x239B1 +0x5B63 0x239B2 +0x5B64 0x23AE4 +0x5B65 0x23C40 +0x5B66 0x2415D +0x5B67 0x24151 +0x5B68 0x2414D +0x5B69 0x2414C +0x5B6A 0x2415B +0x5B6B 0x244D4 +0x5B6C 0x244D2 +0x5B6D 0x244CA +0x5B6E 0x244C8 +0x5B6F 0x244D0 +0x5B70 0x244C9 +0x5B71 0x24549 +0x5B72 0x245A4 +0x5B73 0x24712 +0x5B74 0x2470F +0x5B75 0x24711 +0x5B76 0x248DB +0x5B77 0x248DD +0x5B78 0x248DC +0x5B79 0x24AD4 +0x5B7A 0x24B21 +0x5B7B 0x24BB2 +0x5B7C 0x24D04 +0x5B7D 0x24D02 +0x5B7E 0x24F11 +0x5C21 0x24F16 +0x5C22 0x24F10 +0x5C23 0x24FBE +0x5C24 0x2721A +0x5C25 0x2534C +0x5C26 0x2534A +0x5C27 0x255F2 +0x5C28 0x255F1 +0x5C29 0x2572A +0x5C2A 0x2572C +0x5C2B 0x2572F +0x5C2C 0x25731 +0x5C2D 0x25911 +0x5C2E 0x25912 +0x5C2F 0x25A4B +0x5C30 0x25DDB +0x5C31 0x25DD6 +0x5C32 0x25DDD +0x5C33 0x25DE2 +0x5C34 0x25DE4 +0x5C35 0x25DE0 +0x5C36 0x25DDF +0x5C37 0x25DE3 +0x5C38 0x25F6E +0x5C39 0x25F71 +0x5C3A 0x261E9 +0x5C3B 0x261EA +0x5C3C 0x26263 +0x5C3D 0x263EB +0x5C3E 0x263EA +0x5C3F 0x268BD +0x5C40 0x268BB +0x5C41 0x268C6 +0x5C42 0x268CC +0x5C43 0x268C8 +0x5C44 0x244CF +0x5C45 0x268C9 +0x5C46 0x268CA +0x5C47 0x268CF +0x5C48 0x268D0 +0x5C49 0x269BA +0x5C4A 0x269FB +0x5C4B 0x26A03 +0x5C4C 0x26AC4 +0x5C4D 0x27149 +0x5C4E 0x27153 +0x5C4F 0x27136 +0x5C50 0x2714A +0x5C51 0x27141 +0x5C52 0x2714E +0x5C53 0x27119 +0x5C54 0x2714D +0x5C55 0x27145 +0x5C56 0x2714C +0x5C57 0x27147 +0x5C58 0x27148 +0x5C59 0x2714F +0x5C5A 0x27137 +0x5C5B 0x27142 +0x5C5C 0x2754A +0x5C5D 0x27546 +0x5C5F 0x27549 +0x5C60 0x2754F +0x5C61 0x27551 +0x5C62 0x2754C +0x5C64 0x27606 +0x5C65 0x27951 +0x5C66 0x27B7A +0x5C67 0x27B83 +0x5C68 0x27B7E +0x5C69 0x27B7F +0x5C6A 0x27B80 +0x5C6B 0x24BB5 +0x5C6C 0x27C91 +0x5C6D 0x27C94 +0x5C6E 0x27C95 +0x5C6F 0x27D21 +0x5C70 0x27D20 +0x5C71 0x27E3D +0x5C72 0x27E40 +0x5C73 0x27E46 +0x5C74 0x27E84 +0x5C75 0x27FAC +0x5C76 0x27FAD +0x5C78 0x281DA +0x5C79 0x281D9 +0x5C7A 0x283E2 +0x5C7B 0x283E1 +0x5C7C 0x283E3 +0x5C7D 0x283E4 +0x5C7E 0x283DE +0x5D21 0x283DF +0x5D22 0x28641 +0x5D23 0x28659 +0x5D24 0x2865C +0x5D25 0x2865A +0x5D26 0x287E8 +0x5D27 0x288F6 +0x5D28 0x288FC +0x5D29 0x288F7 +0x5D2A 0x288FA +0x5D2B 0x288F9 +0x5D2C 0x28BC4 +0x5D2D 0x28BBE +0x5D2E 0x28BD2 +0x5D2F 0x28BBD +0x5D30 0x28B95 +0x5D31 0x28BD4 +0x5D32 0x28DE4 +0x5D33 0x29061 +0x5D34 0x29062 +0x5D35 0x29063 +0x5D36 0x29064 +0x5D37 0x29060 +0x5D38 0x2905C +0x5D39 0x2905D +0x5D3A 0x2905E +0x5D3B 0x291A5 +0x5D3C 0x291A6 +0x5D3D 0x2924C +0x5D3E 0x29368 +0x5D3F 0x2936E +0x5D40 0x29371 +0x5D41 0x2936B +0x5D42 0x2936F +0x5D43 0x293EE +0x5D44 0x293F1 +0x5D45 0x293F0 +0x5D46 0x293EF +0x5D47 0x29415 +0x5D48 0x29414 +0x5D49 0x28F6E +0x5D4A 0x29447 +0x5D4B 0x2957C +0x5D4C 0x2957A +0x5D4D 0x29574 +0x5D4E 0x29576 +0x5D4F 0x2956E +0x5D50 0x29578 +0x5D51 0x2956D +0x5D52 0x2956C +0x5D53 0x2964E +0x5D54 0x297D7 +0x5D55 0x297EA +0x5D56 0x297E5 +0x5D57 0x29864 +0x5D58 0x299B3 +0x5D59 0x299A3 +0x5D5A 0x299A5 +0x5D5B 0x299A7 +0x5D5C 0x299A2 +0x5D5D 0x2999F +0x5D5E 0x299A6 +0x5D5F 0x2999E +0x5D60 0x299A8 +0x5D61 0x29AA9 +0x5D62 0x29AA6 +0x5D63 0x29AAA +0x5D64 0x29AAB +0x5D65 0x29AA0 +0x5D66 0x29AA1 +0x5D67 0x29AA8 +0x5D68 0x29AE8 +0x5D69 0x29AE9 +0x5D6A 0x29AEA +0x5D6B 0x29BE4 +0x5D6C 0x29BDF +0x5D6D 0x29BE0 +0x5D6E 0x29C28 +0x5D6F 0x29C5D +0x5D70 0x29C5B +0x5D71 0x29C56 +0x5D72 0x29C57 +0x5D73 0x29C5F +0x5D74 0x29C62 +0x5D75 0x29EE1 +0x5D76 0x29EE3 +0x5D77 0x29EDE +0x5D78 0x29ED9 +0x5D79 0x29EE8 +0x5D7A 0x29EF2 +0x5D7B 0x29EF6 +0x5D7C 0x29EE6 +0x5D7D 0x29EF4 +0x5D7E 0x29EF5 +0x5E21 0x29EE5 +0x5E22 0x29EE2 +0x5E24 0x2A196 +0x5E25 0x2A1AA +0x5E26 0x2A197 +0x5E27 0x2A170 +0x5E28 0x2A1A1 +0x5E29 0x2A19D +0x5E2A 0x2A1A9 +0x5E2B 0x2A16F +0x5E2C 0x2A17E +0x5E2D 0x2A194 +0x5E2E 0x2A19A +0x5E2F 0x2A173 +0x5E30 0x2A187 +0x5E31 0x2A171 +0x5E32 0x2A177 +0x5E33 0x2A188 +0x5E34 0x2A18D +0x5E35 0x2A185 +0x5E36 0x2A178 +0x5E37 0x2A1AD +0x5E38 0x2A280 +0x5E39 0x2A281 +0x5E3A 0x2A2E5 +0x5E3B 0x2A2E7 +0x5E3C 0x2A37C +0x5E3D 0x2A3AF +0x5E3E 0x2A3E1 +0x5E3F 0x2A496 +0x5E40 0x2A4A3 +0x5E41 0x2A490 +0x5E42 0x2A4F8 +0x5E43 0x2A52E +0x5E44 0x2A575 +0x5E45 0x2A57E +0x5E46 0x2A57D +0x5E47 0x2A57B +0x5E48 0x2A578 +0x5E49 0x2A5B0 +0x5E4A 0x2A634 +0x5E4B 0x2A636 +0x5E4C 0x2A630 +0x5E4D 0x2FA1D +0x5E4E 0x2A62E +0x5E4F 0x2A637 +0x5E50 0x20ACE +0x5E51 0x20B97 +0x5E52 0x20B98 +0x5E53 0x2117C +0x5E54 0x2117E +0x5E55 0x2117D +0x5E56 0x2117F +0x5E57 0x2150F +0x5E58 0x216A4 +0x5E59 0x21931 +0x5E5A 0x2192E +0x5E5B 0x2192F +0x5E5C 0x21932 +0x5E5D 0x21D2C +0x5E5E 0x21FD4 +0x5E5F 0x21FDC +0x5E60 0x21FD8 +0x5E61 0x2200E +0x5E62 0x22183 +0x5E63 0x22184 +0x5E64 0x22312 +0x5E65 0x22972 +0x5E66 0x2297C +0x5E67 0x2297E +0x5E68 0x22EA6 +0x5E69 0x22EA0 +0x5E6A 0x22E9E +0x5E6B 0x22EA2 +0x5E6C 0x2312A +0x5E6D 0x23318 +0x5E6E 0x2384D +0x5E6F 0x23858 +0x5E70 0x2385B +0x5E71 0x25914 +0x5E72 0x2F8F2 +0x5E73 0x23AE6 +0x5E74 0x24164 +0x5E75 0x24168 +0x5E76 0x24160 +0x5E77 0x24162 +0x5E78 0x244D7 +0x5E79 0x2454B +0x5E7A 0x248E0 +0x5E7B 0x24B22 +0x5E7C 0x24D05 +0x5E7D 0x24F19 +0x5E7E 0x24F1A +0x5F21 0x24FC3 +0x5F22 0x250D8 +0x5F23 0x250DC +0x5F24 0x2534F +0x5F25 0x255F7 +0x5F26 0x255F4 +0x5F27 0x255F8 +0x5F28 0x25913 +0x5F29 0x25A50 +0x5F2A 0x25DF0 +0x5F2B 0x25DE9 +0x5F2C 0x25DEF +0x5F2D 0x25DED +0x5F2E 0x25DEA +0x5F2F 0x25DF8 +0x5F30 0x25E05 +0x5F31 0x25DF2 +0x5F32 0x25F72 +0x5F34 0x261F9 +0x5F35 0x261F3 +0x5F36 0x261F6 +0x5F37 0x261F2 +0x5F38 0x261F7 +0x5F39 0x26266 +0x5F3A 0x26265 +0x5F3B 0x26340 +0x5F3C 0x2F977 +0x5F3D 0x268D1 +0x5F3E 0x268D3 +0x5F3F 0x26A04 +0x5F40 0x27159 +0x5F41 0x27160 +0x5F42 0x2715B +0x5F43 0x2715D +0x5F44 0x2715E +0x5F45 0x27169 +0x5F46 0x2715C +0x5F47 0x27161 +0x5F48 0x2716A +0x5F49 0x2715F +0x5F4A 0x2754E +0x5F4B 0x2755C +0x5F4C 0x27560 +0x5F4D 0x27563 +0x5F4E 0x275DB +0x5F4F 0x277CA +0x5F50 0x277C9 +0x5F51 0x277C8 +0x5F52 0x278A5 +0x5F53 0x278A3 +0x5F54 0x27B8E +0x5F55 0x27B87 +0x5F56 0x27B89 +0x5F57 0x27B85 +0x5F58 0x27B86 +0x5F59 0x27B8F +0x5F5A 0x27B8A +0x5F5B 0x27B90 +0x5F5C 0x27C98 +0x5F5D 0x27C9B +0x5F5E 0x27E47 +0x5F5F 0x27E49 +0x5F60 0x27E48 +0x5F61 0x281E5 +0x5F62 0x281EA +0x5F63 0x281ED +0x5F64 0x283F0 +0x5F65 0x283EF +0x5F66 0x283F2 +0x5F67 0x283EC +0x5F68 0x28440 +0x5F69 0x28660 +0x5F6A 0x2865F +0x5F6B 0x287EB +0x5F6C 0x287EC +0x5F6D 0x28900 +0x5F6E 0x28901 +0x5F6F 0x28BE2 +0x5F70 0x28BDF +0x5F71 0x28BE0 +0x5F72 0x28BE1 +0x5F73 0x28BE3 +0x5F74 0x28CC3 +0x5F75 0x28DEB +0x5F76 0x28DEA +0x5F77 0x28F61 +0x5F78 0x28F71 +0x5F79 0x2906B +0x5F7A 0x29068 +0x5F7B 0x29069 +0x5F7C 0x29067 +0x5F7D 0x291B0 +0x5F7E 0x291B1 +0x6021 0x291B2 +0x6022 0x29251 +0x6023 0x29374 +0x6024 0x2957F +0x6025 0x29584 +0x6026 0x29653 +0x6027 0x29654 +0x6028 0x297F0 +0x6029 0x297F4 +0x602A 0x297F1 +0x602B 0x29837 +0x602C 0x299BF +0x602F 0x299BD +0x6030 0x299BE +0x6031 0x299B7 +0x6032 0x299C0 +0x6033 0x299BA +0x6034 0x299B8 +0x6035 0x299BC +0x6036 0x299BB +0x6037 0x29AEB +0x6038 0x29BE7 +0x6039 0x29C1D +0x603A 0x29C1C +0x603B 0x29C63 +0x603C 0x2244B +0x603D 0x29D38 +0x603E 0x29D36 +0x603F 0x29D34 +0x6040 0x29D37 +0x6041 0x29F06 +0x6042 0x29F1C +0x6043 0x29F02 +0x6044 0x29F1D +0x6045 0x29F1E +0x6046 0x29EE0 +0x6047 0x29F11 +0x6048 0x29F18 +0x6049 0x29F21 +0x604A 0x29F20 +0x604B 0x29F10 +0x604C 0x2A1BD +0x604D 0x2A1AE +0x604E 0x2A1B5 +0x604F 0x2A1B8 +0x6050 0x2A1B9 +0x6051 0x2A1BE +0x6052 0x2A1C4 +0x6053 0x2A1BC +0x6054 0x2A1BA +0x6055 0x2A283 +0x6056 0x2A2EA +0x6057 0x2A2EC +0x6058 0x2A37E +0x6059 0x2A37B +0x605A 0x2A3E5 +0x605B 0x2A4A7 +0x605C 0x2A49E +0x605D 0x2A49A +0x605E 0x2A52F +0x605F 0x2A531 +0x6060 0x2A583 +0x6061 0x2A5B5 +0x6062 0x2A646 +0x6063 0x2A641 +0x6064 0x2A643 +0x6065 0x2A63D +0x6066 0x2A642 +0x6067 0x2A63B +0x6068 0x2A647 +0x6069 0x2096B +0x606A 0x209D0 +0x606B 0x2118E +0x606C 0x21B11 +0x606D 0x2F871 +0x606E 0x2F889 +0x606F 0x2244C +0x6070 0x2312B +0x6071 0x2384F +0x6072 0x2385E +0x6073 0x23863 +0x6074 0x2386B +0x6075 0x2393F +0x6076 0x23AE9 +0x6077 0x2416D +0x6078 0x2416B +0x6079 0x2416A +0x607A 0x29F2A +0x607B 0x244E0 +0x607C 0x244DD +0x607D 0x244E1 +0x607E 0x244DE +0x6121 0x244DC +0x6122 0x2454D +0x6123 0x24716 +0x6124 0x248E3 +0x6125 0x24AE5 +0x6126 0x24AE4 +0x6127 0x24F1D +0x6128 0x2574B +0x6129 0x2A6C1 +0x612A 0x25A4E +0x612B 0x25AD6 +0x612C 0x25DFD +0x612D 0x25E07 +0x612E 0x25DFE +0x612F 0x25E03 +0x6130 0x25E0B +0x6131 0x25DFF +0x6132 0x25F7A +0x6133 0x25F77 +0x6134 0x261FB +0x6135 0x26343 +0x6136 0x263ED +0x6137 0x269BC +0x6138 0x244DF +0x6139 0x26A05 +0x613A 0x26AC6 +0x613B 0x26AC5 +0x613C 0x27174 +0x613D 0x27173 +0x613E 0x27172 +0x613F 0x27178 +0x6140 0x27573 +0x6141 0x2757A +0x6142 0x24F1C +0x6143 0x27576 +0x6144 0x27575 +0x6145 0x27577 +0x6146 0x277CF +0x6147 0x277CE +0x6148 0x277CD +0x6149 0x278A8 +0x614A 0x27B98 +0x614B 0x27B92 +0x614C 0x27B94 +0x614D 0x27C9A +0x614E 0x27FB4 +0x614F 0x281EB +0x6150 0x281F4 +0x6151 0x281F3 +0x6152 0x281EE +0x6153 0x281F2 +0x6154 0x281F0 +0x6155 0x28664 +0x6156 0x28C05 +0x6157 0x28BFB +0x6158 0x28BFC +0x6159 0x28DF3 +0x615A 0x2906C +0x615B 0x291BA +0x615C 0x29379 +0x615D 0x2937E +0x615E 0x29378 +0x615F 0x293F4 +0x6160 0x29416 +0x6161 0x29657 +0x6162 0x299C8 +0x6163 0x299C3 +0x6164 0x299CE +0x6165 0x29AB3 +0x6166 0x29AED +0x6167 0x29AEE +0x6168 0x29BF1 +0x6169 0x29BF8 +0x616B 0x29C64 +0x616C 0x29C65 +0x616D 0x29F35 +0x616E 0x29F29 +0x616F 0x29F2C +0x6170 0x29F31 +0x6171 0x29F2B +0x6172 0x29F2E +0x6173 0x29F25 +0x6174 0x2A1DA +0x6175 0x2A1E0 +0x6176 0x2A1D4 +0x6177 0x2A1E1 +0x6178 0x2A1DD +0x6179 0x2A3E7 +0x617A 0x2A412 +0x617B 0x2A4AE +0x617C 0x2A4AF +0x617D 0x2A586 +0x617E 0x2A585 +0x6221 0x2A5D1 +0x6222 0x2A658 +0x6223 0x2A63F +0x6224 0x2A652 +0x6225 0x2A64B +0x6226 0x2A653 +0x6227 0x2A650 +0x6228 0x2A656 +0x6229 0x2A657 +0x622A 0x2A6CD +0x622B 0x2A6CB +0x622C 0x20831 +0x622D 0x20830 +0x622E 0x209D1 +0x6230 0x21192 +0x6231 0x21190 +0x6232 0x2118F +0x6233 0x21193 +0x6234 0x21191 +0x6236 0x22313 +0x6237 0x2247F +0x6238 0x22EAC +0x6239 0x24170 +0x623A 0x244E5 +0x623B 0x24B23 +0x623C 0x24B24 +0x623D 0x24D08 +0x623E 0x24D07 +0x623F 0x24F1F +0x6240 0x24F20 +0x6241 0x24F21 +0x6242 0x250E1 +0x6243 0x25354 +0x6244 0x25357 +0x6245 0x25355 +0x6246 0x255FA +0x6247 0x25738 +0x6248 0x27186 +0x6249 0x25737 +0x624A 0x25A53 +0x624B 0x25F7E +0x624C 0x25F7B +0x624D 0x2F971 +0x624E 0x261FD +0x624F 0x261FC +0x6250 0x26346 +0x6251 0x26932 +0x6252 0x26AC7 +0x6253 0x27171 +0x6254 0x27183 +0x6255 0x2716F +0x6256 0x2717E +0x6257 0x2717D +0x6258 0x27181 +0x6259 0x2717C +0x625A 0x2758A +0x625B 0x2757E +0x625C 0x27580 +0x625D 0x2757D +0x625E 0x2757F +0x625F 0x27582 +0x6260 0x277D4 +0x6261 0x277D0 +0x6262 0x277D2 +0x6263 0x27955 +0x6264 0x27B9B +0x6265 0x27B9A +0x6266 0x27E4E +0x6267 0x281F1 +0x6268 0x283F8 +0x6269 0x283FD +0x626A 0x2865E +0x626B 0x28666 +0x626C 0x28905 +0x626D 0x28C0A +0x626E 0x28C0B +0x626F 0x28C0E +0x6270 0x28C0D +0x6271 0x28C11 +0x6272 0x28C09 +0x6273 0x28C10 +0x6274 0x28C0C +0x6275 0x28C12 +0x6276 0x28CC4 +0x6277 0x28DF7 +0x6278 0x28DF8 +0x6279 0x28F6A +0x627A 0x28F6B +0x627B 0x291C0 +0x627C 0x291C2 +0x627D 0x29385 +0x627E 0x29380 +0x6321 0x29384 +0x6322 0x29381 +0x6323 0x291C4 +0x6324 0x2958B +0x6325 0x2958D +0x6326 0x2958E +0x6327 0x29AB7 +0x6328 0x29AB9 +0x6329 0x29AEF +0x632A 0x29BFB +0x632B 0x29BFF +0x632C 0x29C67 +0x632D 0x29C68 +0x632E 0x29C69 +0x632F 0x29D3F +0x6330 0x29F3C +0x6331 0x29F4C +0x6332 0x29F3D +0x6333 0x29F3E +0x6334 0x29F3F +0x6335 0x29F3B +0x6336 0x2A1FF +0x6338 0x2A1F6 +0x6339 0x2A1EE +0x633A 0x2A1FC +0x633B 0x2A1F8 +0x633C 0x2A201 +0x633D 0x2A1FA +0x633E 0x2A288 +0x633F 0x2A380 +0x6340 0x2A411 +0x6341 0x2A4FE +0x6342 0x2A500 +0x6343 0x2A535 +0x6344 0x2503C +0x6345 0x2A5BD +0x6346 0x2A5BB +0x6347 0x2A65C +0x6348 0x2A65A +0x6349 0x2A6D1 +0x634A 0x2A6D0 +0x634B 0x20A0B +0x634C 0x23873 +0x634D 0x21939 +0x634E 0x21B1A +0x634F 0x21FE3 +0x6350 0x22187 +0x6351 0x22377 +0x6352 0x22378 +0x6353 0x22EB1 +0x6354 0x2386A +0x6355 0x23874 +0x6356 0x23AEB +0x6357 0x2417B +0x6358 0x245A5 +0x6359 0x248E4 +0x635A 0x24D0B +0x635B 0x24D0E +0x635C 0x24D0C +0x635D 0x25739 +0x635E 0x25E10 +0x635F 0x25E11 +0x6360 0x25E16 +0x6361 0x25F81 +0x6362 0x25F80 +0x6363 0x261FE +0x6364 0x26201 +0x6365 0x26200 +0x6366 0x26347 +0x6367 0x263EF +0x6368 0x27188 +0x6369 0x2758B +0x636A 0x2758D +0x636B 0x27587 +0x636C 0x27585 +0x636D 0x2758F +0x636E 0x27584 +0x636F 0x27588 +0x6370 0x2758E +0x6371 0x2758C +0x6372 0x277D7 +0x6373 0x277D6 +0x6374 0x27B9F +0x6375 0x22188 +0x6376 0x28203 +0x6377 0x283FE +0x6378 0x287EF +0x6379 0x28909 +0x637A 0x28908 +0x637B 0x28C20 +0x637C 0x28C24 +0x637D 0x28C1F +0x637E 0x29070 +0x6421 0x29256 +0x6422 0x293F7 +0x6423 0x293F8 +0x6424 0x293F6 +0x6425 0x29590 +0x6426 0x2965E +0x6427 0x297F7 +0x6428 0x299D6 +0x6429 0x299D5 +0x642A 0x29ABB +0x642B 0x29AF0 +0x642C 0x29C01 +0x642D 0x29C6C +0x642E 0x29D41 +0x642F 0x29D42 +0x6430 0x29F4F +0x6431 0x29F53 +0x6432 0x29F58 +0x6433 0x2A212 +0x6434 0x2A204 +0x6435 0x2A213 +0x6436 0x2A205 +0x6437 0x2A20D +0x6438 0x2A382 +0x6439 0x2A381 +0x643A 0x2A4B5 +0x643B 0x2A4BA +0x643C 0x2A5BE +0x643D 0x2A665 +0x643E 0x2A663 +0x643F 0x2A66E +0x6440 0x2A66A +0x6441 0x2A66C +0x6442 0x2A6C4 +0x6443 0x2096C +0x6444 0x27BA5 +0x6445 0x21B12 +0x6446 0x2244D +0x6447 0x2331F +0x6448 0x23877 +0x6449 0x23878 +0x644A 0x23C44 +0x644B 0x2417C +0x644C 0x244EB +0x644D 0x244EA +0x644E 0x244EC +0x644F 0x245A7 +0x6450 0x24719 +0x6451 0x24F23 +0x6453 0x25601 +0x6454 0x25E1C +0x6455 0x26203 +0x6456 0x26348 +0x6457 0x268DA +0x6458 0x27191 +0x6459 0x27192 +0x645A 0x27596 +0x645B 0x27597 +0x645C 0x27591 +0x645D 0x27593 +0x645E 0x277D8 +0x645F 0x277D5 +0x6460 0x27957 +0x6461 0x27958 +0x6462 0x27BA2 +0x6463 0x28205 +0x6464 0x283FA +0x6465 0x2890C +0x6466 0x2890A +0x6467 0x28C2E +0x6468 0x28C29 +0x6469 0x28C2F +0x646A 0x28CC5 +0x646B 0x29072 +0x646C 0x291C8 +0x646D 0x2925A +0x646E 0x29259 +0x646F 0x29389 +0x6470 0x29388 +0x6471 0x299DB +0x6472 0x299D9 +0x6473 0x299DA +0x6474 0x29ABC +0x6476 0x29C06 +0x6477 0x29C05 +0x6478 0x29C6F +0x6479 0x29C6D +0x647A 0x29C70 +0x647B 0x29F60 +0x647C 0x29F5E +0x647D 0x29F63 +0x647E 0x29F5A +0x6521 0x29F5F +0x6522 0x2A219 +0x6523 0x2A21D +0x6524 0x2A21B +0x6525 0x2A222 +0x6526 0x2A21C +0x6527 0x2A21E +0x6528 0x2A2F7 +0x6529 0x2A384 +0x652A 0x2A415 +0x652B 0x2A4B8 +0x652C 0x2A4C1 +0x652D 0x2A501 +0x652E 0x2A50A +0x652F 0x2A5D2 +0x6530 0x2A675 +0x6531 0x2A674 +0x6532 0x2A672 +0x6533 0x20AD0 +0x6534 0x21B1B +0x6535 0x22010 +0x6536 0x22379 +0x6537 0x244ED +0x6538 0x24BB9 +0x6539 0x24F24 +0x653A 0x24FC5 +0x653B 0x25603 +0x653C 0x2634A +0x653D 0x268F7 +0x653E 0x269C1 +0x653F 0x269C2 +0x6540 0x27194 +0x6541 0x27599 +0x6542 0x2759A +0x6543 0x2795A +0x6544 0x27BA8 +0x6545 0x27C25 +0x6546 0x27C9E +0x6547 0x28441 +0x6548 0x28C32 +0x6549 0x28C33 +0x654A 0x291CB +0x654B 0x291CA +0x654C 0x291CC +0x654D 0x29593 +0x654E 0x299E0 +0x654F 0x29C71 +0x6550 0x29F6B +0x6551 0x2A22B +0x6552 0x2A229 +0x6553 0x2A21A +0x6554 0x2A226 +0x6555 0x2A227 +0x6556 0x2A22A +0x6557 0x2A2F8 +0x6558 0x2503D +0x6559 0x2A676 +0x655A 0x21518 +0x655B 0x2387A +0x655C 0x2417F +0x655E 0x263F0 +0x655F 0x2719A +0x6560 0x27196 +0x6561 0x2759E +0x6562 0x2759D +0x6563 0x275DC +0x6564 0x277DA +0x6565 0x2820B +0x6566 0x28402 +0x6567 0x28442 +0x6568 0x28667 +0x6569 0x2938B +0x656A 0x299E2 +0x656B 0x29F71 +0x656C 0x2A22F +0x656D 0x2A22E +0x656E 0x2A4C6 +0x656F 0x2A58E +0x6570 0x2A67B +0x6571 0x2A677 +0x6572 0x2A678 +0x6573 0x2A67C +0x6574 0x2387C +0x6575 0x26207 +0x6576 0x27197 +0x6577 0x27BD9 +0x6578 0x2890D +0x6579 0x2890E +0x657A 0x299E3 +0x657B 0x299E4 +0x657C 0x29AF3 +0x657D 0x29C75 +0x657E 0x2A237 +0x6621 0x2A235 +0x6622 0x2A58F +0x6623 0x2A680 +0x6624 0x2A67F +0x6625 0x2A6D4 +0x6626 0x22EB4 +0x6627 0x2A3EC +0x6628 0x28F75 +0x6629 0x24D10 +0x662A 0x26269 +0x662B 0x275A4 +0x662C 0x277DB +0x662D 0x291D1 +0x662E 0x2938D +0x662F 0x29F76 +0x6630 0x2A239 +0x6631 0x2A684 +0x6632 0x2A682 +0x6633 0x20AD2 +0x6634 0x244EE +0x6635 0x24D11 +0x6636 0x25F84 +0x6637 0x28F74 +0x6638 0x2938F +0x6639 0x2938E +0x663A 0x2A23B +0x663B 0x208CB +0x663C 0x2A688 +0x663D 0x2A686 +0x663E 0x2335C +0x663F 0x253A4 +0x6640 0x29075 +0x6641 0x2A68B +0x6642 0x21519 +0x6643 0x27C9F +0x6644 0x299E5 +0x6645 0x2A240 +0x6646 0x24D12 +0x6647 0x2A2FB +0x6648 0x2A68C +0x6649 0x253A5 +0x664A 0x29C77 +0x664B 0x29C78 +0x664C 0x2A6D6 +0x664D 0x277DF +0x664E 0x291D2 +0x664F 0x2151A +0x6650 0x27BA9 +0x6651 0x291D3 +0x6652 0x2A4CA +0x6653 0x269C4 +0x6654 0x278B1 +0x6655 0x29664 diff --git a/jdk/test/sun/nio/cs/SurrogateTestHKSCS.java b/jdk/test/sun/nio/cs/SurrogateTestHKSCS.java new file mode 100644 index 00000000000..2f15355eae6 --- /dev/null +++ b/jdk/test/sun/nio/cs/SurrogateTestHKSCS.java @@ -0,0 +1,1191 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 4750497 + @summary Check surrogate coverage of Big5-HKSCS (2001) + */ + +/* + * Tests the HKSCS converter. Supplements the test for BMP + * mappings (and compatibility char->byte mappings) provided + * via ./test/sun/io/Converter/Big5-HKSCS.b2c and + * ./test/sun/io/Converter/Big5-HKSCS.c2b-irreversible + * + * Mappings available at : + * http://www.info.gov.hk/digital21/eng/hkscs/download.html + * + */ + +import java.io.*; +public class SurrogateTestHKSCS { + + /** + * int array holding the supplementary character + * values (encoded as ints below) for full set of 1651 + * supplementary chars / surrogate pairs which should + * be round-trip mappable within Big5-HKSCS 2001 + * + */ + + static int[] suppValues = { + 0x20021, 0x2003E, 0x20046, 0x2004E, 0x20068, 0x20086, + 0x20087, 0x2008A, 0x20094, 0x200CA, 0x200CB, 0x200CC, + 0x200CD, 0x200D1, 0x200EE, 0x2010C, 0x2010E, 0x20118, + 0x201A9, 0x201AB, 0x201C1, 0x201D4, 0x201F2, 0x20204, + 0x2020C, 0x20214, 0x2025B, 0x20274, 0x20275, 0x20299, + 0x2029E, 0x202A0, 0x202B7, 0x202BF, 0x202C0, 0x202E5, + 0x2030A, 0x20325, 0x20341, 0x20345, 0x20346, 0x20347, + 0x2037E, 0x2037F, 0x20380, 0x203A0, 0x203A7, 0x203B5, + 0x203C9, 0x203CB, 0x203F5, 0x203FC, 0x20413, 0x20414, + 0x2041F, 0x20465, 0x20487, 0x2048E, 0x20491, 0x20492, + 0x204A3, 0x204D7, 0x204FC, 0x204FE, 0x20547, 0x2058E, + 0x205A5, 0x205B3, 0x205C3, 0x205CA, 0x205D0, 0x205D5, + 0x205DF, 0x205E0, 0x205EB, 0x20611, 0x20615, 0x20619, + 0x2061A, 0x20630, 0x20656, 0x20676, 0x2070E, 0x20731, + 0x20779, 0x2082C, 0x20873, 0x208D5, 0x20916, 0x20923, + 0x20954, 0x20979, 0x209E7, 0x20A11, 0x20A50, 0x20AB4, + 0x20AC2, 0x20ACD, 0x20B0D, 0x20B8F, 0x20BA8, 0x20BA9, + 0x20BBF, 0x20BC6, 0x20BCB, 0x20BE2, 0x20BEB, 0x20BFB, + 0x20BFF, 0x20C0B, 0x20C0D, 0x20C20, 0x20C34, 0x20C3A, + 0x20C3B, 0x20C41, 0x20C42, 0x20C43, 0x20C53, 0x20C65, + 0x20C77, 0x20C78, 0x20C7C, 0x20C8D, 0x20C96, 0x20C9C, + 0x20CB5, 0x20CB8, 0x20CCF, 0x20CD3, 0x20CD4, 0x20CD5, + 0x20CD6, 0x20CDD, 0x20CED, 0x20CFF, 0x20D15, 0x20D28, + 0x20D31, 0x20D32, 0x20D46, 0x20D47, 0x20D48, 0x20D49, + 0x20D4C, 0x20D4D, 0x20D4E, 0x20D6F, 0x20D71, 0x20D74, + 0x20D7C, 0x20D7E, 0x20D7F, 0x20D96, 0x20D9C, 0x20DA7, + 0x20DB2, 0x20DC8, 0x20E04, 0x20E09, 0x20E0A, 0x20E0D, + 0x20E0E, 0x20E0F, 0x20E10, 0x20E11, 0x20E16, 0x20E1D, + 0x20E4C, 0x20E6D, 0x20E73, 0x20E75, 0x20E76, 0x20E77, + 0x20E78, 0x20E79, 0x20E7A, 0x20E7B, 0x20E8C, 0x20E96, + 0x20E98, 0x20E9D, 0x20EA2, 0x20EAA, 0x20EAB, 0x20EAC, + 0x20EB6, 0x20ED7, 0x20ED8, 0x20EDD, 0x20EF8, 0x20EF9, + 0x20EFA, 0x20EFB, 0x20F1D, 0x20F26, 0x20F2D, 0x20F2E, + 0x20F30, 0x20F31, 0x20F3B, 0x20F4C, 0x20F64, 0x20F8D, + 0x20F90, 0x20FAD, 0x20FB4, 0x20FB5, 0x20FB6, 0x20FBC, + 0x20FDF, 0x20FEA, 0x20FEB, 0x20FEC, 0x20FED, 0x21014, + 0x2101D, 0x2101E, 0x2104F, 0x2105C, 0x2106F, 0x21075, + 0x21076, 0x21077, 0x21078, 0x2107B, 0x21088, 0x21096, + 0x2109D, 0x210B4, 0x210BF, 0x210C0, 0x210C1, 0x210C7, + 0x210C8, 0x210C9, 0x210CF, 0x210D3, 0x210E4, 0x210F4, + 0x210F5, 0x210F6, 0x2112F, 0x2113B, 0x2113D, 0x21145, + 0x21148, 0x2114F, 0x21180, 0x21187, 0x211D9, 0x2123C, + 0x2124F, 0x2127C, 0x212A8, 0x212A9, 0x212B0, 0x212E3, + 0x212FE, 0x21302, 0x21303, 0x21304, 0x21305, 0x21336, + 0x2133A, 0x21375, 0x21376, 0x2138E, 0x21398, 0x2139C, + 0x213C5, 0x213C6, 0x213ED, 0x213FE, 0x21413, 0x21416, + 0x21424, 0x2143F, 0x21452, 0x21454, 0x21455, 0x2148A, + 0x21497, 0x214B6, 0x214E8, 0x214FD, 0x21577, 0x21582, + 0x21596, 0x2160A, 0x21613, 0x21619, 0x2163E, 0x21661, + 0x21692, 0x216B8, 0x216BA, 0x216C0, 0x216C1, 0x216C2, + 0x216D3, 0x216D5, 0x216DF, 0x216E6, 0x216E7, 0x216E8, + 0x216FA, 0x216FB, 0x216FC, 0x216FE, 0x2170D, 0x21710, + 0x21726, 0x2173A, 0x2173B, 0x2173C, 0x21757, 0x2176C, + 0x2176D, 0x2176E, 0x2176F, 0x21770, 0x21771, 0x21773, + 0x21774, 0x217AB, 0x217B0, 0x217B1, 0x217B2, 0x217B3, + 0x217B4, 0x217B5, 0x217C3, 0x217C7, 0x217D9, 0x217DA, + 0x217DB, 0x217DC, 0x217DF, 0x217EF, 0x217F5, 0x217F6, + 0x217F8, 0x217F9, 0x217FA, 0x217FB, 0x217FC, 0x21820, + 0x21828, 0x21829, 0x2182A, 0x2182D, 0x21839, 0x2183A, + 0x2183B, 0x21840, 0x21845, 0x21852, 0x2185E, 0x21861, + 0x21862, 0x21863, 0x21864, 0x21877, 0x2187B, 0x21883, + 0x21884, 0x21885, 0x2189E, 0x2189F, 0x218A0, 0x218A1, + 0x218A2, 0x218BE, 0x218BF, 0x218D1, 0x218D6, 0x218D7, + 0x218D8, 0x218D9, 0x218FA, 0x21903, 0x21904, 0x21905, + 0x21910, 0x21911, 0x21912, 0x21915, 0x2191C, 0x21922, + 0x21927, 0x2193B, 0x21944, 0x21958, 0x2196A, 0x2197C, + 0x21980, 0x21983, 0x21988, 0x21996, 0x219DB, 0x219F3, + 0x21A2D, 0x21A34, 0x21A45, 0x21A4B, 0x21B44, 0x21BC1, + 0x21BC2, 0x21C2A, 0x21C70, 0x21CA2, 0x21CA5, 0x21CAC, + 0x21D46, 0x21D90, 0x21DB6, 0x21DBA, 0x21DCA, 0x21DD1, + 0x21DEB, 0x21DF9, 0x21E1C, 0x21E37, 0x21E3D, 0x21E89, + 0x21EA4, 0x21EA8, 0x21EC8, 0x21ED5, 0x21F0F, 0x21F15, + 0x21F6A, 0x21F9E, 0x21FA1, 0x21FE8, 0x22045, 0x22049, + 0x2207E, 0x2209A, 0x220C7, 0x220FC, 0x2212A, 0x2215B, + 0x22173, 0x2217A, 0x221A1, 0x221C3, 0x22208, 0x2227C, + 0x22321, 0x22325, 0x223BD, 0x223D0, 0x223D7, 0x223FA, + 0x22465, 0x22471, 0x2248B, 0x22491, 0x224B0, 0x224ED, + 0x22513, 0x2251B, 0x22530, 0x22554, 0x2258D, 0x225AF, + 0x225BE, 0x2261B, 0x2261C, 0x2262B, 0x22668, 0x2267A, + 0x22696, 0x22698, 0x226F4, 0x226F5, 0x226F6, 0x22712, + 0x22714, 0x2271B, 0x2271F, 0x2272A, 0x22775, 0x22781, + 0x227B4, 0x227B5, 0x227CD, 0x22803, 0x2285F, 0x22860, + 0x22871, 0x228AD, 0x228C1, 0x228F7, 0x22926, 0x22939, + 0x2294F, 0x22967, 0x2296B, 0x22980, 0x22993, 0x22A66, + 0x22ACF, 0x22AD5, 0x22AE6, 0x22AE8, 0x22B0E, 0x22B22, + 0x22B3F, 0x22B43, 0x22B6A, 0x22BCA, 0x22BCE, 0x22C26, + 0x22C27, 0x22C38, 0x22C4C, 0x22C51, 0x22C55, 0x22C62, + 0x22C88, 0x22C9B, 0x22CA1, 0x22CA9, 0x22CB2, 0x22CB7, + 0x22CC2, 0x22CC6, 0x22CC9, 0x22D07, 0x22D08, 0x22D12, + 0x22D44, 0x22D4C, 0x22D67, 0x22D8D, 0x22D95, 0x22DA0, + 0x22DA3, 0x22DA4, 0x22DB7, 0x22DEE, 0x22E0D, 0x22E36, + 0x22E42, 0x22E78, 0x22E8B, 0x22EB3, 0x22EEF, 0x22F74, + 0x22FCC, 0x22FE3, 0x23033, 0x23044, 0x2304B, 0x23066, + 0x2307D, 0x2307E, 0x2308E, 0x230B7, 0x230BC, 0x230DA, + 0x23103, 0x2313D, 0x2317D, 0x23182, 0x231A4, 0x231A5, + 0x231B3, 0x231C8, 0x231C9, 0x231F7, 0x231F8, 0x231F9, + 0x2320F, 0x23225, 0x2322F, 0x23231, 0x23232, 0x23233, + 0x23234, 0x23262, 0x23281, 0x23289, 0x2328A, 0x232AB, + 0x232AC, 0x232AD, 0x232D2, 0x232E0, 0x232E1, 0x23300, + 0x2330A, 0x2331F, 0x233B4, 0x233CC, 0x233DE, 0x233E6, + 0x233F4, 0x233F5, 0x233F9, 0x233FA, 0x233FE, 0x23400, + 0x2343F, 0x23450, 0x2346F, 0x23472, 0x234E5, 0x23519, + 0x23530, 0x2355A, 0x23567, 0x23595, 0x23599, 0x2359C, + 0x235CD, 0x235CE, 0x235CF, 0x235F3, 0x23600, 0x2361A, + 0x2363C, 0x23640, 0x23659, 0x2365F, 0x23677, 0x236A6, + 0x236AD, 0x236BA, 0x236DF, 0x236EE, 0x23703, 0x23716, + 0x23720, 0x2372D, 0x2372F, 0x2373F, 0x23766, 0x23781, + 0x237A2, 0x237BC, 0x237C2, 0x237D5, 0x237D6, 0x237D7, + 0x2383A, 0x239C2, 0x23AA7, 0x23ADB, 0x23AEE, 0x23AFA, + 0x23B5A, 0x23C63, 0x23C99, 0x23C9A, 0x23C9B, 0x23CB5, + 0x23CB7, 0x23CC7, 0x23CC8, 0x23CC9, 0x23CFC, 0x23CFD, + 0x23CFE, 0x23CFF, 0x23D40, 0x23D5B, 0x23D7E, 0x23D8F, + 0x23DB6, 0x23DB7, 0x23DB8, 0x23DB9, 0x23DBA, 0x23DBB, + 0x23DBC, 0x23DBD, 0x23DE3, 0x23DF8, 0x23E11, 0x23E2C, + 0x23E2D, 0x23E2E, 0x23E2F, 0x23E30, 0x23E31, 0x23E39, + 0x23E88, 0x23E89, 0x23E8A, 0x23E8B, 0x23EB9, 0x23EBF, + 0x23ED7, 0x23EF7, 0x23EF8, 0x23EF9, 0x23EFA, 0x23EFB, + 0x23EFC, 0x23F35, 0x23F41, 0x23F4A, 0x23F7F, 0x23F80, + 0x23F81, 0x23F82, 0x23F8F, 0x23FB4, 0x23FB7, 0x23FC0, + 0x23FC5, 0x23FEB, 0x23FEC, 0x23FED, 0x23FEE, 0x23FEF, + 0x23FF0, 0x24011, 0x24039, 0x2403A, 0x2403B, 0x2403C, + 0x2403D, 0x24057, 0x24085, 0x2408B, 0x2408C, 0x2408D, + 0x24091, 0x240C9, 0x240E1, 0x24104, 0x2410F, 0x24119, + 0x2413F, 0x24140, 0x24144, 0x2414E, 0x24155, 0x24156, + 0x24157, 0x2415C, 0x2415F, 0x24177, 0x2417A, 0x241A3, + 0x241A4, 0x241A5, 0x241AC, 0x241B5, 0x241CD, 0x241E2, + 0x241FC, 0x2421B, 0x2424B, 0x24256, 0x24259, 0x24276, + 0x24277, 0x24278, 0x24284, 0x24293, 0x24295, 0x242A5, + 0x242C1, 0x242C9, 0x242CA, 0x242EE, 0x242FA, 0x2430D, + 0x2431A, 0x24334, 0x24348, 0x24362, 0x24363, 0x24364, + 0x24365, 0x2438C, 0x24396, 0x2439C, 0x243BD, 0x243C1, + 0x243E9, 0x243EA, 0x243F2, 0x243F8, 0x24404, 0x24435, + 0x24436, 0x2445A, 0x2445B, 0x24473, 0x24487, 0x24488, + 0x244B9, 0x244BC, 0x244CE, 0x244D3, 0x244D6, 0x24505, + 0x24521, 0x24578, 0x245C8, 0x24618, 0x2462A, 0x24665, + 0x24674, 0x24697, 0x246D4, 0x24706, 0x24725, 0x2472F, + 0x2478F, 0x247E0, 0x24812, 0x24823, 0x24882, 0x248E9, + 0x248F0, 0x248F1, 0x248F2, 0x248F3, 0x248FB, 0x248FF, + 0x24900, 0x24901, 0x2490C, 0x24916, 0x24917, 0x24919, + 0x2492F, 0x24933, 0x24934, 0x2493E, 0x2493F, 0x24940, + 0x24941, 0x24942, 0x24943, 0x24962, 0x24963, 0x24974, + 0x24975, 0x24976, 0x2497B, 0x2497F, 0x24982, 0x24988, + 0x24989, 0x2498A, 0x2498B, 0x2498C, 0x2498D, 0x2498E, + 0x2498F, 0x24994, 0x249A4, 0x249A7, 0x249A9, 0x249AB, + 0x249AC, 0x249AD, 0x249B7, 0x249B8, 0x249B9, 0x249BA, + 0x249BB, 0x249C5, 0x249D0, 0x249DA, 0x249DE, 0x249DF, + 0x249E3, 0x249E5, 0x249EC, 0x249ED, 0x249F6, 0x249F7, + 0x249F8, 0x249F9, 0x249FB, 0x24A0E, 0x24A12, 0x24A13, + 0x24A15, 0x24A21, 0x24A22, 0x24A23, 0x24A24, 0x24A25, + 0x24A26, 0x24A27, 0x24A28, 0x24A29, 0x24A2A, 0x24A3E, + 0x24A42, 0x24A45, 0x24A4A, 0x24A4E, 0x24A4F, 0x24A50, + 0x24A51, 0x24A5D, 0x24A65, 0x24A66, 0x24A67, 0x24A71, + 0x24A77, 0x24A78, 0x24A79, 0x24A7A, 0x24A8C, 0x24A93, + 0x24A94, 0x24A95, 0x24A96, 0x24AA4, 0x24AA5, 0x24AA6, + 0x24AA7, 0x24AB1, 0x24AB2, 0x24AB3, 0x24ABA, 0x24ABB, + 0x24ABC, 0x24AC0, 0x24AC7, 0x24ACA, 0x24AD1, 0x24ADF, + 0x24AE2, 0x24AE9, 0x24B6E, 0x24BF5, 0x24C09, 0x24C9E, + 0x24C9F, 0x24CC9, 0x24CD9, 0x24D06, 0x24D13, 0x24DB8, + 0x24DEA, 0x24DEB, 0x24E3B, 0x24E50, 0x24EA5, 0x24EA7, + 0x24F0E, 0x24F5C, 0x24F82, 0x24F86, 0x24F97, 0x24F9A, + 0x24FA9, 0x24FB8, 0x24FC2, 0x2502C, 0x25052, 0x2509D, + 0x2512B, 0x25148, 0x2517D, 0x2517E, 0x251CD, 0x251E3, + 0x251E6, 0x251E7, 0x25220, 0x25221, 0x25250, 0x25299, + 0x252C7, 0x252D8, 0x2530E, 0x25311, 0x25313, 0x25419, + 0x25425, 0x2542F, 0x25430, 0x25446, 0x2546C, 0x2546E, + 0x25531, 0x25535, 0x2553F, 0x2555B, 0x2555C, 0x2555D, + 0x2555E, 0x25562, 0x25565, 0x25566, 0x25581, 0x25584, + 0x2558F, 0x255B9, 0x255D5, 0x255DB, 0x255E0, 0x25605, + 0x25635, 0x25651, 0x25683, 0x25695, 0x256E3, 0x256F6, + 0x25706, 0x2571D, 0x25725, 0x2573D, 0x25772, 0x257C7, + 0x257DF, 0x257E0, 0x257E1, 0x25857, 0x2585D, 0x25872, + 0x258C8, 0x258E1, 0x25903, 0x25946, 0x25956, 0x259AC, + 0x259CC, 0x25A95, 0x25A9C, 0x25AAE, 0x25AAF, 0x25AE9, + 0x25B74, 0x25B89, 0x25BB3, 0x25BB4, 0x25BC6, 0x25BE4, + 0x25BE8, 0x25C01, 0x25C06, 0x25C21, 0x25C4A, 0x25C65, + 0x25C91, 0x25CA4, 0x25CC0, 0x25CC1, 0x25CFE, 0x25D20, + 0x25D30, 0x25D43, 0x25E0E, 0x25E49, 0x25E81, 0x25E82, + 0x25E83, 0x25EA6, 0x25EBC, 0x25ED7, 0x25ED8, 0x25F1A, + 0x25F4B, 0x25FE1, 0x25FE2, 0x26029, 0x26048, 0x26064, + 0x26083, 0x26097, 0x260A4, 0x260A5, 0x26102, 0x26121, + 0x26159, 0x2615A, 0x2615B, 0x2615C, 0x261AD, 0x261AE, + 0x261B2, 0x261DD, 0x26258, 0x26261, 0x2626A, 0x2626B, + 0x262D0, 0x26335, 0x2634B, 0x2634C, 0x26351, 0x263BE, + 0x263F5, 0x263F8, 0x26402, 0x26410, 0x26411, 0x26412, + 0x2644A, 0x26469, 0x26484, 0x26488, 0x26489, 0x2648D, + 0x26498, 0x26512, 0x26572, 0x265A0, 0x265AD, 0x265BF, + 0x26612, 0x26626, 0x266AF, 0x266B1, 0x266B5, 0x266DA, + 0x266E8, 0x266FC, 0x26716, 0x26741, 0x26799, 0x267B3, + 0x267B4, 0x267CC, 0x2681C, 0x26846, 0x2685E, 0x2686E, + 0x26888, 0x2688A, 0x26893, 0x268C7, 0x2690E, 0x26911, + 0x26926, 0x26939, 0x26951, 0x269A8, 0x269B5, 0x269F2, + 0x269FA, 0x26A2D, 0x26A2E, 0x26A34, 0x26A42, 0x26A51, + 0x26A52, 0x26B05, 0x26B0A, 0x26B13, 0x26B15, 0x26B28, + 0x26B50, 0x26B51, 0x26B52, 0x26B53, 0x26B5B, 0x26B75, + 0x26B82, 0x26B96, 0x26B97, 0x26B9D, 0x26BB3, 0x26BC0, + 0x26BF7, 0x26C21, 0x26C40, 0x26C7E, 0x26C7F, 0x26C80, + 0x26C81, 0x26C82, 0x26CA4, 0x26CB7, 0x26CB8, 0x26CBD, + 0x26CC0, 0x26CC3, 0x26CD1, 0x26D22, 0x26D23, 0x26D24, + 0x26D25, 0x26D26, 0x26D27, 0x26D28, 0x26D29, 0x26D2A, + 0x26D51, 0x26D74, 0x26DA0, 0x26DA1, 0x26DA2, 0x26DA3, + 0x26DA4, 0x26DA5, 0x26DA6, 0x26DA7, 0x26DAE, 0x26DDC, + 0x26DEA, 0x26DEB, 0x26DF0, 0x26E00, 0x26E05, 0x26E07, + 0x26E12, 0x26E42, 0x26E43, 0x26E44, 0x26E45, 0x26E6E, + 0x26E72, 0x26E77, 0x26E84, 0x26E99, 0x26ED0, 0x26ED1, + 0x26ED2, 0x26ED3, 0x26ED4, 0x26ED5, 0x26ED6, 0x26ED7, + 0x26F26, 0x26F73, 0x26F74, 0x26F9F, 0x26FA1, 0x26FBE, + 0x26FDE, 0x26FDF, 0x2700E, 0x2704B, 0x27052, 0x27053, + 0x27088, 0x270AD, 0x270AE, 0x270AF, 0x270CD, 0x270F8, + 0x27109, 0x2710C, 0x2710D, 0x27126, 0x27127, 0x27164, + 0x27165, 0x27175, 0x271CD, 0x2721B, 0x27280, 0x27285, + 0x2728B, 0x272B2, 0x272B6, 0x272E6, 0x2739A, 0x27422, + 0x27450, 0x27484, 0x27486, 0x27574, 0x275A3, 0x275E0, + 0x275E4, 0x275FD, 0x275FE, 0x27607, 0x2760C, 0x27632, + 0x27639, 0x27655, 0x27656, 0x27657, 0x27694, 0x2770F, + 0x27735, 0x27736, 0x27741, 0x2775E, 0x27784, 0x27785, + 0x277CC, 0x27858, 0x27870, 0x2789D, 0x278B2, 0x278C8, + 0x27924, 0x27967, 0x2797A, 0x279A0, 0x279DD, 0x279FD, + 0x27A0A, 0x27A0E, 0x27A3E, 0x27A53, 0x27A59, 0x27A79, + 0x27A84, 0x27ABD, 0x27ABE, 0x27AF4, 0x27B06, 0x27B0B, + 0x27B18, 0x27B38, 0x27B39, 0x27B3A, 0x27B48, 0x27BF4, + 0x27C12, 0x27D2F, 0x27D53, 0x27D54, 0x27D66, 0x27D73, + 0x27D84, 0x27D8F, 0x27D98, 0x27DBD, 0x27DDC, 0x27E4D, + 0x27E4F, 0x27FF9, 0x28002, 0x28009, 0x2801E, 0x28023, + 0x28024, 0x28048, 0x28083, 0x28090, 0x280BD, 0x280BE, + 0x280E8, 0x280E9, 0x280F4, 0x2812E, 0x2814F, 0x2815D, + 0x2816F, 0x28189, 0x281AF, 0x281BC, 0x28207, 0x28218, + 0x2821A, 0x28256, 0x2827C, 0x2829B, 0x282CD, 0x282E2, + 0x28306, 0x28318, 0x2832F, 0x2833A, 0x28365, 0x2836D, + 0x2837D, 0x2838A, 0x28412, 0x28468, 0x2846C, 0x28473, + 0x28482, 0x28501, 0x2853C, 0x2853D, 0x2856C, 0x285E8, + 0x285F4, 0x28600, 0x2860B, 0x28625, 0x2863B, 0x286AA, + 0x286AB, 0x286BC, 0x286D8, 0x286E6, 0x2870F, 0x28713, + 0x28804, 0x2882B, 0x28933, 0x28948, 0x28949, 0x28956, + 0x28964, 0x28968, 0x2896C, 0x2897E, 0x28989, 0x289A8, + 0x289AA, 0x289AB, 0x289B8, 0x289BC, 0x289C0, 0x289DC, + 0x289DE, 0x289E1, 0x289E3, 0x289E4, 0x289E7, 0x289E8, + 0x289F9, 0x289FA, 0x289FB, 0x289FC, 0x28A0F, 0x28A16, + 0x28A25, 0x28A29, 0x28A32, 0x28A36, 0x28A44, 0x28A45, + 0x28A46, 0x28A47, 0x28A48, 0x28A49, 0x28A4A, 0x28A4B, + 0x28A59, 0x28A5A, 0x28A81, 0x28A82, 0x28A83, 0x28A9A, + 0x28A9B, 0x28A9C, 0x28AC0, 0x28AC6, 0x28ACB, 0x28ACC, + 0x28ACE, 0x28ADE, 0x28ADF, 0x28AE0, 0x28AE1, 0x28AE2, + 0x28AE3, 0x28AE5, 0x28AEA, 0x28AFC, 0x28B0C, 0x28B13, + 0x28B21, 0x28B22, 0x28B2B, 0x28B2C, 0x28B2D, 0x28B2F, + 0x28B46, 0x28B4C, 0x28B4E, 0x28B50, 0x28B63, 0x28B64, + 0x28B65, 0x28B66, 0x28B6C, 0x28B8F, 0x28B99, 0x28B9C, + 0x28B9D, 0x28BC2, 0x28BC5, 0x28BD4, 0x28BD7, 0x28BD9, + 0x28BDA, 0x28BE7, 0x28BE8, 0x28BE9, 0x28BEA, 0x28BEB, + 0x28BEC, 0x28BF5, 0x28BFF, 0x28C03, 0x28C09, 0x28C1C, + 0x28C1D, 0x28C23, 0x28C26, 0x28C2B, 0x28C30, 0x28C39, + 0x28C3B, 0x28CCA, 0x28CCD, 0x28CD2, 0x28D34, 0x28D99, + 0x28DB9, 0x28E0F, 0x28E36, 0x28E39, 0x28E65, 0x28E66, + 0x28E97, 0x28EAC, 0x28EB2, 0x28EB3, 0x28ED9, 0x28EE7, + 0x28FC5, 0x29088, 0x2908B, 0x29093, 0x290AF, 0x290B0, + 0x290B1, 0x290C0, 0x290E4, 0x290E5, 0x290EC, 0x290ED, + 0x2910D, 0x29110, 0x2913C, 0x2914D, 0x2915B, 0x2915E, + 0x29170, 0x2919C, 0x291A8, 0x291D5, 0x291EB, 0x2941D, + 0x29420, 0x29433, 0x2943F, 0x29448, 0x294D0, 0x294D9, + 0x294DA, 0x294E5, 0x294E7, 0x2959E, 0x295B0, 0x295B8, + 0x295D7, 0x295E9, 0x295F4, 0x29720, 0x29732, 0x297D4, + 0x29810, 0x29857, 0x298A4, 0x298D1, 0x298EA, 0x298F1, + 0x29903, 0x29905, 0x2992F, 0x29947, 0x29948, 0x29949, + 0x2995D, 0x2996A, 0x2999D, 0x299C3, 0x299C9, 0x29A28, + 0x29A4D, 0x29B05, 0x29B0E, 0x29BD5, 0x29C73, 0x29CAD, + 0x29D3E, 0x29D5A, 0x29D7C, 0x29D98, 0x29D9B, 0x29DF6, + 0x29E06, 0x29E2D, 0x29E68, 0x29EAC, 0x29EC3, 0x29EF8, + 0x29F23, 0x29F30, 0x29FB7, 0x29FDE, 0x2A014, 0x2A087, + 0x2A0B9, 0x2A0E1, 0x2A0ED, 0x2A0F3, 0x2A0F8, 0x2A0FE, + 0x2A107, 0x2A123, 0x2A133, 0x2A134, 0x2A150, 0x2A192, + 0x2A193, 0x2A1AB, 0x2A1B4, 0x2A1DF, 0x2A1F5, 0x2A220, + 0x2A233, 0x2A293, 0x2A29F, 0x2A2B2, 0x2A2B4, 0x2A2B6, + 0x2A2BA, 0x2A2BD, 0x2A2DF, 0x2A2FF, 0x2A3A9, 0x2A434, + 0x2A45B, 0x2A5C6, 0x2A5CB, 0x2A601, 0x2A632, 0x2A64A, + 0x2A65B, 0x2A6A9, 0x2F825, 0x2F83B, 0x2F840, 0x2F878, + 0x2F894, 0x2F8A6, 0x2F8CD, 0x2F994, 0x2F9B2, 0x2F9BC, + 0x2F9D4 }; + + /** + * Big5-HKSCS native encoded equivalent for the + * surrogate pair input provided above within the + * String constant "surrogates" + */ + + final static byte[] expectBytes = { + (byte)0x9C, (byte)0x71, (byte)0x93, (byte)0x75, + (byte)0x93, (byte)0x76, (byte)0x95, (byte)0x48, + (byte)0x8E, (byte)0xC6, (byte)0x8B, (byte)0xC5, + (byte)0x8B, (byte)0xFA, (byte)0xC8, (byte)0x7C, + (byte)0x9A, (byte)0xB4, (byte)0x88, (byte)0x4E, + (byte)0x88, (byte)0x4B, (byte)0xC8, (byte)0x7A, + (byte)0x88, (byte)0x48, (byte)0x88, (byte)0x47, + (byte)0xA0, (byte)0xF6, (byte)0x88, (byte)0x45, + (byte)0x88, (byte)0x53, (byte)0xFC, (byte)0xAD, + (byte)0x8A, (byte)0xAD, (byte)0x92, (byte)0x72, + (byte)0xFC, (byte)0x47, (byte)0x94, (byte)0xDF, + (byte)0x9F, (byte)0xD1, (byte)0xFB, (byte)0xCB, + (byte)0x92, (byte)0x7D, (byte)0x98, (byte)0xA4, + (byte)0x94, (byte)0xE7, (byte)0x90, (byte)0xCB, + (byte)0x92, (byte)0x7B, (byte)0x94, (byte)0xD8, + (byte)0xFC, (byte)0x5F, (byte)0xFA, (byte)0x54, + (byte)0x9A, (byte)0xB5, (byte)0x96, (byte)0xDA, + (byte)0x92, (byte)0x79, (byte)0xFA, (byte)0x74, + (byte)0x92, (byte)0x75, (byte)0x8D, (byte)0xFB, + (byte)0x8A, (byte)0x49, (byte)0x92, (byte)0xDF, + (byte)0x9B, (byte)0x7C, (byte)0xFA, (byte)0x63, + (byte)0xFA, (byte)0x60, (byte)0x92, (byte)0x6D, + (byte)0xFA, (byte)0x62, (byte)0x9A, (byte)0xB6, + (byte)0x97, (byte)0x6B, (byte)0xFD, (byte)0x6A, + (byte)0xFD, (byte)0x54, (byte)0x92, (byte)0x73, + (byte)0x97, (byte)0xD8, (byte)0x9F, (byte)0xBB, + (byte)0x93, (byte)0x42, (byte)0x92, (byte)0x76, + (byte)0xFA, (byte)0x65, (byte)0x92, (byte)0x6C, + (byte)0xFA, (byte)0x6E, (byte)0x9E, (byte)0xE0, + (byte)0x92, (byte)0xC0, (byte)0x92, (byte)0xBF, + (byte)0x92, (byte)0xBE, (byte)0x9A, (byte)0xBA, + (byte)0x8A, (byte)0xB3, (byte)0x97, (byte)0x75, + (byte)0xFA, (byte)0x40, (byte)0xFA, (byte)0x76, + (byte)0xFB, (byte)0xD0, (byte)0xFA, (byte)0x7B, + (byte)0xFE, (byte)0x6D, (byte)0x9B, (byte)0xB3, + (byte)0x89, (byte)0xCC, (byte)0x9A, (byte)0xBE, + (byte)0xFA, (byte)0x42, (byte)0x92, (byte)0xBC, + (byte)0x94, (byte)0x5C, (byte)0x9B, (byte)0xB5, + (byte)0x9A, (byte)0xBF, (byte)0x98, (byte)0xA7, + (byte)0x97, (byte)0xA4, (byte)0x90, (byte)0xFD, + (byte)0xFC, (byte)0x7B, (byte)0x9A, (byte)0xC0, + (byte)0x92, (byte)0xC3, (byte)0x8A, (byte)0xAA, + (byte)0x9B, (byte)0xD0, (byte)0x95, (byte)0x50, + (byte)0x92, (byte)0xC6, (byte)0x98, (byte)0xA6, + (byte)0x95, (byte)0x46, (byte)0xFD, (byte)0x63, + (byte)0xFA, (byte)0xC2, (byte)0x9E, (byte)0xC3, + (byte)0x89, (byte)0xB2, (byte)0x9C, (byte)0x66, + (byte)0x90, (byte)0x53, (byte)0x97, (byte)0xC1, + (byte)0x9A, (byte)0xC4, (byte)0x9A, (byte)0xC5, + (byte)0x8E, (byte)0xEF, (byte)0xFA, (byte)0xE9, + (byte)0x92, (byte)0x62, (byte)0x8A, (byte)0xF7, + (byte)0x9A, (byte)0xC6, (byte)0x92, (byte)0xE1, + (byte)0x9A, (byte)0xC9, (byte)0xFA, (byte)0xC6, + (byte)0x97, (byte)0xA5, (byte)0x9A, (byte)0xCB, + (byte)0xFA, (byte)0x72, (byte)0x8A, (byte)0x5E, + (byte)0x94, (byte)0xE0, (byte)0x92, (byte)0xCC, + (byte)0x8A, (byte)0xE5, (byte)0xFE, (byte)0x5C, + (byte)0x9A, (byte)0xCC, (byte)0x9D, (byte)0xF9, + (byte)0x8A, (byte)0x43, (byte)0x8A, (byte)0xA6, + (byte)0x9A, (byte)0xCD, (byte)0x9A, (byte)0xCE, + (byte)0xFA, (byte)0xEE, (byte)0x9B, (byte)0xCC, + (byte)0x9A, (byte)0xCF, (byte)0x9A, (byte)0xD1, + (byte)0x9D, (byte)0xFA, (byte)0x9D, (byte)0x7C, + (byte)0x9A, (byte)0xD3, (byte)0x97, (byte)0xA6, + (byte)0x99, (byte)0x5F, (byte)0xFB, (byte)0xF6, + (byte)0x9F, (byte)0xC5, (byte)0x8A, (byte)0x59, + (byte)0x8B, (byte)0x6B, (byte)0x9A, (byte)0xD4, + (byte)0x9A, (byte)0xD5, (byte)0x97, (byte)0xA2, + (byte)0x8A, (byte)0x44, (byte)0x9F, (byte)0x4A, + (byte)0x90, (byte)0xA1, (byte)0xFD, (byte)0xA4, + (byte)0x8A, (byte)0x64, (byte)0x8A, (byte)0xF2, + (byte)0x8A, (byte)0xF8, (byte)0x9D, (byte)0xD8, + (byte)0x94, (byte)0xD6, (byte)0xFA, (byte)0xFE, + (byte)0xFB, (byte)0xA7, (byte)0x9A, (byte)0xD6, + (byte)0x9F, (byte)0x4D, (byte)0xFA, (byte)0xF6, + (byte)0x8A, (byte)0x57, (byte)0x8B, (byte)0x43, + (byte)0x8B, (byte)0x44, (byte)0x8A, (byte)0xB6, + (byte)0x8A, (byte)0xC0, (byte)0x9E, (byte)0x54, + (byte)0x9A, (byte)0xD7, (byte)0x9A, (byte)0xD8, + (byte)0x9A, (byte)0xDC, (byte)0x8A, (byte)0xCA, + (byte)0x9E, (byte)0xA8, (byte)0x92, (byte)0x63, + (byte)0x9A, (byte)0xDD, (byte)0x8B, (byte)0x65, + (byte)0x8B, (byte)0x6F, (byte)0x8B, (byte)0x7E, + (byte)0x8F, (byte)0x43, (byte)0x92, (byte)0xD0, + (byte)0x8A, (byte)0xF4, (byte)0x9D, (byte)0xBE, + (byte)0x9A, (byte)0xE1, (byte)0xFC, (byte)0xDE, + (byte)0x9D, (byte)0xFD, (byte)0x8B, (byte)0x66, + (byte)0x8B, (byte)0x70, (byte)0x8B, (byte)0x75, + (byte)0x8A, (byte)0xE4, (byte)0x8B, (byte)0xA4, + (byte)0x8A, (byte)0xED, (byte)0x8A, (byte)0x5D, + (byte)0x8B, (byte)0x48, (byte)0x9D, (byte)0xED, + (byte)0x9E, (byte)0x40, (byte)0x8A, (byte)0xEF, + (byte)0x8A, (byte)0xF6, (byte)0x9E, (byte)0x76, + (byte)0x9E, (byte)0xE3, (byte)0x9A, (byte)0xDE, + (byte)0x8D, (byte)0xFE, (byte)0xFA, (byte)0xFC, + (byte)0x9C, (byte)0xB1, (byte)0x9E, (byte)0x77, + (byte)0x8B, (byte)0x64, (byte)0x8B, (byte)0x67, + (byte)0x97, (byte)0x4B, (byte)0x96, (byte)0x53, + (byte)0x9A, (byte)0xE0, (byte)0x8B, (byte)0x4A, + (byte)0x8A, (byte)0xF1, (byte)0x8A, (byte)0xD7, + (byte)0xA0, (byte)0xAB, (byte)0x8A, (byte)0xB5, + (byte)0x8A, (byte)0x5F, (byte)0x8A, (byte)0xEE, + (byte)0x9A, (byte)0xDF, (byte)0x8A, (byte)0xFE, + (byte)0x8A, (byte)0x58, (byte)0x8B, (byte)0xA3, + (byte)0x8B, (byte)0xA7, (byte)0x9A, (byte)0xE3, + (byte)0x92, (byte)0x61, (byte)0x9D, (byte)0xD7, + (byte)0x9E, (byte)0x7D, (byte)0x9E, (byte)0xA7, + (byte)0x9E, (byte)0xAB, (byte)0x90, (byte)0x42, + (byte)0x8B, (byte)0x79, (byte)0x8B, (byte)0x7A, + (byte)0x9A, (byte)0xE6, (byte)0x9A, (byte)0xE5, + (byte)0x8A, (byte)0x7E, (byte)0x9E, (byte)0x44, + (byte)0x9A, (byte)0xE7, (byte)0x8A, (byte)0x7C, + (byte)0x8B, (byte)0x71, (byte)0x9A, (byte)0xE9, + (byte)0x9A, (byte)0xEA, (byte)0x9A, (byte)0xEB, + (byte)0x8A, (byte)0xBD, (byte)0xFB, (byte)0x4E, + (byte)0x9A, (byte)0xED, (byte)0x8A, (byte)0xF9, + (byte)0x9E, (byte)0x63, (byte)0x8B, (byte)0x49, + (byte)0x8A, (byte)0xCE, (byte)0x8B, (byte)0x6E, + (byte)0x8A, (byte)0xE8, (byte)0x9A, (byte)0xEE, + (byte)0x92, (byte)0xCE, (byte)0x8A, (byte)0x5A, + (byte)0x8B, (byte)0x7B, (byte)0x8B, (byte)0x7C, + (byte)0x9A, (byte)0xEF, (byte)0x9A, (byte)0xF0, + (byte)0x8A, (byte)0xFA, (byte)0x89, (byte)0x41, + (byte)0x8B, (byte)0x72, (byte)0x8A, (byte)0xF3, + (byte)0x8B, (byte)0xA8, (byte)0x9E, (byte)0xAE, + (byte)0x9E, (byte)0x72, (byte)0xFB, (byte)0x73, + (byte)0xFB, (byte)0x5F, (byte)0x90, (byte)0xBA, + (byte)0x91, (byte)0xFE, (byte)0x9E, (byte)0xF6, + (byte)0x97, (byte)0xED, (byte)0x9A, (byte)0xF3, + (byte)0xA0, (byte)0xEE, (byte)0x96, (byte)0x7C, + (byte)0x93, (byte)0x45, (byte)0x98, (byte)0x6E, + (byte)0xFA, (byte)0x56, (byte)0x9A, (byte)0xF5, + (byte)0xFC, (byte)0x4B, (byte)0x9A, (byte)0xF4, + (byte)0xFE, (byte)0xDE, (byte)0xFC, (byte)0xB7, + (byte)0x97, (byte)0xF1, (byte)0x97, (byte)0xC7, + (byte)0x9C, (byte)0xCB, (byte)0x92, (byte)0x40, + (byte)0x9C, (byte)0xE8, (byte)0x91, (byte)0xFD, + (byte)0x97, (byte)0x4E, (byte)0xFB, (byte)0x68, + (byte)0x97, (byte)0x6C, (byte)0x8C, (byte)0xC2, + (byte)0x97, (byte)0xE8, (byte)0xFB, (byte)0x6A, + (byte)0x8B, (byte)0x74, (byte)0x8E, (byte)0xE7, + (byte)0xFD, (byte)0xC8, (byte)0x92, (byte)0x41, + (byte)0x96, (byte)0xA1, (byte)0x8E, (byte)0xF3, + (byte)0x9A, (byte)0xF7, (byte)0x8F, (byte)0xA6, + (byte)0xFA, (byte)0xD6, (byte)0x9C, (byte)0xC7, + (byte)0xFA, (byte)0xD7, (byte)0x9A, (byte)0xF8, + (byte)0xFB, (byte)0xA1, (byte)0x8E, (byte)0xC5, + (byte)0xFB, (byte)0xA4, (byte)0xFB, (byte)0xC2, + (byte)0x9A, (byte)0xC1, (byte)0x91, (byte)0xFA, + (byte)0xFE, (byte)0xDB, (byte)0x97, (byte)0xAB, + (byte)0x91, (byte)0x47, (byte)0xFB, (byte)0xB1, + (byte)0x8F, (byte)0xEA, (byte)0x94, (byte)0xD2, + (byte)0xFE, (byte)0x61, (byte)0xFA, (byte)0xCE, + (byte)0x92, (byte)0xED, (byte)0x91, (byte)0xF3, + (byte)0x93, (byte)0xC6, (byte)0x93, (byte)0x5A, + (byte)0xFA, (byte)0xFB, (byte)0x92, (byte)0xEF, + (byte)0xFA, (byte)0xC8, (byte)0x98, (byte)0x47, + (byte)0x93, (byte)0x66, (byte)0x98, (byte)0x55, + (byte)0x96, (byte)0xE6, (byte)0x9F, (byte)0x43, + (byte)0x9F, (byte)0xAA, (byte)0x94, (byte)0xDA, + (byte)0x92, (byte)0xEE, (byte)0xFC, (byte)0xAF, + (byte)0xFB, (byte)0xFB, (byte)0x8E, (byte)0xF9, + (byte)0x91, (byte)0xF6, (byte)0x93, (byte)0x64, + (byte)0x94, (byte)0xF5, (byte)0x9C, (byte)0xB6, + (byte)0xFB, (byte)0xAD, (byte)0x98, (byte)0x4E, + (byte)0x8F, (byte)0x44, (byte)0x96, (byte)0xFD, + (byte)0x9A, (byte)0xF9, (byte)0x9A, (byte)0xFA, + (byte)0x97, (byte)0x69, (byte)0x95, (byte)0xD4, + (byte)0x98, (byte)0x4B, (byte)0xFB, (byte)0xAA, + (byte)0x98, (byte)0x7C, (byte)0x91, (byte)0xEA, + (byte)0x9D, (byte)0xAF, (byte)0x9D, (byte)0xC5, + (byte)0x91, (byte)0xF1, (byte)0x8E, (byte)0xB1, + (byte)0x97, (byte)0xA9, (byte)0xFB, (byte)0xAC, + (byte)0xFC, (byte)0xB8, (byte)0x9C, (byte)0xB9, + (byte)0xFB, (byte)0xB0, (byte)0xFC, (byte)0xD2, + (byte)0x93, (byte)0xCB, (byte)0x9A, (byte)0xFD, + (byte)0x91, (byte)0xF4, (byte)0x8B, (byte)0xAC, + (byte)0xA0, (byte)0x55, (byte)0x95, (byte)0x74, + (byte)0x95, (byte)0xBE, (byte)0x97, (byte)0xAD, + (byte)0x8E, (byte)0xE9, (byte)0x92, (byte)0xF8, + (byte)0x97, (byte)0xBE, (byte)0x91, (byte)0x6C, + (byte)0x94, (byte)0xAA, (byte)0xFC, (byte)0x63, + (byte)0x9D, (byte)0xC6, (byte)0x97, (byte)0xB5, + (byte)0x92, (byte)0xB8, (byte)0x91, (byte)0xEF, + (byte)0xFE, (byte)0xA6, (byte)0x97, (byte)0x60, + (byte)0x93, (byte)0x58, (byte)0x95, (byte)0x76, + (byte)0x8F, (byte)0xAC, (byte)0x91, (byte)0xEC, + (byte)0x97, (byte)0xB4, (byte)0x91, (byte)0xF7, + (byte)0x97, (byte)0x4A, (byte)0xFB, (byte)0x49, + (byte)0x95, (byte)0x78, (byte)0x93, (byte)0xBC, + (byte)0x91, (byte)0xD6, (byte)0x93, (byte)0x55, + (byte)0x93, (byte)0x56, (byte)0x98, (byte)0x51, + (byte)0x8F, (byte)0xF8, (byte)0xFB, (byte)0xC0, + (byte)0x93, (byte)0xF2, (byte)0x90, (byte)0xD0, + (byte)0x9C, (byte)0x44, (byte)0x92, (byte)0x55, + (byte)0x93, (byte)0x63, (byte)0x91, (byte)0xA5, + (byte)0xA0, (byte)0xED, (byte)0xFD, (byte)0x6B, + (byte)0x9A, (byte)0xFE, (byte)0x93, (byte)0x51, + (byte)0x8C, (byte)0x57, (byte)0xFA, (byte)0x78, + (byte)0xFE, (byte)0xA8, (byte)0x93, (byte)0x50, + (byte)0xFA, (byte)0x4C, (byte)0x92, (byte)0xF7, + (byte)0x9B, (byte)0x40, (byte)0xFB, (byte)0xCE, + (byte)0x9B, (byte)0x41, (byte)0xFE, (byte)0xAD, + (byte)0xFB, (byte)0xD5, (byte)0x8B, (byte)0xC2, + (byte)0x9A, (byte)0x7C, (byte)0x9B, (byte)0x42, + (byte)0x9B, (byte)0x43, (byte)0x9E, (byte)0x79, + (byte)0xFB, (byte)0xD9, (byte)0x9B, (byte)0x44, + (byte)0xA0, (byte)0xA7, (byte)0x9B, (byte)0xF3, + (byte)0x8C, (byte)0x79, (byte)0x93, (byte)0x5E, + (byte)0x89, (byte)0xCB, (byte)0x9F, (byte)0x53, + (byte)0x93, (byte)0xD7, (byte)0xFB, (byte)0xE1, + (byte)0xFE, (byte)0xD0, (byte)0xFB, (byte)0xE2, + (byte)0xFC, (byte)0xE3, (byte)0x90, (byte)0x74, + (byte)0xFB, (byte)0xE6, (byte)0x9B, (byte)0xB7, + (byte)0x9B, (byte)0x45, (byte)0x9B, (byte)0x47, + (byte)0x9F, (byte)0x50, (byte)0x9B, (byte)0x48, + (byte)0xFC, (byte)0x5B, (byte)0x98, (byte)0xA9, + (byte)0x9C, (byte)0xFD, (byte)0x88, (byte)0x4C, + (byte)0x9B, (byte)0x4B, (byte)0xFB, (byte)0xEC, + (byte)0x8C, (byte)0x69, (byte)0x9B, (byte)0xA8, + (byte)0x8A, (byte)0xD5, (byte)0xFA, (byte)0x73, + (byte)0xFD, (byte)0x59, (byte)0x91, (byte)0xA2, + (byte)0xFB, (byte)0xED, (byte)0x9C, (byte)0xA9, + (byte)0x8A, (byte)0xA8, (byte)0x9B, (byte)0xC3, + (byte)0x8A, (byte)0xE1, (byte)0x9B, (byte)0x4E, + (byte)0x95, (byte)0xD0, (byte)0x90, (byte)0x5F, + (byte)0x97, (byte)0xEE, (byte)0xFC, (byte)0x4E, + (byte)0x9B, (byte)0x4F, (byte)0x9B, (byte)0x50, + (byte)0x9E, (byte)0xC6, (byte)0xFC, (byte)0x50, + (byte)0xFD, (byte)0x73, (byte)0xFD, (byte)0xA7, + (byte)0x9D, (byte)0xA2, (byte)0xFA, (byte)0x58, + (byte)0xFA, (byte)0x5E, (byte)0xA0, (byte)0x59, + (byte)0xFA, (byte)0x75, (byte)0xFB, (byte)0xBE, + (byte)0x9C, (byte)0xA2, (byte)0x93, (byte)0x70, + (byte)0x93, (byte)0x71, (byte)0x93, (byte)0x77, + (byte)0xFE, (byte)0xEF, (byte)0x93, (byte)0x6D, + (byte)0xFC, (byte)0x5D, (byte)0x90, (byte)0xB8, + (byte)0x8A, (byte)0xFC, (byte)0xFB, (byte)0x41, + (byte)0x9E, (byte)0x6B, (byte)0x94, (byte)0xE3, + (byte)0x8E, (byte)0xE2, (byte)0x8C, (byte)0x7D, + (byte)0x8E, (byte)0xD7, (byte)0x9C, (byte)0x4D, + (byte)0x96, (byte)0xA3, (byte)0x9B, (byte)0x51, + (byte)0x8A, (byte)0xC3, (byte)0x96, (byte)0xAA, + (byte)0xFC, (byte)0x68, (byte)0x8B, (byte)0x6D, + (byte)0xFD, (byte)0x67, (byte)0x8A, (byte)0xE9, + (byte)0xFC, (byte)0xA1, (byte)0x93, (byte)0x6C, + (byte)0x9B, (byte)0x52, (byte)0xFE, (byte)0x70, + (byte)0xFC, (byte)0xA8, (byte)0xFC, (byte)0xE9, + (byte)0x9C, (byte)0xB4, (byte)0x8A, (byte)0xEA, + (byte)0x9B, (byte)0x53, (byte)0x9B, (byte)0x55, + (byte)0x96, (byte)0xAB, (byte)0xFC, (byte)0xA7, + (byte)0x9B, (byte)0x56, (byte)0x8A, (byte)0xBC, + (byte)0x8A, (byte)0xCB, (byte)0x9B, (byte)0x57, + (byte)0x89, (byte)0xCD, (byte)0x9B, (byte)0x59, + (byte)0x9B, (byte)0x5B, (byte)0x93, (byte)0xA5, + (byte)0x9B, (byte)0x5D, (byte)0x9E, (byte)0x4F, + (byte)0x93, (byte)0xA3, (byte)0x8A, (byte)0x7B, + (byte)0x8B, (byte)0x42, (byte)0x97, (byte)0x50, + (byte)0x8F, (byte)0xB3, (byte)0x8A, (byte)0x50, + (byte)0x9B, (byte)0x60, (byte)0x8B, (byte)0x45, + (byte)0x8B, (byte)0x46, (byte)0x9D, (byte)0xFE, + (byte)0x9B, (byte)0x62, (byte)0x93, (byte)0x7B, + (byte)0x93, (byte)0xB1, (byte)0x8A, (byte)0x60, + (byte)0x8A, (byte)0xD8, (byte)0x9B, (byte)0x63, + (byte)0x8A, (byte)0x69, (byte)0x8A, (byte)0x47, + (byte)0x8A, (byte)0xCC, (byte)0x93, (byte)0x7C, + (byte)0x9B, (byte)0x65, (byte)0x9B, (byte)0x66, + (byte)0x8A, (byte)0x72, (byte)0x8A, (byte)0x7A, + (byte)0x93, (byte)0xAF, (byte)0x8A, (byte)0xB0, + (byte)0x9B, (byte)0x68, (byte)0x9E, (byte)0xA3, + (byte)0xFA, (byte)0xEC, (byte)0x8B, (byte)0x77, + (byte)0x9B, (byte)0x67, (byte)0x8B, (byte)0x59, + (byte)0xFC, (byte)0xB1, (byte)0xFC, (byte)0xBB, + (byte)0x9B, (byte)0x69, (byte)0x93, (byte)0xA8, + (byte)0x8A, (byte)0xE0, (byte)0x9E, (byte)0x51, + (byte)0x8F, (byte)0x5F, (byte)0x9B, (byte)0x6A, + (byte)0x9B, (byte)0x6B, (byte)0x97, (byte)0xEC, + (byte)0x9B, (byte)0x6C, (byte)0xFE, (byte)0x4E, + (byte)0xFD, (byte)0xC2, (byte)0x9B, (byte)0x6D, + (byte)0x91, (byte)0x67, (byte)0xFC, (byte)0xCC, + (byte)0x93, (byte)0xB6, (byte)0x90, (byte)0xE4, + (byte)0x90, (byte)0xE5, (byte)0x9E, (byte)0xF2, + (byte)0x93, (byte)0xCA, (byte)0x8B, (byte)0xBC, + (byte)0x8F, (byte)0x46, (byte)0x93, (byte)0xCF, + (byte)0xFC, (byte)0xDB, (byte)0xFC, (byte)0xDC, + (byte)0x93, (byte)0xC0, (byte)0xFC, (byte)0xE6, + (byte)0x96, (byte)0xE7, (byte)0xFC, (byte)0xD8, + (byte)0xFC, (byte)0xD9, (byte)0xFD, (byte)0xA6, + (byte)0x93, (byte)0xCE, (byte)0x95, (byte)0xF1, + (byte)0x9C, (byte)0xE9, (byte)0xFC, (byte)0xE4, + (byte)0x94, (byte)0xAF, (byte)0xFA, (byte)0x77, + (byte)0x93, (byte)0xCC, (byte)0x90, (byte)0x5A, + (byte)0x8C, (byte)0x54, (byte)0x93, (byte)0xBF, + (byte)0xFB, (byte)0x51, (byte)0x93, (byte)0xB9, + (byte)0xFE, (byte)0xD7, (byte)0x93, (byte)0xB7, + (byte)0x93, (byte)0xD9, (byte)0x93, (byte)0xBB, + (byte)0x93, (byte)0xDA, (byte)0x98, (byte)0xA3, + (byte)0x90, (byte)0xD1, (byte)0x9B, (byte)0x6E, + (byte)0xFA, (byte)0x70, (byte)0x9B, (byte)0xEB, + (byte)0x9B, (byte)0x6F, (byte)0xFC, (byte)0xFC, + (byte)0x8B, (byte)0x40, (byte)0xA0, (byte)0x7B, + (byte)0x8C, (byte)0xA1, (byte)0x97, (byte)0xF7, + (byte)0x93, (byte)0xE2, (byte)0xFC, (byte)0xD6, + (byte)0x95, (byte)0x59, (byte)0x93, (byte)0xA6, + (byte)0xFD, (byte)0x40, (byte)0x93, (byte)0x5F, + (byte)0x97, (byte)0xF2, (byte)0x9C, (byte)0x76, + (byte)0x8E, (byte)0xF8, (byte)0x8F, (byte)0x47, + (byte)0x9B, (byte)0x74, (byte)0x92, (byte)0xB4, + (byte)0x91, (byte)0xED, (byte)0x96, (byte)0xD2, + (byte)0xFD, (byte)0x46, (byte)0x8F, (byte)0x4F, + (byte)0x95, (byte)0x49, (byte)0x9B, (byte)0x75, + (byte)0xFA, (byte)0x5C, (byte)0x9B, (byte)0x79, + (byte)0xFD, (byte)0x4B, (byte)0x96, (byte)0xD3, + (byte)0xFD, (byte)0x58, (byte)0x94, (byte)0x5F, + (byte)0xA0, (byte)0xF5, (byte)0x92, (byte)0x43, + (byte)0x97, (byte)0xFA, (byte)0x9D, (byte)0xD9, + (byte)0x97, (byte)0xF4, (byte)0x92, (byte)0x4D, + (byte)0xFD, (byte)0x5B, (byte)0x9B, (byte)0x7A, + (byte)0x9E, (byte)0xD5, (byte)0xFA, (byte)0xAE, + (byte)0x9C, (byte)0xC9, (byte)0x92, (byte)0x58, + (byte)0x8E, (byte)0xC8, (byte)0x94, (byte)0xB4, + (byte)0x93, (byte)0xE1, (byte)0x93, (byte)0xDF, + (byte)0xFC, (byte)0xF0, (byte)0x93, (byte)0xEC, + (byte)0x97, (byte)0xF6, (byte)0x96, (byte)0xCF, + (byte)0x93, (byte)0xDE, (byte)0x8A, (byte)0xCF, + (byte)0x9B, (byte)0xA2, (byte)0xFD, (byte)0x69, + (byte)0x93, (byte)0x52, (byte)0x98, (byte)0xA2, + (byte)0xFD, (byte)0x6E, (byte)0x8C, (byte)0xA4, + (byte)0xFA, (byte)0x7C, (byte)0x93, (byte)0xFA, + (byte)0x90, (byte)0x7C, (byte)0x8F, (byte)0x67, + (byte)0x9D, (byte)0xB7, (byte)0xA0, (byte)0xE9, + (byte)0xFA, (byte)0x4E, (byte)0xFD, (byte)0xA1, + (byte)0x9E, (byte)0x74, (byte)0x9F, (byte)0xBF, + (byte)0x9E, (byte)0xCB, (byte)0x9B, (byte)0xB9, + (byte)0x9D, (byte)0xD4, (byte)0x97, (byte)0xB9, + (byte)0x8E, (byte)0xF1, (byte)0x95, (byte)0x7B, + (byte)0x9E, (byte)0xD2, (byte)0x97, (byte)0x53, + (byte)0x96, (byte)0xA4, (byte)0x8F, (byte)0xBE, + (byte)0x94, (byte)0xD9, (byte)0x90, (byte)0x58, + (byte)0xFD, (byte)0x79, (byte)0xFD, (byte)0x7B, + (byte)0x8E, (byte)0xDA, (byte)0x8E, (byte)0xFA, + (byte)0x9B, (byte)0xA5, (byte)0x9E, (byte)0xD9, + (byte)0x97, (byte)0xD4, (byte)0x90, (byte)0xBB, + (byte)0xFD, (byte)0xBC, (byte)0xFD, (byte)0xC6, + (byte)0x92, (byte)0x48, (byte)0x92, (byte)0xB5, + (byte)0x9D, (byte)0xC1, (byte)0x92, (byte)0xB9, + (byte)0x92, (byte)0xA6, (byte)0x8F, (byte)0x4B, + (byte)0x9B, (byte)0xA6, (byte)0x92, (byte)0xB6, + (byte)0x8E, (byte)0x40, (byte)0x9E, (byte)0xD8, + (byte)0x94, (byte)0x5E, (byte)0x98, (byte)0x5F, + (byte)0x94, (byte)0xCE, (byte)0x92, (byte)0x4A, + (byte)0xFD, (byte)0x70, (byte)0x94, (byte)0x67, + (byte)0x8D, (byte)0xEC, (byte)0x9B, (byte)0xD8, + (byte)0x94, (byte)0x48, (byte)0xFA, (byte)0xC1, + (byte)0x9C, (byte)0xF7, (byte)0xFD, (byte)0xBE, + (byte)0x8F, (byte)0xDA, (byte)0xFD, (byte)0xD9, + (byte)0xFC, (byte)0x7E, (byte)0x93, (byte)0xF9, + (byte)0xFA, (byte)0x43, (byte)0xFA, (byte)0xEB, + (byte)0xFA, (byte)0xC3, (byte)0x97, (byte)0xD3, + (byte)0x95, (byte)0xF9, (byte)0x9C, (byte)0x48, + (byte)0xFD, (byte)0xD8, (byte)0xA0, (byte)0xD8, + (byte)0xFD, (byte)0xD7, (byte)0xFB, (byte)0x4A, + (byte)0x9B, (byte)0xAF, (byte)0x94, (byte)0x4B, + (byte)0xFD, (byte)0xC9, (byte)0x8E, (byte)0xAC, + (byte)0xFD, (byte)0xB2, (byte)0x92, (byte)0x5A, + (byte)0xFC, (byte)0xBD, (byte)0x92, (byte)0xD9, + (byte)0xFD, (byte)0xD5, (byte)0x92, (byte)0xDD, + (byte)0x92, (byte)0x59, (byte)0x96, (byte)0xBA, + (byte)0x92, (byte)0x5B, (byte)0x9B, (byte)0xAB, + (byte)0xFD, (byte)0xDA, (byte)0xFD, (byte)0xDE, + (byte)0xFD, (byte)0xD3, (byte)0x8C, (byte)0x46, + (byte)0xFD, (byte)0xD6, (byte)0xFD, (byte)0xDC, + (byte)0xFD, (byte)0xDD, (byte)0x90, (byte)0xFE, + (byte)0xFE, (byte)0xA1, (byte)0x8B, (byte)0xAD, + (byte)0x9C, (byte)0xD8, (byte)0x9E, (byte)0x6D, + (byte)0xFD, (byte)0x7C, (byte)0xFB, (byte)0x61, + (byte)0x96, (byte)0xF8, (byte)0x96, (byte)0xF0, + (byte)0xFC, (byte)0xF4, (byte)0xFE, (byte)0x60, + (byte)0x98, (byte)0x52, (byte)0x96, (byte)0x4F, + (byte)0x91, (byte)0x6E, (byte)0x98, (byte)0x6D, + (byte)0x98, (byte)0x64, (byte)0x94, (byte)0x53, + (byte)0xFD, (byte)0xEC, (byte)0xFB, (byte)0x78, + (byte)0x95, (byte)0xBA, (byte)0x98, (byte)0x5D, + (byte)0x92, (byte)0xF9, (byte)0x98, (byte)0x5A, + (byte)0xFD, (byte)0xF6, (byte)0x93, (byte)0xD0, + (byte)0x98, (byte)0x62, (byte)0x9B, (byte)0xAD, + (byte)0x97, (byte)0x4F, (byte)0x9B, (byte)0xAE, + (byte)0x94, (byte)0x52, (byte)0x9B, (byte)0xB0, + (byte)0x91, (byte)0xD2, (byte)0x97, (byte)0xEA, + (byte)0xFB, (byte)0x6B, (byte)0x91, (byte)0xB1, + (byte)0xFD, (byte)0xF3, (byte)0x92, (byte)0xCB, + (byte)0x9B, (byte)0xB1, (byte)0xFC, (byte)0xEC, + (byte)0x98, (byte)0x6B, (byte)0x97, (byte)0x51, + (byte)0x98, (byte)0x71, (byte)0x95, (byte)0xEF, + (byte)0x9E, (byte)0xF3, (byte)0x91, (byte)0xE8, + (byte)0x9B, (byte)0xBA, (byte)0xFB, (byte)0x4C, + (byte)0x92, (byte)0x6A, (byte)0xFD, (byte)0xF8, + (byte)0x98, (byte)0x61, (byte)0x91, (byte)0xE7, + (byte)0x93, (byte)0xED, (byte)0x97, (byte)0x44, + (byte)0x91, (byte)0xE1, (byte)0xFB, (byte)0xF5, + (byte)0x98, (byte)0x69, (byte)0x8A, (byte)0x62, + (byte)0x9B, (byte)0xBB, (byte)0x8C, (byte)0xA8, + (byte)0x9C, (byte)0x55, (byte)0x8E, (byte)0x77, + (byte)0x8A, (byte)0xB2, (byte)0x9E, (byte)0xBC, + (byte)0x93, (byte)0xE6, (byte)0x93, (byte)0xA2, + (byte)0x9B, (byte)0xBD, (byte)0x94, (byte)0xB3, + (byte)0x93, (byte)0x7D, (byte)0x9E, (byte)0x66, + (byte)0x94, (byte)0x59, (byte)0x9B, (byte)0xBF, + (byte)0x94, (byte)0x58, (byte)0x9E, (byte)0xA5, + (byte)0x9B, (byte)0xC7, (byte)0xFE, (byte)0x54, + (byte)0x8E, (byte)0x74, (byte)0x8B, (byte)0xD6, + (byte)0x94, (byte)0xB6, (byte)0xFD, (byte)0x74, + (byte)0x98, (byte)0xC0, (byte)0x94, (byte)0xA5, + (byte)0x9B, (byte)0xC8, (byte)0x95, (byte)0xED, + (byte)0xFD, (byte)0x7E, (byte)0xFB, (byte)0xEB, + (byte)0xFD, (byte)0x7D, (byte)0x97, (byte)0x6F, + (byte)0x94, (byte)0x61, (byte)0x9F, (byte)0xC1, + (byte)0x95, (byte)0xD7, (byte)0xFA, (byte)0x52, + (byte)0x9C, (byte)0x58, (byte)0x9F, (byte)0x68, + (byte)0x9B, (byte)0xE7, (byte)0xFC, (byte)0xCE, + (byte)0x96, (byte)0xE8, (byte)0xFA, (byte)0x49, + (byte)0x97, (byte)0xA1, (byte)0x95, (byte)0x4D, + (byte)0x9E, (byte)0xF8, (byte)0xFE, (byte)0x49, + (byte)0x91, (byte)0xCE, (byte)0x97, (byte)0x71, + (byte)0x8C, (byte)0xCF, (byte)0xFD, (byte)0xB1, + (byte)0xFC, (byte)0x6E, (byte)0x9C, (byte)0xF2, + (byte)0x93, (byte)0xB8, (byte)0x90, (byte)0x43, + (byte)0x97, (byte)0x59, (byte)0x94, (byte)0xD7, + (byte)0xFE, (byte)0x66, (byte)0x94, (byte)0x7D, + (byte)0xFC, (byte)0x6F, (byte)0x92, (byte)0x46, + (byte)0xFA, (byte)0x6D, (byte)0x8E, (byte)0xF7, + (byte)0xFB, (byte)0xB7, (byte)0x94, (byte)0x7C, + (byte)0x92, (byte)0xCD, (byte)0x97, (byte)0xB2, + (byte)0xFE, (byte)0x65, (byte)0x96, (byte)0x7E, + (byte)0x97, (byte)0x58, (byte)0x9B, (byte)0x77, + (byte)0x91, (byte)0xCF, (byte)0x94, (byte)0xA4, + (byte)0x9C, (byte)0xAD, (byte)0x8B, (byte)0xAB, + (byte)0x96, (byte)0xD5, (byte)0xFC, (byte)0xB3, + (byte)0x93, (byte)0xAE, (byte)0x97, (byte)0x6D, + (byte)0x94, (byte)0x46, (byte)0x95, (byte)0xF7, + (byte)0x9C, (byte)0x46, (byte)0x95, (byte)0x5B, + (byte)0x91, (byte)0xD1, (byte)0x94, (byte)0xF4, + (byte)0xFE, (byte)0x67, (byte)0x92, (byte)0xA5, + (byte)0xFE, (byte)0xDF, (byte)0x8C, (byte)0xAB, + (byte)0x9B, (byte)0xC9, (byte)0xFC, (byte)0xED, + (byte)0xFD, (byte)0xFA, (byte)0xFC, (byte)0xC8, + (byte)0xFE, (byte)0x62, (byte)0x91, (byte)0xFC, + (byte)0xFE, (byte)0x6B, (byte)0xFD, (byte)0xF9, + (byte)0xFC, (byte)0xC7, (byte)0x91, (byte)0x4E, + (byte)0x9C, (byte)0xB8, (byte)0x97, (byte)0x67, + (byte)0x95, (byte)0xEE, (byte)0x9B, (byte)0xB2, + (byte)0x94, (byte)0x60, (byte)0x94, (byte)0xA2, + (byte)0x98, (byte)0x75, (byte)0x97, (byte)0xAC, + (byte)0x91, (byte)0xD3, (byte)0x98, (byte)0x7B, + (byte)0x8E, (byte)0xEB, (byte)0x97, (byte)0x6A, + (byte)0x96, (byte)0x5E, (byte)0x97, (byte)0xEB, + (byte)0x9F, (byte)0xF9, (byte)0x95, (byte)0xF8, + (byte)0xFE, (byte)0xA2, (byte)0x8F, (byte)0xE6, + (byte)0xFE, (byte)0x7E, (byte)0x9D, (byte)0xA4, + (byte)0x97, (byte)0x68, (byte)0x8E, (byte)0xEC, + (byte)0x94, (byte)0xBD, (byte)0x94, (byte)0x5B, + (byte)0x9C, (byte)0xF6, (byte)0xFA, (byte)0xA7, + (byte)0x9B, (byte)0xD9, (byte)0xFA, (byte)0x5D, + (byte)0x96, (byte)0x56, (byte)0x97, (byte)0x62, + (byte)0x94, (byte)0xBA, (byte)0xA0, (byte)0x4F, + (byte)0x92, (byte)0xD8, (byte)0x9B, (byte)0xCB, + (byte)0x94, (byte)0xBB, (byte)0x9D, (byte)0x5F, + (byte)0x90, (byte)0xCF, (byte)0x94, (byte)0x65, + (byte)0x9F, (byte)0x4C, (byte)0x90, (byte)0xD8, + (byte)0x9E, (byte)0xBE, (byte)0xFB, (byte)0x6D, + (byte)0x95, (byte)0xCA, (byte)0x9D, (byte)0xC2, + (byte)0x97, (byte)0xF8, (byte)0x8F, (byte)0xFC, + (byte)0x94, (byte)0x73, (byte)0x94, (byte)0x74, + (byte)0xFE, (byte)0xB7, (byte)0x8A, (byte)0x4B, + (byte)0x8A, (byte)0x55, (byte)0x8B, (byte)0x69, + (byte)0x8A, (byte)0xDC, (byte)0x8B, (byte)0x76, + (byte)0x9B, (byte)0xCE, (byte)0x8A, (byte)0x68, + (byte)0xA0, (byte)0xF8, (byte)0x98, (byte)0xDF, + (byte)0xFE, (byte)0xB5, (byte)0x9B, (byte)0xCF, + (byte)0x96, (byte)0xFB, (byte)0x9B, (byte)0xFB, + (byte)0x9E, (byte)0xCE, (byte)0x8E, (byte)0xE5, + (byte)0x9E, (byte)0x7B, (byte)0x9B, (byte)0xD2, + (byte)0x8A, (byte)0xA5, (byte)0xFE, (byte)0xCE, + (byte)0x8A, (byte)0x45, (byte)0x9D, (byte)0xFC, + (byte)0xFE, (byte)0xCF, (byte)0x8B, (byte)0xA5, + (byte)0x8C, (byte)0x4A, (byte)0x8A, (byte)0xEC, + (byte)0xFC, (byte)0xE0, (byte)0x94, (byte)0xAD, + (byte)0xFE, (byte)0xD5, (byte)0x94, (byte)0xAC, + (byte)0xFC, (byte)0x5A, (byte)0x9B, (byte)0xD6, + (byte)0x8A, (byte)0x6F, (byte)0x8B, (byte)0xA9, + (byte)0x8E, (byte)0x5F, (byte)0x9D, (byte)0xCB, + (byte)0xFC, (byte)0xE7, (byte)0x9B, (byte)0xD7, + (byte)0x93, (byte)0xC8, (byte)0x91, (byte)0xF0, + (byte)0x8F, (byte)0xE0, (byte)0x9B, (byte)0xDB, + (byte)0x90, (byte)0xED, (byte)0x9B, (byte)0xDC, + (byte)0xA0, (byte)0xEC, (byte)0x98, (byte)0xFA, + (byte)0x9B, (byte)0xE0, (byte)0x93, (byte)0xC7, + (byte)0x92, (byte)0x49, (byte)0x96, (byte)0xE1, + (byte)0x9B, (byte)0xE2, (byte)0x9B, (byte)0xE4, + (byte)0x8F, (byte)0xE1, (byte)0x9B, (byte)0xE5, + (byte)0x94, (byte)0xC0, (byte)0x93, (byte)0xC3, + (byte)0x93, (byte)0xC5, (byte)0x90, (byte)0x79, + (byte)0x97, (byte)0x7B, (byte)0x90, (byte)0x7E, + (byte)0xFE, (byte)0xE6, (byte)0xFE, (byte)0x46, + (byte)0x9D, (byte)0xB8, (byte)0x92, (byte)0x70, + (byte)0x95, (byte)0xA8, (byte)0x8C, (byte)0xB0, + (byte)0x94, (byte)0xC8, (byte)0x98, (byte)0xB9, + (byte)0x91, (byte)0x40, (byte)0xFC, (byte)0xBE, + (byte)0x91, (byte)0x57, (byte)0x8B, (byte)0xB2, + (byte)0xFA, (byte)0xDF, (byte)0x9B, (byte)0xE6, + (byte)0x96, (byte)0x43, (byte)0x8E, (byte)0x44, + (byte)0x9C, (byte)0x4F, (byte)0xFE, (byte)0xF4, + (byte)0x9B, (byte)0xE8, (byte)0x93, (byte)0xDC, + (byte)0x96, (byte)0x6F, (byte)0x8E, (byte)0x4A, + (byte)0x9B, (byte)0xED, (byte)0x92, (byte)0xF6, + (byte)0x9D, (byte)0xB9, (byte)0x8E, (byte)0x4E, + (byte)0xFB, (byte)0xCF, (byte)0x9E, (byte)0xC2, + (byte)0x94, (byte)0xE5, (byte)0x9B, (byte)0xF0, + (byte)0x94, (byte)0xE4, (byte)0x95, (byte)0x51, + (byte)0x8B, (byte)0xBB, (byte)0x9B, (byte)0xF1, + (byte)0x94, (byte)0xF0, (byte)0x8E, (byte)0x64, + (byte)0x94, (byte)0xEA, (byte)0x8F, (byte)0x61, + (byte)0x9B, (byte)0x64, (byte)0x8E, (byte)0x5B, + (byte)0x9B, (byte)0xF2, (byte)0x9F, (byte)0xBE, + (byte)0x9D, (byte)0xC9, (byte)0x8E, (byte)0x6C, + (byte)0x8F, (byte)0x73, (byte)0x8C, (byte)0xAF, + (byte)0x8F, (byte)0x75, (byte)0x8E, (byte)0x71, + (byte)0x8E, (byte)0x60, (byte)0x8E, (byte)0x6A, + (byte)0x8C, (byte)0x4C, (byte)0x95, (byte)0x52, + (byte)0x95, (byte)0x54, (byte)0x8A, (byte)0xD4, + (byte)0x9D, (byte)0xBB, (byte)0x95, (byte)0x43, + (byte)0x92, (byte)0xFE, (byte)0x94, (byte)0xF2, + (byte)0x94, (byte)0xF1, (byte)0xA0, (byte)0xEA, + (byte)0x9D, (byte)0xD2, (byte)0xA0, (byte)0xB1, + (byte)0x91, (byte)0xF8, (byte)0x94, (byte)0x62, + (byte)0x9B, (byte)0xA4, (byte)0x8E, (byte)0xAD, + (byte)0x9E, (byte)0xAD, (byte)0x96, (byte)0xD0, + (byte)0xFE, (byte)0xEE, (byte)0x8A, (byte)0xB4, + (byte)0x97, (byte)0x57, (byte)0x8A, (byte)0x77, + (byte)0x9B, (byte)0xF7, (byte)0x8E, (byte)0xB5, + (byte)0xA0, (byte)0x6D, (byte)0x8E, (byte)0xB6, + (byte)0x97, (byte)0x56, (byte)0x95, (byte)0x40, + (byte)0xA0, (byte)0xF3, (byte)0x94, (byte)0xBE, + (byte)0x9B, (byte)0xFA, (byte)0xFD, (byte)0xDF, + (byte)0x9D, (byte)0xBC, (byte)0x94, (byte)0xFE, + (byte)0x8B, (byte)0xDB, (byte)0xA0, (byte)0xFE, + (byte)0x8E, (byte)0xC0, (byte)0x9F, (byte)0x47, + (byte)0x8B, (byte)0xDE, (byte)0xA0, (byte)0xFB, + (byte)0x8E, (byte)0xC3, (byte)0x96, (byte)0x49, + (byte)0xFE, (byte)0xC2, (byte)0x95, (byte)0x4C, + (byte)0x9B, (byte)0xFD, (byte)0x90, (byte)0xCC, + (byte)0x9C, (byte)0x60, (byte)0x95, (byte)0x4B, + (byte)0x9B, (byte)0xFE, (byte)0x9C, (byte)0x70, + (byte)0x9C, (byte)0x43, (byte)0x9C, (byte)0x47, + (byte)0x8E, (byte)0xCC, (byte)0x8E, (byte)0x54, + (byte)0x8E, (byte)0xE4, (byte)0x9C, (byte)0x49, + (byte)0x8B, (byte)0x5E, (byte)0x95, (byte)0x5E, + (byte)0x95, (byte)0x5C, (byte)0x9C, (byte)0x4B, + (byte)0x8B, (byte)0xE1, (byte)0x8E, (byte)0xD9, + (byte)0x9D, (byte)0xB4, (byte)0x92, (byte)0x5F, + (byte)0x9C, (byte)0x4C, (byte)0x8A, (byte)0xA1, + (byte)0x8E, (byte)0xDB, (byte)0x9C, (byte)0x56, + (byte)0x8A, (byte)0xA2, (byte)0x97, (byte)0x54, + (byte)0x9C, (byte)0x5E, (byte)0x9E, (byte)0xD4, + (byte)0x95, (byte)0x68, (byte)0xA0, (byte)0xC3, + (byte)0x8A, (byte)0xE6, (byte)0xA0, (byte)0xF7, + (byte)0x9C, (byte)0x61, (byte)0x9C, (byte)0x5F, + (byte)0xFC, (byte)0x4D, (byte)0x9E, (byte)0x5B, + (byte)0x9E, (byte)0x69, (byte)0x9C, (byte)0x63, + (byte)0xFE, (byte)0xC7, (byte)0xFE, (byte)0xC6, + (byte)0x9C, (byte)0x67, (byte)0x9C, (byte)0x69, + (byte)0x8B, (byte)0xE2, (byte)0x91, (byte)0x65, + (byte)0x9C, (byte)0xE7, (byte)0x8A, (byte)0x54, + (byte)0x9C, (byte)0x6C, (byte)0x9C, (byte)0x6E, + (byte)0xFE, (byte)0x5D, (byte)0x9C, (byte)0x73, + (byte)0x95, (byte)0x6A, (byte)0x95, (byte)0x6D, + (byte)0x8E, (byte)0xF0, (byte)0x8F, (byte)0x4D, + (byte)0x8E, (byte)0xF6, (byte)0xFA, (byte)0xBC, + (byte)0x8C, (byte)0xD5, (byte)0xFB, (byte)0xDA, + (byte)0x8B, (byte)0x4C, (byte)0xFD, (byte)0x75, + (byte)0x9B, (byte)0xDD, (byte)0xFA, (byte)0xF5, + (byte)0x9C, (byte)0x74, (byte)0x95, (byte)0x45, + (byte)0x96, (byte)0xC6, (byte)0x8F, (byte)0x6A, + (byte)0x8F, (byte)0x4E, (byte)0x9C, (byte)0x78, + (byte)0xFA, (byte)0x55, (byte)0x97, (byte)0xE4, + (byte)0x9C, (byte)0x41, (byte)0x92, (byte)0x5C, + (byte)0x96, (byte)0xFA, (byte)0xFB, (byte)0x66, + (byte)0x8E, (byte)0x65, (byte)0x98, (byte)0x49, + (byte)0xFB, (byte)0xA8, (byte)0x98, (byte)0x42, + (byte)0x9C, (byte)0x7A, (byte)0x97, (byte)0xFB, + (byte)0x90, (byte)0xCA, (byte)0x9C, (byte)0x5B, + (byte)0x97, (byte)0x4D, (byte)0x8E, (byte)0xD3, + (byte)0x95, (byte)0x61, (byte)0x9F, (byte)0x4B, + (byte)0x9F, (byte)0xB5, (byte)0x93, (byte)0xD2, + (byte)0xFD, (byte)0xAA, (byte)0x98, (byte)0x40, + (byte)0x91, (byte)0x46, (byte)0x98, (byte)0x67, + (byte)0xFA, (byte)0x5A, (byte)0xFB, (byte)0xA9, + (byte)0x98, (byte)0x41, (byte)0x8C, (byte)0xD3, + (byte)0xFC, (byte)0xFD, (byte)0xFD, (byte)0xAB, + (byte)0x91, (byte)0xBD, (byte)0x8F, (byte)0x4C, + (byte)0x96, (byte)0xC9, (byte)0x8F, (byte)0x55, + (byte)0xFB, (byte)0xAE, (byte)0x95, (byte)0x6F, + (byte)0x9C, (byte)0x7D, (byte)0xA0, (byte)0xF0, + (byte)0x94, (byte)0x6F, (byte)0xFD, (byte)0xAC, + (byte)0x96, (byte)0xCB, (byte)0x96, (byte)0xCE, + (byte)0xA0, (byte)0x56, (byte)0x9C, (byte)0xE1, + (byte)0x96, (byte)0xC4, (byte)0x8F, (byte)0x5E, + (byte)0x8F, (byte)0x6C, (byte)0x8E, (byte)0xA3, + (byte)0xFB, (byte)0xB3, (byte)0xFC, (byte)0x53, + (byte)0xFD, (byte)0xB3, (byte)0x8F, (byte)0x6B, + (byte)0x96, (byte)0xCA, (byte)0x8F, (byte)0x79, + (byte)0x9E, (byte)0x6F, (byte)0xA0, (byte)0xC5, + (byte)0xFC, (byte)0x78, (byte)0x8E, (byte)0x42, + (byte)0x8F, (byte)0x5A, (byte)0x90, (byte)0xC2, + (byte)0x8E, (byte)0xA5, (byte)0x90, (byte)0x61, + (byte)0x92, (byte)0x4F, (byte)0x93, (byte)0x73, + (byte)0xFD, (byte)0xB5, (byte)0xFE, (byte)0xCC, + (byte)0xFB, (byte)0xBD, (byte)0x8C, (byte)0xD6, + (byte)0x98, (byte)0x43, (byte)0x96, (byte)0xC5, + (byte)0x89, (byte)0xBC, (byte)0x9C, (byte)0xA3, + (byte)0x92, (byte)0x4B, (byte)0x98, (byte)0x4A, + (byte)0x8F, (byte)0xA4, (byte)0xA0, (byte)0xF1, + (byte)0x9E, (byte)0xFB, (byte)0x9C, (byte)0xD2, + (byte)0x8F, (byte)0xA7, (byte)0xFC, (byte)0x5C, + (byte)0x98, (byte)0x45, (byte)0x90, (byte)0x46, + (byte)0x8C, (byte)0xD1, (byte)0xFE, (byte)0xFA, + (byte)0x95, (byte)0x60, (byte)0x9F, (byte)0x48, + (byte)0x92, (byte)0x47, (byte)0x90, (byte)0xFB, + (byte)0x9C, (byte)0xA4, (byte)0x95, (byte)0x71, + (byte)0x9C, (byte)0xA6, (byte)0x9C, (byte)0xA7, + (byte)0x9C, (byte)0xAA, (byte)0x9E, (byte)0xD3, + (byte)0x9E, (byte)0x70, (byte)0x9C, (byte)0xAC, + (byte)0x8F, (byte)0xAE, (byte)0x95, (byte)0x7D, + (byte)0x9C, (byte)0xB0, (byte)0x97, (byte)0xB6, + (byte)0xA0, (byte)0xBD, (byte)0x8A, (byte)0xDF, + (byte)0x9E, (byte)0xAA, (byte)0x8F, (byte)0xBD, + (byte)0x8F, (byte)0xBF, (byte)0x93, (byte)0x69, + (byte)0x9B, (byte)0xA7, (byte)0xC8, (byte)0xA4, + (byte)0xFE, (byte)0xEA, (byte)0x9B, (byte)0xE1, + (byte)0x8B, (byte)0x41, (byte)0x9D, (byte)0xB6, + (byte)0xA0, (byte)0xEB, (byte)0x9B, (byte)0xA3, + (byte)0x8B, (byte)0xA1, (byte)0x8F, (byte)0xC8, + (byte)0x89, (byte)0x4C, (byte)0x98, (byte)0x60, + (byte)0x94, (byte)0xC7, (byte)0x8B, (byte)0x58, + (byte)0x95, (byte)0xAB, (byte)0x95, (byte)0xAA, + (byte)0x9C, (byte)0xC3, (byte)0x9C, (byte)0xC4, + (byte)0x93, (byte)0xD6, (byte)0x9D, (byte)0xAC, + (byte)0x8B, (byte)0xE6, (byte)0x8A, (byte)0x71, + (byte)0x8F, (byte)0xD1, (byte)0x99, (byte)0xD5, + (byte)0x90, (byte)0xF4, (byte)0x8A, (byte)0xA3, + (byte)0x9C, (byte)0xCE, (byte)0x9C, (byte)0xD4, + (byte)0x9C, (byte)0xD5, (byte)0xFB, (byte)0xC8, + (byte)0x9D, (byte)0xB3, (byte)0xFC, (byte)0x70, + (byte)0x8F, (byte)0xD7, (byte)0x9B, (byte)0x73, + (byte)0xFA, (byte)0x5B, (byte)0x8F, (byte)0xD2, + (byte)0x90, (byte)0x64, (byte)0x98, (byte)0xB6, + (byte)0x96, (byte)0x68, (byte)0x9C, (byte)0xD6, + (byte)0x98, (byte)0xBD, (byte)0x8F, (byte)0xDC, + (byte)0xFE, (byte)0xF6, (byte)0x8F, (byte)0xD9, + (byte)0x95, (byte)0x41, (byte)0x97, (byte)0xF3, + (byte)0x9B, (byte)0xF8, (byte)0x9E, (byte)0x6C, + (byte)0x8F, (byte)0xF2, (byte)0x8F, (byte)0xEE, + (byte)0x9C, (byte)0xD7, (byte)0x9E, (byte)0x6E, + (byte)0x8A, (byte)0x40, (byte)0x8F, (byte)0xEF, + (byte)0x8F, (byte)0xF4, (byte)0x8F, (byte)0xF5, + (byte)0x95, (byte)0xC2, (byte)0x98, (byte)0x6A, + (byte)0x97, (byte)0xCF, (byte)0x9E, (byte)0x7C, + (byte)0x90, (byte)0x41, (byte)0x9C, (byte)0xDB, + (byte)0x94, (byte)0x41, (byte)0x9C, (byte)0xE6, + (byte)0x9D, (byte)0xB0, (byte)0x9C, (byte)0xEA, + (byte)0x9C, (byte)0xED, (byte)0x9C, (byte)0xFA, + (byte)0x8B, (byte)0x62, (byte)0x8A, (byte)0x4E, + (byte)0x9C, (byte)0xCA, (byte)0x8A, (byte)0x66, + (byte)0x9C, (byte)0xFB, (byte)0x9C, (byte)0xFC, + (byte)0x9C, (byte)0xFE, (byte)0x8A, (byte)0x53, + (byte)0x9C, (byte)0xE5, (byte)0x9D, (byte)0x40, + (byte)0x9D, (byte)0x41, (byte)0x90, (byte)0x45, + (byte)0x8B, (byte)0x73, (byte)0x97, (byte)0xCA, + (byte)0x9D, (byte)0x42, (byte)0x8A, (byte)0x61, + (byte)0x8B, (byte)0xAE, (byte)0x8A, (byte)0xD2, + (byte)0x8B, (byte)0xA2, (byte)0x9D, (byte)0xF2, + (byte)0x9D, (byte)0x43, (byte)0x9C, (byte)0xDF, + (byte)0x9D, (byte)0x44, (byte)0x8E, (byte)0xCA, + (byte)0x90, (byte)0x4E, (byte)0x8E, (byte)0xB3, + (byte)0x9F, (byte)0xF5, (byte)0x9D, (byte)0x45, + (byte)0x90, (byte)0x4F, (byte)0x9D, (byte)0x47, + (byte)0x89, (byte)0xCA, (byte)0x9C, (byte)0xB5, + (byte)0xFB, (byte)0xFE, (byte)0x90, (byte)0x5E, + (byte)0x90, (byte)0x63, (byte)0x90, (byte)0x57, + (byte)0x90, (byte)0x66, (byte)0x9B, (byte)0xC0, + (byte)0xFC, (byte)0xE5, (byte)0x91, (byte)0x62, + (byte)0x90, (byte)0x67, (byte)0x8F, (byte)0xA1, + (byte)0x8F, (byte)0xA2, (byte)0x9D, (byte)0x48, + (byte)0xFA, (byte)0xD3, (byte)0x90, (byte)0x5D, + (byte)0x90, (byte)0xB9, (byte)0x90, (byte)0x6B, + (byte)0x8C, (byte)0x5C, (byte)0x90, (byte)0x69, + (byte)0xFE, (byte)0x57, (byte)0xFE, (byte)0x55, + (byte)0x90, (byte)0x73, (byte)0x9B, (byte)0xEF, + (byte)0x9C, (byte)0xF0, (byte)0x9D, (byte)0x4B, + (byte)0xFE, (byte)0xD9, (byte)0xFE, (byte)0xDA, + (byte)0x91, (byte)0xE0, (byte)0x91, (byte)0xD8, + (byte)0x96, (byte)0x46, (byte)0x93, (byte)0x60, + (byte)0xFA, (byte)0x53, (byte)0x9C, (byte)0xD3, + (byte)0x9D, (byte)0x4E, (byte)0xFB, (byte)0x40, + (byte)0x8D, (byte)0xE2, (byte)0x94, (byte)0x42, + (byte)0x90, (byte)0x56, (byte)0x98, (byte)0x65, + (byte)0x8C, (byte)0x6C, (byte)0xFA, (byte)0x4A, + (byte)0x9D, (byte)0x50, (byte)0x9D, (byte)0x52, + (byte)0x95, (byte)0xAF, (byte)0x97, (byte)0x5A, + (byte)0x93, (byte)0x49, (byte)0x97, (byte)0x47, + (byte)0xA0, (byte)0xF4, (byte)0x97, (byte)0x78, + (byte)0x8F, (byte)0xCF, (byte)0xFC, (byte)0x60, + (byte)0x8C, (byte)0x4E, (byte)0xFC, (byte)0x56, + (byte)0x91, (byte)0xDC, (byte)0x96, (byte)0x61, + (byte)0x92, (byte)0xEC, (byte)0x93, (byte)0x5D, + (byte)0x8E, (byte)0xDE, (byte)0x96, (byte)0xFE, + (byte)0xFD, (byte)0x4F, (byte)0x95, (byte)0xDE, + (byte)0x98, (byte)0xB0, (byte)0xA0, (byte)0x40, + (byte)0x97, (byte)0xBD, (byte)0x97, (byte)0x7D, + (byte)0x97, (byte)0xF5, (byte)0x9B, (byte)0xAC, + (byte)0xFA, (byte)0xDA, (byte)0x92, (byte)0xC2, + (byte)0x97, (byte)0xB1, (byte)0x90, (byte)0x7B, + (byte)0x93, (byte)0xFE, (byte)0x94, (byte)0x7B, + (byte)0x97, (byte)0x77, (byte)0xFA, (byte)0xBE, + (byte)0xFD, (byte)0x43, (byte)0x90, (byte)0xC6, + (byte)0x90, (byte)0xA4, (byte)0x90, (byte)0xA8, + (byte)0x94, (byte)0xA9, (byte)0x90, (byte)0xA9, + (byte)0x8C, (byte)0x65, (byte)0x95, (byte)0xE0, + (byte)0x90, (byte)0x7D, (byte)0x92, (byte)0x65, + (byte)0xFD, (byte)0xBA, (byte)0x93, (byte)0xC4, + (byte)0xFE, (byte)0xED, (byte)0x9D, (byte)0xAB, + (byte)0xA0, (byte)0xE3, (byte)0x96, (byte)0x48, + (byte)0x9D, (byte)0x53, (byte)0x8A, (byte)0xA9, + (byte)0x9B, (byte)0xC5, (byte)0x96, (byte)0x5D, + (byte)0x97, (byte)0x5F, (byte)0x96, (byte)0x5F, + (byte)0x96, (byte)0x6E, (byte)0xFB, (byte)0x5D, + (byte)0x9D, (byte)0xB1, (byte)0xFE, (byte)0xA3, + (byte)0x9D, (byte)0xB2, (byte)0x95, (byte)0xAE, + (byte)0xFC, (byte)0xA3, (byte)0xA0, (byte)0xA2, + (byte)0x96, (byte)0x55, (byte)0x9D, (byte)0x54, + (byte)0x93, (byte)0x41, (byte)0x95, (byte)0xAD, + (byte)0x91, (byte)0xD5, (byte)0x97, (byte)0x7A, + (byte)0xFD, (byte)0xFC, (byte)0x8E, (byte)0x47, + (byte)0x93, (byte)0xFD, (byte)0x90, (byte)0xA5, + (byte)0x90, (byte)0xAC, (byte)0x95, (byte)0xAC, + (byte)0x90, (byte)0xAE, (byte)0xFE, (byte)0xA5, + (byte)0x9D, (byte)0x56, (byte)0x97, (byte)0xE3, + (byte)0x95, (byte)0xE2, (byte)0x94, (byte)0x66, + (byte)0x96, (byte)0x47, (byte)0x91, (byte)0xB8, + (byte)0x9C, (byte)0xEC, (byte)0x90, (byte)0xAD, + (byte)0x95, (byte)0xE3, (byte)0x8B, (byte)0x4F, + (byte)0x8A, (byte)0xE3, (byte)0x8B, (byte)0x4D, + (byte)0x95, (byte)0xEA, (byte)0x8B, (byte)0x4E, + (byte)0x8C, (byte)0xC1, (byte)0x8B, (byte)0xED, + (byte)0x91, (byte)0xD9, (byte)0xA0, (byte)0xA4, + (byte)0x95, (byte)0xF5, (byte)0x95, (byte)0xF4, + (byte)0x9F, (byte)0xB3, (byte)0xFE, (byte)0xAF, + (byte)0xFE, (byte)0x72, (byte)0x92, (byte)0x7A, + (byte)0xFE, (byte)0xAC, (byte)0x95, (byte)0xF3, + (byte)0x9D, (byte)0x58, (byte)0x93, (byte)0x72, + (byte)0x91, (byte)0xC5, (byte)0x96, (byte)0x42, + (byte)0x90, (byte)0xCD, (byte)0x95, (byte)0xFE, + (byte)0x91, (byte)0x59, (byte)0x9C, (byte)0x65, + (byte)0x97, (byte)0xCC, (byte)0x90, (byte)0xCE, + (byte)0x9D, (byte)0x59, (byte)0xFC, (byte)0xF5, + (byte)0xFE, (byte)0xFD, (byte)0x9D, (byte)0x5B, + (byte)0x9D, (byte)0x5C, (byte)0x93, (byte)0x7E, + (byte)0x98, (byte)0xAC, (byte)0x9D, (byte)0x5E, + (byte)0xFD, (byte)0xD0, (byte)0xFD, (byte)0x60, + (byte)0x9C, (byte)0xCF, (byte)0x90, (byte)0xDD, + (byte)0x90, (byte)0xE0, (byte)0x90, (byte)0xF3, + (byte)0x98, (byte)0xB1, (byte)0x90, (byte)0xF0, + (byte)0x93, (byte)0xBD, (byte)0x95, (byte)0xB7, + (byte)0x9F, (byte)0x46, (byte)0x8E, (byte)0x4B, + (byte)0x96, (byte)0x58, (byte)0x8A, (byte)0x4C, + (byte)0x9D, (byte)0x63, (byte)0x9E, (byte)0xCF, + (byte)0x9D, (byte)0x65, (byte)0x9D, (byte)0x66, + (byte)0x96, (byte)0x5A, (byte)0x9D, (byte)0x64, + (byte)0x8A, (byte)0x6C, (byte)0x8A, (byte)0xD9, + (byte)0x9D, (byte)0x67, (byte)0x8A, (byte)0x70, + (byte)0x8B, (byte)0xF3, (byte)0x91, (byte)0x50, + (byte)0x9C, (byte)0xC1, (byte)0x9D, (byte)0x68, + (byte)0x93, (byte)0xA7, (byte)0x96, (byte)0x74, + (byte)0xA0, (byte)0xEF, (byte)0x91, (byte)0x51, + (byte)0x96, (byte)0xC1, (byte)0x8C, (byte)0x64, + (byte)0x96, (byte)0x76, (byte)0x9D, (byte)0x69, + (byte)0xFC, (byte)0xA4, (byte)0x9D, (byte)0x6A, + (byte)0x92, (byte)0x4E, (byte)0x9D, (byte)0x6B, + (byte)0x9B, (byte)0xC1, (byte)0x9D, (byte)0x6C, + (byte)0x8A, (byte)0x65, (byte)0x91, (byte)0x5D, + (byte)0x9D, (byte)0x6D, (byte)0x91, (byte)0x5A, + (byte)0x8C, (byte)0x42, (byte)0x9C, (byte)0xC0, + (byte)0x91, (byte)0x6A, (byte)0x9D, (byte)0x6E, + (byte)0x9E, (byte)0xA6, (byte)0x9D, (byte)0xCD, + (byte)0x9D, (byte)0x6F, (byte)0x89, (byte)0xBB, + (byte)0x9E, (byte)0xF9, (byte)0x96, (byte)0xB4, + (byte)0x91, (byte)0x72, (byte)0x9E, (byte)0xC8, + (byte)0x8B, (byte)0x55, (byte)0x9D, (byte)0x71, + (byte)0x9D, (byte)0x72, (byte)0x9E, (byte)0xCC, + (byte)0x91, (byte)0x74, (byte)0x9E, (byte)0xD0, + (byte)0x90, (byte)0x5C, (byte)0x8E, (byte)0xD2, + (byte)0x91, (byte)0xA8, (byte)0x91, (byte)0x77, + (byte)0x96, (byte)0xBF, (byte)0x96, (byte)0xC0, + (byte)0x8F, (byte)0xB1, (byte)0x96, (byte)0xB7, + (byte)0x8C, (byte)0x55, (byte)0x91, (byte)0x78, + (byte)0x89, (byte)0xBE, (byte)0x91, (byte)0x7C, + (byte)0xFB, (byte)0x77, (byte)0x91, (byte)0x75, + (byte)0x91, (byte)0xA3, (byte)0x91, (byte)0x76, + (byte)0x96, (byte)0xBE, (byte)0x91, (byte)0x79, + (byte)0x96, (byte)0xB6, (byte)0x91, (byte)0xA4, + (byte)0x91, (byte)0xA6, (byte)0x9D, (byte)0x75, + (byte)0x90, (byte)0x52, (byte)0xA0, (byte)0x45, + (byte)0x91, (byte)0xA9, (byte)0x98, (byte)0xAA, + (byte)0x8C, (byte)0x5F, (byte)0x8B, (byte)0xAA, + (byte)0x9C, (byte)0xDD, (byte)0x9D, (byte)0x77, + (byte)0x89, (byte)0x40, (byte)0x9E, (byte)0xEC, + (byte)0x93, (byte)0xAA, (byte)0x94, (byte)0x78, + (byte)0x9D, (byte)0x7A, (byte)0x8A, (byte)0xC9, + (byte)0x8B, (byte)0x4B, (byte)0x9F, (byte)0xEC, + (byte)0x8A, (byte)0xE2, (byte)0x9E, (byte)0x75, + (byte)0x98, (byte)0x74, (byte)0x9A, (byte)0xC8, + (byte)0xA0, (byte)0x47, (byte)0x8B, (byte)0xC3, + (byte)0xFC, (byte)0x48, (byte)0xFC, (byte)0x77, + (byte)0x9C, (byte)0x52, (byte)0x8E, (byte)0xFD, + (byte)0x8F, (byte)0xA8, (byte)0x95, (byte)0x7A, + (byte)0x8F, (byte)0xF0 }; + + + /* + * Tests the roundtrip integrity and expected encoding + * correctness for a String containing the 1651 surrogate + * pairs equivalent to 1651 supplementary characters whose + * mappings are covered by HKSCS (2001) + */ + + public static void main(String[] args) throws Exception { + char[] surrogatePair = new char[2]; + + for (int i=0, j=0 ; j < expectBytes.length ; i++, j+=2) { + surrogatePair[0] = (char) ((suppValues[i] - 0x10000) / 0x400 + 0xd800); + surrogatePair[1] = (char) ((suppValues[i] - 0x10000) % 0x400 + 0xdc00); + String testStr = new String(surrogatePair); + byte[] encodedBytes = testStr.getBytes("Big5-HKSCS"); + + if (encodedBytes[0] != expectBytes[j] + && encodedBytes[1] != expectBytes[j+1]) + throw new Exception("HKSCS Surrogate Encoder error"); + + String decoded = new String(encodedBytes, "Big5-HKSCS"); + + if (!decoded.equals(testStr)) { + throw new Exception("HKSCS Decoder error"); + } + } + } +} diff --git a/jdk/test/sun/nio/cs/Test4200310.sh b/jdk/test/sun/nio/cs/Test4200310.sh new file mode 100644 index 00000000000..cc38a66da6e --- /dev/null +++ b/jdk/test/sun/nio/cs/Test4200310.sh @@ -0,0 +1,41 @@ +# +# Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, +# CA 95054 USA or visit www.sun.com if you need additional information or +# have any questions. +# +# @test +# @bug 4200310 +# @summary make sure class files are not duplicated between rt.jar, +# charsets.jar, and localedata.jar +# @author Norbert Lindenberg +# @run shell Test4200310.sh + +2>1 $TESTJAVA/bin/jar -tf "$TESTJAVA/jre/lib/rt.jar" > class-list +2>1 $TESTJAVA/bin/jar -tf "$TESTJAVA/jre/lib/charsets.jar" >> class-list +2>1 $TESTJAVA/bin/jar -tf "$TESTJAVA/jre/lib/ext/localedata.jar" >> class-list +duplicates=`grep '\.class$' class-list | sort | uniq -d` + +rm -f class-list +if [ "$duplicates" != "" ]; then + echo FAILED: $duplicates are duplicated between rt.jar, charsets.jar, and localedata.jar + exit 1 +fi + +exit 0 diff --git a/jdk/test/sun/nio/cs/Test4206507.java b/jdk/test/sun/nio/cs/Test4206507.java new file mode 100644 index 00000000000..15097d7873d --- /dev/null +++ b/jdk/test/sun/nio/cs/Test4206507.java @@ -0,0 +1,38 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 4206507 + @summary verify that we can obtain and use a converter for encoding + ISO8859-9 in the Turkish locale. + */ + +import java.util.Locale; +import java.io.UnsupportedEncodingException; + +public class Test4206507 { + public static void main(String[] args) throws UnsupportedEncodingException { + Locale.setDefault(new Locale("tr", "TR")); + byte[] b = "".getBytes("ISO8859-9"); + } +} diff --git a/jdk/test/sun/nio/cs/Test6254467.java b/jdk/test/sun/nio/cs/Test6254467.java new file mode 100644 index 00000000000..bc508574df6 --- /dev/null +++ b/jdk/test/sun/nio/cs/Test6254467.java @@ -0,0 +1,38 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 6254467 + @summary Checks if Charset.forName() accepts legal IANA alias names + for charset IBM037. + */ +import java.nio.charset.Charset; + +public class Test6254467 { + public static void main (String[] args) throws Exception { + Charset ebcdic = Charset.forName("ebcdic-cp-us"); + ebcdic = Charset.forName("ebcdic-cp-ca"); + ebcdic = Charset.forName("ebcdic-cp-wt"); + ebcdic = Charset.forName("ebcdic-cp-nl"); + } +} diff --git a/jdk/test/sun/nio/cs/Test6275027.java b/jdk/test/sun/nio/cs/Test6275027.java new file mode 100644 index 00000000000..2658b3d33ea --- /dev/null +++ b/jdk/test/sun/nio/cs/Test6275027.java @@ -0,0 +1,42 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 6275027 + @summary Check if StreamEncoder works correctly when fed with unpaired + surrogates. + */ + +import java.io.*; +public class Test6275027 { + public static void main( String arg[] ) throws Exception { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + PrintStream ps = new PrintStream(baos); + ps.print("\uda00"); + ps.print("\uda01"); + ps.close(); + if (!"??".equals(baos.toString())) + throw new Exception("failed"); + } + +} diff --git a/jdk/test/sun/nio/cs/Test6392804.java b/jdk/test/sun/nio/cs/Test6392804.java new file mode 100644 index 00000000000..d93343a0a88 --- /dev/null +++ b/jdk/test/sun/nio/cs/Test6392804.java @@ -0,0 +1,59 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + @bug 6392804 + @summary Decoder fails to detect decoding error +*/ +import java.nio.*; +import java.nio.charset.*; + +public class Test6392804 { + public static void main(String[] args) throws Throwable { + test("ISO-2022-JP", + new byte[] {0x1b,(byte)0x8e, 0x24, 0x40, 0x0, 0x0}); + test("ISO-2022-JP-2", + new byte[] {0x1b,(byte)0x8e, 0x24, 0x40, 0x0, 0x0}); + test("x-windows-50220", + new byte[] {0x1b,(byte)0x8e, 0x24, 0x40, 0x0, 0x0}); + test("x-windows-50221", + new byte[] {0x1b,(byte)0x8e, 0x24, 0x40, 0x0, 0x0}); + test("x-windows-iso2022jp", + new byte[] {0x1b,(byte)0x8e, 0x24, 0x40, 0x0, 0x0}); + test("EUC_TW", + new byte[] {(byte)0x8e, (byte)0xa8, (byte)0xad, (byte)0xe5}); + //out of range second byte + test("EUC_TW", + new byte[] {(byte)0x8e, (byte)0x92, (byte)0xa1, (byte)0xa1}); + test("EUC_TW", + new byte[] {(byte)0x8e, (byte)0x98, (byte)0xa1, (byte)0xa1}); + } + + static void test(String csn, byte[] bytes) throws Throwable { + CharsetDecoder dec = Charset.forName(csn).newDecoder(); + CharBuffer cb = CharBuffer.allocate(1024); + CoderResult cr = dec.decode(ByteBuffer.wrap(bytes), cb, true); + if (cr.isUnderflow()) + throw new RuntimeException(csn + " failed cr=" + cr); + } +} diff --git a/jdk/test/sun/nio/cs/TestCompoundTest.java b/jdk/test/sun/nio/cs/TestCompoundTest.java new file mode 100644 index 00000000000..a75f35641e7 --- /dev/null +++ b/jdk/test/sun/nio/cs/TestCompoundTest.java @@ -0,0 +1,47 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + * @bug 6427981 + * @summary Check the Compound_Text's canonical name and its aliases + */ + +import java.nio.charset.*; +import java.util.Set; + +public class TestCompoundTest { + + public static void main(String args[]) throws Exception + { + if (System.getProperty("os.name").startsWith("Windows")) + return; + Charset cs = Charset.forName("COMPOUND_TEXT"); + if (!cs.name().startsWith("x-")) + throw new RuntimeException("FAILED: name does not start with x-"); + Set aliases = cs.aliases(); + if (!aliases.contains("COMPOUND_TEXT") || + !aliases.contains("x-compound-text") || + !aliases.contains("x11-compound_text")) + throw new RuntimeException("FAILED: alias name is missing"); + } +} diff --git a/jdk/test/sun/nio/cs/TestConverterDroppedCharacters.java b/jdk/test/sun/nio/cs/TestConverterDroppedCharacters.java new file mode 100644 index 00000000000..985ca617592 --- /dev/null +++ b/jdk/test/sun/nio/cs/TestConverterDroppedCharacters.java @@ -0,0 +1,92 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 4122961 + @summary Verify that converters don't drop characters on buffer boundaries + + This is a slightly modified version of the attachment supplied with the + bug report. + */ +import java.io.*; + +public class TestConverterDroppedCharacters { + public static void main(String args[]) + throws java.io.IOException, java.io.UnsupportedEncodingException, + java.io.FileNotFoundException + { + /* Try misc. encodings, many are broken. */ + tryEncoding("Big5"); + tryEncoding("CNS11643"); + tryEncoding("Cp1006"); + tryEncoding("Cp1381"); + tryEncoding("Cp33722"); + tryEncoding("GB2312"); + tryEncoding("KSC5601"); + tryEncoding("SJIS"); + tryEncoding("UTF8"); + } + + static void tryEncoding(String encoding) + throws java.io.IOException, java.io.UnsupportedEncodingException, + java.io.FileNotFoundException + { + String filename = "OUTPUT"; + int goesBadAfter = 8193; + int i; + char data[] = new char[goesBadAfter+1]; + + System.out.println("Testing " + encoding); + + /* Create some data */ + for(i = 0; i < goesBadAfter; i++) { + data[i] = (char)((i % 0x7f) + 1); + } + + /* Write the data out to a file. */ + FileOutputStream fout = new FileOutputStream(filename); + OutputStreamWriter ow = new OutputStreamWriter(fout, encoding); + BufferedWriter fd = new BufferedWriter(ow); + fd.write(data,0,goesBadAfter); + fd.close(); + + /* Now read it back with the same encoding. */ + char buf[] = new char[goesBadAfter+1]; + FileInputStream fin = new FileInputStream("OUTPUT"); + InputStreamReader ir = new InputStreamReader(fin, encoding); + ir.read(buf,0,goesBadAfter); + ir.close(); + + /* And check to see if what we wrote is what we got back. */ + for(i = 0; i < goesBadAfter; i++) { + if (data[i] != buf[i]) { + System.out.println("ERROR with encoding " + encoding + + ": Data wrong at position " + i + " " + + "in: " + (int)data[i] + " " + + "out: " + (int)buf[i]); + throw new RuntimeException(); + } + } + System.out.println("Successfully tested " + encoding); + } +} diff --git a/jdk/test/sun/nio/cs/TestCp834_SBCS.java b/jdk/test/sun/nio/cs/TestCp834_SBCS.java new file mode 100644 index 00000000000..06c939dbb9b --- /dev/null +++ b/jdk/test/sun/nio/cs/TestCp834_SBCS.java @@ -0,0 +1,101 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 6379808 + @summary Check all Cp933 SBCS characters are not supported in Cp834 + */ + +import sun.io.*; +import java.io.*; +import java.nio.*; +import java.nio.charset.*; + +public class TestCp834_SBCS { + public static void main(String args[]) throws Exception { + // The correctness of 1:1 mapping is Coverted by CoderTest.java + // and TestConv.java, we only need to verify that SBCS characters + // are not supported by this charset. + CharToByteConverter cb834 = CharToByteConverter.getConverter("Cp834"); + ByteToCharConverter bc834 = ByteToCharConverter.getConverter("Cp834"); + CharsetEncoder enc834 = Charset.forName("Cp834") + .newEncoder() + .onUnmappableCharacter(CodingErrorAction.REPLACE) + .onMalformedInput(CodingErrorAction.REPLACE); + + CharsetDecoder dec834 = Charset.forName("Cp834") + .newDecoder() + .onUnmappableCharacter(CodingErrorAction.REPLACE) + .onMalformedInput(CodingErrorAction.REPLACE); + + CharsetDecoder dec933 = Charset.forName("Cp933") + .newDecoder() + .onUnmappableCharacter(CodingErrorAction.REPLACE) + .onMalformedInput(CodingErrorAction.REPLACE); + byte[] ba = new byte[1]; + byte[] ba2 = new byte[2]; + ByteBuffer dbb = ByteBuffer.allocateDirect(10); + char[] ca = new char[1]; + char c; + for (int i = 0; i <= 0xff; i++) { + if (i != 0xe && i != 0xf) { // no SI/SO + ba[0] = (byte)i; + CharBuffer cb = dec933.decode(ByteBuffer.wrap(ba)); + if ((c = cb.get()) != '\ufffd') { + // OK, this is a SBCS character in Cp933 + if (dec834.decode(ByteBuffer.wrap(ba)).get() != '\ufffd') + throw new Exception("SBCS is supported in IBM834 decoder"); + + if (enc834.canEncode(c)) + throw new Exception("SBCS can be encoded in IBM834 encoder"); + + ca[0] = c; + ByteBuffer bb = enc834.encode(CharBuffer.wrap(ca)); + if (bb.get() != (byte)0xfe || bb.get() != (byte)0xfe) + throw new Exception("SBCS is supported in IBM834 encoder"); + + boolean isMalformed = false; + int ret = 0; + bc834.reset(); + try { + ret = bc834.convert(ba, 0, 1, ca, 0, 1); + } catch (sun.io.MalformedInputException x) { isMalformed = true; } + if (!isMalformed && ret != 0 && ca[0] != '\ufffd') { + // three scenarios (1)malformed (2)held as an incomplete + // input or (3)return replacement all mean "no sbcs" + throw new Exception("SBCS is supported in Cp834 b2c"); + } + + if (cb834.canConvert(c)) + throw new Exception("SBCS can be converted in Cp834 c2b "); + + ca[0] = c; + if (cb834.convert(ca, 0, 1, ba2, 0, 2) != 2 || + ba2[0] != (byte)0xfe || ba2[1] != (byte)0xfe) { + throw new Exception("SBCS is supported in Cp834 c2b"); + } + } + } + } + } +} diff --git a/jdk/test/sun/nio/cs/TestCp93xSISO.java b/jdk/test/sun/nio/cs/TestCp93xSISO.java new file mode 100644 index 00000000000..4a9de28da52 --- /dev/null +++ b/jdk/test/sun/nio/cs/TestCp93xSISO.java @@ -0,0 +1,52 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 4429358 + @summary Remove illegal SI/SO char to byte mappings + */ + +public class TestCp93xSISO { + public static void main ( String[] args) throws Exception { + int exceptionCount = 0; + String[] encName = {"Cp930", "Cp933", "Cp935", "Cp937", "Cp939" }; + + String s = "\u000e\u000f" ; + + for ( int i=0; i < encName.length; i++) { // Test 2 converters. + try { + byte[] encoded = s.getBytes(encName[i]); + for (int j=0 ; j 0) + throw new Exception ("bug4429369: Cp93x SI/SO Ch->Byte mappings incorrect"); + } +} diff --git a/jdk/test/sun/nio/cs/TestIBMBugs.java b/jdk/test/sun/nio/cs/TestIBMBugs.java new file mode 100644 index 00000000000..dcca1ed887b --- /dev/null +++ b/jdk/test/sun/nio/cs/TestIBMBugs.java @@ -0,0 +1,146 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 6371437 6371422 6371416 6371619 5058184 6371431 + @summary Check if the problems reported in above bugs have been fixed + */ + +import java.io.*; +import java.nio.*; +import java.nio.charset.*; + +public class TestIBMBugs { + + private static void bug6371437() throws Exception { + CharsetEncoder converter = Charset.forName("Cp933").newEncoder(); + converter = converter.onMalformedInput(CodingErrorAction.REPORT); + converter = converter.onUnmappableCharacter(CodingErrorAction.REPORT); + CharBuffer in = CharBuffer.wrap(new char[] { (char)4352 }); + try { + ByteBuffer out = converter.encode(in); + } catch (CharacterCodingException e) { } + } + + private static void bug6371422() throws Exception { + String[] charsets = { "Cp949", "Cp949C" }; + for (int n = 0; n < charsets.length; n++) { + String charset = charsets[n]; + CharsetEncoder converter = Charset.forName(charset).newEncoder(); + converter = converter.onMalformedInput(CodingErrorAction.REPORT); + converter = converter.onUnmappableCharacter(CodingErrorAction.REPORT); + int errors = 0; + for (int i = 1; i < 0x1ffff; i++) { + if (i >= 0x1100 && i <= 0x11f9) + continue; //Dont try leading consonant, vowel and trailing + //consonant as a single char + char[] in = (i < 0x10000 + ? new char[] { (char)i } + : new char[] { (char)(0xd800 + ((i - 0x10000) >> 10)), + (char)(0xdc00 + ((i - 0x10000) & 0x3ff)) }); + + try { + ByteBuffer out = converter.encode(CharBuffer.wrap(in)); + if (out.remaining() == 0 || + (out.remaining() == 1 && out.get(0) == 0x00)) { + errors++; + } + } catch (CharacterCodingException e) { } + } + if (errors > 0) + throw new Exception("Charset "+charset+": "+errors+" errors"); + } + } + + private static void bug6371416() throws Exception { + String[] charsets = { "Cp933", "Cp949", "Cp949C", "Cp970"}; + for (int n = 0; n < charsets.length; n++) { + String charset = charsets[n]; + CharsetEncoder converter = Charset.forName(charset).newEncoder(); + converter = converter.onMalformedInput(CodingErrorAction.REPORT); + converter = converter.onUnmappableCharacter(CodingErrorAction.REPORT); + int errors = 0; + for (int i = 0xd800; i < 0xe000; i++) { + char[] in = new char[] { (char)i }; + try { + ByteBuffer out = converter.encode(CharBuffer.wrap(in)); + if (out.remaining() == 0) + errors++; + } catch (CharacterCodingException e) { } + } + if (errors > 0) + throw new Exception("Charset "+charset+": "+errors+" errors"); + } + } + + private static void bug6371619() throws Exception { + String encoding = "Cp964"; + Charset charset = Charset.forName(encoding); + CharsetDecoder converter = charset.newDecoder(); + converter = converter.onMalformedInput(CodingErrorAction.REPORT); + converter = converter.onUnmappableCharacter(CodingErrorAction.REPORT); + int errors = 0; + for (int b = 0x80; b < 0x100; b++) + if (!(b == 0x8e || // 0x8e is a SS2 + (b >= 0x80 && b <= 0x8d) || (b >= 0x90 && b <= 0x9f))) { + ByteBuffer in = ByteBuffer.wrap(new byte[] { (byte)b }); + try { + CharBuffer out = converter.decode(in); + if (out.length() == 0) { + errors++; + } + } catch (CharacterCodingException e) { } + } + if (errors > 0) + throw new Exception("Charset "+charset+": "+errors+" errors"); + } + + + private static void bug6371431() throws Exception { + String encoding = "Cp33722"; + Charset charset = Charset.forName(encoding); + CharsetDecoder converter = charset.newDecoder(); + converter = converter.onMalformedInput(CodingErrorAction.REPORT); + converter = converter.onUnmappableCharacter(CodingErrorAction.REPORT); + int errors = 0; + for (int b = 0xa0; b < 0x100; b++) { + ByteBuffer in = ByteBuffer.wrap(new byte[] { (byte)b }); + try { + CharBuffer out = converter.decode(in); + if (out.length() == 0) { + errors++; + } + } catch (CharacterCodingException e) { } + } + if (errors > 0) + throw new Exception("Charset "+charset+": "+errors+" errors"); + } + + public static void main (String[] args) throws Exception { + bug6371437(); + bug6371422(); + bug6371416(); + bug6371619(); + bug6371431(); + } +} diff --git a/jdk/test/sun/nio/cs/TestISCII91.java b/jdk/test/sun/nio/cs/TestISCII91.java new file mode 100644 index 00000000000..01b05bafddc --- /dev/null +++ b/jdk/test/sun/nio/cs/TestISCII91.java @@ -0,0 +1,71 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 6431650 + @summary Check charset ISCII91 and C2B/B2CISCII91 yield same encoding/decoding result + */ + + +import java.nio.*; +import java.nio.charset.*; +import sun.io.*; + +public class TestISCII91 { + public static void main(String[] args) throws Throwable{ + CharToByteConverter c2b = new CharToByteISCII91(); + ByteToCharConverter b2c = new ByteToCharISCII91(); + Charset cs = Charset.forName("ISCII91"); + String charsToEncode = getCharsForEncoding("ISCII91"); + + byte [] c2bBytes = c2b.convertAll(charsToEncode.toCharArray()); + byte [] csBytes = cs.encode(charsToEncode).array(); + for (int i = 0; i < c2bBytes.length; ++i) { + if (c2bBytes[i] != csBytes[i]) + throw new RuntimeException("ISCII91 encoding failed!"); + } + + char[] c2bChars = b2c.convertAll(c2bBytes); + char[] csChars = cs.decode(ByteBuffer.wrap(csBytes)).array(); + for (int i = 0; i < c2bChars.length; ++i) { + if (c2bChars[i] != csChars[i]) + throw new RuntimeException("ISCII91 decoding failed!"); + } + } + + + static String getCharsForEncoding(String encodingName) + throws CharacterCodingException{ + Charset set = Charset.forName(encodingName); + CharBuffer chars = CharBuffer.allocate(300); + CharsetEncoder encoder = set.newEncoder(); + for (int c = 0; chars.remaining() > 0 && c < Character.MAX_VALUE; ++c) { + if (Character.isDefined((char) c) && !Character.isISOControl((char) c) && encoder.canEncode((char) c)) { + chars.put((char) c); + } + } + chars.limit(chars.position()); + chars.rewind(); + return chars.toString(); + } +} diff --git a/jdk/test/sun/nio/cs/TestISO2022CNDecoder.java b/jdk/test/sun/nio/cs/TestISO2022CNDecoder.java new file mode 100644 index 00000000000..f27ba85ff93 --- /dev/null +++ b/jdk/test/sun/nio/cs/TestISO2022CNDecoder.java @@ -0,0 +1,440 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 4779029 4924625 6392664 + @summary Test decoding of various permutations of valid ISO-2022-CN byte sequences + */ + +/* + * Regression test for NIO ISO-2022-CN decoder. Passes various valid + * ISO-2022-CN byte sequences to the decoder using the java.io + * InputStreamReader API + */ + +import java.io.*; +import java.nio.*; +import java.nio.charset.*; + +public class TestISO2022CNDecoder +{ + private static String encodingName = "ISO2022CN"; + + // + // Positive tests -- test both output and input processing against + // various "known good" data + // + private static boolean decodeTest ( + byte encoded[], + char decoded[], + String label) + { + boolean retval = true; + int i = 0; + + try { + // + // Ensure that reading decodes correctly + // + ByteArrayInputStream in; + InputStreamReader reader; + + in = new ByteArrayInputStream(encoded); + reader = new InputStreamReader(in, encodingName); + + for (i = 0; i < decoded.length; i++) { + int c = reader.read(); + + if (c != decoded[i]) { + System.err.print(label + ": read failed, char " + i); + System.err.print(" ... expected 0x" + + Integer.toHexString(decoded[i])); + if (c == -1) + System.err.println(", got EOF"); + else + System.err.println(", got 0x" + + Integer.toHexString(c)); + retval = false; + if (c == -1) + return retval; + } + } + + int testChar; + if ((testChar = reader.read()) != -1) { + System.err.println(label + ": read failed, no EOF"); + System.err.println("testChar is " + + Integer.toHexString((int)testChar)); + return false; + } + String decodedString = new String(encoded, "ISO2022CN"); + + for (i = 0; i < decodedString.length(); i++) { + if (decodedString.charAt(i) != decoded[i]) + System.err.println(label + ": read failed, char " + i); + } + + CharsetDecoder dec = Charset.forName("ISO2022CN") + .newDecoder() + .onUnmappableCharacter(CodingErrorAction.REPLACE) + .onMalformedInput(CodingErrorAction.REPLACE); + ByteBuffer bb = ByteBuffer.allocateDirect(encoded.length).put(encoded); + bb.flip(); + CharBuffer cb = ByteBuffer.allocateDirect(2*encoded.length*(int)dec.maxCharsPerByte()) + .asCharBuffer(); + if (bb.hasArray() || cb.hasArray()) { + System.err.println(label + ": directBuffer failed, "); + return false; + } + if (!dec.decode(bb, cb, true).isUnderflow()) { + System.err.println(label + ": decoder's decode() failed!"); + return false; + } + cb.flip(); + for (i = 0; i < cb.limit(); i++) { + if (cb.get() != decoded[i]) + System.err.println(label + ": decoder failed, char " + i); + } + + } catch (Exception e) { + System.err.println(label + ": failed " + + "(i = " + i + "), " + + e.getClass().getName() + + ", " + e.getMessage()); + e.printStackTrace(); + return false; + } + return retval; + } + + private static boolean equal(CoderResult a, CoderResult b) { + return (a == CoderResult.OVERFLOW && b == CoderResult.OVERFLOW) || + (a == CoderResult.UNDERFLOW && b == CoderResult.UNDERFLOW) || + ((a.isError() == b.isError()) && + (a.isMalformed() == b.isMalformed()) && + (a.isUnmappable() == b.isUnmappable()) && + (a.length() == b.length())); + } + + private static boolean decodeResultTest (byte encoded[], + CoderResult expected, + String label) { + CharsetDecoder dec = Charset.forName("ISO2022CN").newDecoder(); + ByteBuffer bb = ByteBuffer.wrap(encoded); + CharBuffer cb = CharBuffer.allocate(encoded.length*(int)dec.maxCharsPerByte()); + CoderResult result = dec.decode(bb, cb, true); + if (!equal(result, expected)) { + System.err.println(label + ": decoder's decode() failed!"); + return false; + } + + bb = ByteBuffer.allocateDirect(encoded.length).put(encoded); + bb.flip(); + cb = ByteBuffer.allocateDirect(2*encoded.length*(int)dec.maxCharsPerByte()) + .asCharBuffer(); + if (bb.hasArray() || cb.hasArray()) { + System.err.println(label + ": directBuffer failed, "); + return false; + } + result = dec.reset().decode(bb, cb, true); + if (!equal(result, expected)) { + System.err.println(label + ": decoder's decode() - direct failed!"); + return false; + } + return true; + } + + // + // Negative tests -- only for input processing, make sure that + // invalid or corrupt characters are rejected. + // + private static boolean negative (byte encoded [], String label) + { + try { + ByteArrayInputStream in; + InputStreamReader reader; + int c; + + in = new ByteArrayInputStream(encoded); + reader = new InputStreamReader(in, encodingName); + + c = reader.read(); + System.err.print (label + ": read failed, "); + + if (c == -1) + System.err.println("reported EOF"); + else + System.err.println("returned char 0x" + + Integer.toHexString(c) + + ", expected exception"); + return false; + + } catch (CharConversionException e) { + return true; + + } catch (Throwable t) { + System.err.println(label + ": failed, threw " + + t.getClass().getName() + + ", " + t.getMessage()); + } + return false; + } + + private static boolean decodeTest6392664 () { + try { + CharsetDecoder dec = Charset.forName("ISO-2022-CN-GB").newDecoder(); + dec.decode(ByteBuffer.wrap(new byte[] {(byte)0x0e, (byte)0x42, (byte)0x43 })); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + return true; + } + + // + // TEST #0: 7-bit unshifted values, + // shift-in of a valid decodable GB2312-80 + // character and an unmappable GB2312-80 char + // This is a positive test. + // + private static byte test0_bytes[] = { + (byte)0x00, + (byte)0x01, (byte)0x02, (byte)0x03, + (byte)0x0E, (byte)0x21, (byte)0x2f, + (byte)0x0E, (byte)0xDD, (byte)0x9f + }; + + private static char test0_chars[] = { + 0x0000, + 0x0001, 0x0002, 0x0003, + 0x2019, + 0xFFFD + }; + + private static byte test1_bytes[] = { + (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41, (byte)0x21, + (byte)0x2f }; + + private static char test1_chars[] = { + 0x21, 0x2f + }; + + private static byte test2_bytes[] = { + (byte)0x0e, + (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41, + (byte)0x21, (byte)0x2f }; + + private static char test2_chars[] = { + 0x2019 + }; + + private static byte test3_bytes[] = { + (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41, + (byte)0x0e, + (byte)0x21, (byte)0x2f }; + + private static byte test3a_bytes[] = { + (byte)0x1b, (byte)0x24, (byte)0x41, + (byte)0x0e, + (byte)0x21, (byte)0x2f }; + + private static char test3_chars[] = { + 0x2019 + }; + + private static byte test4_bytes[] = { + (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41, + (byte)0x0f, + (byte)0x21, (byte)0x2f }; + + private static char test4_chars[] = { + 0x21, 0x2f + }; + + private static byte test5_bytes[] = { + (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41, + (byte)0x0e, (byte)0x21, (byte)0x2e, + (byte)0x0f, (byte)0x21, (byte)0x2f }; + + private static char test5_chars[] = { + 0x2018, 0x21, 0x2f + }; + + private static byte test6_bytes[] = { + (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41, + (byte)0x0e, (byte)0x21, (byte)0x2e, + (byte)0x21, (byte)0x2f }; + + private static char test6_chars[] = { + 0x2018, 0x2019 + }; + + private static byte test7_bytes[] = { + (byte)0x1b, (byte)0x24, (byte)0x29, (byte)'G', + (byte)0x0e, (byte)0x21, (byte)0x2e, + (byte)0x21, (byte)0x2f }; + + private static char test7_chars[] = { + 0xFE50, 0xFE51 + }; + + private static byte test8_bytes[] = { + (byte)0x1b, (byte)0x24, (byte)0x29, (byte)'G', + (byte)0x0e, (byte)0x21, (byte)0x2e, + (byte)0x0f, (byte)0x21, (byte)0x2f }; + + private static char test8_chars[] = { + 0xFE50, 0x21, 0x2f + }; + + private static byte test9_bytes[] = { + (byte)0x1b, (byte)0x24, (byte)0x2a, (byte)'H', + (byte)0x1b, (byte)0x4e, + (byte)0x21, (byte)0x2f }; + + private static char test9_chars[] = { + 0x4e0e + }; + + /* + * Plane 3 support provided for compatibility with + * sun.io ISO2022_CN decoder. Officially ISO-2022-CN + * just handles planes 1/2 of CNS-11643 (1986) + * Test case data below verifies this compatibility + * + */ + + private static byte test10_bytes[] = { + (byte)0x1b, (byte)0x24, (byte)'+', (byte)'I', + (byte)0x1b, (byte)0x4f, + (byte)0x21, (byte)0x2f }; + + private static char test10_chars[] = { + 0x51e2 + }; + + private static byte test11_bytes[] = { + (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41, //SO Designator + (byte)0x0e, //SO + (byte)0x21, (byte)0x2e, //GB2312 char + (byte)0x1b, (byte)0x24, (byte)0x2a, (byte)'H', //SS2 Designator + (byte)0x1b, (byte)0x4e, //SS2 + (byte)0x21, (byte)0x2f, //CNS-P2 char + (byte)0x21, (byte)0x2f //GB2312 char + }; + + private static char test11_chars[] = { + 0x2018, + 0x4e0e, + 0x2019 + }; + + private static byte test12_bytes[] = { + (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41, //SO Designator + (byte)0x0e, //SO + (byte)0x21, (byte)0x2e, //GB2312 char + (byte)0x1b, (byte)0x24, (byte)'+', (byte)'I', //SS3 Designator + (byte)0x1b, (byte)0x4f, //SS3 + (byte)0x21, (byte)0x2f, //CNS-P2 char + (byte)0x21, (byte)0x2f //GB2312 char + }; + + private static char test12_chars[] = { + 0x2018, + 0x51e2, + 0x2019 + }; + + + private static byte test13_bytes[] = { + (byte)0x0f0, // byte with MSB + }; + + private static char test13_chars[] = { + 0x00f0, + }; + + private static byte test14_bytes[] = { + (byte)0x0E, (byte)0x21, (byte)0x2f, + (byte)0x0E, (byte)0xDD, (byte)0x9f + }; + private static CoderResult test14_result = CoderResult.unmappableForLength(2); + + // Current ISO2022CN treats the "out of range" code points as "unmappable" + private static byte test15_bytes[] = { + (byte)0x1b, (byte)0x4f, // SS3 + (byte)0x20, (byte)0x2f, // "out of range" CNS-P2 char + }; + private static CoderResult test15_result = CoderResult.unmappableForLength(4); + + /** + * Main program to test ISO2022CN conformance + * + */ + public static void main (String argv []) throws Exception + { + boolean pass = true; + + System.out.println (""); + System.out.println ("------ checking ISO2022CN decoder -----"); + + // This regtest must be the first one. + pass &= decodeTest6392664(); + + try { + new InputStreamReader (System.in, "ISO2022CN"); + } catch (Exception e) { + encodingName = "ISO2022CN"; + System.out.println ("... requires nonstandard encoding name " + + encodingName); + pass &= false; + } + + // + // Positive tests -- good data is dealt with correctly + // + pass &= decodeTest(test0_bytes, test0_chars, "first batch"); + pass &= decodeTest(test1_bytes, test1_chars, "escapes1"); + pass &= decodeTest(test2_bytes, test2_chars, "escapes2"); + pass &= decodeTest(test3_bytes, test3_chars, "escapes3"); + pass &= decodeTest(test3a_bytes, test3_chars, "escapes3a"); + pass &= decodeTest(test4_bytes, test4_chars, "escapes4"); + pass &= decodeTest(test5_bytes, test5_chars, "escapes5"); + pass &= decodeTest(test6_bytes, test6_chars, "escapes6"); + pass &= decodeTest(test7_bytes, test7_chars, "escapes7"); + pass &= decodeTest(test8_bytes, test8_chars, "escapes8"); + pass &= decodeTest(test9_bytes, test9_chars, "escapes9"); + pass &= decodeTest(test10_bytes, test10_chars, "escapes10"); + pass &= decodeTest(test11_bytes, test11_chars, "escapes11"); + pass &= decodeTest(test12_bytes, test12_chars, "escapes12"); + pass &= decodeTest(test13_bytes, test13_chars, "escapes13"); + pass &= decodeResultTest(test14_bytes, test14_result, "escapes14"); + pass &= decodeResultTest(test15_bytes, test15_result, "escapes15"); + // PASS/FAIL status is what the whole thing is about. + // + if (! pass) { + throw new Exception("FAIL -- incorrect ISO-2022-CN"); + } + + } +} diff --git a/jdk/test/sun/nio/cs/TestISO2022JP.java b/jdk/test/sun/nio/cs/TestISO2022JP.java new file mode 100644 index 00000000000..a2f2b33bf91 --- /dev/null +++ b/jdk/test/sun/nio/cs/TestISO2022JP.java @@ -0,0 +1,612 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 4626545 4879522 4913711 4119445 + @summary Check full coverage encode/decode for ISO-2022-JP + */ + +/* + * Tests the NIO converter for J2RE >= 1.4.1 + * since the default converter used by String + * API is the NIO converter sun.nio.cs.ext.ISO2022_JP + */ + +import java.io.*; +public class TestISO2022JP { + + private final static String US_ASCII = + "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007" + + "\b\t\n\u000B\f\r" + + "\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017" + + "\u0018\u0019\u001A\u001C\u001D\u001E\u001F" + + "\u0020\u0021\"\u0023\u0024\u0025\u0026\'" + + "\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F" + + "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037" + + "\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F" + + "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047" + + "\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F" + + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057" + + "\u0058\u0059\u005A\u005B\\\u005D\u005E\u005F" + + "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067" + + "\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F" + + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077" + + "\u0078\u0079\u007A\u007B\u007C\u007D\u007E\u00A5\u203E"; + + // Subset of chars sourced from JISX0208:1983 + + private final static String JISX0208SUBSET = + "u3000\u3001\u3002\uFF0C\uFF0E\u30FB\uFF1A" + + "\uFF1B\uFF1F\uFF01\u309B\u309C\u00B4\uFF40\u00A8" + + "\uFF3E\uFFE3\uFF3F\u30FD\u30FE\u309D\u309E\u3003" + + "\u4EDD\u3005\u3006\u3007\u30FC\u2014\u2010\uFF0F" + + "\uFF3C\u301C\u2016\uFF5C\u2026\u2025\u2018\u2019" + + "\u5C05\u5C07\u5C08\u5C0D\u5C13\u5C20\u5C22\u5C28" + + "\u5C38\u5C39\u5C41\u5C46\u5C4E\u5C53\u5C50\u5C4F" + + "\u5B71\u5C6C\u5C6E\u4E62\u5C76\u5C79\u5C8C\u5C91" + + "\u5C94\u599B\u5CAB\u5CBB\u5CB6\u5CBC\u5CB7\u5CC5" + + "\u5CBE\u5CC7\u5CD9\u5CE9\u5CFD\u5CFA\u5CED\u5D8C" + + "\u5CEA\u5D0B\u5D15\u5D17\u5D5C\u5D1F\u5D1B\u5D11" + + "\u5D14\u5D22\u5D1A\u5D19\u5D18\u5D4C\u5D52\u5D4E" + + "\u5D4B\u5D6C\u5D73\u5D76\u5D87\u5D84\u5D82\u5DA2" + + "\u5D9D\u5DAC\u5DAE\u5DBD\u5D90\u5DB7\u5DBC\u5DC9" + + "\u5DCD\u5DD3\u5DD2\u5DD6\u5DDB\u5DEB\u5DF2\u5DF5" + + "\u5E0B\u5E1A\u5E19\u5E11\u5E1B\u5E36\u5E37\u5E44" + + "\u5E43\u5E40\u5E4E\u5E57\u5E54\u5E5F\u5E62\u5E64" + + "\u5E47\u5E75\u5E76\u5E7A\u9EBC\u5E7F\u5EA0\u5EC1" + + "\u5EC2\u5EC8\u5ED0\u5ECF\u5ED6\u5EE3\u5EDD\u5EDA" + + "\u5EDB\u5EE2\u5EE1\u5EE8\u5EE9\u5EEC\u5EF1\u5EF3" + + "\u5EF0\u5EF4\u5EF8\u5EFE\u5F03\u5F09\u5F5D\u5F5C" + + "\u5F0B\u5F11\u5F16\u5F29\u5F2D\u5F38\u5F41\u5F48" + + "\u5F4C\u5F4E\u5F2F\u5F51\u5F56\u5F57\u5F59\u5F61" + + "\u5F6D\u5F73\u5F77\u5F83\u5F82\u5F7F\u5F8A\u5F88" + + "\u5F91\u5F87\u5F9E\u5F99\u5F98\u5FA0\u5FA8\u5FAD" + + "\u5FBC\u5FD6\u5FFB\u5FE4\u5FF8\u5FF1\u5FDD\u60B3" + + "\u5FFF\u6021\u6060\u6019\u6010\u6029\u600E\u6031" + + "\u62EE\u62F1\u6327\u6302\u6308\u62EF\u62F5\u6350" + + "\u633E\u634D\u641C\u634F\u6396\u638E\u6380\u63AB" + + "\u6376\u63A3\u638F\u6389\u639F\u63B5\u636B\u6369" + + "\u63BE\u63E9\u63C0\u63C6\u63E3\u63C9\u63D2\u63F6" + + "\u63C4\u6416\u6434\u6406\u6413\u6426\u6436\u651D" + + "\u6417\u6428\u640F\u6467\u646F\u6476\u644E\u652A" + + "\u6495\u6493\u64A5\u64A9\u6488\u64BC\u64DA\u64D2" + + "\u64C5\u64C7\u64BB\u64D8\u64C2\u64F1\u64E7\u8209" + + "\u64E0\u64E1\u62AC\u64E3\u64EF\u652C\u64F6\u64F4" + + "\u64F2\u64FA\u6500\u64FD\u6518\u651C\u6505\u6524" + + "\u6523\u652B\u6534\u6535\u6537\u6536\u6538\u754B" + + "\u6741\u6738\u6737\u6746\u675E\u6760\u6759\u6763" + + "\u6764\u6789\u6770\u67A9\u677C\u676A\u678C\u678B" + + "\u67A6\u67A1\u6785\u67B7\u67EF\u67B4\u67EC\u67B3" + + "\u67E9\u67B8\u67E4\u67DE\u67DD\u67E2\u67EE\u67B9" + + "\u67CE\u67C6\u67E7\u6A9C\u681E\u6846\u6829\u6840" + + "\u684D\u6832\u684E\u68B3\u682B\u6859\u6863\u6877" + + "\u687F\u689F\u688F\u68AD\u6894\u689D\u689B\u6883" + + "\u6AAE\u68B9\u6874\u68B5\u68A0\u68BA\u690F\u688D" + + "\u687E\u6901\u68CA\u6908\u68D8\u6922\u6926\u68E1" + + "\u690C\u68CD\u68D4\u68E7\u68D5\u6936\u6912\u6904" + + "\u68D7\u68E3\u6925\u68F9\u68E0\u68EF\u6928\u692A" + + "\u691A\u6923\u6921\u68C6\u6979\u6977\u695C\u6978" + + "\u6CD7\u6CC5\u6CDD\u6CAE\u6CB1\u6CBE\u6CBA\u6CDB" + + "\u6CEF\u6CD9\u6CEA\u6D1F\u884D\u6D36\u6D2B\u6D3D" + + "\u6D38\u6D19\u6D35\u6D33\u6D12\u6D0C\u6D63\u6D93" + + "\u6D64\u6D5A\u6D79\u6D59\u6D8E\u6D95\u6FE4\u6D85" + + "\u6DF9\u6E15\u6E0A\u6DB5\u6DC7\u6DE6\u6DB8\u6DC6" + + "\u6DEC\u6DDE\u6DCC\u6DE8\u6DD2\u6DC5\u6DFA\u6DD9" + + "\u724B\u7258\u7274\u727E\u7282\u7281\u7287\u7292" + + "\u7296\u72A2\u72A7\u72B9\u72B2\u72C3\u72C6\u72C4" + + "\u9D59\u9D72\u9D89\u9D87\u9DAB\u9D6F\u9D7A\u9D9A" + + "\u9DA4\u9DA9\u9DB2\u9DC4\u9DC1\u9DBB\u9DB8\u9DBA" + + "\u9DC6\u9DCF\u9DC2\u9DD9\u9DD3\u9DF8\u9DE6\u9DED" + + "\u9DEF\u9DFD\u9E1A\u9E1B\u9E1E\u9E75\u9E79\u9E7D" + + "\u9E81\u9E88\u9E8B\u9E8C\u9E92\u9E95\u9E91\u9E9D" + + "\u9EA5\u9EA9\u9EB8\u9EAA\u9EAD\u9761\u9ECC\u9ECE" + + "\u9ECF\u9ED0\u9ED4\u9EDC\u9EDE\u9EDD\u9EE0\u9EE5" + + "\u9EE8\u9EEF\u9EF4\u9EF6\u9EF7\u9EF9\u9EFB\u9EFC" + + "\u9EFD\u9F07\u9F08\u76B7\u9F15\u9F21\u9F2C\u9F3E" + + "\u9F4A\u9F52\u9F54\u9F63\u9F5F\u9F60\u9F61\u9F66" + + "\u9F67\u9F6C\u9F6A\u9F77\u9F72\u9F76\u9F95\u9F9C" + + "\u9FA0\u582F\u69C7\u9059\u7464\u51DC\u7199"; + + final static String JISX0202KATAKANA = + "\uFF61\uFF62\uFF63\uFF64" + + "\uFF65\uFF66\uFF67\uFF68\uFF69\uFF6A\uFF6B\uFF6C" + + "\uFF6D\uFF6E\uFF6F\uFF70\uFF71\uFF72\uFF73\uFF74" + + "\uFF75\uFF76\uFF77\uFF78\uFF79\uFF7A\uFF7B\uFF7C" + + "\uFF7D\uFF7E\uFF7F\uFF80\uFF81\uFF82\uFF83\uFF84" + + "\uFF85\uFF86\uFF87\uFF88\uFF89\uFF8A\uFF8B\uFF8C" + + "\uFF8D\uFF8E\uFF8F\uFF90\uFF91\uFF92\uFF93\uFF94" + + "\uFF95\uFF96\uFF97\uFF98\uFF99\uFF9A\uFF9B\uFF9C" + + "\uFF9D\uFF9E\uFF9F"; + + + final static byte[] expectedBytes1 = { + (byte) 0x0, (byte) 0x1, (byte) 0x2, (byte) 0x3, + (byte) 0x4, (byte) 0x5, (byte) 0x6, (byte) 0x7, + (byte) 0x8, (byte) 0x9, (byte) 0xa, (byte) 0xb, + (byte) 0xc, (byte) 0xd, + (byte) 0x10, (byte) 0x11, (byte) 0x12, (byte) 0x13, + (byte) 0x14, (byte) 0x15, (byte) 0x16, (byte) 0x17, + (byte) 0x18, (byte) 0x19, (byte) 0x1a, + (byte) 0x1c, (byte) 0x1d, (byte) 0x1e, (byte) 0x1f, + (byte) 0x20, (byte) 0x21, (byte) 0x22, (byte) 0x23, + (byte) 0x24, (byte) 0x25, (byte) 0x26, (byte) 0x27, + (byte) 0x28, (byte) 0x29, (byte) 0x2a, (byte) 0x2b, + (byte) 0x2c, (byte) 0x2d, (byte) 0x2e, (byte) 0x2f, + (byte) 0x30, (byte) 0x31, (byte) 0x32, (byte) 0x33, + (byte) 0x34, (byte) 0x35, (byte) 0x36, (byte) 0x37, + (byte) 0x38, (byte) 0x39, (byte) 0x3a, (byte) 0x3b, + (byte) 0x3c, (byte) 0x3d, (byte) 0x3e, (byte) 0x3f, + (byte) 0x40, (byte) 0x41, (byte) 0x42, (byte) 0x43, + (byte) 0x44, (byte) 0x45, (byte) 0x46, (byte) 0x47, + (byte) 0x48, (byte) 0x49, (byte) 0x4a, (byte) 0x4b, + (byte) 0x4c, (byte) 0x4d, (byte) 0x4e, (byte) 0x4f, + (byte) 0x50, (byte) 0x51, (byte) 0x52, (byte) 0x53, + (byte) 0x54, (byte) 0x55, (byte) 0x56, (byte) 0x57, + (byte) 0x58, (byte) 0x59, (byte) 0x5a, (byte) 0x5b, + (byte) 0x5c, (byte) 0x5d, (byte) 0x5e, (byte) 0x5f, + (byte) 0x60, (byte) 0x61, (byte) 0x62, (byte) 0x63, + (byte) 0x64, (byte) 0x65, (byte) 0x66, (byte) 0x67, + (byte) 0x68, (byte) 0x69, (byte) 0x6a, (byte) 0x6b, + (byte) 0x6c, (byte) 0x6d, (byte) 0x6e, (byte) 0x6f, + (byte) 0x70, (byte) 0x71, (byte) 0x72, (byte) 0x73, + (byte) 0x74, (byte) 0x75, (byte) 0x76, (byte) 0x77, + (byte) 0x78, (byte) 0x79, (byte) 0x7a, (byte) 0x7b, + (byte) 0x7c, (byte) 0x7d, (byte) 0x7e, (byte) 0x1b, + (byte) 0x28, (byte) 0x4a, (byte) 0x5c, (byte) 0x7e, + (byte) 0x1b, (byte) 0x28, (byte) 0x42, (byte) 0x75, + (byte) 0x33, (byte) 0x30, (byte) 0x30, (byte) 0x30, + (byte) 0x1b, (byte) 0x24, (byte) 0x42, (byte) 0x21, + (byte) 0x22, (byte) 0x21, (byte) 0x23, (byte) 0x21, + (byte) 0x24, (byte) 0x21, (byte) 0x25, (byte) 0x21, + (byte) 0x26, (byte) 0x21, (byte) 0x27, (byte) 0x21, + (byte) 0x28, (byte) 0x21, (byte) 0x29, (byte) 0x21, + (byte) 0x2a, (byte) 0x21, (byte) 0x2b, (byte) 0x21, + (byte) 0x2c, (byte) 0x21, (byte) 0x2d, (byte) 0x21, + (byte) 0x2e, (byte) 0x21, (byte) 0x2f, (byte) 0x21, + (byte) 0x30, (byte) 0x21, (byte) 0x31, (byte) 0x21, + (byte) 0x32, (byte) 0x21, (byte) 0x33, (byte) 0x21, + (byte) 0x34, (byte) 0x21, (byte) 0x35, (byte) 0x21, + (byte) 0x36, (byte) 0x21, (byte) 0x37, (byte) 0x21, + (byte) 0x38, (byte) 0x21, (byte) 0x39, (byte) 0x21, + (byte) 0x3a, (byte) 0x21, (byte) 0x3b, (byte) 0x21, + (byte) 0x3c, (byte) 0x21, (byte) 0x3d, (byte) 0x21, + (byte) 0x3e, (byte) 0x21, (byte) 0x3f, (byte) 0x21, + (byte) 0x40, (byte) 0x21, (byte) 0x41, (byte) 0x21, + (byte) 0x42, (byte) 0x21, (byte) 0x43, (byte) 0x21, + (byte) 0x44, (byte) 0x21, (byte) 0x45, (byte) 0x21, + (byte) 0x46, (byte) 0x21, (byte) 0x47, (byte) 0x55, + (byte) 0x71, (byte) 0x55, (byte) 0x72, (byte) 0x55, + (byte) 0x73, (byte) 0x55, (byte) 0x74, (byte) 0x55, + (byte) 0x75, (byte) 0x55, (byte) 0x76, (byte) 0x55, + (byte) 0x77, (byte) 0x55, (byte) 0x78, (byte) 0x55, + (byte) 0x79, (byte) 0x55, (byte) 0x7a, (byte) 0x55, + (byte) 0x7b, (byte) 0x55, (byte) 0x7c, (byte) 0x55, + (byte) 0x7d, (byte) 0x55, (byte) 0x7e, (byte) 0x56, + (byte) 0x21, (byte) 0x56, (byte) 0x22, (byte) 0x56, + (byte) 0x23, (byte) 0x56, (byte) 0x24, (byte) 0x56, + (byte) 0x25, (byte) 0x56, (byte) 0x26, (byte) 0x56, + (byte) 0x27, (byte) 0x56, (byte) 0x28, (byte) 0x56, + (byte) 0x29, (byte) 0x56, (byte) 0x2a, (byte) 0x56, + (byte) 0x2b, (byte) 0x56, (byte) 0x2c, (byte) 0x56, + (byte) 0x2d, (byte) 0x56, (byte) 0x2e, (byte) 0x56, + (byte) 0x2f, (byte) 0x56, (byte) 0x30, (byte) 0x56, + (byte) 0x31, (byte) 0x56, (byte) 0x32, (byte) 0x56, + (byte) 0x33, (byte) 0x56, (byte) 0x34, (byte) 0x56, + (byte) 0x35, (byte) 0x56, (byte) 0x36, (byte) 0x56, + (byte) 0x37, (byte) 0x56, (byte) 0x38, (byte) 0x56, + (byte) 0x39, (byte) 0x56, (byte) 0x3a, (byte) 0x56, + (byte) 0x3b, (byte) 0x56, (byte) 0x3c, (byte) 0x56, + (byte) 0x3d, (byte) 0x56, (byte) 0x3e, (byte) 0x56, + (byte) 0x3f, (byte) 0x56, (byte) 0x40, (byte) 0x56, + (byte) 0x41, (byte) 0x56, (byte) 0x42, (byte) 0x56, + (byte) 0x43, (byte) 0x56, (byte) 0x44, (byte) 0x56, + (byte) 0x45, (byte) 0x56, (byte) 0x46, (byte) 0x56, + (byte) 0x47, (byte) 0x56, (byte) 0x48, (byte) 0x56, + (byte) 0x49, (byte) 0x56, (byte) 0x4a, (byte) 0x56, + (byte) 0x4b, (byte) 0x56, (byte) 0x4c, (byte) 0x56, + (byte) 0x4d, (byte) 0x56, (byte) 0x4e, (byte) 0x56, + (byte) 0x4f, (byte) 0x56, (byte) 0x50, (byte) 0x56, + (byte) 0x51, (byte) 0x56, (byte) 0x52, (byte) 0x56, + (byte) 0x53, (byte) 0x56, (byte) 0x54, (byte) 0x56, + (byte) 0x55, (byte) 0x56, (byte) 0x56, (byte) 0x56, + (byte) 0x57, (byte) 0x56, (byte) 0x58, (byte) 0x56, + (byte) 0x59, (byte) 0x56, (byte) 0x5a, (byte) 0x56, + (byte) 0x5b, (byte) 0x56, (byte) 0x5c, (byte) 0x56, + (byte) 0x5d, (byte) 0x56, (byte) 0x5e, (byte) 0x56, + (byte) 0x5f, (byte) 0x56, (byte) 0x60, (byte) 0x56, + (byte) 0x61, (byte) 0x56, (byte) 0x62, (byte) 0x56, + (byte) 0x63, (byte) 0x56, (byte) 0x64, (byte) 0x56, + (byte) 0x65, (byte) 0x56, (byte) 0x66, (byte) 0x56, + (byte) 0x67, (byte) 0x56, (byte) 0x68, (byte) 0x56, + (byte) 0x69, (byte) 0x56, (byte) 0x6a, (byte) 0x56, + (byte) 0x6b, (byte) 0x56, (byte) 0x6c, (byte) 0x56, + (byte) 0x6d, (byte) 0x56, (byte) 0x6e, (byte) 0x56, + (byte) 0x6f, (byte) 0x56, (byte) 0x70, (byte) 0x56, + (byte) 0x71, (byte) 0x56, (byte) 0x72, (byte) 0x56, + (byte) 0x73, (byte) 0x56, (byte) 0x74, (byte) 0x56, + (byte) 0x75, (byte) 0x56, (byte) 0x76, (byte) 0x56, + (byte) 0x77, (byte) 0x56, (byte) 0x78, (byte) 0x56, + (byte) 0x79, (byte) 0x56, (byte) 0x7a, (byte) 0x56, + (byte) 0x7b, (byte) 0x56, (byte) 0x7c, (byte) 0x56, + (byte) 0x7d, (byte) 0x56, (byte) 0x7e, (byte) 0x57, + (byte) 0x21, (byte) 0x57, (byte) 0x22, (byte) 0x57, + (byte) 0x23, (byte) 0x57, (byte) 0x24, (byte) 0x57, + (byte) 0x25, (byte) 0x57, (byte) 0x26, (byte) 0x57, + (byte) 0x27, (byte) 0x57, (byte) 0x28, (byte) 0x57, + (byte) 0x29, (byte) 0x57, (byte) 0x2a, (byte) 0x57, + (byte) 0x2b, (byte) 0x57, (byte) 0x2c, (byte) 0x57, + (byte) 0x2d, (byte) 0x57, (byte) 0x2e, (byte) 0x57, + (byte) 0x2f, (byte) 0x57, (byte) 0x30, (byte) 0x57, + (byte) 0x31, (byte) 0x57, (byte) 0x32, (byte) 0x57, + (byte) 0x33, (byte) 0x57, (byte) 0x34, (byte) 0x57, + (byte) 0x35, (byte) 0x57, (byte) 0x36, (byte) 0x57, + (byte) 0x37, (byte) 0x57, (byte) 0x38, (byte) 0x57, + (byte) 0x39, (byte) 0x57, (byte) 0x3a, (byte) 0x57, + (byte) 0x3b, (byte) 0x57, (byte) 0x3c, (byte) 0x57, + (byte) 0x3d, (byte) 0x57, (byte) 0x3e, (byte) 0x57, + (byte) 0x3f, (byte) 0x57, (byte) 0x40, (byte) 0x57, + (byte) 0x41, (byte) 0x57, (byte) 0x42, (byte) 0x57, + (byte) 0x43, (byte) 0x57, (byte) 0x44, (byte) 0x57, + (byte) 0x45, (byte) 0x57, (byte) 0x46, (byte) 0x57, + (byte) 0x47, (byte) 0x57, (byte) 0x48, (byte) 0x57, + (byte) 0x49, (byte) 0x57, (byte) 0x4a, (byte) 0x57, + (byte) 0x4b, (byte) 0x57, (byte) 0x4c, (byte) 0x57, + (byte) 0x4d, (byte) 0x57, (byte) 0x4e, (byte) 0x57, + (byte) 0x4f, (byte) 0x57, (byte) 0x50, (byte) 0x57, + (byte) 0x51, (byte) 0x57, (byte) 0x52, (byte) 0x57, + (byte) 0x53, (byte) 0x57, (byte) 0x54, (byte) 0x57, + (byte) 0x55, (byte) 0x57, (byte) 0x56, (byte) 0x57, + (byte) 0x57, (byte) 0x57, (byte) 0x58, (byte) 0x57, + (byte) 0x59, (byte) 0x57, (byte) 0x5a, (byte) 0x57, + (byte) 0x5b, (byte) 0x57, (byte) 0x5c, (byte) 0x57, + (byte) 0x5d, (byte) 0x57, (byte) 0x5e, (byte) 0x57, + (byte) 0x5f, (byte) 0x57, (byte) 0x60, (byte) 0x57, + (byte) 0x61, (byte) 0x57, (byte) 0x62, (byte) 0x57, + (byte) 0x63, (byte) 0x57, (byte) 0x64, (byte) 0x59, + (byte) 0x49, (byte) 0x59, (byte) 0x4a, (byte) 0x59, + (byte) 0x4b, (byte) 0x59, (byte) 0x4c, (byte) 0x59, + (byte) 0x4d, (byte) 0x59, (byte) 0x4e, (byte) 0x59, + (byte) 0x4f, (byte) 0x59, (byte) 0x50, (byte) 0x59, + (byte) 0x51, (byte) 0x59, (byte) 0x52, (byte) 0x59, + (byte) 0x53, (byte) 0x59, (byte) 0x54, (byte) 0x59, + (byte) 0x55, (byte) 0x59, (byte) 0x56, (byte) 0x59, + (byte) 0x57, (byte) 0x59, (byte) 0x58, (byte) 0x59, + (byte) 0x59, (byte) 0x59, (byte) 0x5a, (byte) 0x59, + (byte) 0x5b, (byte) 0x59, (byte) 0x5c, (byte) 0x59, + (byte) 0x5d, (byte) 0x59, (byte) 0x5e, (byte) 0x59, + (byte) 0x5f, (byte) 0x59, (byte) 0x60, (byte) 0x59, + (byte) 0x61, (byte) 0x59, (byte) 0x62, (byte) 0x59, + (byte) 0x63, (byte) 0x59, (byte) 0x64, (byte) 0x59, + (byte) 0x65, (byte) 0x59, (byte) 0x66, (byte) 0x59, + (byte) 0x67, (byte) 0x59, (byte) 0x68, (byte) 0x59, + (byte) 0x69, (byte) 0x59, (byte) 0x6a, (byte) 0x59, + (byte) 0x6b, (byte) 0x59, (byte) 0x6c, (byte) 0x59, + (byte) 0x6d, (byte) 0x59, (byte) 0x6e, (byte) 0x59, + (byte) 0x6f, (byte) 0x59, (byte) 0x70, (byte) 0x59, + (byte) 0x71, (byte) 0x59, (byte) 0x72, (byte) 0x59, + (byte) 0x73, (byte) 0x59, (byte) 0x74, (byte) 0x59, + (byte) 0x75, (byte) 0x59, (byte) 0x76, (byte) 0x59, + (byte) 0x77, (byte) 0x59, (byte) 0x78, (byte) 0x59, + (byte) 0x79, (byte) 0x59, (byte) 0x7a, (byte) 0x59, + (byte) 0x7b, (byte) 0x59, (byte) 0x7c, (byte) 0x59, + (byte) 0x7d, (byte) 0x59, (byte) 0x7e, (byte) 0x5a, + (byte) 0x21, (byte) 0x5a, (byte) 0x22, (byte) 0x5a, + (byte) 0x23, (byte) 0x5a, (byte) 0x24, (byte) 0x5a, + (byte) 0x25, (byte) 0x5a, (byte) 0x26, (byte) 0x5a, + (byte) 0x27, (byte) 0x5a, (byte) 0x28, (byte) 0x5a, + (byte) 0x29, (byte) 0x5a, (byte) 0x2a, (byte) 0x5a, + (byte) 0x2b, (byte) 0x5a, (byte) 0x2c, (byte) 0x5a, + (byte) 0x2d, (byte) 0x5a, (byte) 0x2e, (byte) 0x5a, + (byte) 0x2f, (byte) 0x5a, (byte) 0x30, (byte) 0x5a, + (byte) 0x31, (byte) 0x5a, (byte) 0x32, (byte) 0x5a, + (byte) 0x33, (byte) 0x5a, (byte) 0x34, (byte) 0x5a, + (byte) 0x35, (byte) 0x5a, (byte) 0x36, (byte) 0x5a, + (byte) 0x37, (byte) 0x5a, (byte) 0x38, (byte) 0x5a, + (byte) 0x39, (byte) 0x5a, (byte) 0x3a, (byte) 0x5a, + (byte) 0x3b, (byte) 0x5a, (byte) 0x3c, (byte) 0x5a, + (byte) 0x3d, (byte) 0x5a, (byte) 0x3e, (byte) 0x5a, + (byte) 0x3f, (byte) 0x5a, (byte) 0x40, (byte) 0x5a, + (byte) 0x41, (byte) 0x5a, (byte) 0x42, (byte) 0x5b, + (byte) 0x35, (byte) 0x5b, (byte) 0x36, (byte) 0x5b, + (byte) 0x37, (byte) 0x5b, (byte) 0x38, (byte) 0x5b, + (byte) 0x39, (byte) 0x5b, (byte) 0x3a, (byte) 0x5b, + (byte) 0x3b, (byte) 0x5b, (byte) 0x3c, (byte) 0x5b, + (byte) 0x3d, (byte) 0x5b, (byte) 0x3e, (byte) 0x5b, + (byte) 0x3f, (byte) 0x5b, (byte) 0x40, (byte) 0x5b, + (byte) 0x41, (byte) 0x5b, (byte) 0x42, (byte) 0x5b, + (byte) 0x43, (byte) 0x5b, (byte) 0x44, (byte) 0x5b, + (byte) 0x45, (byte) 0x5b, (byte) 0x46, (byte) 0x5b, + (byte) 0x47, (byte) 0x5b, (byte) 0x48, (byte) 0x5b, + (byte) 0x49, (byte) 0x5b, (byte) 0x4a, (byte) 0x5b, + (byte) 0x4b, (byte) 0x5b, (byte) 0x4c, (byte) 0x5b, + (byte) 0x4d, (byte) 0x5b, (byte) 0x4e, (byte) 0x5b, + (byte) 0x4f, (byte) 0x5b, (byte) 0x50, (byte) 0x5b, + (byte) 0x51, (byte) 0x5b, (byte) 0x52, (byte) 0x5b, + (byte) 0x53, (byte) 0x5b, (byte) 0x54, (byte) 0x5b, + (byte) 0x55, (byte) 0x5b, (byte) 0x56, (byte) 0x5b, + (byte) 0x57, (byte) 0x5b, (byte) 0x58, (byte) 0x5b, + (byte) 0x59, (byte) 0x5b, (byte) 0x5a, (byte) 0x5b, + (byte) 0x5b, (byte) 0x5b, (byte) 0x5c, (byte) 0x5b, + (byte) 0x5d, (byte) 0x5b, (byte) 0x5e, (byte) 0x5b, + (byte) 0x5f, (byte) 0x5b, (byte) 0x60, (byte) 0x5b, + (byte) 0x61, (byte) 0x5b, (byte) 0x62, (byte) 0x5b, + (byte) 0x63, (byte) 0x5b, (byte) 0x64, (byte) 0x5b, + (byte) 0x65, (byte) 0x5b, (byte) 0x66, (byte) 0x5b, + (byte) 0x67, (byte) 0x5b, (byte) 0x68, (byte) 0x5b, + (byte) 0x69, (byte) 0x5b, (byte) 0x6a, (byte) 0x5b, + (byte) 0x6b, (byte) 0x5b, (byte) 0x6c, (byte) 0x5b, + (byte) 0x6d, (byte) 0x5b, (byte) 0x6e, (byte) 0x5b, + (byte) 0x6f, (byte) 0x5b, (byte) 0x70, (byte) 0x5b, + (byte) 0x71, (byte) 0x5b, (byte) 0x72, (byte) 0x5b, + (byte) 0x73, (byte) 0x5b, (byte) 0x74, (byte) 0x5b, + (byte) 0x75, (byte) 0x5b, (byte) 0x76, (byte) 0x5b, + (byte) 0x77, (byte) 0x5b, (byte) 0x78, (byte) 0x5b, + (byte) 0x79, (byte) 0x5b, (byte) 0x7a, (byte) 0x5b, + (byte) 0x7b, (byte) 0x5b, (byte) 0x7c, (byte) 0x5b, + (byte) 0x7d, (byte) 0x5b, (byte) 0x7e, (byte) 0x5c, + (byte) 0x21, (byte) 0x5c, (byte) 0x22, (byte) 0x5c, + (byte) 0x23, (byte) 0x5c, (byte) 0x24, (byte) 0x5c, + (byte) 0x25, (byte) 0x5c, (byte) 0x26, (byte) 0x5c, + (byte) 0x27, (byte) 0x5c, (byte) 0x28, (byte) 0x5c, + (byte) 0x29, (byte) 0x5c, (byte) 0x2a, (byte) 0x5c, + (byte) 0x2b, (byte) 0x5c, (byte) 0x2c, (byte) 0x5c, + (byte) 0x2d, (byte) 0x5c, (byte) 0x2e, (byte) 0x5c, + (byte) 0x2f, (byte) 0x5c, (byte) 0x30, (byte) 0x5c, + (byte) 0x31, (byte) 0x5c, (byte) 0x32, (byte) 0x5c, + (byte) 0x33, (byte) 0x5c, (byte) 0x34, (byte) 0x5c, + (byte) 0x35, (byte) 0x5c, (byte) 0x36, (byte) 0x5d, + (byte) 0x79, (byte) 0x5d, (byte) 0x7a, (byte) 0x5d, + (byte) 0x7b, (byte) 0x5d, (byte) 0x7c, (byte) 0x5d, + (byte) 0x7d, (byte) 0x5d, (byte) 0x7e, (byte) 0x5e, + (byte) 0x21, (byte) 0x5e, (byte) 0x22, (byte) 0x5e, + (byte) 0x23, (byte) 0x5e, (byte) 0x24, (byte) 0x5e, + (byte) 0x25, (byte) 0x5e, (byte) 0x26, (byte) 0x5e, + (byte) 0x27, (byte) 0x5e, (byte) 0x28, (byte) 0x5e, + (byte) 0x29, (byte) 0x5e, (byte) 0x2a, (byte) 0x5e, + (byte) 0x2b, (byte) 0x5e, (byte) 0x2c, (byte) 0x5e, + (byte) 0x2d, (byte) 0x5e, (byte) 0x2e, (byte) 0x5e, + (byte) 0x2f, (byte) 0x5e, (byte) 0x30, (byte) 0x5e, + (byte) 0x31, (byte) 0x5e, (byte) 0x32, (byte) 0x5e, + (byte) 0x33, (byte) 0x5e, (byte) 0x34, (byte) 0x5e, + (byte) 0x35, (byte) 0x5e, (byte) 0x36, (byte) 0x5e, + (byte) 0x37, (byte) 0x5e, (byte) 0x38, (byte) 0x5e, + (byte) 0x39, (byte) 0x5e, (byte) 0x3a, (byte) 0x5e, + (byte) 0x3b, (byte) 0x5e, (byte) 0x3c, (byte) 0x5e, + (byte) 0x3d, (byte) 0x5e, (byte) 0x3e, (byte) 0x5e, + (byte) 0x3f, (byte) 0x5e, (byte) 0x40, (byte) 0x5e, + (byte) 0x41, (byte) 0x5e, (byte) 0x42, (byte) 0x5e, + (byte) 0x43, (byte) 0x5e, (byte) 0x44, (byte) 0x5e, + (byte) 0x45, (byte) 0x5e, (byte) 0x46, (byte) 0x5e, + (byte) 0x47, (byte) 0x5e, (byte) 0x48, (byte) 0x5e, + (byte) 0x49, (byte) 0x5e, (byte) 0x4a, (byte) 0x60, + (byte) 0x30, (byte) 0x60, (byte) 0x31, (byte) 0x60, + (byte) 0x32, (byte) 0x60, (byte) 0x33, (byte) 0x60, + (byte) 0x34, (byte) 0x60, (byte) 0x35, (byte) 0x60, + (byte) 0x36, (byte) 0x60, (byte) 0x37, (byte) 0x60, + (byte) 0x38, (byte) 0x60, (byte) 0x39, (byte) 0x60, + (byte) 0x3a, (byte) 0x60, (byte) 0x3b, (byte) 0x60, + (byte) 0x3c, (byte) 0x60, (byte) 0x3d, (byte) 0x60, + (byte) 0x3e, (byte) 0x60, (byte) 0x3f, (byte) 0x73, + (byte) 0x26, (byte) 0x73, (byte) 0x27, (byte) 0x73, + (byte) 0x28, (byte) 0x73, (byte) 0x29, (byte) 0x73, + (byte) 0x2a, (byte) 0x73, (byte) 0x2b, (byte) 0x73, + (byte) 0x2c, (byte) 0x73, (byte) 0x2d, (byte) 0x73, + (byte) 0x2e, (byte) 0x73, (byte) 0x2f, (byte) 0x73, + (byte) 0x30, (byte) 0x73, (byte) 0x31, (byte) 0x73, + (byte) 0x32, (byte) 0x73, (byte) 0x33, (byte) 0x73, + (byte) 0x34, (byte) 0x73, (byte) 0x35, (byte) 0x73, + (byte) 0x36, (byte) 0x73, (byte) 0x37, (byte) 0x73, + (byte) 0x38, (byte) 0x73, (byte) 0x39, (byte) 0x73, + (byte) 0x3a, (byte) 0x73, (byte) 0x3b, (byte) 0x73, + (byte) 0x3c, (byte) 0x73, (byte) 0x3d, (byte) 0x73, + (byte) 0x3e, (byte) 0x73, (byte) 0x3f, (byte) 0x73, + (byte) 0x40, (byte) 0x73, (byte) 0x41, (byte) 0x73, + (byte) 0x42, (byte) 0x73, (byte) 0x43, (byte) 0x73, + (byte) 0x44, (byte) 0x73, (byte) 0x45, (byte) 0x73, + (byte) 0x46, (byte) 0x73, (byte) 0x47, (byte) 0x73, + (byte) 0x48, (byte) 0x73, (byte) 0x49, (byte) 0x73, + (byte) 0x4a, (byte) 0x73, (byte) 0x4b, (byte) 0x73, + (byte) 0x4c, (byte) 0x73, (byte) 0x4d, (byte) 0x73, + (byte) 0x4e, (byte) 0x73, (byte) 0x4f, (byte) 0x73, + (byte) 0x50, (byte) 0x73, (byte) 0x51, (byte) 0x73, + (byte) 0x52, (byte) 0x73, (byte) 0x53, (byte) 0x73, + (byte) 0x54, (byte) 0x73, (byte) 0x55, (byte) 0x73, + (byte) 0x56, (byte) 0x73, (byte) 0x57, (byte) 0x73, + (byte) 0x58, (byte) 0x73, (byte) 0x59, (byte) 0x73, + (byte) 0x5a, (byte) 0x73, (byte) 0x5b, (byte) 0x73, + (byte) 0x5c, (byte) 0x73, (byte) 0x5d, (byte) 0x73, + (byte) 0x5e, (byte) 0x73, (byte) 0x5f, (byte) 0x73, + (byte) 0x60, (byte) 0x73, (byte) 0x61, (byte) 0x73, + (byte) 0x62, (byte) 0x73, (byte) 0x63, (byte) 0x73, + (byte) 0x64, (byte) 0x73, (byte) 0x65, (byte) 0x73, + (byte) 0x66, (byte) 0x73, (byte) 0x67, (byte) 0x73, + (byte) 0x68, (byte) 0x73, (byte) 0x69, (byte) 0x73, + (byte) 0x6a, (byte) 0x73, (byte) 0x6b, (byte) 0x73, + (byte) 0x6c, (byte) 0x73, (byte) 0x6d, (byte) 0x73, + (byte) 0x6e, (byte) 0x73, (byte) 0x6f, (byte) 0x73, + (byte) 0x70, (byte) 0x73, (byte) 0x71, (byte) 0x73, + (byte) 0x72, (byte) 0x73, (byte) 0x73, (byte) 0x73, + (byte) 0x74, (byte) 0x73, (byte) 0x75, (byte) 0x73, + (byte) 0x76, (byte) 0x73, (byte) 0x77, (byte) 0x73, + (byte) 0x78, (byte) 0x73, (byte) 0x79, (byte) 0x73, + (byte) 0x7a, (byte) 0x73, (byte) 0x7b, (byte) 0x73, + (byte) 0x7c, (byte) 0x73, (byte) 0x7d, (byte) 0x73, + (byte) 0x7e, (byte) 0x74, (byte) 0x21, (byte) 0x74, + (byte) 0x22, (byte) 0x74, (byte) 0x23, (byte) 0x74, + (byte) 0x24, (byte) 0x74, (byte) 0x25, (byte) 0x74, + (byte) 0x26, (byte) 0x1b, (byte) 0x28, (byte) 0x49, + (byte) 0x21, (byte) 0x22, (byte) 0x23, (byte) 0x24, + (byte) 0x25, (byte) 0x26, (byte) 0x27, (byte) 0x28, + (byte) 0x29, (byte) 0x2a, (byte) 0x2b, (byte) 0x2c, + (byte) 0x2d, (byte) 0x2e, (byte) 0x2f, (byte) 0x30, + (byte) 0x31, (byte) 0x32, (byte) 0x33, (byte) 0x34, + (byte) 0x35, (byte) 0x36, (byte) 0x37, (byte) 0x38, + (byte) 0x39, (byte) 0x3a, (byte) 0x3b, (byte) 0x3c, + (byte) 0x3d, (byte) 0x3e, (byte) 0x3f, (byte) 0x40, + (byte) 0x41, (byte) 0x42, (byte) 0x43, (byte) 0x44, + (byte) 0x45, (byte) 0x46, (byte) 0x47, (byte) 0x48, + (byte) 0x49, (byte) 0x4a, (byte) 0x4b, (byte) 0x4c, + (byte) 0x4d, (byte) 0x4e, (byte) 0x4f, (byte) 0x50, + (byte) 0x51, (byte) 0x52, (byte) 0x53, (byte) 0x54, + (byte) 0x55, (byte) 0x56, (byte) 0x57, (byte) 0x58, + (byte) 0x59, (byte) 0x5a, (byte) 0x5b, (byte) 0x5c, + (byte) 0x5d, (byte) 0x5e, (byte) 0x5f, (byte) 0x1b, + (byte) 0x28, (byte) 0x42 }; + + private final static String MIXEDCONTENT = + "JA\u3000\u3002\u0062\uFF64PAN" + + "\uFF0C\uFF0E\u00A5\uFF65\uFF66X\u203E" + + "\u30FB\uFF67\u203E"; + + static byte[] mixedBytesExpected = { + (byte) 0x4a, (byte) 0x41, (byte) 0x1b, (byte) 0x24, + (byte) 0x42, (byte) 0x21, (byte) 0x21, (byte) 0x21, + (byte) 0x23, (byte) 0x1b, (byte) 0x28, (byte) 0x42, + (byte) 0x62, (byte) 0x1b, (byte) 0x28, (byte) 0x49, + (byte) 0x24, (byte) 0x1b, (byte) 0x28, (byte) 0x42, + (byte) 0x50, (byte) 0x41, (byte) 0x4e, (byte) 0x1b, + (byte) 0x24, (byte) 0x42, (byte) 0x21, (byte) 0x24, + (byte) 0x21, (byte) 0x25, (byte) 0x1b, (byte) 0x28, + (byte) 0x4a, (byte) 0x5c, (byte) 0x1b, (byte) 0x28, + (byte) 0x49, (byte) 0x25, (byte) 0x26, (byte) 0x1b, + (byte) 0x28, (byte) 0x42, (byte) 0x58, (byte) 0x1b, + (byte) 0x28, (byte) 0x4a, (byte) 0x7e, (byte) 0x1b, + (byte) 0x24, (byte) 0x42, (byte) 0x21, (byte) 0x26, + (byte) 0x1b, (byte) 0x28, (byte) 0x49, (byte) 0x27, + (byte) 0x1b, (byte) 0x28, (byte) 0x4a, (byte) 0x7e, + (byte) 0x1b, (byte) 0x28, (byte) 0x42 }; + + static byte[] repeatingEscapes = { + (byte) 0x4a, (byte) 0x41, (byte) 0x1b, (byte) 0x24, + (byte) 0x42, (byte)0x1b, (byte)0x24, (byte)0x42, + (byte) 0x21, (byte) 0x21, (byte) 0x21, + (byte) 0x23, (byte) 0x1b, (byte) 0x28, (byte) 0x42, + // embedded repeated iso-2022 escapes (see bugID 4879522) + (byte)0x1b, (byte)0x28, (byte)0x42, + (byte) 0x62, (byte) 0x1b, (byte) 0x28, (byte) 0x49, + (byte)0x0f, (byte)0x0e, (byte)0x0f, + (byte)0x1b, (byte)0x28, (byte)0x49, + (byte) 0x24, (byte) 0x1b, (byte) 0x28, (byte) 0x42, + (byte) 0x50, (byte) 0x41, (byte) 0x4e, + // embedded shift chars (see bugID 4879522) + (byte)0x0e, (byte)0x0f, + (byte) 0x1b, + (byte) 0x24, (byte) 0x42, (byte) 0x21, (byte) 0x24, + (byte) 0x21, (byte) 0x25, (byte) 0x1b, (byte) 0x28, + (byte) 0x4a, (byte) 0x5c, (byte) 0x1b, (byte) 0x28, + (byte) 0x49, (byte) 0x25, (byte) 0x26, (byte) 0x1b, + (byte) 0x28, (byte) 0x42, (byte) 0x58, (byte) 0x1b, + (byte) 0x28, (byte) 0x4a, (byte) 0x7e, (byte) 0x1b, + (byte) 0x24, (byte) 0x42, (byte) 0x21, (byte) 0x26, + (byte) 0x1b, (byte) 0x28, (byte) 0x49, (byte) 0x27, + (byte) 0x1b, (byte) 0x28, (byte) 0x4a, (byte) 0x7e, + (byte) 0x1b, (byte) 0x28, (byte) 0x42 }; + + + private static String JISX0212 = + "\u02d8\u6896\u9fa5"; + + private static byte[] expectedBytes_JISX0212 = { + (byte)0x1b, (byte)0x24, (byte)0x28, (byte)0x44, + (byte)0x22, (byte)0x2f, (byte)0x43, (byte)0x6f, + (byte)0x6d, (byte)0x63, + (byte)0x1b, (byte)0x28, (byte)0x42 + }; + + /* + * Tests the roundtrip integrity and expected encoding + * correctness for a String containing a substantial + * subset of ISO-2022-JP/ISO-2022-JP-2 encodeable chars + */ + + private static void roundTrip(String testStr, byte[] expectBytes, + String csName) + throws Exception { + byte[] encodedBytes = testStr.getBytes(csName); + + if (encodedBytes.length != expectBytes.length) { + throw new Exception(csName + " Encoder error"); + } + + for (int i = 0; i < expectBytes.length; i++) { + if (encodedBytes[i] != expectBytes[i]) { + throw new Exception(csName + " Encoder error"); + } + } + String decoded = new String(encodedBytes, csName); + + if (!decoded.equals(testStr)) { + throw new Exception(csName + " Decoder error"); + } + String decoded2 = new String(repeatingEscapes, csName); + if (!decoded2.equals(MIXEDCONTENT)) { + throw new Exception(csName + " Decoder error"); + } + } + + public static void main(String[] args) throws Exception { + + // Long String containing sequential chars + // ASCII/yen/tilde/jisx0208 chars/katakana chars + + String testStr1 = US_ASCII + + JISX0208SUBSET + JISX0202KATAKANA; + roundTrip(testStr1, expectedBytes1, "ISO-2022-JP"); + roundTrip(testStr1, expectedBytes1, "ISO-2022-JP-2"); + roundTrip(JISX0212, expectedBytes_JISX0212, "ISO-2022-JP-2"); + + // mixed chars which encode to the supported codesets + // of ISO-2022-JP/ISO-2022-JP-2 + + String testStr2 = MIXEDCONTENT; + roundTrip(testStr2 , mixedBytesExpected, "ISO-2022-JP"); + roundTrip(testStr2 , mixedBytesExpected, "ISO-2022-JP-2"); + + String decoded2 = new String(repeatingEscapes, "ISO-2022-JP"); + if (!decoded2.equals(MIXEDCONTENT)) { + throw new Exception("ISO-2022-JP Decoder error"); + } + + decoded2 = new String(repeatingEscapes, "ISO-2022-JP-2"); + if (!decoded2.equals(MIXEDCONTENT)) { + throw new Exception("ISO-2022-JP-2 Decoder error"); + } + + // Test for bugID 4913711 + // ISO-2022-JP encoding of a single input char yields + // 8 output bytes. Prior to fix for 4913711 the + // max bytes per char value was underspecified as 5.0 + // and the code below would have thrown a BufferOverflow + // exception. This test validates the fix for 4913711 + + String testStr3 = "\u3042"; + byte[] expected = { (byte)0x1b, (byte)0x24, (byte)0x42, + (byte)0x24, (byte)0x22, (byte)0x1b, + (byte)0x28, (byte)0x42 }; + byte[] encoded = testStr3.getBytes("ISO-2022-JP"); + for (int i = 0; i < expected.length; i++) { + if (encoded[i] != expected[i]) + throw new Exception("ISO-2022-JP Decoder error"); + } + } +} diff --git a/jdk/test/sun/nio/cs/TestISO2022JPEncoder.java b/jdk/test/sun/nio/cs/TestISO2022JPEncoder.java new file mode 100644 index 00000000000..ec2cbff0b9f --- /dev/null +++ b/jdk/test/sun/nio/cs/TestISO2022JPEncoder.java @@ -0,0 +1,73 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 4251646 + @summary Make sure buffer boundary convert works + */ + +import java.nio.*; +import java.nio.charset.*; + +public class TestISO2022JPEncoder { + static char[] inputChars = {'\u0020', '\u0020', '\u0020', '\u0020', + '\u0020', '\u0020', '\u0020', '\u0020', + '\u0020', '\u4e00'}; + static byte[] expectedBytes1 = {0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20}; + static byte[] expectedBytes2 = {0x1b, 0x24, 0x42, 0x30, 0x6c, + 0x1b, 0x28, 0x42}; + static byte[] outputBuff = new byte[10]; + + public static void main(String args[]) throws Exception { + CharsetEncoder enc = Charset.forName("ISO2022JP").newEncoder(); + CharBuffer cb = CharBuffer.wrap(inputChars); + ByteBuffer bb = ByteBuffer.wrap(outputBuff); + CoderResult cr = enc.encode(cb, bb, false); + if (!cr.isOverflow()) + throw new Exception("Expected CodeResult.OVERFLOW was not returned"); + for (int i = 0; i < expectedBytes1.length; ++i) { + //System.out.println(expectedBytes1[i] + ":" + outputBuff[i]); + if (expectedBytes1[i] != outputBuff[i]) { + throw new Exception("Output bytes does not match at first conversion"); + } + } + int nci = cb.position(); + if (nci != expectedBytes1.length) + throw new Exception("Output length does not match at first conversion"); + bb.clear(); + cr = enc.encode(cb, bb, true); + enc.flush(bb); + //System.out.println(ret + "," + expectedBytes2.length); + bb.flip(); + int len = bb.remaining(); + if (len != expectedBytes2.length) + throw new Exception("Output length does not match at second conversion"); + for (int i = 0; i < expectedBytes2.length; ++i) { + //System.out.println(expectedBytes2[i] + ":" + outputBuff[i]); + if (expectedBytes2[i] != outputBuff[i]) { + throw new Exception("Output bytes does not match at second conversion"); + } + } + } +} diff --git a/jdk/test/sun/nio/cs/TestISO2022JPSubBytes.java b/jdk/test/sun/nio/cs/TestISO2022JPSubBytes.java new file mode 100644 index 00000000000..7dc38522f43 --- /dev/null +++ b/jdk/test/sun/nio/cs/TestISO2022JPSubBytes.java @@ -0,0 +1,101 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 4262894 6233303 + @summary Testing substitute character Escape sequence + */ + +import java.nio.*; +import java.nio.charset.*; + +public class TestISO2022JPSubBytes { + /* \U2460 is not valid character in ISO2022JP and will be substituted + * with replacement character. If the replacement character is not the + * "current charset" character, correct escape sequence should be output + * for changing character set. + */ + static char[][] in = { {'\u25cb', '\u2460', '\u25cb'}, + {'\u0061', '\u2460', '\u0061'}, + {'\u25cb', '\u2460', '\u25cb'}, + {'\u0061', '\u2460', '\u0061'}, + }; + static byte[][] expected = { {0x1b, 0x24, 0x42, 0x21, 0x7b, + 0x21, 0x29, + 0x21, 0x7b, + 0x1b, 0x28, 0x42}, + {0x61, + 0x1b, 0x24, 0x42, 0x21, 0x29, + 0x1b, 0x28, 0x42, 0x61}, + {0x1b, 0x24, 0x42, 0x21, 0x7b, + 0x1b, 0x28, 0x42, 0x3f, + 0x1b, 0x24, 0x42, 0x21, 0x7b, + 0x1b, 0x28, 0x42}, + {0x61, + 0x3f, + 0x61} + }; + + public static void main(String args[]) throws Exception { + CharsetEncoder enc = Charset.forName("ISO2022JP") + .newEncoder() + .onUnmappableCharacter(CodingErrorAction.REPLACE); + + test(enc, in[0], expected[0]); + + enc.reset(); + test(enc, in[1], expected[1]); + + enc.reset(); + enc.replaceWith(new byte[]{(byte)'?'}); + test(enc, in[2], expected[2]); + + enc.reset(); + test(enc, in[3], expected[3]); + } + + public static void test (CharsetEncoder enc, + char[] inputChars, + byte[] expectedBytes) throws Exception + { + ByteBuffer bb = ByteBuffer.allocate(expectedBytes.length); + enc.encode(CharBuffer.wrap(inputChars), bb, true); + enc.flush(bb); + bb.flip(); + byte[] outputBuff = bb.array(); + int outputLen = bb.limit(); + if (outputLen != expectedBytes.length) { + throw new Exception("Output bytes does not match"); + } + for (int i = 0; i < outputLen; ++i) { + System.out.printf("<%x:%x> ", + expectedBytes[i] & 0xff, + outputBuff[i] & 0xff); + if (expectedBytes[i] != outputBuff[i]) { + System.out.println("..."); + throw new Exception("Output bytes does not match"); + } + } + System.out.println(); + } +} diff --git a/jdk/test/sun/nio/cs/TestIllegalISO2022Esc.java b/jdk/test/sun/nio/cs/TestIllegalISO2022Esc.java new file mode 100644 index 00000000000..696177fa4d9 --- /dev/null +++ b/jdk/test/sun/nio/cs/TestIllegalISO2022Esc.java @@ -0,0 +1,60 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 4429369 + @summary ISO2022CN and ISO2022KR converters throw exception + */ + +import java.io.*; +import java.nio.charset.*; + +public class TestIllegalISO2022Esc { + + public static void main ( String[] args) throws Exception { + int exceptionCount = 0; + String[] encName = {"ISO2022CN", "ISO2022KR" }; + byte[]b= { + (byte)0x1b, //Illegal sequence for both converters. + (byte)')', + (byte)'x' + }; + + for ( int i=0; i < 2; i++) { // Test 2 converters. + try { + ByteArrayInputStream bais = new ByteArrayInputStream(b); + InputStreamReader isr = + new InputStreamReader(bais,encName[i]); + char cc[] = new char[1]; + isr.read(cc,0,1); //attempt to read + } catch (MalformedInputException e) { } // Passes if thrown + catch (Throwable t) { + System.err.println("error with converter " + encName[i]); + exceptionCount++; + } + } + + if (exceptionCount > 0) + throw new Exception ("Incorrect handling of illegal ISO2022 escapes"); + } +} diff --git a/jdk/test/sun/nio/cs/TestIllegalSJIS.java b/jdk/test/sun/nio/cs/TestIllegalSJIS.java new file mode 100644 index 00000000000..e5562bbfb89 --- /dev/null +++ b/jdk/test/sun/nio/cs/TestIllegalSJIS.java @@ -0,0 +1,50 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 4117820 + @summary Verify that SJIS.Decoder works properly for values between 0xA000 and 0xA0FC + */ + +import java.nio.charset.*; +import java.nio.*; + +public class TestIllegalSJIS { + + public static void main(String[] args) throws Exception + { + CharsetDecoder dec = Charset.forName("SJIS").newDecoder() + .onUnmappableCharacter(CodingErrorAction.REPLACE) + .onMalformedInput(CodingErrorAction.REPLACE); + byte[] sjis = {(byte)0xA0, (byte)0x00}; + + int b; + for (b = 0; b < 0xFD; b++) { + sjis[1] = (byte) b; + CharBuffer cb = dec.decode(ByteBuffer.wrap(sjis)); + if (cb.charAt(0) != 0xFFFD) { + throw new Exception(Integer.toHexString(0xa000 + b) + " failed to convert to 0xFFFD"); + } + } + } +} diff --git a/jdk/test/sun/nio/cs/TestJIS0208Decoder.java b/jdk/test/sun/nio/cs/TestJIS0208Decoder.java new file mode 100644 index 00000000000..e0bacd8741c --- /dev/null +++ b/jdk/test/sun/nio/cs/TestJIS0208Decoder.java @@ -0,0 +1,61 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4179800 + * @summary Make sure JIS0208.Decoder really works + */ + +import java.nio.*; +import java.nio.charset.*; + +public class TestJIS0208Decoder { + static String outputString = "\u65e5\u672c\u8a9e\u30c6\u30ad\u30b9\u30c8"; + static byte [] inputBytes = new byte[] {(byte)'F', (byte)'|', (byte)'K', (byte)'\\', + (byte)'8', (byte)'l', (byte)'%', (byte)'F', + (byte)'%', (byte)'-', (byte)'%', (byte)'9', + (byte)'%', (byte)'H'}; + + public static void main(String args[]) + throws Exception + { + test(); + } + + private static void test() + throws Exception + { + CharsetDecoder dec = Charset.forName("JIS0208").newDecoder(); + try { + String ret = dec.decode(ByteBuffer.wrap(inputBytes)).toString(); + if (ret.length() != outputString.length() + || ! outputString.equals(ret)){ + throw new Exception("ByteToCharJIS0208 does not work correctly"); + } + } + catch (Exception e){ + throw new Exception("ByteToCharJIS0208 does not work correctly"); + } + } +} diff --git a/jdk/test/sun/nio/cs/TestJIS0212Decoder.java b/jdk/test/sun/nio/cs/TestJIS0212Decoder.java new file mode 100644 index 00000000000..56836161984 --- /dev/null +++ b/jdk/test/sun/nio/cs/TestJIS0212Decoder.java @@ -0,0 +1,62 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + @bug 4179800 + @summary Make sure JIS0212.Decoder really works + */ + +import java.nio.*; +import java.nio.charset.*; + +public class TestJIS0212Decoder { + static String outputString = "\u4e02\u4e04\u4e05\u4e0c\u4e12\u4e1f\u4e23"; + static char [] outputChars = new char[8]; + static byte [] inputBytes = new byte[] {(byte)0x30, (byte)0x21, (byte)0x30, (byte)0x22, + (byte)0x30, (byte)0x23, (byte)0x30, (byte)0x24, + (byte)0x30, (byte)0x25, (byte)0x30, (byte)0x26, + (byte)0x30, (byte)0x27}; + + public static void main(String args[]) + throws Exception + { + test(); + } + + private static void test() + throws Exception + { + CharsetDecoder dec = Charset.forName("JIS0212").newDecoder(); + try { + String ret = dec.decode(ByteBuffer.wrap(inputBytes)).toString(); + if (ret.length() != outputString.length() + || ! outputString.equals(ret)){ + throw new Exception("ByteToCharJIS0212 does not work correctly"); + } + } + catch (Exception e){ + throw new Exception("ByteToCharJIS0212 does not work correctly"); + } + } +} diff --git a/jdk/test/sun/nio/cs/TestMS5022X.java b/jdk/test/sun/nio/cs/TestMS5022X.java new file mode 100644 index 00000000000..e98e3d0df0f --- /dev/null +++ b/jdk/test/sun/nio/cs/TestMS5022X.java @@ -0,0 +1,750 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 6173388 6319716 + @summary Check full coverage encode/decode for Microsoft + ISO2022_JP variants MS50220, MS50221 and MSISO2022JP + */ + +import java.io.*; +import java.nio.charset.*; +public class TestMS5022X { + + private static String US_ASCII = + "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007" + + "\b\t\n\u000B\f\r" + + "\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017" + + "\u0018\u0019\u001A\u001C\u001D\u001E\u001F" + + "\u0020\u0021\"\u0023\u0024\u0025\u0026\'" + + "\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F" + + "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037" + + "\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F" + + "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047" + + "\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F" + + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057" + + "\u0058\u0059\u005A\u005B\\\u005D\u005E\u005F" + + "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067" + + "\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F" + + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077" + + "\u0078\u0079\u007A\u007B\u007C\u007D\u007E\u00A5\u203E"; + + // Subset of chars sourced from JISX0208:1983 + + private static String JISX0208SUBSET = + "\u3000\u3001\u3002\uFF0C\uFF0E\u30FB\uFF1A" + + "\uFF1B\uFF1F\uFF01\u309B\u309C\u00B4\uFF40\u00A8" + + "\uFF3E\uFFE3\uFF3F\u30FD\u30FE\u309D\u309E\u3003" + + "\u4EDD\u3005\u3006\u3007\u30FC\u2015\u2010\uFF0F" + //u2014->u2015 + "\uFF3C\u301C\u2016\uFF5C\u2026\u2025\u2018\u2019" + + "\u5C05\u5C07\u5C08\u5C0D\u5C13\u5C20\u5C22\u5C28" + + "\u5C38\u5C39\u5C41\u5C46\u5C4E\u5C53\u5C50\u5C4F" + + "\u5B71\u5C6C\u5C6E\u4E62\u5C76\u5C79\u5C8C\u5C91" + + "\u5C94\u599B\u5CAB\u5CBB\u5CB6\u5CBC\u5CB7\u5CC5" + + "\u5CBE\u5CC7\u5CD9\u5CE9\u5CFD\u5CFA\u5CED\u5D8C" + + "\u5CEA\u5D0B\u5D15\u5D17\u5D5C\u5D1F\u5D1B\u5D11" + + "\u5D14\u5D22\u5D1A\u5D19\u5D18\u5D4C\u5D52\u5D4E" + + "\u5D4B\u5D6C\u5D73\u5D76\u5D87\u5D84\u5D82\u5DA2" + + "\u5D9D\u5DAC\u5DAE\u5DBD\u5D90\u5DB7\u5DBC\u5DC9" + + "\u5DCD\u5DD3\u5DD2\u5DD6\u5DDB\u5DEB\u5DF2\u5DF5" + + "\u5E0B\u5E1A\u5E19\u5E11\u5E1B\u5E36\u5E37\u5E44" + + "\u5E43\u5E40\u5E4E\u5E57\u5E54\u5E5F\u5E62\u5E64" + + "\u5E47\u5E75\u5E76\u5E7A\u9EBC\u5E7F\u5EA0\u5EC1" + + "\u5EC2\u5EC8\u5ED0\u5ECF\u5ED6\u5EE3\u5EDD\u5EDA" + + "\u5EDB\u5EE2\u5EE1\u5EE8\u5EE9\u5EEC\u5EF1\u5EF3" + + "\u5EF0\u5EF4\u5EF8\u5EFE\u5F03\u5F09\u5F5D\u5F5C" + + "\u5F0B\u5F11\u5F16\u5F29\u5F2D\u5F38\u5F41\u5F48" + + "\u5F4C\u5F4E\u5F2F\u5F51\u5F56\u5F57\u5F59\u5F61" + + "\u5F6D\u5F73\u5F77\u5F83\u5F82\u5F7F\u5F8A\u5F88" + + "\u5F91\u5F87\u5F9E\u5F99\u5F98\u5FA0\u5FA8\u5FAD" + + "\u5FBC\u5FD6\u5FFB\u5FE4\u5FF8\u5FF1\u5FDD\u60B3" + + "\u5FFF\u6021\u6060\u6019\u6010\u6029\u600E\u6031" + + "\u62EE\u62F1\u6327\u6302\u6308\u62EF\u62F5\u6350" + + "\u633E\u634D\u641C\u634F\u6396\u638E\u6380\u63AB" + + "\u6376\u63A3\u638F\u6389\u639F\u63B5\u636B\u6369" + + "\u63BE\u63E9\u63C0\u63C6\u63E3\u63C9\u63D2\u63F6" + + "\u63C4\u6416\u6434\u6406\u6413\u6426\u6436\u651D" + + "\u6417\u6428\u640F\u6467\u646F\u6476\u644E\u652A" + + "\u6495\u6493\u64A5\u64A9\u6488\u64BC\u64DA\u64D2" + + "\u64C5\u64C7\u64BB\u64D8\u64C2\u64F1\u64E7\u8209" + + "\u64E0\u64E1\u62AC\u64E3\u64EF\u652C\u64F6\u64F4" + + "\u64F2\u64FA\u6500\u64FD\u6518\u651C\u6505\u6524" + + "\u6523\u652B\u6534\u6535\u6537\u6536\u6538\u754B" + + "\u6741\u6738\u6737\u6746\u675E\u6760\u6759\u6763" + + "\u6764\u6789\u6770\u67A9\u677C\u676A\u678C\u678B" + + "\u67A6\u67A1\u6785\u67B7\u67EF\u67B4\u67EC\u67B3" + + "\u67E9\u67B8\u67E4\u67DE\u67DD\u67E2\u67EE\u67B9" + + "\u67CE\u67C6\u67E7\u6A9C\u681E\u6846\u6829\u6840" + + "\u684D\u6832\u684E\u68B3\u682B\u6859\u6863\u6877" + + "\u687F\u689F\u688F\u68AD\u6894\u689D\u689B\u6883" + + "\u6AAE\u68B9\u6874\u68B5\u68A0\u68BA\u690F\u688D" + + "\u687E\u6901\u68CA\u6908\u68D8\u6922\u6926\u68E1" + + "\u690C\u68CD\u68D4\u68E7\u68D5\u6936\u6912\u6904" + + "\u68D7\u68E3\u6925\u68F9\u68E0\u68EF\u6928\u692A" + + "\u691A\u6923\u6921\u68C6\u6979\u6977\u695C\u6978" + + "\u6CD7\u6CC5\u6CDD\u6CAE\u6CB1\u6CBE\u6CBA\u6CDB" + + "\u6CEF\u6CD9\u6CEA\u6D1F\u884D\u6D36\u6D2B\u6D3D" + + "\u6D38\u6D19\u6D35\u6D33\u6D12\u6D0C\u6D63\u6D93" + + "\u6D64\u6D5A\u6D79\u6D59\u6D8E\u6D95\u6FE4\u6D85" + + "\u6DF9\u6E15\u6E0A\u6DB5\u6DC7\u6DE6\u6DB8\u6DC6" + + "\u6DEC\u6DDE\u6DCC\u6DE8\u6DD2\u6DC5\u6DFA\u6DD9" + + "\u724B\u7258\u7274\u727E\u7282\u7281\u7287\u7292" + + "\u7296\u72A2\u72A7\u72B9\u72B2\u72C3\u72C6\u72C4" + + "\u9D59\u9D72\u9D89\u9D87\u9DAB\u9D6F\u9D7A\u9D9A" + + "\u9DA4\u9DA9\u9DB2\u9DC4\u9DC1\u9DBB\u9DB8\u9DBA" + + "\u9DC6\u9DCF\u9DC2\u9DD9\u9DD3\u9DF8\u9DE6\u9DED" + + "\u9DEF\u9DFD\u9E1A\u9E1B\u9E1E\u9E75\u9E79\u9E7D" + + "\u9E81\u9E88\u9E8B\u9E8C\u9E92\u9E95\u9E91\u9E9D" + + "\u9EA5\u9EA9\u9EB8\u9EAA\u9EAD\u9761\u9ECC\u9ECE" + + "\u9ECF\u9ED0\u9ED4\u9EDC\u9EDE\u9EDD\u9EE0\u9EE5" + + "\u9EE8\u9EEF\u9EF4\u9EF6\u9EF7\u9EF9\u9EFB\u9EFC" + + "\u9EFD\u9F07\u9F08\u76B7\u9F15\u9F21\u9F2C\u9F3E" + + "\u9F4A\u9F52\u9F54\u9F63\u9F5F\u9F60\u9F61\u9F66" + + "\u9F67\u9F6C\u9F6A\u9F77\u9F72\u9F76\u9F95\u9F9C" + + "\u9FA0\u582F\u69C7\u9059\u7464\u51DC\u7199"; + + private static String JISX0201KATAKANA = + "\uFF61\uFF62\uFF63\uFF64" + + "\uFF65\uFF66\uFF67\uFF68\uFF69\uFF6A\uFF6B\uFF6C" + + "\uFF6D\uFF6E\uFF6F\uFF70\uFF71\uFF72\uFF73\uFF74" + + "\uFF75\uFF76\uFF77\uFF78\uFF79\uFF7A\uFF7B\uFF7C" + + "\uFF7D\uFF7E\uFF7F\uFF80\uFF81\uFF82\uFF83\uFF84" + + "\uFF85\uFF86\uFF87\uFF88\uFF89\uFF8A\uFF8B\uFF8C" + + "\uFF8D\uFF8E\uFF8F\uFF90\uFF91\uFF92\uFF93\uFF94" + + "\uFF95\uFF96\uFF97\uFF98\uFF99\uFF9A\uFF9B\uFF9C" + + "\uFF9D\uFF9E\uFF9F"; + + private static String JISX0208NECROW13 = + "\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467" + + "\u2468\u2469\u246A\u246B\u246C\u246D\u246E\u246F" + + "\u2470\u2471\u2472\u2473\u2160\u2161\u2162\u2163" + + "\u2164\u2165\u2166\u2167\u2168\u2169\u3349\u3314" + + "\u3322\u334D\u3318\u3327\u3303\u3336\u3351\u3357" + + "\u330D\u3326\u3323\u332B\u334A\u333B\u339C\u339D" + + "\u339E\u338E\u338F\u33C4\u33A1\u337B\u301E\u301F" + + "\u2116\u33CD\u2121\u32A4\u32A5\u32A6\u32A7\u32A8" + + "\u3231\u3232\u3239\u337E\u337D\u337C" + + "\u222e\u2211\u221f\u22bf"; + + private static byte[] expectedBytes_US_ASCII = { + (byte)0x0, (byte)0x1, (byte)0x2, (byte)0x3, + (byte)0x4, (byte)0x5, (byte)0x6, (byte)0x7, + (byte)0x8, (byte)0x9, (byte)0xa, (byte)0xb, + (byte)0xc, (byte)0xd, + (byte)0x10, (byte)0x11, (byte)0x12, (byte)0x13, + (byte)0x14, (byte)0x15, (byte)0x16, (byte)0x17, + (byte)0x18, (byte)0x19, (byte)0x1a, + (byte)0x1c, (byte)0x1d, (byte)0x1e, (byte)0x1f, + (byte)0x20, (byte)0x21, (byte)0x22, (byte)0x23, + (byte)0x24, (byte)0x25, (byte)0x26, (byte)0x27, + (byte)0x28, (byte)0x29, (byte)0x2a, (byte)0x2b, + (byte)0x2c, (byte)0x2d, (byte)0x2e, (byte)0x2f, + (byte)0x30, (byte)0x31, (byte)0x32, (byte)0x33, + (byte)0x34, (byte)0x35, (byte)0x36, (byte)0x37, + (byte)0x38, (byte)0x39, (byte)0x3a, (byte)0x3b, + (byte)0x3c, (byte)0x3d, (byte)0x3e, (byte)0x3f, + (byte)0x40, (byte)0x41, (byte)0x42, (byte)0x43, + (byte)0x44, (byte)0x45, (byte)0x46, (byte)0x47, + (byte)0x48, (byte)0x49, (byte)0x4a, (byte)0x4b, + (byte)0x4c, (byte)0x4d, (byte)0x4e, (byte)0x4f, + (byte)0x50, (byte)0x51, (byte)0x52, (byte)0x53, + (byte)0x54, (byte)0x55, (byte)0x56, (byte)0x57, + (byte)0x58, (byte)0x59, (byte)0x5a, (byte)0x5b, + (byte)0x5c, (byte)0x5d, (byte)0x5e, (byte)0x5f, + (byte)0x60, (byte)0x61, (byte)0x62, (byte)0x63, + (byte)0x64, (byte)0x65, (byte)0x66, (byte)0x67, + (byte)0x68, (byte)0x69, (byte)0x6a, (byte)0x6b, + (byte)0x6c, (byte)0x6d, (byte)0x6e, (byte)0x6f, + (byte)0x70, (byte)0x71, (byte)0x72, (byte)0x73, + (byte)0x74, (byte)0x75, (byte)0x76, (byte)0x77, + (byte)0x78, (byte)0x79, (byte)0x7a, (byte)0x7b, + (byte)0x7c, (byte)0x7d, (byte)0x7e, (byte)0x1b, + (byte)0x28, (byte)0x4a, (byte)0x5c, (byte)0x7e + }; + + private static byte[] expectedBytes_JISX0208SUBSET = + { + (byte)0x1b, (byte)0x24, (byte)0x42, (byte)0x21, + (byte)0x21, (byte)0x21, + (byte)0x22, (byte)0x21, (byte)0x23, (byte)0x21, + (byte)0x24, (byte)0x21, (byte)0x25, (byte)0x21, + (byte)0x26, (byte)0x21, (byte)0x27, (byte)0x21, + (byte)0x28, (byte)0x21, (byte)0x29, (byte)0x21, + (byte)0x2a, (byte)0x21, (byte)0x2b, (byte)0x21, + (byte)0x2c, (byte)0x21, (byte)0x2d, (byte)0x21, + (byte)0x2e, (byte)0x21, (byte)0x2f, (byte)0x21, + (byte)0x30, (byte)0x21, (byte)0x31, (byte)0x21, + (byte)0x32, (byte)0x21, (byte)0x33, (byte)0x21, + (byte)0x34, (byte)0x21, (byte)0x35, (byte)0x21, + (byte)0x36, (byte)0x21, (byte)0x37, (byte)0x21, + (byte)0x38, (byte)0x21, (byte)0x39, (byte)0x21, + (byte)0x3a, (byte)0x21, (byte)0x3b, (byte)0x21, + (byte)0x3c, (byte)0x21, (byte)0x3d, (byte)0x21, + (byte)0x3e, (byte)0x21, (byte)0x3f, (byte)0x21, + (byte)0x40, (byte)0x21, (byte)0x41, (byte)0x21, + (byte)0x42, (byte)0x21, (byte)0x43, (byte)0x21, + (byte)0x44, (byte)0x21, (byte)0x45, (byte)0x21, + (byte)0x46, (byte)0x21, (byte)0x47, (byte)0x55, + (byte)0x71, (byte)0x55, (byte)0x72, (byte)0x55, + (byte)0x73, (byte)0x55, (byte)0x74, (byte)0x55, + (byte)0x75, (byte)0x55, (byte)0x76, (byte)0x55, + (byte)0x77, (byte)0x55, (byte)0x78, (byte)0x55, + (byte)0x79, (byte)0x55, (byte)0x7a, (byte)0x55, + (byte)0x7b, (byte)0x55, (byte)0x7c, (byte)0x55, + (byte)0x7d, (byte)0x55, (byte)0x7e, (byte)0x56, + (byte)0x21, (byte)0x56, (byte)0x22, (byte)0x56, + (byte)0x23, (byte)0x56, (byte)0x24, (byte)0x56, + (byte)0x25, (byte)0x56, (byte)0x26, (byte)0x56, + (byte)0x27, (byte)0x56, (byte)0x28, (byte)0x56, + (byte)0x29, (byte)0x56, (byte)0x2a, (byte)0x56, + (byte)0x2b, (byte)0x56, (byte)0x2c, (byte)0x56, + (byte)0x2d, (byte)0x56, (byte)0x2e, (byte)0x56, + (byte)0x2f, (byte)0x56, (byte)0x30, (byte)0x56, + (byte)0x31, (byte)0x56, (byte)0x32, (byte)0x56, + (byte)0x33, (byte)0x56, (byte)0x34, (byte)0x56, + (byte)0x35, (byte)0x56, (byte)0x36, (byte)0x56, + (byte)0x37, (byte)0x56, (byte)0x38, (byte)0x56, + (byte)0x39, (byte)0x56, (byte)0x3a, (byte)0x56, + (byte)0x3b, (byte)0x56, (byte)0x3c, (byte)0x56, + (byte)0x3d, (byte)0x56, (byte)0x3e, (byte)0x56, + (byte)0x3f, (byte)0x56, (byte)0x40, (byte)0x56, + (byte)0x41, (byte)0x56, (byte)0x42, (byte)0x56, + (byte)0x43, (byte)0x56, (byte)0x44, (byte)0x56, + (byte)0x45, (byte)0x56, (byte)0x46, (byte)0x56, + (byte)0x47, (byte)0x56, (byte)0x48, (byte)0x56, + (byte)0x49, (byte)0x56, (byte)0x4a, (byte)0x56, + (byte)0x4b, (byte)0x56, (byte)0x4c, (byte)0x56, + (byte)0x4d, (byte)0x56, (byte)0x4e, (byte)0x56, + (byte)0x4f, (byte)0x56, (byte)0x50, (byte)0x56, + (byte)0x51, (byte)0x56, (byte)0x52, (byte)0x56, + (byte)0x53, (byte)0x56, (byte)0x54, (byte)0x56, + (byte)0x55, (byte)0x56, (byte)0x56, (byte)0x56, + (byte)0x57, (byte)0x56, (byte)0x58, (byte)0x56, + (byte)0x59, (byte)0x56, (byte)0x5a, (byte)0x56, + (byte)0x5b, (byte)0x56, (byte)0x5c, (byte)0x56, + (byte)0x5d, (byte)0x56, (byte)0x5e, (byte)0x56, + (byte)0x5f, (byte)0x56, (byte)0x60, (byte)0x56, + (byte)0x61, (byte)0x56, (byte)0x62, (byte)0x56, + (byte)0x63, (byte)0x56, (byte)0x64, (byte)0x56, + (byte)0x65, (byte)0x56, (byte)0x66, (byte)0x56, + (byte)0x67, (byte)0x56, (byte)0x68, (byte)0x56, + (byte)0x69, (byte)0x56, (byte)0x6a, (byte)0x56, + (byte)0x6b, (byte)0x56, (byte)0x6c, (byte)0x56, + (byte)0x6d, (byte)0x56, (byte)0x6e, (byte)0x56, + (byte)0x6f, (byte)0x56, (byte)0x70, (byte)0x56, + (byte)0x71, (byte)0x56, (byte)0x72, (byte)0x56, + (byte)0x73, (byte)0x56, (byte)0x74, (byte)0x56, + (byte)0x75, (byte)0x56, (byte)0x76, (byte)0x56, + (byte)0x77, (byte)0x56, (byte)0x78, (byte)0x56, + (byte)0x79, (byte)0x56, (byte)0x7a, (byte)0x56, + (byte)0x7b, (byte)0x56, (byte)0x7c, (byte)0x56, + (byte)0x7d, (byte)0x56, (byte)0x7e, (byte)0x57, + (byte)0x21, (byte)0x57, (byte)0x22, (byte)0x57, + (byte)0x23, (byte)0x57, (byte)0x24, (byte)0x57, + (byte)0x25, (byte)0x57, (byte)0x26, (byte)0x57, + (byte)0x27, (byte)0x57, (byte)0x28, (byte)0x57, + (byte)0x29, (byte)0x57, (byte)0x2a, (byte)0x57, + (byte)0x2b, (byte)0x57, (byte)0x2c, (byte)0x57, + (byte)0x2d, (byte)0x57, (byte)0x2e, (byte)0x57, + (byte)0x2f, (byte)0x57, (byte)0x30, (byte)0x57, + (byte)0x31, (byte)0x57, (byte)0x32, (byte)0x57, + (byte)0x33, (byte)0x57, (byte)0x34, (byte)0x57, + (byte)0x35, (byte)0x57, (byte)0x36, (byte)0x57, + (byte)0x37, (byte)0x57, (byte)0x38, (byte)0x57, + (byte)0x39, (byte)0x57, (byte)0x3a, (byte)0x57, + (byte)0x3b, (byte)0x57, (byte)0x3c, (byte)0x57, + (byte)0x3d, (byte)0x57, (byte)0x3e, (byte)0x57, + (byte)0x3f, (byte)0x57, (byte)0x40, (byte)0x57, + (byte)0x41, (byte)0x57, (byte)0x42, (byte)0x57, + (byte)0x43, (byte)0x57, (byte)0x44, (byte)0x57, + (byte)0x45, (byte)0x57, (byte)0x46, (byte)0x57, + (byte)0x47, (byte)0x57, (byte)0x48, (byte)0x57, + (byte)0x49, (byte)0x57, (byte)0x4a, (byte)0x57, + (byte)0x4b, (byte)0x57, (byte)0x4c, (byte)0x57, + (byte)0x4d, (byte)0x57, (byte)0x4e, (byte)0x57, + (byte)0x4f, (byte)0x57, (byte)0x50, (byte)0x57, + (byte)0x51, (byte)0x57, (byte)0x52, (byte)0x57, + (byte)0x53, (byte)0x57, (byte)0x54, (byte)0x57, + (byte)0x55, (byte)0x57, (byte)0x56, (byte)0x57, + (byte)0x57, (byte)0x57, (byte)0x58, (byte)0x57, + (byte)0x59, (byte)0x57, (byte)0x5a, (byte)0x57, + (byte)0x5b, (byte)0x57, (byte)0x5c, (byte)0x57, + (byte)0x5d, (byte)0x57, (byte)0x5e, (byte)0x57, + (byte)0x5f, (byte)0x57, (byte)0x60, (byte)0x57, + (byte)0x61, (byte)0x57, (byte)0x62, (byte)0x57, + (byte)0x63, (byte)0x57, (byte)0x64, (byte)0x59, + (byte)0x49, (byte)0x59, (byte)0x4a, (byte)0x59, + (byte)0x4b, (byte)0x59, (byte)0x4c, (byte)0x59, + (byte)0x4d, (byte)0x59, (byte)0x4e, (byte)0x59, + (byte)0x4f, (byte)0x59, (byte)0x50, (byte)0x59, + (byte)0x51, (byte)0x59, (byte)0x52, (byte)0x59, + (byte)0x53, (byte)0x59, (byte)0x54, (byte)0x59, + (byte)0x55, (byte)0x59, (byte)0x56, (byte)0x59, + (byte)0x57, (byte)0x59, (byte)0x58, (byte)0x59, + (byte)0x59, (byte)0x59, (byte)0x5a, (byte)0x59, + (byte)0x5b, (byte)0x59, (byte)0x5c, (byte)0x59, + (byte)0x5d, (byte)0x59, (byte)0x5e, (byte)0x59, + (byte)0x5f, (byte)0x59, (byte)0x60, (byte)0x59, + (byte)0x61, (byte)0x59, (byte)0x62, (byte)0x59, + (byte)0x63, (byte)0x59, (byte)0x64, (byte)0x59, + (byte)0x65, (byte)0x59, (byte)0x66, (byte)0x59, + (byte)0x67, (byte)0x59, (byte)0x68, (byte)0x59, + (byte)0x69, (byte)0x59, (byte)0x6a, (byte)0x59, + (byte)0x6b, (byte)0x59, (byte)0x6c, (byte)0x59, + (byte)0x6d, (byte)0x59, (byte)0x6e, (byte)0x59, + (byte)0x6f, (byte)0x59, (byte)0x70, (byte)0x59, + (byte)0x71, (byte)0x59, (byte)0x72, (byte)0x59, + (byte)0x73, (byte)0x59, (byte)0x74, (byte)0x59, + (byte)0x75, (byte)0x59, (byte)0x76, (byte)0x59, + (byte)0x77, (byte)0x59, (byte)0x78, (byte)0x59, + (byte)0x79, (byte)0x59, (byte)0x7a, (byte)0x59, + (byte)0x7b, (byte)0x59, (byte)0x7c, (byte)0x59, + (byte)0x7d, (byte)0x59, (byte)0x7e, (byte)0x5a, + (byte)0x21, (byte)0x5a, (byte)0x22, (byte)0x5a, + (byte)0x23, (byte)0x5a, (byte)0x24, (byte)0x5a, + (byte)0x25, (byte)0x5a, (byte)0x26, (byte)0x5a, + (byte)0x27, (byte)0x5a, (byte)0x28, (byte)0x5a, + (byte)0x29, (byte)0x5a, (byte)0x2a, (byte)0x5a, + (byte)0x2b, (byte)0x5a, (byte)0x2c, (byte)0x5a, + (byte)0x2d, (byte)0x5a, (byte)0x2e, (byte)0x5a, + (byte)0x2f, (byte)0x5a, (byte)0x30, (byte)0x5a, + (byte)0x31, (byte)0x5a, (byte)0x32, (byte)0x5a, + (byte)0x33, (byte)0x5a, (byte)0x34, (byte)0x5a, + (byte)0x35, (byte)0x5a, (byte)0x36, (byte)0x5a, + (byte)0x37, (byte)0x5a, (byte)0x38, (byte)0x5a, + (byte)0x39, (byte)0x5a, (byte)0x3a, (byte)0x5a, + (byte)0x3b, (byte)0x5a, (byte)0x3c, (byte)0x5a, + (byte)0x3d, (byte)0x5a, (byte)0x3e, (byte)0x5a, + (byte)0x3f, (byte)0x5a, (byte)0x40, (byte)0x5a, + (byte)0x41, (byte)0x5a, (byte)0x42, (byte)0x5b, + (byte)0x35, (byte)0x5b, (byte)0x36, (byte)0x5b, + (byte)0x37, (byte)0x5b, (byte)0x38, (byte)0x5b, + (byte)0x39, (byte)0x5b, (byte)0x3a, (byte)0x5b, + (byte)0x3b, (byte)0x5b, (byte)0x3c, (byte)0x5b, + (byte)0x3d, (byte)0x5b, (byte)0x3e, (byte)0x5b, + (byte)0x3f, (byte)0x5b, (byte)0x40, (byte)0x5b, + (byte)0x41, (byte)0x5b, (byte)0x42, (byte)0x5b, + (byte)0x43, (byte)0x5b, (byte)0x44, (byte)0x5b, + (byte)0x45, (byte)0x5b, (byte)0x46, (byte)0x5b, + (byte)0x47, (byte)0x5b, (byte)0x48, (byte)0x5b, + (byte)0x49, (byte)0x5b, (byte)0x4a, (byte)0x5b, + (byte)0x4b, (byte)0x5b, (byte)0x4c, (byte)0x5b, + (byte)0x4d, (byte)0x5b, (byte)0x4e, (byte)0x5b, + (byte)0x4f, (byte)0x5b, (byte)0x50, (byte)0x5b, + (byte)0x51, (byte)0x5b, (byte)0x52, (byte)0x5b, + (byte)0x53, (byte)0x5b, (byte)0x54, (byte)0x5b, + (byte)0x55, (byte)0x5b, (byte)0x56, (byte)0x5b, + (byte)0x57, (byte)0x5b, (byte)0x58, (byte)0x5b, + (byte)0x59, (byte)0x5b, (byte)0x5a, (byte)0x5b, + (byte)0x5b, (byte)0x5b, (byte)0x5c, (byte)0x5b, + (byte)0x5d, (byte)0x5b, (byte)0x5e, (byte)0x5b, + (byte)0x5f, (byte)0x5b, (byte)0x60, (byte)0x5b, + (byte)0x61, (byte)0x5b, (byte)0x62, (byte)0x5b, + (byte)0x63, (byte)0x5b, (byte)0x64, (byte)0x5b, + (byte)0x65, (byte)0x5b, (byte)0x66, (byte)0x5b, + (byte)0x67, (byte)0x5b, (byte)0x68, (byte)0x5b, + (byte)0x69, (byte)0x5b, (byte)0x6a, (byte)0x5b, + (byte)0x6b, (byte)0x5b, (byte)0x6c, (byte)0x5b, + (byte)0x6d, (byte)0x5b, (byte)0x6e, (byte)0x5b, + (byte)0x6f, (byte)0x5b, (byte)0x70, (byte)0x5b, + (byte)0x71, (byte)0x5b, (byte)0x72, (byte)0x5b, + (byte)0x73, (byte)0x5b, (byte)0x74, (byte)0x5b, + (byte)0x75, (byte)0x5b, (byte)0x76, (byte)0x5b, + (byte)0x77, (byte)0x5b, (byte)0x78, (byte)0x5b, + (byte)0x79, (byte)0x5b, (byte)0x7a, (byte)0x5b, + (byte)0x7b, (byte)0x5b, (byte)0x7c, (byte)0x5b, + (byte)0x7d, (byte)0x5b, (byte)0x7e, (byte)0x5c, + (byte)0x21, (byte)0x5c, (byte)0x22, (byte)0x5c, + (byte)0x23, (byte)0x5c, (byte)0x24, (byte)0x5c, + (byte)0x25, (byte)0x5c, (byte)0x26, (byte)0x5c, + (byte)0x27, (byte)0x5c, (byte)0x28, (byte)0x5c, + (byte)0x29, (byte)0x5c, (byte)0x2a, (byte)0x5c, + (byte)0x2b, (byte)0x5c, (byte)0x2c, (byte)0x5c, + (byte)0x2d, (byte)0x5c, (byte)0x2e, (byte)0x5c, + (byte)0x2f, (byte)0x5c, (byte)0x30, (byte)0x5c, + (byte)0x31, (byte)0x5c, (byte)0x32, (byte)0x5c, + (byte)0x33, (byte)0x5c, (byte)0x34, (byte)0x5c, + (byte)0x35, (byte)0x5c, (byte)0x36, (byte)0x5d, + (byte)0x79, (byte)0x5d, (byte)0x7a, (byte)0x5d, + (byte)0x7b, (byte)0x5d, (byte)0x7c, (byte)0x5d, + (byte)0x7d, (byte)0x5d, (byte)0x7e, (byte)0x5e, + (byte)0x21, (byte)0x5e, (byte)0x22, (byte)0x5e, + (byte)0x23, (byte)0x5e, (byte)0x24, (byte)0x5e, + (byte)0x25, (byte)0x5e, (byte)0x26, (byte)0x5e, + (byte)0x27, (byte)0x5e, (byte)0x28, (byte)0x5e, + (byte)0x29, (byte)0x5e, (byte)0x2a, (byte)0x5e, + (byte)0x2b, (byte)0x5e, (byte)0x2c, (byte)0x5e, + (byte)0x2d, (byte)0x5e, (byte)0x2e, (byte)0x5e, + (byte)0x2f, (byte)0x5e, (byte)0x30, (byte)0x5e, + (byte)0x31, (byte)0x5e, (byte)0x32, (byte)0x5e, + (byte)0x33, (byte)0x5e, (byte)0x34, (byte)0x5e, + (byte)0x35, (byte)0x5e, (byte)0x36, (byte)0x5e, + (byte)0x37, (byte)0x5e, (byte)0x38, (byte)0x5e, + (byte)0x39, (byte)0x5e, (byte)0x3a, (byte)0x5e, + (byte)0x3b, (byte)0x5e, (byte)0x3c, (byte)0x5e, + (byte)0x3d, (byte)0x5e, (byte)0x3e, (byte)0x5e, + (byte)0x3f, (byte)0x5e, (byte)0x40, (byte)0x5e, + (byte)0x41, (byte)0x5e, (byte)0x42, (byte)0x5e, + (byte)0x43, (byte)0x5e, (byte)0x44, (byte)0x5e, + (byte)0x45, (byte)0x5e, (byte)0x46, (byte)0x5e, + (byte)0x47, (byte)0x5e, (byte)0x48, (byte)0x5e, + (byte)0x49, (byte)0x5e, (byte)0x4a, (byte)0x60, + (byte)0x30, (byte)0x60, (byte)0x31, (byte)0x60, + (byte)0x32, (byte)0x60, (byte)0x33, (byte)0x60, + (byte)0x34, (byte)0x60, (byte)0x35, (byte)0x60, + (byte)0x36, (byte)0x60, (byte)0x37, (byte)0x60, + (byte)0x38, (byte)0x60, (byte)0x39, (byte)0x60, + (byte)0x3a, (byte)0x60, (byte)0x3b, (byte)0x60, + (byte)0x3c, (byte)0x60, (byte)0x3d, (byte)0x60, + (byte)0x3e, (byte)0x60, (byte)0x3f, (byte)0x73, + (byte)0x26, (byte)0x73, (byte)0x27, (byte)0x73, + (byte)0x28, (byte)0x73, (byte)0x29, (byte)0x73, + (byte)0x2a, (byte)0x73, (byte)0x2b, (byte)0x73, + (byte)0x2c, (byte)0x73, (byte)0x2d, (byte)0x73, + (byte)0x2e, (byte)0x73, (byte)0x2f, (byte)0x73, + (byte)0x30, (byte)0x73, (byte)0x31, (byte)0x73, + (byte)0x32, (byte)0x73, (byte)0x33, (byte)0x73, + (byte)0x34, (byte)0x73, (byte)0x35, (byte)0x73, + (byte)0x36, (byte)0x73, (byte)0x37, (byte)0x73, + (byte)0x38, (byte)0x73, (byte)0x39, (byte)0x73, + (byte)0x3a, (byte)0x73, (byte)0x3b, (byte)0x73, + (byte)0x3c, (byte)0x73, (byte)0x3d, (byte)0x73, + (byte)0x3e, (byte)0x73, (byte)0x3f, (byte)0x73, + (byte)0x40, (byte)0x73, (byte)0x41, (byte)0x73, + (byte)0x42, (byte)0x73, (byte)0x43, (byte)0x73, + (byte)0x44, (byte)0x73, (byte)0x45, (byte)0x73, + (byte)0x46, (byte)0x73, (byte)0x47, (byte)0x73, + (byte)0x48, (byte)0x73, (byte)0x49, (byte)0x73, + (byte)0x4a, (byte)0x73, (byte)0x4b, (byte)0x73, + (byte)0x4c, (byte)0x73, (byte)0x4d, (byte)0x73, + (byte)0x4e, (byte)0x73, (byte)0x4f, (byte)0x73, + (byte)0x50, (byte)0x73, (byte)0x51, (byte)0x73, + (byte)0x52, (byte)0x73, (byte)0x53, (byte)0x73, + (byte)0x54, (byte)0x73, (byte)0x55, (byte)0x73, + (byte)0x56, (byte)0x73, (byte)0x57, (byte)0x73, + (byte)0x58, (byte)0x73, (byte)0x59, (byte)0x73, + (byte)0x5a, (byte)0x73, (byte)0x5b, (byte)0x73, + (byte)0x5c, (byte)0x73, (byte)0x5d, (byte)0x73, + (byte)0x5e, (byte)0x73, (byte)0x5f, (byte)0x73, + (byte)0x60, (byte)0x73, (byte)0x61, (byte)0x73, + (byte)0x62, (byte)0x73, (byte)0x63, (byte)0x73, + (byte)0x64, (byte)0x73, (byte)0x65, (byte)0x73, + (byte)0x66, (byte)0x73, (byte)0x67, (byte)0x73, + (byte)0x68, (byte)0x73, (byte)0x69, (byte)0x73, + (byte)0x6a, (byte)0x73, (byte)0x6b, (byte)0x73, + (byte)0x6c, (byte)0x73, (byte)0x6d, (byte)0x73, + (byte)0x6e, (byte)0x73, (byte)0x6f, (byte)0x73, + (byte)0x70, (byte)0x73, (byte)0x71, (byte)0x73, + (byte)0x72, (byte)0x73, (byte)0x73, (byte)0x73, + (byte)0x74, (byte)0x73, (byte)0x75, (byte)0x73, + (byte)0x76, (byte)0x73, (byte)0x77, (byte)0x73, + (byte)0x78, (byte)0x73, (byte)0x79, (byte)0x73, + (byte)0x7a, (byte)0x73, (byte)0x7b, (byte)0x73, + (byte)0x7c, (byte)0x73, (byte)0x7d, (byte)0x73, + (byte)0x7e, (byte)0x74, (byte)0x21, (byte)0x74, + (byte)0x22, (byte)0x74, (byte)0x23, (byte)0x74, + (byte)0x24, (byte)0x74, (byte)0x25, (byte)0x74, + (byte)0x26 + }; + + private static byte[] expectedBytes_JISX0201KATAKANA1 = + { + (byte)0x1b, (byte)0x28, (byte)0x49, + (byte)0x21, (byte)0x22, (byte)0x23, (byte)0x24, + (byte)0x25, (byte)0x26, (byte)0x27, (byte)0x28, + (byte)0x29, (byte)0x2a, (byte)0x2b, (byte)0x2c, + (byte)0x2d, (byte)0x2e, (byte)0x2f, (byte)0x30, + (byte)0x31, (byte)0x32, (byte)0x33, (byte)0x34, + (byte)0x35, (byte)0x36, (byte)0x37, (byte)0x38, + (byte)0x39, (byte)0x3a, (byte)0x3b, (byte)0x3c, + (byte)0x3d, (byte)0x3e, (byte)0x3f, (byte)0x40, + (byte)0x41, (byte)0x42, (byte)0x43, (byte)0x44, + (byte)0x45, (byte)0x46, (byte)0x47, (byte)0x48, + (byte)0x49, (byte)0x4a, (byte)0x4b, (byte)0x4c, + (byte)0x4d, (byte)0x4e, (byte)0x4f, (byte)0x50, + (byte)0x51, (byte)0x52, (byte)0x53, (byte)0x54, + (byte)0x55, (byte)0x56, (byte)0x57, (byte)0x58, + (byte)0x59, (byte)0x5a, (byte)0x5b, (byte)0x5c, + (byte)0x5d, (byte)0x5e, (byte)0x5f + }; + + private static byte[] expectedBytes_JISX0201KATAKANA2 = + { + (byte)0x1b, (byte)0x24, (byte)0x42, + (byte)0x21, (byte)0x23, (byte)0x21, (byte)0x56, + (byte)0x21, (byte)0x57, (byte)0x21, (byte)0x22, + (byte)0x21, (byte)0x26, (byte)0x25, (byte)0x72, + (byte)0x25, (byte)0x21, (byte)0x25, (byte)0x23, + (byte)0x25, (byte)0x25, (byte)0x25, (byte)0x27, + (byte)0x25, (byte)0x29, (byte)0x25, (byte)0x63, + (byte)0x25, (byte)0x65, (byte)0x25, (byte)0x67, + (byte)0x25, (byte)0x43, (byte)0x21, (byte)0x3c, + (byte)0x25, (byte)0x22, (byte)0x25, (byte)0x24, + (byte)0x25, (byte)0x26, (byte)0x25, (byte)0x28, + (byte)0x25, (byte)0x2a, (byte)0x25, (byte)0x2b, + (byte)0x25, (byte)0x2d, (byte)0x25, (byte)0x2f, + (byte)0x25, (byte)0x31, (byte)0x25, (byte)0x33, + (byte)0x25, (byte)0x35, (byte)0x25, (byte)0x37, + (byte)0x25, (byte)0x39, (byte)0x25, (byte)0x3b, + (byte)0x25, (byte)0x3d, (byte)0x25, (byte)0x3f, + (byte)0x25, (byte)0x41, (byte)0x25, (byte)0x44, + (byte)0x25, (byte)0x46, (byte)0x25, (byte)0x48, + (byte)0x25, (byte)0x4a, (byte)0x25, (byte)0x4b, + (byte)0x25, (byte)0x4c, (byte)0x25, (byte)0x4d, + (byte)0x25, (byte)0x4e, (byte)0x25, (byte)0x4f, + (byte)0x25, (byte)0x52, (byte)0x25, (byte)0x55, + (byte)0x25, (byte)0x58, (byte)0x25, (byte)0x5b, + (byte)0x25, (byte)0x5e, (byte)0x25, (byte)0x5f, + (byte)0x25, (byte)0x60, (byte)0x25, (byte)0x61, + (byte)0x25, (byte)0x62, (byte)0x25, (byte)0x64, + (byte)0x25, (byte)0x66, (byte)0x25, (byte)0x68, + (byte)0x25, (byte)0x69, (byte)0x25, (byte)0x6a, + (byte)0x25, (byte)0x6b, (byte)0x25, (byte)0x6c, + (byte)0x25, (byte)0x6d, (byte)0x25, (byte)0x6f, + (byte)0x25, (byte)0x73, (byte)0x21, (byte)0x2b, + (byte)0x21, (byte)0x2c, + (byte)0x1b, (byte)0x28, (byte)0x42 + }; + + private static byte[] expectedBytes_JISX0208NECROW13 = + { + (byte)0x1b, (byte)0x24, (byte)0x42, + (byte)0x2d, (byte)0x21, (byte)0x2d, (byte)0x22, + (byte)0x2d, (byte)0x23, (byte)0x2d, (byte)0x24, + (byte)0x2d, (byte)0x25, (byte)0x2d, (byte)0x26, + (byte)0x2d, (byte)0x27, (byte)0x2d, (byte)0x28, + (byte)0x2d, (byte)0x29, (byte)0x2d, (byte)0x2a, + (byte)0x2d, (byte)0x2b, (byte)0x2d, (byte)0x2c, + (byte)0x2d, (byte)0x2d, (byte)0x2d, (byte)0x2e, + (byte)0x2d, (byte)0x2f, (byte)0x2d, (byte)0x30, + (byte)0x2d, (byte)0x31, (byte)0x2d, (byte)0x32, + (byte)0x2d, (byte)0x33, (byte)0x2d, (byte)0x34, + (byte)0x2d, (byte)0x35, (byte)0x2d, (byte)0x36, + (byte)0x2d, (byte)0x37, (byte)0x2d, (byte)0x38, + (byte)0x2d, (byte)0x39, (byte)0x2d, (byte)0x3a, + (byte)0x2d, (byte)0x3b, (byte)0x2d, (byte)0x3c, + (byte)0x2d, (byte)0x3d, (byte)0x2d, (byte)0x3e, + (byte)0x2d, (byte)0x40, (byte)0x2d, (byte)0x41, + (byte)0x2d, (byte)0x42, (byte)0x2d, (byte)0x43, + (byte)0x2d, (byte)0x44, (byte)0x2d, (byte)0x45, + (byte)0x2d, (byte)0x46, (byte)0x2d, (byte)0x47, + (byte)0x2d, (byte)0x48, (byte)0x2d, (byte)0x49, + (byte)0x2d, (byte)0x4a, (byte)0x2d, (byte)0x4b, + (byte)0x2d, (byte)0x4c, (byte)0x2d, (byte)0x4d, + (byte)0x2d, (byte)0x4e, (byte)0x2d, (byte)0x4f, + (byte)0x2d, (byte)0x50, (byte)0x2d, (byte)0x51, + (byte)0x2d, (byte)0x52, (byte)0x2d, (byte)0x53, + (byte)0x2d, (byte)0x54, (byte)0x2d, (byte)0x55, + (byte)0x2d, (byte)0x56, (byte)0x2d, (byte)0x5f, + (byte)0x2d, (byte)0x60, (byte)0x2d, (byte)0x61, + (byte)0x2d, (byte)0x62, (byte)0x2d, (byte)0x63, + (byte)0x2d, (byte)0x64, (byte)0x2d, (byte)0x65, + (byte)0x2d, (byte)0x66, (byte)0x2d, (byte)0x67, + (byte)0x2d, (byte)0x68, (byte)0x2d, (byte)0x69, + (byte)0x2d, (byte)0x6a, (byte)0x2d, (byte)0x6b, + (byte)0x2d, (byte)0x6c, (byte)0x2d, (byte)0x6d, + (byte)0x2d, (byte)0x6e, (byte)0x2d, (byte)0x6f, + (byte)0x2d, (byte)0x73, (byte)0x2d, (byte)0x74, + (byte)0x2d, (byte)0x78, (byte)0x2d, (byte)0x79, + (byte)0x1b, (byte)0x28, (byte)0x42 + }; + + + private static String MIXEDCONTENT = + "JA\u3000\u3002\u0062\uFF64PAN" + + "\uFF0C\uFF0E\u00A5\uFF65\uFF66X\u203E" + + "\u30FB\uFF67\u203E"; + + static byte[] mixedBytesExpected = { + (byte)0x4a, (byte)0x41, (byte)0x1b, (byte)0x24, + (byte)0x42, (byte)0x21, (byte)0x21, (byte)0x21, + (byte)0x23, (byte)0x1b, (byte)0x28, (byte)0x42, + (byte)0x62, (byte)0x1b, (byte)0x28, (byte)0x49, + (byte)0x24, (byte)0x1b, (byte)0x28, (byte)0x42, + (byte)0x50, (byte)0x41, (byte)0x4e, (byte)0x1b, + (byte)0x24, (byte)0x42, (byte)0x21, (byte)0x24, + (byte)0x21, (byte)0x25, (byte)0x1b, (byte)0x28, + (byte)0x4a, (byte)0x5c, (byte)0x1b, (byte)0x28, + (byte)0x49, (byte)0x25, (byte)0x26, (byte)0x1b, + (byte)0x28, (byte)0x42, (byte)0x58, (byte)0x1b, + (byte)0x28, (byte)0x4a, (byte)0x7e, (byte)0x1b, + (byte)0x24, (byte)0x42, (byte)0x21, (byte)0x26, + (byte)0x1b, (byte)0x28, (byte)0x49, (byte)0x27, + (byte)0x1b, (byte)0x28, (byte)0x4a, (byte)0x7e, + (byte)0x1b, (byte)0x28, (byte)0x42 }; + + private static byte[] repeatingEscapes = { + (byte)0x4a, (byte)0x41, (byte)0x1b, (byte)0x24, + (byte)0x42, (byte)0x1b, (byte)0x24, (byte)0x42, + (byte)0x21, (byte)0x21, (byte)0x21, + (byte)0x23, (byte)0x1b, (byte)0x28, (byte)0x42, + // embedded repeated iso-2022 escapes (see bugID 4879522) + (byte)0x1b, (byte)0x28, (byte)0x42, + (byte)0x62, (byte)0x1b, (byte)0x28, (byte)0x49, + (byte)0x0f, (byte)0x0e, (byte)0x0f, + (byte)0x1b, (byte)0x28, (byte)0x49, + (byte)0x24, (byte)0x1b, (byte)0x28, (byte)0x42, + (byte)0x50, (byte)0x41, (byte)0x4e, + // embedded shift chars (see bugID 4879522) + (byte)0x0e, (byte)0x0f, + (byte)0x1b, + (byte)0x24, (byte)0x42, (byte)0x21, (byte)0x24, + (byte)0x21, (byte)0x25, (byte)0x1b, (byte)0x28, + (byte)0x4a, (byte)0x5c, (byte)0x1b, (byte)0x28, + (byte)0x49, (byte)0x25, (byte)0x26, (byte)0x1b, + (byte)0x28, (byte)0x42, (byte)0x58, (byte)0x1b, + (byte)0x28, (byte)0x4a, (byte)0x7e, (byte)0x1b, + (byte)0x24, (byte)0x42, (byte)0x21, (byte)0x26, + (byte)0x1b, (byte)0x28, (byte)0x49, (byte)0x27, + (byte)0x1b, (byte)0x28, (byte)0x4a, (byte)0x7e, + (byte)0x1b, (byte)0x28, (byte)0x42 }; + + private static String JISX0212 = + "\u02d8\u6896\ue757"; + + private static byte[] expectedBytes_JISX0212 = { + (byte)0x1b, (byte)0x24, (byte)0x28, (byte)0x44, + (byte)0x22, (byte)0x2f, (byte)0x43, (byte)0x6f, + (byte)0x7e, (byte)0x7e, + (byte)0x1b, (byte)0x28, (byte)0x42 + }; + + /* + * Tests the roundtrip integrity and expected encoding + * correctness for a String containing a substantial + * subset of MS5022X encodeable chars + */ + + private static void roundTrip(String name, + String testStr, + byte[] expectBytes) + throws Exception { + byte[] encodedBytes = testStr.getBytes(name); + if (encodedBytes.length != expectBytes.length) { + //System.out.printf("l1=%d, l2=%d\n", + // encodedBytes.length,expectBytes.length); + throw new Exception(name + " Encoder error"); + } + for (int i = 0; i < expectBytes.length; i++) { + + if (encodedBytes[i] != expectBytes[i]) { + //System.out.printf("--->"); + //throw new Exception(name + " Encoder error"); + } + //System.out.printf("%x, %x\n", + //encodedBytes[i],expectBytes[i]); + } + String decoded = new String(encodedBytes, name); + if (!decoded.equals(testStr)) { + throw new Exception(name + " Decoder error"); + } + String decoded2 = new String(repeatingEscapes, name); + if (!decoded2.equals(MIXEDCONTENT)) { + throw new Exception(name + " Decoder error"); + } + } + + public static void main(String[] args) throws Exception { + String map = System.getProperty("sun.nio.cs.map"); + if (map != null) { + map = map.toLowerCase(java.util.Locale.US); + Charset cs = Charset.forName("ISO-2022-JP"); + if (map.indexOf("x-windows-50221/ISO-2022-jp") != -1 && + !"x-windows-50220".equals(cs.name()) || + map.indexOf("x-windows-50220/ISO-2022-jp") != -1 && + !"x-windows-50220".equals(cs.name()) || + map.indexOf("x-windows-iso2022jp/ISO-2022-jp") != -1 && + !"x-windows-iso2022jp".equals(cs.name())) { + throw new Exception("Error: sun.nio.cs.map=" + map + + ", ISO-2022-JP=" + cs.name()); + } else { + System.out.printf("ISO-2022-JP=%s\n", cs.name()); + } + } + + String testStr = US_ASCII + + JISX0208SUBSET + + JISX0201KATAKANA + + JISX0208NECROW13; + + byte[] expectedBytes= (new String(expectedBytes_US_ASCII, "ASCII") + + new String(expectedBytes_JISX0208SUBSET, "ASCII") + + new String(expectedBytes_JISX0201KATAKANA1, "ASCII") + + new String(expectedBytes_JISX0208NECROW13, "ASCII")). + getBytes("ASCII"); + + //MS50221 + roundTrip("MS50221", testStr, expectedBytes); + roundTrip("MS50221", JISX0212, expectedBytes_JISX0212); + + //MS50220 without halfwidth kana + roundTrip("MS50220", + US_ASCII + JISX0208SUBSET + JISX0208NECROW13, + (new String(expectedBytes_US_ASCII, "ASCII") + + new String(expectedBytes_JISX0208SUBSET, "ASCII") + + new String(expectedBytes_JISX0208NECROW13, + 3, + expectedBytes_JISX0208NECROW13.length - 3, + "ASCII")).getBytes("ASCII")); + roundTrip("MS50220", JISX0212, expectedBytes_JISX0212); + + // Try MS50220 with halfwidth kana encoding + byte[] encodedBytes = JISX0201KATAKANA.getBytes("MS50220"); + if (encodedBytes.length != expectedBytes_JISX0201KATAKANA2.length) { + throw new Exception("MS50220 Encoder error"); + } + for (int i = 0; i < expectedBytes_JISX0201KATAKANA2.length; i++) { + if (encodedBytes[i] != expectedBytes_JISX0201KATAKANA2[i]) { + throw new Exception("MS50220 Encoder error"); + } + } + + //x-windows-iso2022jp + testStr = testStr.replace('\u301E', '\u301D') + .replace('\u301C', '\uFF4E') + .replace('\u2016', '\u2225'); + roundTrip("x-windows-iso2022jp", + testStr, + expectedBytes); + + testStr = MIXEDCONTENT; + roundTrip("MS50221", testStr , mixedBytesExpected); + + // Test for bugID 4913711 + // ISO-2022-JP encoding of a single input char yields + // 8 output bytes. Prior to fix for 4913711 the + // max bytes per char value was underspecified as 5.0 + // and the code below would have thrown a BufferOverflow + // exception. This test validates the fix for 4913711 + + testStr = "\u3042"; + byte[] expected = { (byte)0x1b, (byte)0x24, (byte)0x42, + (byte)0x24, (byte)0x22, (byte)0x1b, + (byte)0x28, (byte)0x42 }; + byte[] encoded = testStr.getBytes("MS50221"); + for (int i = 0; i < expected.length; i++) { + if (encoded[i] != expected[i]) + throw new Exception("MS50221 Decoder error"); + } + } +} diff --git a/jdk/test/sun/nio/cs/TestMiscEUC_JP.java b/jdk/test/sun/nio/cs/TestMiscEUC_JP.java new file mode 100644 index 00000000000..5611280e935 --- /dev/null +++ b/jdk/test/sun/nio/cs/TestMiscEUC_JP.java @@ -0,0 +1,62 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 4121376 + @summary Verify that EUC_JP 0x8FA2B7 maps to \uFF5E + */ + +import java.nio.*; +import java.nio.charset.*; + +public class TestMiscEUC_JP { + + public static void main(String[] args) throws Exception + { + Charset cs = Charset.forName("EUC_JP"); + CharsetDecoder dec = cs.newDecoder(); + CharsetEncoder enc = cs.newEncoder(); + byte[] euc = {(byte)0x8F, (byte)0xA2, (byte)0xB7}; + + CharBuffer cb = dec.decode(ByteBuffer.wrap(euc)); + if (cb.charAt(0) != 0xFF5E) { + throw new Exception("Converted EUC_JP 0x8FA2B7 to: 0x" + + Integer.toHexString((int)cb.charAt(0))); + } + ByteBuffer bb = enc.encode(cb); + + if (!((bb.limit() == 3) + && (bb.get() == euc[0]) + && (bb.get() == euc[1]) + && (bb.get() == euc[2]))) { + cb.flip(); + bb.flip(); + throw new Exception("Roundrip failed for char 0x" + + Integer.toHexString((int)cb.charAt(0)) + ": " + + Integer.toHexString(bb.limit()) + " 0x" + + Integer.toHexString((int)bb.get() & 0xff) + " " + + Integer.toHexString((int)bb.get() & 0xff) + " " + + Integer.toHexString((int)bb.get() & 0xff)); + } + } +} diff --git a/jdk/test/sun/nio/cs/TestSJIS0213.java b/jdk/test/sun/nio/cs/TestSJIS0213.java new file mode 100644 index 00000000000..db27ac0ff92 --- /dev/null +++ b/jdk/test/sun/nio/cs/TestSJIS0213.java @@ -0,0 +1,116 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 6529796 6710199 + @summary Test SJIS/MS932_0213 charsets + */ + +import java.util.Arrays; + +public class TestSJIS0213 { + private static String sjisStr = "\u2014\u301C\u2016\u2212\u00A2\u00A3\u00AC"; + private static String winStr = "\u2015\uFF5E\u2225\uFF0D\uFFE0\uFFE1\uFFE2\u2252\u2261\u222B\u2211\u221A\u22A5\u2220\u2235\u2229\u222A"; + + private static String compStr = "\u304B\u309A\u304D\u309A\u304F\u309A\u3051\u309A\u3053\u309A\u30AB\u309A\u30AD\u309A\u30AF\u309A\u30B1\u309A\u30B3\u309A\u30BB\u309A\u30C4\u309A\u30C8\u309A\u31F7\u309A\u00E6\u0300\u0254\u0300\u0254\u0301\u028C\u0300\u028C\u0301\u0259\u0300\u0259\u0301\u025A\u0300\u025A\u0301\u02E9\u02E5\u02E5\u02E9"; + private static byte[] compBytes = new byte[] { + (byte)0x82, (byte)0xf5, + (byte)0x82, (byte)0xf6, + (byte)0x82, (byte)0xf7, + (byte)0x82, (byte)0xf8, + (byte)0x82, (byte)0xf9, + (byte)0x83, (byte)0x97, + (byte)0x83, (byte)0x98, + (byte)0x83, (byte)0x99, + (byte)0x83, (byte)0x9a, + (byte)0x83, (byte)0x9b, + (byte)0x83, (byte)0x9c, + (byte)0x83, (byte)0x9d, + (byte)0x83, (byte)0x9e, + (byte)0x83, (byte)0xf6, + (byte)0x86, (byte)0x63, + (byte)0x86, (byte)0x67, + (byte)0x86, (byte)0x68, + (byte)0x86, (byte)0x69, + (byte)0x86, (byte)0x6a, + (byte)0x86, (byte)0x6b, + (byte)0x86, (byte)0x6c, + (byte)0x86, (byte)0x6d, + (byte)0x86, (byte)0x6e, + (byte)0x86, (byte)0x85, + (byte)0x86, (byte)0x86 }; + + private static String mixedStr = "\u002B\u0041\u007a\uff61\uff9f\u3000\u30a1\u4e00\u304B\u309A\u304b"; + private static byte[] mixedBytes = new byte[] { + (byte)0x2b, + (byte)0x41, (byte)0x7a, + (byte)0xa1, (byte)0xdf, + (byte)0x81, (byte)0x40, + (byte)0x83, (byte)0x40, + (byte)0x88, (byte)0xea, + (byte)0x82, (byte)0xf5, // composite + (byte)0x82, (byte)0xa9 }; // base without cc + + //base + base + cc + private static String mixedCompStr = "\u304D\u304B\u309A"; + private static byte[] mixedCompBytes = new byte[] { + (byte)0x82, (byte)0xab, (byte)0x82, (byte)0xf5}; + + private static char[] unmappableChars = new char[] { + 0x80, 0xfffc, 0xfffd}; + + private static byte[] unmappableBytes = new byte[] { + 0x3f, 0x3f, 0x3f}; + + public static void main(String[] args) throws Exception { + if (!winStr.equals(new String(winStr.getBytes("MS932"), "MS932_0213"))) + throw new RuntimeException("MS932_0213 failed on special codepoints!"); + + if (!(Arrays.equals(compStr.getBytes("MS932_0213"), compBytes)) || + !compStr.equals(new String(compBytes, "MS932_0213"))) + throw new RuntimeException("MS932_0213 failed on composites!"); + + if (!(Arrays.equals(mixedStr.getBytes("MS932_0213"), mixedBytes)) || + !mixedStr.equals(new String(mixedBytes, "MS932_0213"))) + throw new RuntimeException("MS932_0213 failed on mixed!"); + + if (!sjisStr.equals(new String(sjisStr.getBytes("SJIS"), "SJIS_0213"))) + throw new RuntimeException("SJIS_0213 failed on special codepoints!"); + + if (!(Arrays.equals(compStr.getBytes("SJIS_0213"), compBytes)) || + !compStr.equals(new String(compBytes, "SJIS_0213"))) + throw new RuntimeException("SJIS_0213 failed on composites!"); + + if (!(Arrays.equals(mixedStr.getBytes("SJIS_0213"), mixedBytes)) || + !mixedStr.equals(new String(mixedBytes, "SJIS_0213"))) + throw new RuntimeException("SJIS_0213 failed on mixed!"); + + if (!(Arrays.equals(mixedCompStr.getBytes("SJIS_0213"), mixedCompBytes)) || + !mixedCompStr.equals(new String(mixedCompBytes, "SJIS_0213"))) + throw new RuntimeException("SJIS_0213 failed on mixedComp!"); + + if (!Arrays.equals(new String(unmappableChars).getBytes("SJIS_0213"), unmappableBytes) || + !Arrays.equals(new String(unmappableChars).getBytes("MS932_0213"), unmappableBytes)) + throw new RuntimeException("SJIS/MS932_0213 failed on unmappable encoding!"); + } +} diff --git a/jdk/test/sun/nio/cs/TestTrailingEscapesISO2022JP.java b/jdk/test/sun/nio/cs/TestTrailingEscapesISO2022JP.java new file mode 100644 index 00000000000..f83f75fc24a --- /dev/null +++ b/jdk/test/sun/nio/cs/TestTrailingEscapesISO2022JP.java @@ -0,0 +1,65 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 4697605 4741233 + @summary Check decoder behaves correctly in ISO2022_JP + */ + +import java.io.*; + +public class TestTrailingEscapesISO2022JP { + + public static void main(String[] args) throws Exception { + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + int len; + + InputStream in = + new FileInputStream(new File(System.getProperty("test.src", "."), + "ISO2022JP.trailEsc")); + try { + byte[] b = new byte[4096]; + while ( ( len = in.read( b, 0, b.length ) ) != -1 ) { + out.write(b, 0, len); + } + } finally { + in.close(); + } + + Reader inR = new InputStreamReader(new ByteArrayInputStream( + out.toByteArray()), + "iso-2022-jp"); + + try { + char[] c = new char[4096]; + while ( ( len = inR.read( c, 0, c.length ) ) != -1 ) { + System.out.println(len); + if (len == 0) + throw new Exception("Read returned zero!"); + } + } finally { + inR.close(); + } + } +} diff --git a/jdk/test/sun/nio/cs/TestUTF8BOM.java b/jdk/test/sun/nio/cs/TestUTF8BOM.java new file mode 100644 index 00000000000..dd40c53f26f --- /dev/null +++ b/jdk/test/sun/nio/cs/TestUTF8BOM.java @@ -0,0 +1,92 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 4508058 6378911 + @summary Check if UTF8 decoder handles BOM correctly + */ + +import java.io.IOException; +import java.nio.BufferOverflowException; +import java.nio.*; +import java.nio.charset.*; + +/* The fix for 6378911 is to backout the change we made for 4508058, + so this regtest is modified accordingly to leave the beginning + BOM untouched during decoding. + */ +public class TestUTF8BOM { + private static ByteBuffer bf = ByteBuffer.allocateDirect(1000); + private static void testDecode(String expected, byte[] input) + throws Exception + { + String out = new String(input, "utf8"); + if (!out.equals(expected)) { + failureReport (out, expected); + throw new Exception("UTF_8 Decoding test failed"); + } + + //try directBuffer. + bf.clear(); + bf.put(input).flip(); + out = Charset.forName("UTF-8") + .decode(bf) + .toString(); + if (!out.equals(expected)) { + failureReport (out, expected); + throw new Exception("UTF_8 Decoding test failed(directbuffer)"); + } + } + + private static void failureReport(String testStr, + String expected) { + + System.err.println ("Expected Characters:"); + for (int i = 0; i < expected.length() ; i++) { + System.out.println("expected char[" + i + "] : " + + Integer.toHexString((int)expected.charAt(i)) + + " obtained char[" + i + "] : " + + Integer.toHexString((int)testStr.charAt(i))); + } + } + + public static void main (String[] args) throws Exception { + // Test 1: with BOM at beginning + testDecode("\ufeff\u0092\u0093", + new byte[] { (byte) 0xef, (byte) 0xbb, (byte) 0xbf, + (byte) 0xc2, (byte) 0x92, + (byte) 0xc2, (byte) 0x93 }); + // Test 2: with BOM at middle + testDecode("\u9200\ufeff\u9300", + new byte[] { (byte) 0xe9, (byte) 0x88, (byte) 0x80, + (byte) 0xef, (byte) 0xbb, (byte) 0xbf, + (byte) 0xe9, (byte) 0x8c, (byte) 0x80 }); + + // Test 3: with BOM at end + testDecode("\u9200\u9300\ufeff", + new byte[] { (byte) 0xe9, (byte) 0x88, (byte) 0x80, + (byte) 0xe9, (byte) 0x8c, (byte) 0x80, + (byte) 0xef, (byte) 0xbb, (byte) 0xbf }); + System.err.println ("\nPASSED UTF-8 decode BOM test"); + } +} diff --git a/jdk/test/sun/nio/cs/TestUTF_16.java b/jdk/test/sun/nio/cs/TestUTF_16.java new file mode 100644 index 00000000000..3e1b91ae7da --- /dev/null +++ b/jdk/test/sun/nio/cs/TestUTF_16.java @@ -0,0 +1,196 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 4403848 6348426 6407730 + @summary Check correctness of the UTF-16 converter in all its flavors + */ + +import java.io.IOException; +import java.nio.BufferOverflowException; +import java.nio.*; +import java.nio.charset.*; + +public class TestUTF_16 { + + private static void testDecode(String charset, + String expected, + byte[] input) + throws Exception + { + String out = new String(input, charset); + if (!out.equals(expected)) { + failureReport (out, expected); + throw new Exception("UTF_16 Decoding test failed " + charset); + } + } + + private static void testEncode(String charset, + String input, + byte[] expected) + throws Exception + { + byte[] testBytes = input.getBytes(charset); + for (int i = 0; i< expected.length; i++) + if (testBytes[i] != expected[i]) + throw new Exception("UTF_16 Encoding test failed " + charset); + + } + + private static void warn(String s) { + System.err.println("FAILED Test 4403848 UTF-16" + + s) ; + } + + private static void failureReport(String testStr, + String expected) { + + System.err.println ("Expected Characters:"); + for (int i = 0; i < expected.length() ; i++) { + warn("expected char[" + i + "] : " + + Integer.toHexString((int)expected.charAt(i)) + + "obtained char[" + i + "] : " + + Integer.toHexString((int)testStr.charAt(i))); + } + } + + /* + private static void checkResult(char[] expected, + String testStr, + String testName) + throws Exception + { + if (testStr.length() != expected.length) + failureReport(testStr, expected); + + for (int i = 0; i < testStr.length(); i++) { + if (testStr.charAt(i) != expected[i]) { + failureReport(testStr, expected); + throw new Exception ("REGTEST TestUTF16 failed: " + + testName); + } + } + System.err.println ("Test " + testName + " PASSED"); + return; + } + */ + + private static void test() throws Exception { + + // Tests: Check decoding of UTF-16. + // Ensures correct endian polarity + // of the decoders and appropriate + // interpretation of BOM bytes where + // they are required. + + // Test 1: BigEndian UTF-16 Decoding + + testDecode("UTF_16BE", "\u0092\u0093", + new byte[] { (byte) 0x00, (byte) 0x92, + (byte) 0x00, (byte) 0x93 }); + + // Test 1a: BigEndian UTF-16 Decoding. BOM bytes provided. + testDecode("UTF_16BE", "\ufeff\u0092\u0093", + new byte[] { (byte) 0xfe, (byte) 0xff, + (byte) 0x00, (byte) 0x92, + (byte) 0x00, (byte) 0x93 }); + + testDecode("UTF_16LE", "\u9200\u9300", + new byte[] { (byte) 0x00, (byte) 0x92, + (byte) 0x00, (byte) 0x93 }); + + // Test 2a: LittleEndian UTF-16 Decoding, BOM bytes provided. + testDecode("UTF_16LE", "\ufeff\u9200\u9300", + new byte[] { (byte) 0xff, (byte) 0xfe, + (byte) 0x00, (byte) 0x92, + (byte) 0x00, (byte) 0x93 }); + + // Test 3: UTF-16 (with mandatory byte order mark) Decoding + + testDecode("UTF-16", "\u9200\u9300", + new byte[] { (byte) 0xfe, (byte) 0xff, + (byte) 0x92, (byte) 0x00, + (byte) 0x93, (byte) 0x00 }); + + + // Test 3a: UTF-16 BOM omitted. This should decode OK. + testDecode("UTF-16", "\u9200\u9300", + new byte[] { (byte) 0x92, (byte) 0x00, + (byte) 0x93, (byte) 0x00 }); + + + // Test 4: encoding using UTF-16 + // BOM must be emitted when encoding and must be BigEndian. + + testEncode("UTF-16", "\u0123", + new byte[] { (byte) 0xfe, (byte) 0xff, + (byte) 0x01, (byte) 0x23 }); + + // Test 5: + if (CoderResult.OVERFLOW != + Charset.forName("UTF_16") + .newDecoder() + .decode((ByteBuffer)(ByteBuffer.allocate(4) + .put(new byte[] + {(byte)0xd8,(byte)0x00, + (byte)0xdc,(byte)0x01}) + .flip()), + CharBuffer.allocate(1), + true)) { + throw new Exception ("REGTEST TestUTF16 Overflow test failed"); + } + + // Test 6: decoding using UTF_16LE_BOM/UnicodeLittle + // UnicodeLittle should accept non-BOM byte sequence + + testDecode("UnicodeLittle", "Arial", + new byte[] { 'A', 0, 'r', 0, 'i', 0, 'a', 0, 'l', 0}); + + System.err.println ("\nPASSED UTF-16 encoder test"); + + // Reversed BOM in middle of stream Negative test. + + /* + boolean caughtException = false; + try { + String out = new String(new byte[] {(byte)0x00, + (byte)0x92, + (byte)0xff, + (byte)0xfe}, + "UTF-16"); + } catch (IOException e) { caughtException = true; } + + if (caughtException == false) + throw new Exception ("Incorrectly parsed BOM in middle of input"); + */ + + // Fixed included with bug 4403848 fixes buffer sizing + // issue due to non provision of additional 2 bytes + // headroom for initial BOM bytes for UTF-16 encoding. + System.err.println ("OVERALL PASS OF UTF-16 Test"); + } + + public static void main (String[] args) throws Exception { + test(); + } +} diff --git a/jdk/test/sun/nio/cs/TestUTF_32.java b/jdk/test/sun/nio/cs/TestUTF_32.java new file mode 100644 index 00000000000..a9ccf061cee --- /dev/null +++ b/jdk/test/sun/nio/cs/TestUTF_32.java @@ -0,0 +1,197 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + @bug 6346419 + @summary Check correctness of the UTF-32 and its variant charsets + */ + +import java.io.*; +import java.nio.*; +import java.nio.charset.*; + +public class TestUTF_32 { + private static void testDecode(String charset, + String expected, + byte[] input) + throws Exception + { + String out = new String(input, charset); + if (!out.equals(expected)) { + failureReport (out, expected); + throw new Exception("UTF_32 Decoding test failed: " + charset); + } + } + + private static void testEncode(String charset, + String input, + byte[] expected) + throws Exception + { + byte[] testBytes = input.getBytes(charset); + for (int i = 0; i< expected.length; i++) + if (testBytes[i] != expected[i]) + throw new Exception("UTF_32 Encoding test failed: [" + i + "]"+ charset); + + } + + private static void warn(String s) { + System.err.println("FAILED Test UTF-32:" + + s) ; + } + + private static void failureReport(String testStr, + String expected) { + System.err.println ("Expected Characters:"); + for (int i = 0; i < expected.length() ; i++) { + warn("expected char[" + i + "] : " + + Integer.toHexString((int)expected.charAt(i)) + + "obtained char[" + i + "] : " + + Integer.toHexString((int)testStr.charAt(i))); + } + } + + private static void writeInt(OutputStream os, int i, boolean isBig) + throws Exception + { + if (isBig) { + os.write((i>>24) & 0xff); + os.write((i>>16) & 0xff); + os.write((i>>8) & 0xff); + os.write(i & 0xff); + } else { + os.write(i & 0xff); + os.write((i>>8) & 0xff); + os.write((i>>16) & 0xff); + os.write((i>>24) & 0xff); + } + } + + private static byte[] getBytes(boolean doBOM, boolean isBig) + throws Exception + { + ByteArrayOutputStream baos = new ByteArrayOutputStream(1024*1024); + if (doBOM) + writeInt(baos, 0xfeff, isBig); + + for (int i = 0; i < 0xffff; i++) { + if (i < Character.MIN_SURROGATE || + i > Character.MAX_SURROGATE) + writeInt(baos, i, isBig); + } + for (int i = 0x10000; i < 0x1ffff; i++) { + writeInt(baos, i, isBig); + } + + for (int i = 0x100000; i < 0x10ffff; i++) { + writeInt(baos, i, isBig); + } + byte[] bb = baos.toByteArray(); + baos.close(); + return bb; + } + + public static void main (String[] args) throws Exception { + byte[] bb; + String s; + + // Test 1: UTF_32 BigEndian + bb = getBytes(false, true); + s = new String(bb, "UTF-32"); + testDecode("UTF_32", s, bb); + testEncode("UTF_32", s, bb); + + // Test 2: UTF_32 LittleEndian Decoding With BOM and + // BigEndian Encoding + bb = getBytes(true, false); + s = new String(bb, "UTF-32"); + bb = getBytes(false, true); + testDecode("UTF_32", s, bb); + testEncode("UTF_32", s, bb); + + + // Test 3: UTF_32BE + bb = getBytes(false, true); + s = new String(bb, "UTF-32BE"); + testDecode("UTF_32BE", s, bb); + testEncode("UTF_32BE", s, bb); + + + // Test 4: UTF_32LE + bb = getBytes(false, false); + s = new String(bb, "UTF-32LE"); + testDecode("UTF_32LE", s, bb); + testEncode("UTF_32LE", s, bb); + + // Test 5: UTF_32BE_BOM + bb = getBytes(true, true); + s = new String(bb, "UTF-32BE-BOM"); + testDecode("UTF_32BE_BOM", s, bb); + testEncode("UTF_32BE_BOM", s, bb); + + + // Test 6: UTF_32LE_BOM + bb = getBytes(true, false); + s = new String(bb, "UTF-32LE-BOM"); + testDecode("UTF_32LE_BOM", s, bb); + testEncode("UTF_32LE_BOM", s, bb); + + s = "\u4e00\ufffd\u4e01"; + // Test 7: BigEndian with reverse BOM in middle + bb = new byte[] { + (byte)0x00,(byte)0x00,(byte)0x4e,(byte)0x00, + (byte)0xff,(byte)0xfe,(byte)0x00,(byte)0x00, + (byte)0x00,(byte)0x00,(byte)0x4e,(byte)0x01 + }; + if (!s.equals(new String(bb, "UTF_32")) || + !s.equals(new String(bb, "UTF_32BE")) || + !s.equals(new String(bb, "UTF_32BE_BOM"))) + throw new Exception("UTF_32 Decoding test failed: "); + + // Test 7: LittleEndian with reverse BOM in middle + bb = new byte[] { + (byte)0xff,(byte)0xfe,(byte)0x00,(byte)0x00, + (byte)0x00,(byte)0x4e,(byte)0x00,(byte)0x00, + (byte)0x00,(byte)0x00,(byte)0xfe,(byte)0xff, + (byte)0x01,(byte)0x4e,(byte)0x00,(byte)0x00 + }; + if (!s.equals(new String(bb, "UTF_32")) || + !s.equals(new String(bb, "UTF_32LE")) || + !s.equals(new String(bb, "UTF_32LE_BOM"))) + throw new Exception("UTF_32 Decoding test failed: "); + + // Test 8: Overflow + if (CoderResult.OVERFLOW != + Charset.forName("UTF_32") + .newDecoder() + .decode((ByteBuffer)(ByteBuffer.allocate(4) + .put(new byte[] + {(byte)0,(byte)1, (byte)0,(byte)01}) + .flip()), + CharBuffer.allocate(1), + true)) { + throw new Exception ("Test UTF-32 Overflow test failed"); + } + System.err.println ("OVERALL PASS OF UTF-32 Test"); + } +} diff --git a/jdk/test/sun/nio/cs/TestUni2HKSCS.java b/jdk/test/sun/nio/cs/TestUni2HKSCS.java new file mode 100644 index 00000000000..08a8a13db55 --- /dev/null +++ b/jdk/test/sun/nio/cs/TestUni2HKSCS.java @@ -0,0 +1,327 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 4634811 + @summary Check Unicode 2.1 --> Big5-HKSCS reverse compatible mappings + */ + +/* + * Mappings sourced from www.info.gov.hk/digital21/eng/hkscs + */ + +public class TestUni2HKSCS { + private static final String uni21String = + "\uF3F5\uF3F8\uF3FD\uF403\uF413\uF415\uF418\uF419\uF41A"+ + "\uF424\uF426\uF428\uF42B\uF42C\uF42D\uF437\uF439"+ + "\uF43A\uF43C\uF445\uF44A\uF44E\uF44F\uF464\uF468"+ + "\uF46A\uF46B\uF473\uF47A\uF487\uF489\uF493\uF494"+ + "\uF496\uF49D\uF4A2\uF4AB\uF4AC\uF4AE\uF4B5\uF4C6"+ + "\uF4CB\uF4D6\uF4E1\uF4FA\uF502\uF504\uF51E\uF529"+ + "\uF52D\uF52E\uF530\uF536\uF540\uF544\uF554\uF637"+ + "\uF638\uF63B\uF63C\uF641\uF642\uF643\uF644\uF648"+ + "\uF64C\uF651\uF653\uF658\uF65D\uF65F\uF662\uF664"+ + "\uF666\uF669\uF66C\uF66D\uF66E\uF675\uF677\uF67C"+ + "\uF67E\uF688\uF68D\uF69D\uF6A1\uF6A2\uF6A5\uF6A7"+ + "\uF6AE\uF6AF\uE316\uE326\uE32A\uE33C\uE351\uE35E"+ + "\uE368\uE376\uE378\uE387\uE39C\uE3AD\uE3B3\uE3BE"+ + "\uE3C2\uE3C7\uE3CB\uE3D1\uE3D2\uE3DE\uE3E2\uE3E4"+ + "\uE3E8\uE3EA\uE3F5\uE3F7\uE406\uE40E\uE427\uE437"+ + "\uE43D\uE449\uE44F\uE460\uE46B\uE47A\uE493\uE4A0"+ + "\uE4A5\uE4A9\uE4B2\uE4BE\uE4BF\uE4C0\uE4DE\uE4E3"+ + "\uE4E5\uE4ED\uE4F7\uE500\uE507\uE50E\uE534\uE539"+ + "\uE53A\uE53B\uE53D\uE541\uE553\uE569\uE574\uE578"+ + "\uE57B\uE57F\uE591\uE596\uE597\uE598\uE59C\uE5AE"+ + "\uE5B9\uE5BC\uE5E0\uE5EC\uE5F5\uE5FA\uE5FE\uE60C"+ + "\uE61D\uE629\uE62D\uE639\uE63B\uE63D\uE651\uE664"+ + "\uE675\uE681\uE682\uE68D\uE694\uE69D\uE6A0\uE6A4"+ + "\uE6A9\uE6AB\uE6B6\uE6C8\uE6E2\uE6E3\uE6E8\uE6ED"+ + "\uE6EF\uE6F1\uE6F4\uE6F8\uE6FD\uE6FE\uE700\uE712"+ + "\uE716\uE719\uE726\uE72E\uE730\uE738\uE73A\uE73B"+ + "\uE749\uE74C\uE760\uE776\uE77E\uE780\uE78F\uE7AA"+ + "\uE7AC\uE7AD\uE7AE\uE7C0\uE7C1\uE7C7\uE7CB\uE7D0"+ + "\uE7D5\uE7D9\uE7E6\uE7EA\uE7F0\uE7F6\uE7FA\uE806"+ + "\uE815\uE81B\uE81D\uE822\uE824\uE82E\uE831\uE832"+ + "\uE83D\uE83F\uE850\uE853\uE85F\uE86B\uE86D\uE876"+ + "\uE880\uE88E\uE899\uE89B\uE89C\uE8B3\uE8B7\uE8BC"+ + "\uE8D2\uE8E2\uE8E4\uE8EC\uE8EE\uE8F4\uE8F6\uE8F7"+ + "\uE8F9\uE8FA\uE8FD\uE901\uE906\uE90B\uE90E\uE90F"+ + "\uE910\uE911\uE912\uE915\uE91B\uE931\uE932\uE946"+ + "\uE949\uE965\uE96C\uE979\uE98D\uE994\uE996\uE99C"+ + "\uE99D\uE99E\uE99F\uE9A1\uE9A2\uE9A7\uE9AA\uE9AC"+ + "\uE9AE\uE9B5\uE9B7\uE9B9\uE9BA\uE9BC\uE9BD\uE9C5"+ + "\uE9CF\uE9D0\uE9D6\uE9D8\uE9DB\uE9DE\uE9E5\uE9E6"+ + "\uE9E9\uE9EB\uE9F7\uE9FE\uEA03\uEA0A\uEA0B\uEA0F"+ + "\uEA13\uEA15\uEA1B\uEA21\uEA2A\uEA31\uEA35\uEA3C"+ + "\uEA3D\uEA4C\uEA4F\uEA57\uEA63\uEA66\uEA75\uEA76"+ + "\uEA7D\uEA82\uEA85\uEA87\uEA89\uEA8D\uEA90\uEA9B"+ + "\uEA9D\uEAA6\uEAA8\uEAC8\uEAF7\uEB17\uEB51\uEB52"+ + "\uEB60\uEB66\uEB6A\uEB87\uEB8B\uEB92\uEB96\uEBB1"+ + "\uEBC3\uEBD6\uEBE0\uEBE6\uEBEA\uEBFF\uEC00\uEC03"+ + "\uEC0B\uEC0D\uEC16\uEC3D\uEC4A\uEC4D\uEC53\uEC55"+ + "\uEC61\uEC77\uEC7C\uEC7F\uEC87\uEC8C\uEC8F\uEC97"+ + "\uECAE\uECB0\uECD0\uECD5\uECF4\uED05\uED1B\uED1F"+ + "\uED23\uED33\uED37\uED38\uED3A\uED44\uED48\uED4C"+ + "\uED59\uED5C\uED5D\uED5E\uED64\uED66\uED6D\uED6F"+ + "\uED7B\uEDAE\uEDC1\uEDF3\uEDF5\uEE2E\uEE43\uEE45"+ + "\uEE4A\uEE53\uEE59\uEE65\uEE89\uEE93\uEE97\uEE9F"+ + "\uEEB2\uF6DD\uF820\uF821\uF822\uF823\uF824\uF825"+ + "\uF826\uF827\uF828\uF829\uF82A\uF82B\uF82C\uF82D"+ + "\uF82E\uF82F\uF830\uF831\uF832\uF833\uF834\uF835"+ + "\uF836\uF837\uF838\uF839\uF83A\uF83B\uE005\uE008"+ + "\uE028\uE02B\uE043\uE06A\uE06B\uE06E\uE07E\uE086"+ + "\uE098\uE09B\uE0A0\uE0A8\uE0BB\uE0C2\uE0CD\uE0D7"+ + "\uE0DA\uE0F1\uE0F4\uE0FA\uE0FC\uE104\uE105\uE10E"+ + "\uE117\uE125\uE12A\uE12B\uE13C\uE143\uE144\uE153"+ + "\uE15E\uE15F\uE160\uE164\uE17E\uE18C\uE19A\uE19C"+ + "\uE1A7\uE1A9\uE1C6\uE1CF\uE1E0\uE1E1\uE1E3\uE1E7"+ + "\uE1EA\uE1F4\uE1F8\uE203\uE211\uE217\uE218\uE239"+ + "\uE23F\uE243\uE246\uE25D\uE25E\uE281\uE28A\uE298"+ + "\uE2A2\uE2AC\uE2B1\uE2C8\uE2D7\uE30D"; + + private static final byte[] expectedBytes = + {(byte)0x89,(byte)0xb7,(byte)0x89,(byte)0xba,(byte)0x89, + (byte)0xbf,(byte)0x89,(byte)0xc5,(byte)0x89,(byte)0xd5, + (byte)0x89,(byte)0xd7,(byte)0x89,(byte)0xda,(byte)0x89, + (byte)0xdb,(byte)0x89,(byte)0xdc,(byte)0x89,(byte)0xe6, + (byte)0x89,(byte)0xe8,(byte)0x89,(byte)0xea,(byte)0x89, + (byte)0xed,(byte)0x89,(byte)0xee,(byte)0x89,(byte)0xef, + (byte)0x89,(byte)0xf9,(byte)0x89,(byte)0xfb,(byte)0x89, + (byte)0xfc,(byte)0x89,(byte)0xfe,(byte)0x8a,(byte)0x48, + (byte)0x8a,(byte)0x4d,(byte)0x8a,(byte)0x51,(byte)0x8a, + (byte)0x52,(byte)0x8a,(byte)0x67,(byte)0x8a,(byte)0x6b, + (byte)0x8a,(byte)0x6d,(byte)0x8a,(byte)0x6e,(byte)0x8a, + (byte)0x76,(byte)0x8a,(byte)0x7d,(byte)0x8a,(byte)0xac, + (byte)0x8a,(byte)0xae,(byte)0x8a,(byte)0xb8,(byte)0x8a, + (byte)0xb9,(byte)0x8a,(byte)0xbb,(byte)0x8a,(byte)0xc2, + (byte)0x8a,(byte)0xc7,(byte)0x8a,(byte)0xd0,(byte)0x8a, + (byte)0xd1,(byte)0x8a,(byte)0xd3,(byte)0x8a,(byte)0xda, + (byte)0x8a,(byte)0xeb,(byte)0x8a,(byte)0xf0,(byte)0x8a, + (byte)0xfb,(byte)0x8b,(byte)0x47,(byte)0x8b,(byte)0x60, + (byte)0x8b,(byte)0x68,(byte)0x8b,(byte)0x6a,(byte)0x8b, + (byte)0xa6,(byte)0x8b,(byte)0xb1,(byte)0x8b,(byte)0xb5, + (byte)0x8b,(byte)0xb6,(byte)0x8b,(byte)0xb8,(byte)0x8b, + (byte)0xbe,(byte)0x8b,(byte)0xc8,(byte)0x8b,(byte)0xcc, + (byte)0x8b,(byte)0xdc,(byte)0x8d,(byte)0x63,(byte)0x8d, + (byte)0x64,(byte)0x8d,(byte)0x67,(byte)0x8d,(byte)0x68, + (byte)0x8d,(byte)0x6d,(byte)0x8d,(byte)0x6e,(byte)0x8d, + (byte)0x6f,(byte)0x8d,(byte)0x70,(byte)0x8d,(byte)0x74, + (byte)0x8d,(byte)0x78,(byte)0x8d,(byte)0x7d,(byte)0x8d, + (byte)0xa1,(byte)0x8d,(byte)0xa6,(byte)0x8d,(byte)0xab, + (byte)0x8d,(byte)0xad,(byte)0x8d,(byte)0xb0,(byte)0x8d, + (byte)0xb2,(byte)0x8d,(byte)0xb4,(byte)0x8d,(byte)0xb7, + (byte)0x8d,(byte)0xba,(byte)0x8d,(byte)0xbb,(byte)0x8d, + (byte)0xbc,(byte)0x8d,(byte)0xc3,(byte)0x8d,(byte)0xc5, + (byte)0x8d,(byte)0xca,(byte)0x8d,(byte)0xcc,(byte)0x8d, + (byte)0xd6,(byte)0x8d,(byte)0xdb,(byte)0x8d,(byte)0xeb, + (byte)0x8d,(byte)0xef,(byte)0x8d,(byte)0xf0,(byte)0x8d, + (byte)0xf3,(byte)0x8d,(byte)0xf5,(byte)0x8d,(byte)0xfc, + (byte)0x8d,(byte)0xfd,(byte)0x8e,(byte)0x45,(byte)0x8e, + (byte)0x55,(byte)0x8e,(byte)0x59,(byte)0x8e,(byte)0x6b, + (byte)0x8e,(byte)0xa2,(byte)0x8e,(byte)0xaf,(byte)0x8e, + (byte)0xb9,(byte)0x8e,(byte)0xc7,(byte)0x8e,(byte)0xc9, + (byte)0x8e,(byte)0xd8,(byte)0x8e,(byte)0xed,(byte)0x8e, + (byte)0xfe,(byte)0x8f,(byte)0x45,(byte)0x8f,(byte)0x50, + (byte)0x8f,(byte)0x54,(byte)0x8f,(byte)0x59,(byte)0x8f, + (byte)0x5d,(byte)0x8f,(byte)0x63,(byte)0x8f,(byte)0x64, + (byte)0x8f,(byte)0x70,(byte)0x8f,(byte)0x74,(byte)0x8f, + (byte)0x76,(byte)0x8f,(byte)0x7a,(byte)0x8f,(byte)0x7c, + (byte)0x8f,(byte)0xa9,(byte)0x8f,(byte)0xab,(byte)0x8f, + (byte)0xba,(byte)0x8f,(byte)0xc2,(byte)0x8f,(byte)0xdb, + (byte)0x8f,(byte)0xeb,(byte)0x8f,(byte)0xf1,(byte)0x8f, + (byte)0xfd,(byte)0x90,(byte)0x44,(byte)0x90,(byte)0x55, + (byte)0x90,(byte)0x60,(byte)0x90,(byte)0x6f,(byte)0x90, + (byte)0xaa,(byte)0x90,(byte)0xb7,(byte)0x90,(byte)0xbc, + (byte)0x90,(byte)0xc0,(byte)0x90,(byte)0xc9,(byte)0x90, + (byte)0xd5,(byte)0x90,(byte)0xd6,(byte)0x90,(byte)0xd7, + (byte)0x90,(byte)0xf5,(byte)0x90,(byte)0xfa,(byte)0x90, + (byte)0xfc,(byte)0x91,(byte)0x45,(byte)0x91,(byte)0x4f, + (byte)0x91,(byte)0x58,(byte)0x91,(byte)0x5f,(byte)0x91, + (byte)0x66,(byte)0x91,(byte)0xae,(byte)0x91,(byte)0xb3, + (byte)0x91,(byte)0xb4,(byte)0x91,(byte)0xb5,(byte)0x91, + (byte)0xb7,(byte)0x91,(byte)0xbb,(byte)0x91,(byte)0xcd, + (byte)0x91,(byte)0xe3,(byte)0x91,(byte)0xee,(byte)0x91, + (byte)0xf2,(byte)0x91,(byte)0xf5,(byte)0x91,(byte)0xf9, + (byte)0x92,(byte)0x4c,(byte)0x92,(byte)0x51,(byte)0x92, + (byte)0x52,(byte)0x92,(byte)0x53,(byte)0x92,(byte)0x57, + (byte)0x92,(byte)0x69,(byte)0x92,(byte)0x74,(byte)0x92, + (byte)0x77,(byte)0x92,(byte)0xbd,(byte)0x92,(byte)0xc9, + (byte)0x92,(byte)0xd2,(byte)0x92,(byte)0xd7,(byte)0x92, + (byte)0xdb,(byte)0x92,(byte)0xe9,(byte)0x92,(byte)0xfa, + (byte)0x93,(byte)0x47,(byte)0x93,(byte)0x4b,(byte)0x93, + (byte)0x57,(byte)0x93,(byte)0x59,(byte)0x93,(byte)0x5b, + (byte)0x93,(byte)0x6f,(byte)0x93,(byte)0xa4,(byte)0x93, + (byte)0xb5,(byte)0x93,(byte)0xc1,(byte)0x93,(byte)0xc2, + (byte)0x93,(byte)0xcd,(byte)0x93,(byte)0xd4,(byte)0x93, + (byte)0xdd,(byte)0x93,(byte)0xe0,(byte)0x93,(byte)0xe4, + (byte)0x93,(byte)0xe9,(byte)0x93,(byte)0xeb,(byte)0x93, + (byte)0xf6,(byte)0x94,(byte)0x49,(byte)0x94,(byte)0x63, + (byte)0x94,(byte)0x64,(byte)0x94,(byte)0x69,(byte)0x94, + (byte)0x6e,(byte)0x94,(byte)0x70,(byte)0x94,(byte)0x72, + (byte)0x94,(byte)0x75,(byte)0x94,(byte)0x79,(byte)0x94, + (byte)0x7e,(byte)0x94,(byte)0xa1,(byte)0x94,(byte)0xa3, + (byte)0x94,(byte)0xb5,(byte)0x94,(byte)0xb9,(byte)0x94, + (byte)0xbc,(byte)0x94,(byte)0xc9,(byte)0x94,(byte)0xd1, + (byte)0x94,(byte)0xd3,(byte)0x94,(byte)0xdb,(byte)0x94, + (byte)0xdd,(byte)0x94,(byte)0xde,(byte)0x94,(byte)0xec, + (byte)0x94,(byte)0xef,(byte)0x95,(byte)0x44,(byte)0x95, + (byte)0x5a,(byte)0x95,(byte)0x62,(byte)0x95,(byte)0x64, + (byte)0x95,(byte)0x73,(byte)0x95,(byte)0xb0,(byte)0x95, + (byte)0xb2,(byte)0x95,(byte)0xb3,(byte)0x95,(byte)0xb4, + (byte)0x95,(byte)0xc6,(byte)0x95,(byte)0xc7,(byte)0x95, + (byte)0xcd,(byte)0x95,(byte)0xd1,(byte)0x95,(byte)0xd6, + (byte)0x95,(byte)0xdb,(byte)0x95,(byte)0xdf,(byte)0x95, + (byte)0xec,(byte)0x95,(byte)0xf0,(byte)0x95,(byte)0xf6, + (byte)0x95,(byte)0xfc,(byte)0x96,(byte)0x41,(byte)0x96, + (byte)0x4d,(byte)0x96,(byte)0x5c,(byte)0x96,(byte)0x62, + (byte)0x96,(byte)0x64,(byte)0x96,(byte)0x69,(byte)0x96, + (byte)0x6b,(byte)0x96,(byte)0x75,(byte)0x96,(byte)0x78, + (byte)0x96,(byte)0x79,(byte)0x96,(byte)0xa6,(byte)0x96, + (byte)0xa8,(byte)0x96,(byte)0xb9,(byte)0x96,(byte)0xbc, + (byte)0x96,(byte)0xc8,(byte)0x96,(byte)0xd4,(byte)0x96, + (byte)0xd6,(byte)0x96,(byte)0xdf,(byte)0x96,(byte)0xe9, + (byte)0x96,(byte)0xf7,(byte)0x97,(byte)0x43,(byte)0x97, + (byte)0x45,(byte)0x97,(byte)0x46,(byte)0x97,(byte)0x5d, + (byte)0x97,(byte)0x61,(byte)0x97,(byte)0x66,(byte)0x97, + (byte)0x7c,(byte)0x97,(byte)0xae,(byte)0x97,(byte)0xb0, + (byte)0x97,(byte)0xb8,(byte)0x97,(byte)0xba,(byte)0x97, + (byte)0xc0,(byte)0x97,(byte)0xc2,(byte)0x97,(byte)0xc3, + (byte)0x97,(byte)0xc5,(byte)0x97,(byte)0xc6,(byte)0x97, + (byte)0xc9,(byte)0x97,(byte)0xcd,(byte)0x97,(byte)0xd2, + (byte)0x97,(byte)0xd7,(byte)0x97,(byte)0xda,(byte)0x97, + (byte)0xdb,(byte)0x97,(byte)0xdc,(byte)0x97,(byte)0xdd, + (byte)0x97,(byte)0xde,(byte)0x97,(byte)0xe1,(byte)0x97, + (byte)0xe7,(byte)0x97,(byte)0xfd,(byte)0x97,(byte)0xfe, + (byte)0x98,(byte)0x53,(byte)0x98,(byte)0x56,(byte)0x98, + (byte)0x72,(byte)0x98,(byte)0x79,(byte)0x98,(byte)0xa8, + (byte)0x98,(byte)0xbc,(byte)0x98,(byte)0xc3,(byte)0x98, + (byte)0xc5,(byte)0x98,(byte)0xcb,(byte)0x98,(byte)0xcc, + (byte)0x98,(byte)0xcd,(byte)0x98,(byte)0xce,(byte)0x98, + (byte)0xd0,(byte)0x98,(byte)0xd1,(byte)0x98,(byte)0xd6, + (byte)0x98,(byte)0xd9,(byte)0x98,(byte)0xdb,(byte)0x98, + (byte)0xdd,(byte)0x98,(byte)0xe4,(byte)0x98,(byte)0xe6, + (byte)0x98,(byte)0xe8,(byte)0x98,(byte)0xe9,(byte)0x98, + (byte)0xeb,(byte)0x98,(byte)0xec,(byte)0x98,(byte)0xf4, + (byte)0x98,(byte)0xfe,(byte)0x99,(byte)0x40,(byte)0x99, + (byte)0x46,(byte)0x99,(byte)0x48,(byte)0x99,(byte)0x4b, + (byte)0x99,(byte)0x4e,(byte)0x99,(byte)0x55,(byte)0x99, + (byte)0x56,(byte)0x99,(byte)0x59,(byte)0x99,(byte)0x5b, + (byte)0x99,(byte)0x67,(byte)0x99,(byte)0x6e,(byte)0x99, + (byte)0x73,(byte)0x99,(byte)0x7a,(byte)0x99,(byte)0x7b, + (byte)0x99,(byte)0xa1,(byte)0x99,(byte)0xa5,(byte)0x99, + (byte)0xa7,(byte)0x99,(byte)0xad,(byte)0x99,(byte)0xb3, + (byte)0x99,(byte)0xbc,(byte)0x99,(byte)0xc3,(byte)0x99, + (byte)0xc7,(byte)0x99,(byte)0xce,(byte)0x99,(byte)0xcf, + (byte)0x99,(byte)0xde,(byte)0x99,(byte)0xe1,(byte)0x99, + (byte)0xe9,(byte)0x99,(byte)0xf5,(byte)0x99,(byte)0xf8, + (byte)0x9a,(byte)0x48,(byte)0x9a,(byte)0x49,(byte)0x9a, + (byte)0x50,(byte)0x9a,(byte)0x55,(byte)0x9a,(byte)0x58, + (byte)0x9a,(byte)0x5a,(byte)0x9a,(byte)0x5c,(byte)0x9a, + (byte)0x60,(byte)0x9a,(byte)0x63,(byte)0x9a,(byte)0x6e, + (byte)0x9a,(byte)0x70,(byte)0x9a,(byte)0x79,(byte)0x9a, + (byte)0x7b,(byte)0x9a,(byte)0xbd,(byte)0x9a,(byte)0xec, + (byte)0x9b,(byte)0x4d,(byte)0x9b,(byte)0xa9,(byte)0x9b, + (byte)0xaa,(byte)0x9b,(byte)0xb8,(byte)0x9b,(byte)0xbe, + (byte)0x9b,(byte)0xc2,(byte)0x9b,(byte)0xdf,(byte)0x9b, + (byte)0xe3,(byte)0x9b,(byte)0xea,(byte)0x9b,(byte)0xee, + (byte)0x9c,(byte)0x4a,(byte)0x9c,(byte)0x5c,(byte)0x9c, + (byte)0x6f,(byte)0x9c,(byte)0x79,(byte)0x9c,(byte)0xa1, + (byte)0x9c,(byte)0xa5,(byte)0x9c,(byte)0xba,(byte)0x9c, + (byte)0xbb,(byte)0x9c,(byte)0xbe,(byte)0x9c,(byte)0xc6, + (byte)0x9c,(byte)0xc8,(byte)0x9c,(byte)0xd1,(byte)0x9c, + (byte)0xf8,(byte)0x9d,(byte)0x46,(byte)0x9d,(byte)0x49, + (byte)0x9d,(byte)0x4f,(byte)0x9d,(byte)0x51,(byte)0x9d, + (byte)0x5d,(byte)0x9d,(byte)0x73,(byte)0x9d,(byte)0x78, + (byte)0x9d,(byte)0x7b,(byte)0x9d,(byte)0xa5,(byte)0x9d, + (byte)0xaa,(byte)0x9d,(byte)0xad,(byte)0x9d,(byte)0xb5, + (byte)0x9d,(byte)0xcc,(byte)0x9d,(byte)0xce,(byte)0x9d, + (byte)0xee,(byte)0x9d,(byte)0xf3,(byte)0x9e,(byte)0x53, + (byte)0x9e,(byte)0x64,(byte)0x9e,(byte)0x7a,(byte)0x9e, + (byte)0x7e,(byte)0x9e,(byte)0xa4,(byte)0x9e,(byte)0xb4, + (byte)0x9e,(byte)0xb8,(byte)0x9e,(byte)0xb9,(byte)0x9e, + (byte)0xbb,(byte)0x9e,(byte)0xc5,(byte)0x9e,(byte)0xc9, + (byte)0x9e,(byte)0xcd,(byte)0x9e,(byte)0xda,(byte)0x9e, + (byte)0xdd,(byte)0x9e,(byte)0xde,(byte)0x9e,(byte)0xdf, + (byte)0x9e,(byte)0xe5,(byte)0x9e,(byte)0xe7,(byte)0x9e, + (byte)0xee,(byte)0x9e,(byte)0xf0,(byte)0x9e,(byte)0xfc, + (byte)0x9f,(byte)0x70,(byte)0x9f,(byte)0xa5,(byte)0x9f, + (byte)0xd7,(byte)0x9f,(byte)0xd9,(byte)0xa0,(byte)0x53, + (byte)0xa0,(byte)0x68,(byte)0xa0,(byte)0x6a,(byte)0xa0, + (byte)0x6f,(byte)0xa0,(byte)0x78,(byte)0xa0,(byte)0x7e, + (byte)0xa0,(byte)0xac,(byte)0xa0,(byte)0xd0,(byte)0xa0, + (byte)0xda,(byte)0xa0,(byte)0xde,(byte)0xa0,(byte)0xe6, + (byte)0xa0,(byte)0xf9,(byte)0xc6,(byte)0xcd,(byte)0xc8, + (byte)0xd6,(byte)0xc8,(byte)0xd7,(byte)0xc8,(byte)0xd8, + (byte)0xc8,(byte)0xd9,(byte)0xc8,(byte)0xda,(byte)0xc8, + (byte)0xdb,(byte)0xc8,(byte)0xdc,(byte)0xc8,(byte)0xdd, + (byte)0xc8,(byte)0xde,(byte)0xc8,(byte)0xdf,(byte)0xc8, + (byte)0xe0,(byte)0xc8,(byte)0xe1,(byte)0xc8,(byte)0xe2, + (byte)0xc8,(byte)0xe3,(byte)0xc8,(byte)0xe4,(byte)0xc8, + (byte)0xe5,(byte)0xc8,(byte)0xe6,(byte)0xc8,(byte)0xe7, + (byte)0xc8,(byte)0xe8,(byte)0xc8,(byte)0xe9,(byte)0xc8, + (byte)0xea,(byte)0xc8,(byte)0xeb,(byte)0xc8,(byte)0xec, + (byte)0xc8,(byte)0xed,(byte)0xc8,(byte)0xee,(byte)0xc8, + (byte)0xef,(byte)0xc8,(byte)0xf0,(byte)0xc8,(byte)0xf1, + (byte)0xfa,(byte)0x45,(byte)0xfa,(byte)0x48,(byte)0xfa, + (byte)0x68,(byte)0xfa,(byte)0x6b,(byte)0xfa,(byte)0xa5, + (byte)0xfa,(byte)0xcc,(byte)0xfa,(byte)0xcd,(byte)0xfa, + (byte)0xd0,(byte)0xfa,(byte)0xe0,(byte)0xfa,(byte)0xe8, + (byte)0xfa,(byte)0xfa,(byte)0xfa,(byte)0xfd,(byte)0xfb, + (byte)0x43,(byte)0xfb,(byte)0x4b,(byte)0xfb,(byte)0x5e, + (byte)0xfb,(byte)0x65,(byte)0xfb,(byte)0x70,(byte)0xfb, + (byte)0x7a,(byte)0xfb,(byte)0x7d,(byte)0xfb,(byte)0xb6, + (byte)0xfb,(byte)0xb9,(byte)0xfb,(byte)0xbf,(byte)0xfb, + (byte)0xc1,(byte)0xfb,(byte)0xc9,(byte)0xfb,(byte)0xca, + (byte)0xfb,(byte)0xd3,(byte)0xfb,(byte)0xdc,(byte)0xfb, + (byte)0xea,(byte)0xfb,(byte)0xef,(byte)0xfb,(byte)0xf0, + (byte)0xfc,(byte)0x42,(byte)0xfc,(byte)0x49,(byte)0xfc, + (byte)0x4a,(byte)0xfc,(byte)0x59,(byte)0xfc,(byte)0x64, + (byte)0xfc,(byte)0x65,(byte)0xfc,(byte)0x66,(byte)0xfc, + (byte)0x6a,(byte)0xfc,(byte)0xa6,(byte)0xfc,(byte)0xb4, + (byte)0xfc,(byte)0xc2,(byte)0xfc,(byte)0xc4,(byte)0xfc, + (byte)0xcf,(byte)0xfc,(byte)0xd1,(byte)0xfc,(byte)0xee, + (byte)0xfc,(byte)0xf7,(byte)0xfd,(byte)0x49,(byte)0xfd, + (byte)0x4a,(byte)0xfd,(byte)0x4c,(byte)0xfd,(byte)0x50, + (byte)0xfd,(byte)0x53,(byte)0xfd,(byte)0x5d,(byte)0xfd, + (byte)0x61,(byte)0xfd,(byte)0x6c,(byte)0xfd,(byte)0x7a, + (byte)0xfd,(byte)0xa2,(byte)0xfd,(byte)0xa3,(byte)0xfd, + (byte)0xc4,(byte)0xfd,(byte)0xca,(byte)0xfd,(byte)0xce, + (byte)0xfd,(byte)0xd1,(byte)0xfd,(byte)0xe8,(byte)0xfd, + (byte)0xe9,(byte)0xfe,(byte)0x4d,(byte)0xfe,(byte)0x56, + (byte)0xfe,(byte)0x64,(byte)0xfe,(byte)0x6e,(byte)0xfe, + (byte)0x78,(byte)0xfe,(byte)0x7d,(byte)0xfe,(byte)0xb6, + (byte)0xfe,(byte)0xc5,(byte)0xfe,(byte)0xfb }; + + public static void main(String[] args) throws Exception { + byte[] encodedBytes = new byte[1000]; + + encodedBytes = uni21String.getBytes("Big5-HKSCS"); + + for (int i = 0; i < encodedBytes.length - 1; i++) { + if (encodedBytes[i] != expectedBytes[i] + || encodedBytes[i+1] != expectedBytes[i+1]) { + throw new Exception("Unexpected char->byte HKSCS mappings"); + } + } + } +} diff --git a/jdk/test/sun/nio/cs/TestX11JIS0201.java b/jdk/test/sun/nio/cs/TestX11JIS0201.java new file mode 100644 index 00000000000..dea3e6bef75 --- /dev/null +++ b/jdk/test/sun/nio/cs/TestX11JIS0201.java @@ -0,0 +1,54 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + * @bug 4195325 + * @summary name() should return "X11JIS0201" + * + */ + +import java.nio.charset.*; + +public class TestX11JIS0201 { + + public static void main(String args[]) + throws Exception + { + test(); + } + + private static void test() + throws Exception + { + Class cl = null; + try { + cl = Class.forName("sun.awt.motif.X11JIS0201"); + } catch (Exception e){ + return; + } + Charset cs = (Charset)cl.newInstance(); + if (! cs.name().equals("X11JIS0201")){ + throw new Exception("X11JIS0201 does not work correctly"); + } + } +} diff --git a/jdk/test/sun/nio/cs/UkrainianIsNotRussian.java b/jdk/test/sun/nio/cs/UkrainianIsNotRussian.java new file mode 100644 index 00000000000..d025d28aad8 --- /dev/null +++ b/jdk/test/sun/nio/cs/UkrainianIsNotRussian.java @@ -0,0 +1,76 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 4890726 + @summary Check the correctness of KOI8_U by comparing to KOI8_R + */ + +import java.util.*; +import static java.lang.Character.UnicodeBlock; + +public class UkrainianIsNotRussian { + private static String decode(byte[] bytes, String encoding) throws Throwable { + String s = new String(bytes, encoding); + equal(s.length(), 1); + check(Arrays.equals(s.getBytes(encoding), bytes)); + return s; + } + + private static void realMain(String[] args) throws Throwable { + final byte[] bytes = new byte[1]; + int differences = 0; + for (int i = 0; i < 0xff; i++) { + bytes[0] = (byte) i; + final String r = decode(bytes, "KOI8_R"); + final String u = decode(bytes, "KOI8_U"); + if (! r.equals(u)) { + differences++; + final char rc = r.charAt(0); + final char uc = u.charAt(0); + final UnicodeBlock rcb = UnicodeBlock.of(rc); + final UnicodeBlock ucb = UnicodeBlock.of(uc); + System.out.printf("%02x => %04x %s, %04x %s%n", + i, (int) rc, rcb, (int) uc, ucb); + check(rcb == UnicodeBlock.BOX_DRAWING && + ucb == UnicodeBlock.CYRILLIC); + } + } + equal(differences, 8); + } + + //--------------------- 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.printf("%nPassed = %d, failed = %d%n%n", passed, failed); + if (failed > 0) throw new AssertionError("Some tests failed");} +} diff --git a/jdk/test/sun/nio/cs/ZeroedByteArrayEUCTWTest.java b/jdk/test/sun/nio/cs/ZeroedByteArrayEUCTWTest.java new file mode 100644 index 00000000000..dd5b5cfc806 --- /dev/null +++ b/jdk/test/sun/nio/cs/ZeroedByteArrayEUCTWTest.java @@ -0,0 +1,52 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + * @bug 4522270 + @summary Ensure that a zeroed byte array produces a valid String when EUC-TW decoded + + */ + +public class ZeroedByteArrayEUCTWTest +{ + public static void main(String[] args) throws Exception { + test("cns11643"); + } + + public static void test(String encoding) throws Exception { + String result = null; + byte[] data = new byte[16]; + + for (int i = 0; i < 16; i++) { + data[i] = 0; + } + + result = new String(data, encoding); + if (result.length() != 16) + throw new Exception ("EUC_TW regression test bugID 4522270 failed"); + + for (int i=0; i < 16; i++) { + data[i] = (byte)( 32 + i); + } + } +} diff --git a/jdk/test/sun/security/krb5/OptionPADataInKDCReq.java b/jdk/test/sun/security/krb5/OptionPADataInKDCReq.java index 2229b541e89..d0a9f8409b2 100644 --- a/jdk/test/sun/security/krb5/OptionPADataInKDCReq.java +++ b/jdk/test/sun/security/krb5/OptionPADataInKDCReq.java @@ -1,5 +1,5 @@ /* - * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/krb5/TimeInCCache.java b/jdk/test/sun/security/krb5/TimeInCCache.java index 5ef8b5370df..f9b70283b75 100644 --- a/jdk/test/sun/security/krb5/TimeInCCache.java +++ b/jdk/test/sun/security/krb5/TimeInCCache.java @@ -1,5 +1,5 @@ /* - * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/pkcs11/Cipher/TestSymmCiphers.java b/jdk/test/sun/security/pkcs11/Cipher/TestSymmCiphers.java index e102606b4d1..5b1e6de3737 100644 --- a/jdk/test/sun/security/pkcs11/Cipher/TestSymmCiphers.java +++ b/jdk/test/sun/security/pkcs11/Cipher/TestSymmCiphers.java @@ -2,32 +2,22 @@ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * - * This code is free software; you can redistribute it and/or modi -fy it - * under the terms of the GNU General Public License version 2 onl -y, as + * This code is free software; you can redistribute 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, bu -t WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABIL -ITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public L -icense - * version 2 for more details (a copy is included in the LICENSE f -ile that + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * - * You should have received a copy of the GNU General Public Licen -se version - * 2 along with this work; if not, write to the Free Software Foun -dation, + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, San -ta Clara, - * CA 95054 USA or visit www.sun.com if you need additional inform -ation or + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ClientHandshaker/RSAExport.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ClientHandshaker/RSAExport.java new file mode 100644 index 00000000000..26b00867d0d --- /dev/null +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ClientHandshaker/RSAExport.java @@ -0,0 +1,561 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6690018 + * @summary RSAClientKeyExchange NullPointerException + */ + +/* + * Certificates and key used in the test. + * + * TLS server certificate: + * server private key: + * -----BEGIN RSA PRIVATE KEY----- + * Proc-Type: 4,ENCRYPTED + * DEK-Info: DES-EDE3-CBC,97EC03A2D031B7BC + * + * 22wrD+DPv3VF8xg9xoeBqHzFnOVbTLQgVulzaCECDF4zWdxElYKy4yYyY6dMDehi + * XT77NTsq1J14zjJHPp2/U6B5OpZxnf97ZSD0ZC9/DDe/2gjW4fY1Lv0TVP0PdXnm + * cj84RaDiiSk/cERlFzFJ5L8ULMwxdOtYwXwZ4upITw2lT+8zDlBD2i3zZ4TcWrzE + * /su5Kpu+Mp3wthfGX+ZGga2T/NS8ZCKZE+gJDPKQZ/x34VBw+YANQGyCJPv1iMaE + * RyagnpApH9OPSrRIp2iR6uWT6836CET2erbfPaC1odyd8IsbnLldVs9CklH7EgXL + * Nms+DqrQEbNmvMuQYEFyZEHN9D1fGONeacx+cjI85FyMSHSEO65JJmasAxgQe4nF + * /yVz3rNQ2qAGqBhjsjP/WaXuB2aLZiAli/HjN17EJws= + * -----END RSA PRIVATE KEY----- + * + * -----BEGIN RSA PRIVATE KEY----- + * MIIBOQIBAAJBALlfGg/5ZweJcW5zqLdnQ2uyircqDDlENKnv9FABOm/j0wnlPHqX + * CCqFBLoM7tG8ohci1SPy6fLJ5dqLf5FOH2sCAwEAAQJATO0/hpOMgx8xmJGc2Yeb + * /gyY7kwfyIAajs9Khw0LcDTYTo2EAI+vMmDpU+dvmOCLUqq/Z2tiKJhGyrmcBlxr + * kQIhAPYkbYovtvWHslxRb78x4eCrn2p1H7iolNKbyepjCI3zAiEAwMufJlLI9Q0O + * BIr7fPnUhbs9NyMHLIvIQAf/hXYubqkCIGJZR9NxIT+VyrSMbYQNoF0u9fGJfvU/ + * lsdYLCOVEnP1AiAsSFjUx50K1CXNG1MqYIPU963W1T/Xln+3XV7ue7esiQIgW2Lu + * xGvz2dAUsGId+Xr2GZXb7ZucY/cPt4o5qdP1m7c= + * -----END RSA PRIVATE KEY----- + * + * Private-Key: (512 bit) + * modulus: + * 00:b9:5f:1a:0f:f9:67:07:89:71:6e:73:a8:b7:67: + * 43:6b:b2:8a:b7:2a:0c:39:44:34:a9:ef:f4:50:01: + * 3a:6f:e3:d3:09:e5:3c:7a:97:08:2a:85:04:ba:0c: + * ee:d1:bc:a2:17:22:d5:23:f2:e9:f2:c9:e5:da:8b: + * 7f:91:4e:1f:6b + * publicExponent: 65537 (0x10001) + * privateExponent: + * 4c:ed:3f:86:93:8c:83:1f:31:98:91:9c:d9:87:9b: + * fe:0c:98:ee:4c:1f:c8:80:1a:8e:cf:4a:87:0d:0b: + * 70:34:d8:4e:8d:84:00:8f:af:32:60:e9:53:e7:6f: + * 98:e0:8b:52:aa:bf:67:6b:62:28:98:46:ca:b9:9c: + * 06:5c:6b:91 + * prime1: + * 00:f6:24:6d:8a:2f:b6:f5:87:b2:5c:51:6f:bf:31: + * e1:e0:ab:9f:6a:75:1f:b8:a8:94:d2:9b:c9:ea:63: + * 08:8d:f3 + * prime2: + * 00:c0:cb:9f:26:52:c8:f5:0d:0e:04:8a:fb:7c:f9: + * d4:85:bb:3d:37:23:07:2c:8b:c8:40:07:ff:85:76: + * 2e:6e:a9 + * exponent1: + * 62:59:47:d3:71:21:3f:95:ca:b4:8c:6d:84:0d:a0: + * 5d:2e:f5:f1:89:7e:f5:3f:96:c7:58:2c:23:95:12: + * 73:f5 + * exponent2: + * 2c:48:58:d4:c7:9d:0a:d4:25:cd:1b:53:2a:60:83: + * d4:f7:ad:d6:d5:3f:d7:96:7f:b7:5d:5e:ee:7b:b7: + * ac:89 + * coefficient: + * 5b:62:ee:c4:6b:f3:d9:d0:14:b0:62:1d:f9:7a:f6: + * 19:95:db:ed:9b:9c:63:f7:0f:b7:8a:39:a9:d3:f5: + * 9b:b7 + * + * + * server certificate: + * Data: + * Version: 3 (0x2) + * Serial Number: 11 (0xb) + * Signature Algorithm: sha1WithRSAEncryption + * Issuer: C=US, ST=Some-State, O=Some Org, CN=Someone + * Validity + * Not Before: Apr 18 15:07:30 2008 GMT + * Not After : Jan 4 15:07:30 2028 GMT + * Subject: C=US, ST=Some-State, O=Some Org, CN=SomeoneExport + * Subject Public Key Info: + * Public Key Algorithm: rsaEncryption + * RSA Public Key: (512 bit) + * Modulus (512 bit): + * 00:b9:5f:1a:0f:f9:67:07:89:71:6e:73:a8:b7:67: + * 43:6b:b2:8a:b7:2a:0c:39:44:34:a9:ef:f4:50:01: + * 3a:6f:e3:d3:09:e5:3c:7a:97:08:2a:85:04:ba:0c: + * ee:d1:bc:a2:17:22:d5:23:f2:e9:f2:c9:e5:da:8b: + * 7f:91:4e:1f:6b + * Exponent: 65537 (0x10001) + * X509v3 extensions: + * X509v3 Basic Constraints: + * CA:FALSE + * X509v3 Key Usage: + * Digital Signature, Non Repudiation, Key Encipherment + * X509v3 Subject Key Identifier: + * F1:30:98:BE:7C:AA:F9:B1:91:38:60:AE:13:5F:67:9C:0A:32:9E:31 + * X509v3 Authority Key Identifier: + * keyid:B5:32:43:D7:00:24:92:BA:E9:95:E5:F9:A3:64:6C:84:EE:33:2E:15 + * + * -----BEGIN CERTIFICATE----- + * MIICIDCCAYmgAwIBAgIBCzANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzET + * MBEGA1UECBMKU29tZS1TdGF0ZTERMA8GA1UEChMIU29tZSBPcmcxEDAOBgNVBAMT + * B1NvbWVvbmUwHhcNMDgwNDE4MTUwNzMwWhcNMjgwMTA0MTUwNzMwWjBNMQswCQYD + * VQQGEwJVUzETMBEGA1UECBMKU29tZS1TdGF0ZTERMA8GA1UEChMIU29tZSBPcmcx + * FjAUBgNVBAMTDVNvbWVvbmVFeHBvcnQwXDANBgkqhkiG9w0BAQEFAANLADBIAkEA + * uV8aD/lnB4lxbnOot2dDa7KKtyoMOUQ0qe/0UAE6b+PTCeU8epcIKoUEugzu0byi + * FyLVI/Lp8snl2ot/kU4fawIDAQABo1owWDAJBgNVHRMEAjAAMAsGA1UdDwQEAwIF + * 4DAdBgNVHQ4EFgQU8TCYvnyq+bGROGCuE19nnAoynjEwHwYDVR0jBBgwFoAUtTJD + * 1wAkkrrpleX5o2RshO4zLhUwDQYJKoZIhvcNAQEFBQADgYEAFU+fP9FSTQNVZOhv + * eJ+zq6wI/biwzTgPbAq3yu2gb5kT85z4nzqBhPd2LWWFXhUW/D8QyNZ54X30y0Ug + * 3NfUAvOANW7CgUbHBmm77KQiF4nWdh338qqq9HzLGrPqcxX0dmiq2RBVPy9wb2Ea + * FTZiU2v+9pkoLoSDnCOfPCg/4Q4= + * -----END CERTIFICATE----- + * + * + * Trusted CA certificate: + * Certificate: + * Data: + * Version: 3 (0x2) + * Serial Number: 0 (0x0) + * Signature Algorithm: md5WithRSAEncryption + * Issuer: C=US, ST=Some-State, O=Some Org, CN=Someone + * Validity + * Not Before: Mar 30 11:44:47 2001 GMT + * Not After : Apr 27 11:44:47 2028 GMT + * Subject: C=US, ST=Some-State, O=Some Org, CN=Someone + * Subject Public Key Info: + * Public Key Algorithm: rsaEncryption + * RSA Public Key: (1024 bit) + * Modulus (1024 bit): + * 00:c1:98:e4:7a:87:53:0f:94:87:dc:da:f3:59:39: + * 3e:36:95:e8:77:58:ff:46:8a:81:1b:5e:c5:4c:fa: + * b6:91:19:30:be:5b:ef:4c:aa:84:30:a4:9a:d4:68: + * af:ef:fa:b4:2c:76:8b:29:33:46:cf:38:74:7c:79: + * d5:07:a6:43:39:84:52:39:4f:8a:1c:f3:73:19:12: + * 40:cf:ee:a1:77:43:01:02:be:8d:32:11:28:70:f4: + * cf:ab:43:75:e4:fb:74:f1:8c:2e:43:24:ba:85:3f: + * 66:3a:05:ea:f7:ce:5b:97:e2:34:a3:f0:87:f4:f8: + * d1:59:12:5a:68:b7:78:64:a9 + * Exponent: 65537 (0x10001) + * X509v3 extensions: + * X509v3 Subject Key Identifier: + * B5:32:43:D7:00:24:92:BA:E9:95:E5:F9:A3:64:6C:84:EE:33:2E:15 + * X509v3 Authority Key Identifier: + * keyid:B5:32:43:D7:00:24:92:BA:E9:95:E5:F9:A3:64:6C:84:EE:33:2E:15 + * DirName:/C=US/ST=Some-State/O=Some Org/CN=Someone + * serial:00 + * + * X509v3 Basic Constraints: + * CA:TRUE + * + * -----BEGIN CERTIFICATE----- + * MIICpjCCAg+gAwIBAgIBADANBgkqhkiG9w0BAQQFADBHMQswCQYDVQQGEwJVUzET + * MBEGA1UECBMKU29tZS1TdGF0ZTERMA8GA1UEChMIU29tZSBPcmcxEDAOBgNVBAMT + * B1NvbWVvbmUwHhcNMDEwMzMwMTE0NDQ3WhcNMjgwNDI3MTE0NDQ3WjBHMQswCQYD + * VQQGEwJVUzETMBEGA1UECBMKU29tZS1TdGF0ZTERMA8GA1UEChMIU29tZSBPcmcx + * EDAOBgNVBAMTB1NvbWVvbmUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMGY + * 5HqHUw+Uh9za81k5PjaV6HdY/0aKgRtexUz6tpEZML5b70yqhDCkmtRor+/6tCx2 + * iykzRs84dHx51QemQzmEUjlPihzzcxkSQM/uoXdDAQK+jTIRKHD0z6tDdeT7dPGM + * LkMkuoU/ZjoF6vfOW5fiNKPwh/T40VkSWmi3eGSpAgMBAAGjgaEwgZ4wHQYDVR0O + * BBYEFLUyQ9cAJJK66ZXl+aNkbITuMy4VMG8GA1UdIwRoMGaAFLUyQ9cAJJK66ZXl + * +aNkbITuMy4VoUukSTBHMQswCQYDVQQGEwJVUzETMBEGA1UECBMKU29tZS1TdGF0 + * ZTERMA8GA1UEChMIU29tZSBPcmcxEDAOBgNVBAMTB1NvbWVvbmWCAQAwDAYDVR0T + * BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQBhf3PX0xWxtaUwZlWCO7GfPwCKgBWr + * CXqlqjtWHCshaaU7wUsDOwxFDWwKjFrMerQLsLuBlhdXEbNfSPjychkQtfezQHcS + * q0Atq7+KVSmRbDw6oKVRs5v1BBzLCupy+o16fNz3/hwreAWwQnSMtAh/osNS9w1b + * QeVWU+JV47H+vg== + * -----END CERTIFICATE----- + * + */ + +import java.io.*; +import java.net.*; +import java.security.KeyStore; +import java.security.KeyFactory; +import java.security.cert.Certificate; +import java.security.cert.CertificateFactory; +import java.security.spec.*; +import java.security.interfaces.*; +import javax.net.ssl.*; +import java.math.BigInteger; + +public class RSAExport { + + /* + * ============================================================= + * Set the various variables needed for the tests, then + * specify what tests to run on each side. + */ + + + /* + * Should we run the client or server in a separate thread? + * Both sides can throw exceptions, but do you have a preference + * as to which side should be the main thread. + */ + static boolean separateServerThread = true; + + /* + * Where do we find the keystores? + */ + static String trusedCertStr = + "-----BEGIN CERTIFICATE-----\n" + + "MIICpjCCAg+gAwIBAgIBADANBgkqhkiG9w0BAQQFADBHMQswCQYDVQQGEwJVUzET\n" + + "MBEGA1UECBMKU29tZS1TdGF0ZTERMA8GA1UEChMIU29tZSBPcmcxEDAOBgNVBAMT\n" + + "B1NvbWVvbmUwHhcNMDEwMzMwMTE0NDQ3WhcNMjgwNDI3MTE0NDQ3WjBHMQswCQYD\n" + + "VQQGEwJVUzETMBEGA1UECBMKU29tZS1TdGF0ZTERMA8GA1UEChMIU29tZSBPcmcx\n" + + "EDAOBgNVBAMTB1NvbWVvbmUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMGY\n" + + "5HqHUw+Uh9za81k5PjaV6HdY/0aKgRtexUz6tpEZML5b70yqhDCkmtRor+/6tCx2\n" + + "iykzRs84dHx51QemQzmEUjlPihzzcxkSQM/uoXdDAQK+jTIRKHD0z6tDdeT7dPGM\n" + + "LkMkuoU/ZjoF6vfOW5fiNKPwh/T40VkSWmi3eGSpAgMBAAGjgaEwgZ4wHQYDVR0O\n" + + "BBYEFLUyQ9cAJJK66ZXl+aNkbITuMy4VMG8GA1UdIwRoMGaAFLUyQ9cAJJK66ZXl\n" + + "+aNkbITuMy4VoUukSTBHMQswCQYDVQQGEwJVUzETMBEGA1UECBMKU29tZS1TdGF0\n" + + "ZTERMA8GA1UEChMIU29tZSBPcmcxEDAOBgNVBAMTB1NvbWVvbmWCAQAwDAYDVR0T\n" + + "BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQBhf3PX0xWxtaUwZlWCO7GfPwCKgBWr\n" + + "CXqlqjtWHCshaaU7wUsDOwxFDWwKjFrMerQLsLuBlhdXEbNfSPjychkQtfezQHcS\n" + + "q0Atq7+KVSmRbDw6oKVRs5v1BBzLCupy+o16fNz3/hwreAWwQnSMtAh/osNS9w1b\n" + + "QeVWU+JV47H+vg==\n" + + "-----END CERTIFICATE-----"; + + static String serverCertStr = + "-----BEGIN CERTIFICATE-----\n" + + "MIICIDCCAYmgAwIBAgIBCzANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzET\n" + + "MBEGA1UECBMKU29tZS1TdGF0ZTERMA8GA1UEChMIU29tZSBPcmcxEDAOBgNVBAMT\n" + + "B1NvbWVvbmUwHhcNMDgwNDE4MTUwNzMwWhcNMjgwMTA0MTUwNzMwWjBNMQswCQYD\n" + + "VQQGEwJVUzETMBEGA1UECBMKU29tZS1TdGF0ZTERMA8GA1UEChMIU29tZSBPcmcx\n" + + "FjAUBgNVBAMTDVNvbWVvbmVFeHBvcnQwXDANBgkqhkiG9w0BAQEFAANLADBIAkEA\n" + + "uV8aD/lnB4lxbnOot2dDa7KKtyoMOUQ0qe/0UAE6b+PTCeU8epcIKoUEugzu0byi\n" + + "FyLVI/Lp8snl2ot/kU4fawIDAQABo1owWDAJBgNVHRMEAjAAMAsGA1UdDwQEAwIF\n" + + "4DAdBgNVHQ4EFgQU8TCYvnyq+bGROGCuE19nnAoynjEwHwYDVR0jBBgwFoAUtTJD\n" + + "1wAkkrrpleX5o2RshO4zLhUwDQYJKoZIhvcNAQEFBQADgYEAFU+fP9FSTQNVZOhv\n" + + "eJ+zq6wI/biwzTgPbAq3yu2gb5kT85z4nzqBhPd2LWWFXhUW/D8QyNZ54X30y0Ug\n" + + "3NfUAvOANW7CgUbHBmm77KQiF4nWdh338qqq9HzLGrPqcxX0dmiq2RBVPy9wb2Ea\n" + + "FTZiU2v+9pkoLoSDnCOfPCg/4Q4=\n" + + "-----END CERTIFICATE-----"; + + static byte privateExponent[] = { + (byte)0x4c, (byte)0xed, (byte)0x3f, (byte)0x86, + (byte)0x93, (byte)0x8c, (byte)0x83, (byte)0x1f, + (byte)0x31, (byte)0x98, (byte)0x91, (byte)0x9c, + (byte)0xd9, (byte)0x87, (byte)0x9b, (byte)0xfe, + (byte)0x0c, (byte)0x98, (byte)0xee, (byte)0x4c, + (byte)0x1f, (byte)0xc8, (byte)0x80, (byte)0x1a, + (byte)0x8e, (byte)0xcf, (byte)0x4a, (byte)0x87, + (byte)0x0d, (byte)0x0b, (byte)0x70, (byte)0x34, + (byte)0xd8, (byte)0x4e, (byte)0x8d, (byte)0x84, + (byte)0x00, (byte)0x8f, (byte)0xaf, (byte)0x32, + (byte)0x60, (byte)0xe9, (byte)0x53, (byte)0xe7, + (byte)0x6f, (byte)0x98, (byte)0xe0, (byte)0x8b, + (byte)0x52, (byte)0xaa, (byte)0xbf, (byte)0x67, + (byte)0x6b, (byte)0x62, (byte)0x28, (byte)0x98, + (byte)0x46, (byte)0xca, (byte)0xb9, (byte)0x9c, + (byte)0x06, (byte)0x5c, (byte)0x6b, (byte)0x91 + }; + + static byte modulus[] = { + (byte)0x00, + (byte)0xb9, (byte)0x5f, (byte)0x1a, (byte)0x0f, + (byte)0xf9, (byte)0x67, (byte)0x07, (byte)0x89, + (byte)0x71, (byte)0x6e, (byte)0x73, (byte)0xa8, + (byte)0xb7, (byte)0x67, (byte)0x43, (byte)0x6b, + (byte)0xb2, (byte)0x8a, (byte)0xb7, (byte)0x2a, + (byte)0x0c, (byte)0x39, (byte)0x44, (byte)0x34, + (byte)0xa9, (byte)0xef, (byte)0xf4, (byte)0x50, + (byte)0x01, (byte)0x3a, (byte)0x6f, (byte)0xe3, + (byte)0xd3, (byte)0x09, (byte)0xe5, (byte)0x3c, + (byte)0x7a, (byte)0x97, (byte)0x08, (byte)0x2a, + (byte)0x85, (byte)0x04, (byte)0xba, (byte)0x0c, + (byte)0xee, (byte)0xd1, (byte)0xbc, (byte)0xa2, + (byte)0x17, (byte)0x22, (byte)0xd5, (byte)0x23, + (byte)0xf2, (byte)0xe9, (byte)0xf2, (byte)0xc9, + (byte)0xe5, (byte)0xda, (byte)0x8b, (byte)0x7f, + (byte)0x91, (byte)0x4e, (byte)0x1f, (byte)0x6b + }; + + static char passphrase[] = "passphrase".toCharArray(); + + /* + * Is the server ready to serve? + */ + volatile static boolean serverReady = false; + + /* + * Turn on SSL debugging? + */ + static boolean debug = false; + + /* + * If the client or server is doing some kind of object creation + * that the other side depends on, and that thread prematurely + * exits, you may experience a hang. The test harness will + * terminate all hung threads after its timeout has expired, + * currently 3 minutes by default, but you might try to be + * smart about it.... + */ + + /* + * Define the server side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doServerSide() throws Exception { + SSLServerSocketFactory sslssf = + getSSLContext(true).getServerSocketFactory(); + SSLServerSocket sslServerSocket = + (SSLServerSocket) sslssf.createServerSocket(serverPort); + + serverPort = sslServerSocket.getLocalPort(); + + /* + * Signal Client, we're ready for this connect. + */ + serverReady = true; + + // Enable RSA_EXPORT cipher suites only. + try { + String enabledSuites[] = { + "SSL_RSA_EXPORT_WITH_RC4_40_MD5", + "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA"}; + sslServerSocket.setEnabledCipherSuites(enabledSuites); + } catch (IllegalArgumentException iae) { + // ignore the exception a cipher suite is unsupported. + } + + SSLSocket sslSocket = (SSLSocket) sslServerSocket.accept(); + InputStream sslIS = sslSocket.getInputStream(); + OutputStream sslOS = sslSocket.getOutputStream(); + + sslIS.read(); + sslOS.write(85); + sslOS.flush(); + + + sslSocket.close(); + } + + /* + * Define the client side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doClientSide() throws Exception { + + /* + * Wait for server to get started. + */ + while (!serverReady) { + Thread.sleep(50); + } + + SSLSocketFactory sslsf = + getSSLContext(false).getSocketFactory(); + SSLSocket sslSocket = (SSLSocket) + sslsf.createSocket("localhost", serverPort); + + // Enable RSA_EXPORT cipher suites only. + try { + String enabledSuites[] = { + "SSL_RSA_EXPORT_WITH_RC4_40_MD5", + "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA"}; + sslSocket.setEnabledCipherSuites(enabledSuites); + } catch (IllegalArgumentException iae) { + // ignore the exception a cipher suite is unsupported. + } + + InputStream sslIS = sslSocket.getInputStream(); + OutputStream sslOS = sslSocket.getOutputStream(); + + sslOS.write(280); + sslOS.flush(); + sslIS.read(); + + sslSocket.close(); + } + + /* + * ============================================================= + * The remainder is just support stuff + */ + + // use any free port by default + volatile int serverPort = 0; + + volatile Exception serverException = null; + volatile Exception clientException = null; + + public static void main(String[] args) throws Exception { + if (debug) + System.setProperty("javax.net.debug", "all"); + + /* + * Start the tests. + */ + new RSAExport(); + } + + Thread clientThread = null; + Thread serverThread = null; + + /* + * Primary constructor, used to drive remainder of the test. + * + * Fork off the other side, then do your work. + */ + RSAExport() throws Exception { + if (separateServerThread) { + startServer(true); + startClient(false); + } else { + startClient(true); + startServer(false); + } + + /* + * Wait for other side to close down. + */ + if (separateServerThread) { + serverThread.join(); + } else { + clientThread.join(); + } + + /* + * When we get here, the test is pretty much over. + * + * If the main thread excepted, that propagates back + * immediately. If the other thread threw an exception, we + * should report back. + */ + if (serverException != null) + throw serverException; + if (clientException != null) + throw clientException; + } + + void startServer(boolean newThread) throws Exception { + if (newThread) { + serverThread = new Thread() { + public void run() { + try { + doServerSide(); + } catch (Exception e) { + /* + * Our server thread just died. + * + * Release the client, if not active already... + */ + System.err.println("Server died..." + e); + serverReady = true; + serverException = e; + } + } + }; + serverThread.start(); + } else { + doServerSide(); + } + } + + void startClient(boolean newThread) throws Exception { + if (newThread) { + clientThread = new Thread() { + public void run() { + try { + doClientSide(); + } catch (Exception e) { + /* + * Our client thread just died. + */ + System.err.println("Client died..."); + clientException = e; + } + } + }; + clientThread.start(); + } else { + doClientSide(); + } + } + + // Get the SSL context + private SSLContext getSSLContext(boolean authnRequired) throws Exception { + // generate certificate from cert string + CertificateFactory cf = CertificateFactory.getInstance("X.509"); + + ByteArrayInputStream is = + new ByteArrayInputStream(trusedCertStr.getBytes()); + Certificate trustedCert = cf.generateCertificate(is); + + // create a key store + KeyStore ks = KeyStore.getInstance("JKS"); + ks.load(null, null); + + // import the trusted cert + ks.setCertificateEntry("RSA Export Signer", trustedCert); + + if (authnRequired) { + // generate the private key. + RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec( + new BigInteger(modulus), + new BigInteger(privateExponent)); + KeyFactory kf = KeyFactory.getInstance("RSA"); + RSAPrivateKey priKey = + (RSAPrivateKey)kf.generatePrivate(priKeySpec); + + // generate certificate chain + is = new ByteArrayInputStream(serverCertStr.getBytes()); + Certificate serverCert = cf.generateCertificate(is); + + Certificate[] chain = new Certificate[2]; + chain[0] = serverCert; + chain[1] = trustedCert; + + // import the key entry. + ks.setKeyEntry("RSA Export", priKey, passphrase, chain); + } + + // create SSL context + TrustManagerFactory tmf = TrustManagerFactory.getInstance("PKIX"); + tmf.init(ks); + + SSLContext ctx = SSLContext.getInstance("TLS"); + if (authnRequired) { + KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); + kmf.init(ks, passphrase); + + ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); + } else { + ctx.init(null, tmf.getTrustManagers(), null); + } + + return ctx; + } + +} diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/AsyncSSLSocketClose.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/AsyncSSLSocketClose.java index 21fe5303a6e..56eff7e3fd4 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/AsyncSSLSocketClose.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/AsyncSSLSocketClose.java @@ -1,5 +1,5 @@ /* - * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/tools/keytool/StartDateTest.java b/jdk/test/sun/security/tools/keytool/StartDateTest.java index 7e3e5bad103..602f2f3c8fb 100644 --- a/jdk/test/sun/security/tools/keytool/StartDateTest.java +++ b/jdk/test/sun/security/tools/keytool/StartDateTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/tools/keytool/autotest.sh b/jdk/test/sun/security/tools/keytool/autotest.sh index 5376b257a4e..04c00c14ebf 100644 --- a/jdk/test/sun/security/tools/keytool/autotest.sh +++ b/jdk/test/sun/security/tools/keytool/autotest.sh @@ -1,5 +1,5 @@ # -# Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -90,7 +90,8 @@ chmod u+w cert8.db echo | ${TESTJAVA}${FS}bin${FS}java -Dfile -Dnss \ -Dnss.lib=${NSS}${FS}lib${FS}${PF}${FS}${LIBNAME} \ - KeyToolTest || exit 12 + KeyToolTest +status=$? rm -f p11-nss.txt rm -f cert8.db @@ -101,4 +102,5 @@ rm HumanInputStream*.class rm KeyToolTest.class rm TestException.class -exit $? +exit $status + diff --git a/jdk/test/sun/security/tools/keytool/console.sh b/jdk/test/sun/security/tools/keytool/console.sh index 46252de33c1..dd7d3f84048 100644 --- a/jdk/test/sun/security/tools/keytool/console.sh +++ b/jdk/test/sun/security/tools/keytool/console.sh @@ -1,7 +1,7 @@ #! /bin/sh # -# Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -30,7 +30,7 @@ # # @run shell/manual console.sh -if [ "$ALT_PASS" == "" ]; then +if [ "$ALT_PASS" = "" ]; then export PASS=äöäöäöäö else export PASS=$ALT_PASS @@ -54,7 +54,7 @@ echo "If you see both the prompts appear, say --" echo " Enter key password for " echo " (RETURN if same as keystore password): Enter keystore password:" echo "only response to the last prompt by typing $PASS and press ENTER" -echo +echo echo "Only if all the command run correctly without showing any error " echo "or warning, this test passes." echo @@ -87,3 +87,6 @@ echo $PASS| $J5/bin/keytool -keystore kkk -genkey -dname CN=olala $JM/bin/keytool -keystore kkk -list echo $PASS| $J5/bin/keytool -keystore kkk -list echo $PASS| $JM/bin/keytool -keystore kkk -list +rm kkk + +exit 0 diff --git a/jdk/test/sun/text/resources/LocaleData b/jdk/test/sun/text/resources/LocaleData index 5c4e65760ec..f885bbeb2db 100644 --- a/jdk/test/sun/text/resources/LocaleData +++ b/jdk/test/sun/text/resources/LocaleData @@ -5514,3 +5514,7 @@ CurrencyNames/ar_SD/SDG=\u062c.\u0633.\u200f # bug 6531593 FormatData/is_IS/NumberPatterns/1=#,##0. \u00A4;-#,##0. \u00A4 +# bug 6509039 +FormatData/sv/AmPmMarkers/0=fm +FormatData/sv/AmPmMarkers/1=em + diff --git a/jdk/test/sun/text/resources/LocaleDataTest.java b/jdk/test/sun/text/resources/LocaleDataTest.java index 70fd1828a28..ff36327ea77 100644 --- a/jdk/test/sun/text/resources/LocaleDataTest.java +++ b/jdk/test/sun/text/resources/LocaleDataTest.java @@ -31,6 +31,7 @@ * 5102005 5074431 6182685 6208712 6277020 6245766 6351682 6386647 6379382 * 6414459 6455680 6498742 6558863 6488119 6547501 6497154 6558856 6481177 * 6379214 6485516 6486607 4225362 4494727 6533691 6531591 6531593 6570259 + * 6509039 * @summary Verify locale data * */ diff --git a/langtools/.hgtags b/langtools/.hgtags index ebaa7fa9637..2454b025be9 100644 --- a/langtools/.hgtags +++ b/langtools/.hgtags @@ -2,3 +2,7 @@ 58039502942e52f4144a33f36290a2bd2f3581e6 jdk7-b25 c46d25a2350ac147d0121d9c9725af6fcb1b4dbe jdk7-b26 a17265993253d61becd04fe7d96d1fe8b4bd6dff jdk7-b27 +4ef4bd31856949554967fbf22783babb21a62a0e jdk7-b28 +dec081837b01d509dcc2b9de86a4299c1ec17e04 jdk7-b29 +eaf608c64fecf70f955dc9f29f94c055b183aeec jdk7-b30 +07c916ecfc71f6bf432e4ff09bfbfb6290b5703c jdk7-b31 diff --git a/langtools/make/build.properties b/langtools/make/build.properties index 949e91d90a0..38fd0f4705d 100644 --- a/langtools/make/build.properties +++ b/langtools/make/build.properties @@ -1,5 +1,5 @@ # -# Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -66,7 +66,7 @@ javac.no.jdk.warnings = -XDignore.symbol.file=true # set the following to -version to verify the versions of javac being used javac.version.opt = # in time, there should be no exceptions to -Xlint:all -javac.lint.opts = -Xlint:all,-unchecked,-deprecation,-fallthrough,-cast,-serial -Werror +javac.lint.opts = -Xlint:all,-deprecation,-fallthrough,-serial,-unchecked,-cast # options for the task for javac javadoc.jls3.url=http://java.sun.com/docs/books/jls/ @@ -120,6 +120,8 @@ javah.tests = \ tools/javah/ javap.includes = \ + com/sun/tools/classfile/ \ + com/sun/tools/javap/ \ sun/tools/javap/ javap.tests = \ diff --git a/langtools/make/build.xml b/langtools/make/build.xml index b2d8b1b6380..79bd060dd69 100644 --- a/langtools/make/build.xml +++ b/langtools/make/build.xml @@ -1,6 +1,6 @@ @@ -480,7 +481,7 @@ destdir="@{gensrc.dir}" includes="@{includes}"/> - + diff --git a/langtools/make/netbeans/common/standard-ide-actions-no-javadoc.ent b/langtools/make/netbeans/common/standard-ide-actions-no-javadoc.ent index 8f91bbe2544..912daf729a8 100644 --- a/langtools/make/netbeans/common/standard-ide-actions-no-javadoc.ent +++ b/langtools/make/netbeans/common/standard-ide-actions-no-javadoc.ent @@ -1,6 +1,6 @@