From db860f0cf8bd5b47516508be170f930710e5e396 Mon Sep 17 00:00:00 2001
From: Robert Toyonaga
Date: Wed, 29 May 2024 08:28:26 +0000
Subject: [PATCH 01/66] 8326529: JFR: Test for CompilerCompile events fails due
to time out
Reviewed-by: sgehwolf
Backport-of: 4dd6c44cbdb0b5957414fa87b6c559fa4d6f2fa8
---
jdk/test/jdk/jfr/event/compiler/TestCompilerCompile.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/jdk/test/jdk/jfr/event/compiler/TestCompilerCompile.java b/jdk/test/jdk/jfr/event/compiler/TestCompilerCompile.java
index 765f723868..b74456f0c5 100644
--- a/jdk/test/jdk/jfr/event/compiler/TestCompilerCompile.java
+++ b/jdk/test/jdk/jfr/event/compiler/TestCompilerCompile.java
@@ -50,6 +50,7 @@
* sun.hotspot.WhiteBox$WhiteBoxPermission
* @run main/othervm -Xbootclasspath/a:.
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
+ * -XX:CompileOnly=jdk.jfr.event.compiler.TestCompilerCompile::dummyMethod,jdk.jfr.event.compiler.TestCompilerCompile::doTest
* jdk.jfr.event.compiler.TestCompilerCompile
*/
public class TestCompilerCompile {
From 663ecc703dd8526178e3aab0036ddeac8767ff0f Mon Sep 17 00:00:00 2001
From: Andrew John Hughes
Date: Fri, 31 May 2024 15:37:07 +0000
Subject: [PATCH 02/66] 8333126: Bump update version of OpenJDK: 8u432
Reviewed-by: sgehwolf
---
.jcheck/conf | 2 +-
common/autoconf/version-numbers | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/.jcheck/conf b/.jcheck/conf
index f002fd8b96..6d284c03a0 100644
--- a/.jcheck/conf
+++ b/.jcheck/conf
@@ -1,7 +1,7 @@
[general]
project=jdk8u
jbs=JDK
-version=openjdk8u422
+version=openjdk8u432
[checks]
error=author,committer,reviewers,merge,issues,executable,symlink,message,hg-tag,whitespace
diff --git a/common/autoconf/version-numbers b/common/autoconf/version-numbers
index bd3c3824e3..9e53237503 100644
--- a/common/autoconf/version-numbers
+++ b/common/autoconf/version-numbers
@@ -26,7 +26,7 @@
JDK_MAJOR_VERSION=1
JDK_MINOR_VERSION=8
JDK_MICRO_VERSION=0
-JDK_UPDATE_VERSION=422
+JDK_UPDATE_VERSION=432
LAUNCHER_NAME=openjdk
PRODUCT_NAME=OpenJDK
PRODUCT_SUFFIX="Runtime Environment"
From 9a7aa794506ded4771d8a29356c20f7c0c6e8327 Mon Sep 17 00:00:00 2001
From: Zdenek Zambersky
Date: Thu, 6 Jun 2024 12:11:50 +0000
Subject: [PATCH 03/66] 8333669: [8u] GHA: Dead VS2010 download link
Reviewed-by: sgehwolf
---
.github/workflows/submit.yml | 9 ++++++---
make/conf/test-dependencies | 4 +++-
2 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/.github/workflows/submit.yml b/.github/workflows/submit.yml
index b0a4e7b952..c522c887ef 100644
--- a/.github/workflows/submit.yml
+++ b/.github/workflows/submit.yml
@@ -867,6 +867,8 @@ jobs:
VS2010_DIR: "${{ fromJson(needs.prerequisites.outputs.dependencies).VS2010_DIR }}"
VS2010_FILENAME: "${{ fromJson(needs.prerequisites.outputs.dependencies).VS2010_FILENAME }}"
VS2010_URL: "${{ fromJson(needs.prerequisites.outputs.dependencies).VS2010_URL }}"
+ VS2010_TORRENT_URL: "${{ fromJson(needs.prerequisites.outputs.dependencies).VS2010_TORRENT_URL }}"
+ VS2010_TORRENT_DIR: "${{ fromJson(needs.prerequisites.outputs.dependencies).VS2010_TORRENT_DIR }}"
VS2010_SHA256: "${{ fromJson(needs.prerequisites.outputs.dependencies).VS2010_SHA256 }}"
steps:
@@ -933,10 +935,11 @@ jobs:
- name: Download and unpack Visual Studio 2010
run: |
mkdir "$HOME\$env:VS2010_DIR"
- & curl -L "$env:VS2010_URL" -o "$HOME/$env:VS2010_FILENAME"
- $FileHash = Get-FileHash -Algorithm SHA256 "$HOME/$env:VS2010_FILENAME"
+ $ImagePath = "$HOME/$env:VS2010_TORRENT_DIR/$env:VS2010_FILENAME"
+ & aria2c -d "$HOME" --seed-time=0 --bt-stop-timeout=300 "$env:VS2010_TORRENT_URL" || & curl -L "$env:VS2010_URL" -o "$ImagePath" --create-dirs
+ $FileHash = Get-FileHash -Algorithm SHA256 "$ImagePath"
$FileHash.Hash -eq $env:VS2010_SHA256
- & 7z x -o"$HOME/$env:VS2010_DIR" "$HOME/$env:VS2010_FILENAME"
+ & 7z x -o"$HOME/$env:VS2010_DIR" "$ImagePath"
& dir "$HOME/$env:VS2010_DIR"
if: steps.vs2010.outputs.cache-hit != 'true'
diff --git a/make/conf/test-dependencies b/make/conf/test-dependencies
index c455e3d187..4bc970f190 100644
--- a/make/conf/test-dependencies
+++ b/make/conf/test-dependencies
@@ -31,7 +31,9 @@ JTREG_BUILD=b01
VS2010_FILENAME=VS2010Express1.iso
VS2010_DIR=VS2010Express1
-VS2010_URL=https://debian.fmi.uni-sofia.bg/~aangelov/VS2010Express1.iso
+VS2010_URL=https://archive.org/download/vs-2010-express-1/VS2010Express1.iso
+VS2010_TORRENT_URL=https://archive.org/download/vs-2010-express-1/vs-2010-express-1_archive.torrent
+VS2010_TORRENT_DIR=vs-2010-express-1
VS2010_SHA256=a9d5dcdf55e539a06547a8ebbc63d55dc167113e09ee9e42096ab9098313039b
VS2017_FILENAME=vs2017.exe
From 9da7380962e4532c880235c1dc74c9333a1b52f1 Mon Sep 17 00:00:00 2001
From: Zdenek Zambersky
Date: Thu, 6 Jun 2024 13:13:55 +0000
Subject: [PATCH 04/66] 8331730: [8u] GHA: update sysroot for cross builds to
Debian bullseye
Reviewed-by: serb
---
.github/workflows/submit.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/submit.yml b/.github/workflows/submit.yml
index c522c887ef..4d2c1d1f15 100644
--- a/.github/workflows/submit.yml
+++ b/.github/workflows/submit.yml
@@ -401,7 +401,7 @@ jobs:
--verbose
--include=fakeroot,symlinks,build-essential,libx11-dev,libxext-dev,libxrender-dev,libxrandr-dev,libxtst-dev,libxt-dev,libcups2-dev,libfontconfig1-dev,libasound2-dev,libfreetype6-dev,libpng-dev,libffi-dev
--resolve-deps
- buster
+ bullseye
~/sysroot-${{ matrix.debian-arch }}
http://httpredir.debian.org/debian/
if: matrix.debian-arch != '' && steps.cache-sysroot.outputs.cache-hit != 'true'
From 8892b817af1b25520b05608a30ea539dd0c0b25f Mon Sep 17 00:00:00 2001
From: Robert Toyonaga
Date: Thu, 6 Jun 2024 15:37:39 +0000
Subject: [PATCH 05/66] 8326521: JFR: CompilerPhase event test fails on windows
32 bit
Reviewed-by: sgehwolf
Backport-of: 96530bcc07514c3eda40fd6ffa74f197fe541dea
---
jdk/test/jdk/jfr/event/compiler/TestCompilerPhase.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/jdk/test/jdk/jfr/event/compiler/TestCompilerPhase.java b/jdk/test/jdk/jfr/event/compiler/TestCompilerPhase.java
index 3b80f79565..7a3659956e 100644
--- a/jdk/test/jdk/jfr/event/compiler/TestCompilerPhase.java
+++ b/jdk/test/jdk/jfr/event/compiler/TestCompilerPhase.java
@@ -45,6 +45,7 @@
* @run main ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
* @run main/othervm -Xbootclasspath/a:.
+ * -XX:-NeverActAsServerClassMachine
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
* -XX:CompileOnly=jdk.jfr.event.compiler.TestCompilerPhase::dummyMethod
* -Xbootclasspath/a:.
From 61dde50292198f9f35f906eef00b1fd002a19074 Mon Sep 17 00:00:00 2001
From: SendaoYan
Date: Fri, 7 Jun 2024 15:25:28 +0000
Subject: [PATCH 06/66] 8333724: Problem list
security/infra/java/security/cert/CertPathValidator/certification/CAInterop.java#teliasonerarootcav1
Reviewed-by: sgehwolf
Backport-of: 8ffc35d117846a7a2aa08afed662273d2f887770
---
jdk/test/ProblemList.txt | 1 +
1 file changed, 1 insertion(+)
diff --git a/jdk/test/ProblemList.txt b/jdk/test/ProblemList.txt
index 29f2d59b3c..0d432b16a2 100644
--- a/jdk/test/ProblemList.txt
+++ b/jdk/test/ProblemList.txt
@@ -390,4 +390,5 @@ sample/chatserver/ChatTest.java 8178912 generic-all
############################################################################
security/infra/java/security/cert/CertPathValidator/certification/CAInterop.java#certignarootca 8331883 generic-all
+security/infra/java/security/cert/CertPathValidator/certification/CAInterop.java#teliasonerarootcav1 8333640 generic-all
security/infra/java/security/cert/CertPathValidator/certification/LuxTrustCA.java 8314509 generic-all
From 0357abbfe41fc3dc244c30e48f8f9193219ea406 Mon Sep 17 00:00:00 2001
From: fitzsim
Date: Wed, 12 Jun 2024 19:31:59 +0000
Subject: [PATCH 07/66] 8324632: Update Zlib Data Compression Library to
Version 1.3.1 8315117: Update Zlib Data Compression Library to Version 1.3
8326351: Update the Zlib version in open/src/java.base/share/legal/zlib.md to
1.3.1
Reviewed-by: sgehwolf, andrew
Backport-of: 6aa721649d870354a79c3508343b14222e0edcfb
---
THIRD_PARTY_README | 6 +-
corba/THIRD_PARTY_README | 6 +-
hotspot/THIRD_PARTY_README | 6 +-
jaxp/THIRD_PARTY_README | 6 +-
jaxws/THIRD_PARTY_README | 6 +-
jdk/THIRD_PARTY_README | 6 +-
.../share/native/java/util/zip/zlib/ChangeLog | 215 ++++--
.../share/native/java/util/zip/zlib/README | 19 +-
.../native/java/util/zip/zlib/compress.c | 21 +-
.../share/native/java/util/zip/zlib/deflate.c | 612 ++++++++----------
.../share/native/java/util/zip/zlib/deflate.h | 51 +-
.../share/native/java/util/zip/zlib/gzclose.c | 4 +-
.../share/native/java/util/zip/zlib/gzguts.h | 31 +-
.../share/native/java/util/zip/zlib/gzlib.c | 113 +---
.../share/native/java/util/zip/zlib/gzread.c | 88 +--
.../share/native/java/util/zip/zlib/gzwrite.c | 84 +--
.../share/native/java/util/zip/zlib/infback.c | 30 +-
.../share/native/java/util/zip/zlib/inffast.c | 5 +-
.../share/native/java/util/zip/zlib/inffast.h | 2 +-
.../share/native/java/util/zip/zlib/inflate.c | 131 +---
.../native/java/util/zip/zlib/inftrees.c | 17 +-
.../native/java/util/zip/zlib/inftrees.h | 10 +-
.../java/util/zip/zlib/patches/ChangeLog_java | 2 +-
.../share/native/java/util/zip/zlib/trees.c | 542 +++++++---------
.../share/native/java/util/zip/zlib/uncompr.c | 16 +-
.../native/java/util/zip/zlib/zadler32.c | 32 +-
.../share/native/java/util/zip/zlib/zconf.h | 18 +-
.../share/native/java/util/zip/zlib/zcrc32.c | 248 +++----
.../share/native/java/util/zip/zlib/zlib.h | 391 +++++------
.../share/native/java/util/zip/zlib/zutil.c | 60 +-
.../share/native/java/util/zip/zlib/zutil.h | 47 +-
langtools/THIRD_PARTY_README | 6 +-
nashorn/THIRD_PARTY_README | 6 +-
33 files changed, 1205 insertions(+), 1632 deletions(-)
diff --git a/THIRD_PARTY_README b/THIRD_PARTY_README
index 99a20eb52d..97fc700d46 100644
--- a/THIRD_PARTY_README
+++ b/THIRD_PARTY_README
@@ -3043,14 +3043,14 @@ performance, or use of this material.
-------------------------------------------------------------------------------
-%% This notice is provided with respect to zlib v1.2.13, which may be included
+%% This notice is provided with respect to zlib v1.3.1, which may be included
with JRE 8, JDK 8, and OpenJDK 8.
--- begin of LICENSE ---
- version 1.2.13, October 13th, 2022
+ version 1.3.1, January 22, 2024
- Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler
+ Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
diff --git a/corba/THIRD_PARTY_README b/corba/THIRD_PARTY_README
index f26a5f3ec5..97fc700d46 100644
--- a/corba/THIRD_PARTY_README
+++ b/corba/THIRD_PARTY_README
@@ -3043,14 +3043,14 @@ performance, or use of this material.
-------------------------------------------------------------------------------
-%% This notice is provided with respect to zlib v1.2.11, which may be included
+%% This notice is provided with respect to zlib v1.3.1, which may be included
with JRE 8, JDK 8, and OpenJDK 8.
--- begin of LICENSE ---
- version 1.2.11, January 15th, 2017
+ version 1.3.1, January 22, 2024
- Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
+ Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
diff --git a/hotspot/THIRD_PARTY_README b/hotspot/THIRD_PARTY_README
index f26a5f3ec5..97fc700d46 100644
--- a/hotspot/THIRD_PARTY_README
+++ b/hotspot/THIRD_PARTY_README
@@ -3043,14 +3043,14 @@ performance, or use of this material.
-------------------------------------------------------------------------------
-%% This notice is provided with respect to zlib v1.2.11, which may be included
+%% This notice is provided with respect to zlib v1.3.1, which may be included
with JRE 8, JDK 8, and OpenJDK 8.
--- begin of LICENSE ---
- version 1.2.11, January 15th, 2017
+ version 1.3.1, January 22, 2024
- Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
+ Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
diff --git a/jaxp/THIRD_PARTY_README b/jaxp/THIRD_PARTY_README
index f26a5f3ec5..97fc700d46 100644
--- a/jaxp/THIRD_PARTY_README
+++ b/jaxp/THIRD_PARTY_README
@@ -3043,14 +3043,14 @@ performance, or use of this material.
-------------------------------------------------------------------------------
-%% This notice is provided with respect to zlib v1.2.11, which may be included
+%% This notice is provided with respect to zlib v1.3.1, which may be included
with JRE 8, JDK 8, and OpenJDK 8.
--- begin of LICENSE ---
- version 1.2.11, January 15th, 2017
+ version 1.3.1, January 22, 2024
- Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
+ Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
diff --git a/jaxws/THIRD_PARTY_README b/jaxws/THIRD_PARTY_README
index f26a5f3ec5..97fc700d46 100644
--- a/jaxws/THIRD_PARTY_README
+++ b/jaxws/THIRD_PARTY_README
@@ -3043,14 +3043,14 @@ performance, or use of this material.
-------------------------------------------------------------------------------
-%% This notice is provided with respect to zlib v1.2.11, which may be included
+%% This notice is provided with respect to zlib v1.3.1, which may be included
with JRE 8, JDK 8, and OpenJDK 8.
--- begin of LICENSE ---
- version 1.2.11, January 15th, 2017
+ version 1.3.1, January 22, 2024
- Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
+ Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
diff --git a/jdk/THIRD_PARTY_README b/jdk/THIRD_PARTY_README
index f26a5f3ec5..97fc700d46 100644
--- a/jdk/THIRD_PARTY_README
+++ b/jdk/THIRD_PARTY_README
@@ -3043,14 +3043,14 @@ performance, or use of this material.
-------------------------------------------------------------------------------
-%% This notice is provided with respect to zlib v1.2.11, which may be included
+%% This notice is provided with respect to zlib v1.3.1, which may be included
with JRE 8, JDK 8, and OpenJDK 8.
--- begin of LICENSE ---
- version 1.2.11, January 15th, 2017
+ version 1.3.1, January 22, 2024
- Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
+ Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
diff --git a/jdk/src/share/native/java/util/zip/zlib/ChangeLog b/jdk/src/share/native/java/util/zip/zlib/ChangeLog
index 30199a65a0..b801a1031e 100644
--- a/jdk/src/share/native/java/util/zip/zlib/ChangeLog
+++ b/jdk/src/share/native/java/util/zip/zlib/ChangeLog
@@ -1,6 +1,109 @@
ChangeLog file for zlib
+Changes in 1.3.1 (22 Jan 2024)
+- Reject overflows of zip header fields in minizip
+- Fix bug in inflateSync() for data held in bit buffer
+- Add LIT_MEM define to use more memory for a small deflate speedup
+- Fix decision on the emission of Zip64 end records in minizip
+- Add bounds checking to ERR_MSG() macro, used by zError()
+- Neutralize zip file traversal attacks in miniunz
+- Fix a bug in ZLIB_DEBUG compiles in check_match()
+- Various portability and appearance improvements
+
+Changes in 1.3 (18 Aug 2023)
+- Remove K&R function definitions and zlib2ansi
+- Fix bug in deflateBound() for level 0 and memLevel 9
+- Fix bug when gzungetc() is used immediately after gzopen()
+- Fix bug when using gzflush() with a very small buffer
+- Fix crash when gzsetparams() attempted for transparent write
+- Fix test/example.c to work with FORCE_STORED
+- Rewrite of zran in examples (see zran.c version history)
+- Fix minizip to allow it to open an empty zip file
+- Fix reading disk number start on zip64 files in minizip
+- Fix logic error in minizip argument processing
+- Add minizip testing to Makefile
+- Read multiple bytes instead of byte-by-byte in minizip unzip.c
+- Add memory sanitizer to configure (--memory)
+- Various portability improvements
+- Various documentation improvements
+- Various spelling and typo corrections
+
+Changes in 1.2.13 (13 Oct 2022)
+- Fix configure issue that discarded provided CC definition
+- Correct incorrect inputs provided to the CRC functions
+- Repair prototypes and exporting of new CRC functions
+- Fix inflateBack to detect invalid input with distances too far
+- Have infback() deliver all of the available output up to any error
+- Fix a bug when getting a gzip header extra field with inflate()
+- Fix bug in block type selection when Z_FIXED used
+- Tighten deflateBound bounds
+- Remove deleted assembler code references
+- Various portability and appearance improvements
+
+Changes in 1.2.12 (27 Mar 2022)
+- Cygwin does not have _wopen(), so do not create gzopen_w() there
+- Permit a deflateParams() parameter change as soon as possible
+- Limit hash table inserts after switch from stored deflate
+- Fix bug when window full in deflate_stored()
+- Fix CLEAR_HASH macro to be usable as a single statement
+- Avoid a conversion error in gzseek when off_t type too small
+- Have Makefile return non-zero error code on test failure
+- Avoid some conversion warnings in gzread.c and gzwrite.c
+- Update use of errno for newer Windows CE versions
+- Small speedup to inflate [psumbera]
+- Return an error if the gzputs string length can't fit in an int
+- Add address checking in clang to -w option of configure
+- Don't compute check value for raw inflate if asked to validate
+- Handle case where inflateSync used when header never processed
+- Avoid the use of ptrdiff_t
+- Avoid an undefined behavior of memcpy() in gzappend()
+- Avoid undefined behaviors of memcpy() in gz*printf()
+- Avoid an undefined behavior of memcpy() in _tr_stored_block()
+- Make the names in functions declarations identical to definitions
+- Remove old assembler code in which bugs have manifested
+- Fix deflateEnd() to not report an error at start of raw deflate
+- Add legal disclaimer to README
+- Emphasize the need to continue decompressing gzip members
+- Correct the initialization requirements for deflateInit2()
+- Fix a bug that can crash deflate on some input when using Z_FIXED
+- Assure that the number of bits for deflatePrime() is valid
+- Use a structure to make globals in enough.c evident
+- Use a macro for the printf format of big_t in enough.c
+- Clean up code style in enough.c, update version
+- Use inline function instead of macro for index in enough.c
+- Clarify that prefix codes are counted in enough.c
+- Show all the codes for the maximum tables size in enough.c
+- Add gznorm.c example, which normalizes gzip files
+- Fix the zran.c example to work on a multiple-member gzip file
+- Add tables for crc32_combine(), to speed it up by a factor of 200
+- Add crc32_combine_gen() and crc32_combine_op() for fast combines
+- Speed up software CRC-32 computation by a factor of 1.5 to 3
+- Use atomic test and set, if available, for dynamic CRC tables
+- Don't bother computing check value after successful inflateSync()
+- Correct comment in crc32.c
+- Add use of the ARMv8 crc32 instructions when requested
+- Use ARM crc32 instructions if the ARM architecture has them
+- Explicitly note that the 32-bit check values are 32 bits
+- Avoid adding empty gzip member after gzflush with Z_FINISH
+- Fix memory leak on error in gzlog.c
+- Fix error in comment on the polynomial representation of a byte
+- Clarify gz* function interfaces, referring to parameter names
+- Change macro name in inflate.c to avoid collision in VxWorks
+- Correct typo in blast.c
+- Improve portability of contrib/minizip
+- Fix indentation in minizip's zip.c
+- Replace black/white with allow/block. (theresa-m)
+- minizip warning fix if MAXU32 already defined. (gvollant)
+- Fix unztell64() in minizip to work past 4GB. (Daniël Hörchner)
+- Clean up minizip to reduce warnings for testing
+- Add fallthrough comments for gcc
+- Eliminate use of ULL constants
+- Separate out address sanitizing from warnings in configure
+- Remove destructive aspects of make distclean
+- Check for cc masquerading as gcc or clang in configure
+- Fix crc32.c to compile local functions only if used
+
Changes in 1.2.11 (15 Jan 2017)
- Fix deflate stored bug when pulling last block from window
- Permit immediate deflateParams changes before any deflate input
@@ -96,7 +199,7 @@ Changes in 1.2.7.1 (24 Mar 2013)
- Fix types in contrib/minizip to match result of get_crc_table()
- Simplify contrib/vstudio/vc10 with 'd' suffix
- Add TOP support to win32/Makefile.msc
-- Suport i686 and amd64 assembler builds in CMakeLists.txt
+- Support i686 and amd64 assembler builds in CMakeLists.txt
- Fix typos in the use of _LARGEFILE64_SOURCE in zconf.h
- Add vc11 and vc12 build files to contrib/vstudio
- Add gzvprintf() as an undocumented function in zlib
@@ -296,14 +399,14 @@ Changes in 1.2.5.1 (10 Sep 2011)
- Use u4 type for crc_table to avoid conversion warnings
- Apply casts in zlib.h to avoid conversion warnings
- Add OF to prototypes for adler32_combine_ and crc32_combine_ [Miller]
-- Improve inflateSync() documentation to note indeterminancy
+- Improve inflateSync() documentation to note indeterminacy
- Add deflatePending() function to return the amount of pending output
- Correct the spelling of "specification" in FAQ [Randers-Pehrson]
- Add a check in configure for stdarg.h, use for gzprintf()
- Check that pointers fit in ints when gzprint() compiled old style
- Add dummy name before $(SHAREDLIBV) in Makefile [Bar-Lev, Bowler]
- Delete line in configure that adds -L. libz.a to LDFLAGS [Weigelt]
-- Add debug records in assmebler code [Londer]
+- Add debug records in assembler code [Londer]
- Update RFC references to use http://tools.ietf.org/html/... [Li]
- Add --archs option, use of libtool to configure for Mac OS X [Borstel]
@@ -511,7 +614,7 @@ Changes in 1.2.3.5 (8 Jan 2010)
- Don't use _vsnprintf on later versions of MSVC [Lowman]
- Add CMake build script and input file [Lowman]
- Update contrib/minizip to 1.1 [Svensson, Vollant]
-- Moved nintendods directory from contrib to .
+- Moved nintendods directory from contrib to root
- Replace gzio.c with a new set of routines with the same functionality
- Add gzbuffer(), gzoffset(), gzclose_r(), gzclose_w() as part of above
- Update contrib/minizip to 1.1b
@@ -685,7 +788,7 @@ Changes in 1.2.2.4 (11 July 2005)
- Be more strict on incomplete code sets in inflate_table() and increase
ENOUGH and MAXD -- this repairs a possible security vulnerability for
invalid inflate input. Thanks to Tavis Ormandy and Markus Oberhumer for
- discovering the vulnerability and providing test cases.
+ discovering the vulnerability and providing test cases
- Add ia64 support to configure for HP-UX [Smith]
- Add error return to gzread() for format or i/o error [Levin]
- Use malloc.h for OS/2 [Necasek]
@@ -721,7 +824,7 @@ Changes in 1.2.2.2 (30 December 2004)
- Add Z_FIXED strategy option to deflateInit2() to force fixed trees
- Add updated make_vms.com [Coghlan], update README
- Create a new "examples" directory, move gzappend.c there, add zpipe.c,
- fitblk.c, gzlog.[ch], gzjoin.c, and zlib_how.html.
+ fitblk.c, gzlog.[ch], gzjoin.c, and zlib_how.html
- Add FAQ entry and comments in deflate.c on uninitialized memory access
- Add Solaris 9 make options in configure [Gilbert]
- Allow strerror() usage in gzio.c for STDC
@@ -792,7 +895,7 @@ Changes in 1.2.1.1 (9 January 2004)
- Fix a big fat bug in inftrees.c that prevented decoding valid
dynamic blocks with only literals and no distance codes --
Thanks to "Hot Emu" for the bug report and sample file
-- Add a note to puff.c on no distance codes case.
+- Add a note to puff.c on no distance codes case
Changes in 1.2.1 (17 November 2003)
- Remove a tab in contrib/gzappend/gzappend.c
@@ -970,7 +1073,7 @@ Changes in 1.2.0.1 (17 March 2003)
- Include additional header file on VMS for off_t typedef
- Try to use _vsnprintf where it supplants vsprintf [Vollant]
- Add some casts in inffast.c
-- Enchance comments in zlib.h on what happens if gzprintf() tries to
+- Enhance comments in zlib.h on what happens if gzprintf() tries to
write more than 4095 bytes before compression
- Remove unused state from inflateBackEnd()
- Remove exit(0) from minigzip.c, example.c
@@ -1036,14 +1139,14 @@ Changes in 1.2.0 (9 March 2003)
- Add contrib/puff/ simple inflate for deflate format description
Changes in 1.1.4 (11 March 2002)
-- ZFREE was repeated on same allocation on some error conditions.
+- ZFREE was repeated on same allocation on some error conditions
This creates a security problem described in
http://www.zlib.org/advisory-2002-03-11.txt
- Returned incorrect error (Z_MEM_ERROR) on some invalid data
- Avoid accesses before window for invalid distances with inflate window
- less than 32K.
+ less than 32K
- force windowBits > 8 to avoid a bug in the encoder for a window size
- of 256 bytes. (A complete fix will be available in 1.1.5).
+ of 256 bytes. (A complete fix will be available in 1.1.5)
Changes in 1.1.3 (9 July 1998)
- fix "an inflate input buffer bug that shows up on rare but persistent
@@ -1117,7 +1220,7 @@ Changes in 1.1.1 (27 Feb 98)
- remove block truncation heuristic which had very marginal effect for zlib
(smaller lit_bufsize than in gzip 1.2.4) and degraded a little the
compression ratio on some files. This also allows inlining _tr_tally for
- matches in deflate_slow.
+ matches in deflate_slow
- added msdos/Makefile.w32 for WIN32 Microsoft Visual C++ (Bob Frazier)
Changes in 1.1.0 (24 Feb 98)
@@ -1148,7 +1251,7 @@ Changes in 1.0.9 (17 Feb 1998)
- Avoid gcc 2.8.0 comparison bug a little differently than zlib 1.0.8
- in inftrees.c, avoid cc -O bug on HP (Farshid Elahi)
- in zconf.h move the ZLIB_DLL stuff earlier to avoid problems with
- the declaration of FAR (Gilles VOllant)
+ the declaration of FAR (Gilles Vollant)
- install libz.so* with mode 755 (executable) instead of 644 (Marc Lehmann)
- read_buf buf parameter of type Bytef* instead of charf*
- zmemcpy parameters are of type Bytef*, not charf* (Joseph Strout)
@@ -1162,7 +1265,7 @@ Changes in 1.0.8 (27 Jan 1998)
- include sys/types.h to get off_t on some systems (Marc Lehmann & QingLong)
- use constant arrays for the static trees in trees.c instead of computing
them at run time (thanks to Ken Raeburn for this suggestion). To create
- trees.h, compile with GEN_TREES_H and run "make test".
+ trees.h, compile with GEN_TREES_H and run "make test"
- check return code of example in "make test" and display result
- pass minigzip command line options to file_compress
- simplifying code of inflateSync to avoid gcc 2.8 bug
@@ -1201,12 +1304,12 @@ Changes in 1.0.6 (19 Jan 1998)
- add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and
gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code)
- Fix a deflate bug occurring only with compression level 0 (thanks to
- Andy Buckler for finding this one).
-- In minigzip, pass transparently also the first byte for .Z files.
+ Andy Buckler for finding this one)
+- In minigzip, pass transparently also the first byte for .Z files
- return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress()
- check Z_FINISH in inflate (thanks to Marc Schluper)
- Implement deflateCopy (thanks to Adam Costello)
-- make static libraries by default in configure, add --shared option.
+- make static libraries by default in configure, add --shared option
- move MSDOS or Windows specific files to directory msdos
- suppress the notion of partial flush to simplify the interface
(but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4)
@@ -1218,7 +1321,7 @@ Changes in 1.0.6 (19 Jan 1998)
- added Makefile.nt (thanks to Stephen Williams)
- added the unsupported "contrib" directory:
contrib/asm386/ by Gilles Vollant
- 386 asm code replacing longest_match().
+ 386 asm code replacing longest_match()
contrib/iostream/ by Kevin Ruland
A C++ I/O streams interface to the zlib gz* functions
contrib/iostream2/ by Tyge Løvset
@@ -1226,7 +1329,7 @@ Changes in 1.0.6 (19 Jan 1998)
contrib/untgz/ by "Pedro A. Aranda Guti\irrez"
A very simple tar.gz file extractor using zlib
contrib/visual-basic.txt by Carlos Rios
- How to use compress(), uncompress() and the gz* functions from VB.
+ How to use compress(), uncompress() and the gz* functions from VB
- pass params -f (filtered data), -h (huffman only), -1 to -9 (compression
level) in minigzip (thanks to Tom Lane)
@@ -1235,8 +1338,8 @@ Changes in 1.0.6 (19 Jan 1998)
- add undocumented function inflateSyncPoint() (hack for Paul Mackerras)
- add undocumented function zError to convert error code to string
(for Tim Smithers)
-- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code.
-- Use default memcpy for Symantec MSDOS compiler.
+- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code
+- Use default memcpy for Symantec MSDOS compiler
- Add EXPORT keyword for check_func (needed for Windows DLL)
- add current directory to LD_LIBRARY_PATH for "make test"
- create also a link for libz.so.1
@@ -1249,7 +1352,7 @@ Changes in 1.0.6 (19 Jan 1998)
- allow compilation with ANSI keywords only enabled for TurboC in large model
- avoid "versionString"[0] (Borland bug)
- add NEED_DUMMY_RETURN for Borland
-- use variable z_verbose for tracing in debug mode (L. Peter Deutsch).
+- use variable z_verbose for tracing in debug mode (L. Peter Deutsch)
- allow compilation with CC
- defined STDC for OS/2 (David Charlap)
- limit external names to 8 chars for MVS (Thomas Lund)
@@ -1259,7 +1362,7 @@ Changes in 1.0.6 (19 Jan 1998)
- use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau)
- added makelcc.bat for lcc-win32 (Tom St Denis)
- in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe)
-- Avoid expanded $Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion.
+- Avoid expanded $Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion
- check for unistd.h in configure (for off_t)
- remove useless check parameter in inflate_blocks_free
- avoid useless assignment of s->check to itself in inflate_blocks_new
@@ -1280,7 +1383,7 @@ Changes in 1.0.5 (3 Jan 98)
Changes in 1.0.4 (24 Jul 96)
- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF
bit, so the decompressor could decompress all the correct data but went
- on to attempt decompressing extra garbage data. This affected minigzip too.
+ on to attempt decompressing extra garbage data. This affected minigzip too
- zlibVersion and gzerror return const char* (needed for DLL)
- port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno)
- use z_error only for DEBUG (avoid problem with DLLs)
@@ -1310,7 +1413,7 @@ Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion]
- fix array overlay in deflate.c which sometimes caused bad compressed data
- fix inflate bug with empty stored block
- fix MSDOS medium model which was broken in 0.99
-- fix deflateParams() which could generate bad compressed data.
+- fix deflateParams() which could generate bad compressed data
- Bytef is define'd instead of typedef'ed (work around Borland bug)
- added an INDEX file
- new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32),
@@ -1331,7 +1434,7 @@ Changes in 0.99 (27 Jan 96)
- allow preset dictionary shared between compressor and decompressor
- allow compression level 0 (no compression)
- add deflateParams in zlib.h: allow dynamic change of compression level
- and compression strategy.
+ and compression strategy
- test large buffers and deflateParams in example.c
- add optional "configure" to build zlib as a shared library
- suppress Makefile.qnx, use configure instead
@@ -1370,33 +1473,33 @@ Changes in 0.99 (27 Jan 96)
- fix typo in Make_vms.com (f$trnlnm -> f$getsyi)
- in fcalloc, normalize pointer if size > 65520 bytes
- don't use special fcalloc for 32 bit Borland C++
-- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc...
+- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc.
- use Z_BINARY instead of BINARY
- document that gzclose after gzdopen will close the file
-- allow "a" as mode in gzopen.
+- allow "a" as mode in gzopen
- fix error checking in gzread
- allow skipping .gz extra-field on pipes
- added reference to Perl interface in README
- put the crc table in FAR data (I dislike more and more the medium model :)
- added get_crc_table
-- added a dimension to all arrays (Borland C can't count).
+- added a dimension to all arrays (Borland C can't count)
- workaround Borland C bug in declaration of inflate_codes_new & inflate_fast
- guard against multiple inclusion of *.h (for precompiled header on Mac)
-- Watcom C pretends to be Microsoft C small model even in 32 bit mode.
+- Watcom C pretends to be Microsoft C small model even in 32 bit mode
- don't use unsized arrays to avoid silly warnings by Visual C++:
warning C4746: 'inflate_mask' : unsized array treated as '__far'
- (what's wrong with far data in far model?).
+ (what's wrong with far data in far model?)
- define enum out of inflate_blocks_state to allow compilation with C++
Changes in 0.95 (16 Aug 95)
- fix MSDOS small and medium model (now easier to adapt to any compiler)
- inlined send_bits
- fix the final (:-) bug for deflate with flush (output was correct but
- not completely flushed in rare occasions).
+ not completely flushed in rare occasions)
- default window size is same for compression and decompression
- (it's now sufficient to set MAX_WBITS in zconf.h).
+ (it's now sufficient to set MAX_WBITS in zconf.h)
- voidp -> voidpf and voidnp -> voidp (for consistency with other
- typedefs and because voidnp was not near in large model).
+ typedefs and because voidnp was not near in large model)
Changes in 0.94 (13 Aug 95)
- support MSDOS medium model
@@ -1405,12 +1508,12 @@ Changes in 0.94 (13 Aug 95)
- added support for VMS
- allow a compression level in gzopen()
- gzflush now calls fflush
-- For deflate with flush, flush even if no more input is provided.
+- For deflate with flush, flush even if no more input is provided
- rename libgz.a as libz.a
- avoid complex expression in infcodes.c triggering Turbo C bug
- work around a problem with gcc on Alpha (in INSERT_STRING)
- don't use inline functions (problem with some gcc versions)
-- allow renaming of Byte, uInt, etc... with #define.
+- allow renaming of Byte, uInt, etc... with #define
- avoid warning about (unused) pointer before start of array in deflate.c
- avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c
- avoid reserved word 'new' in trees.c
@@ -1429,7 +1532,7 @@ Changes in 0.92 (3 May 95)
- no memcpy on Pyramid
- suppressed inftest.c
- optimized fill_window, put longest_match inline for gcc
-- optimized inflate on stored blocks.
+- optimized inflate on stored blocks
- untabify all sources to simplify patches
Changes in 0.91 (2 May 95)
@@ -1447,7 +1550,7 @@ Changes in 0.9 (1 May 95)
- let again gzread copy uncompressed data unchanged (was working in 0.71)
- deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented
- added a test of inflateSync in example.c
-- moved MAX_WBITS to zconf.h because users might want to change that.
+- moved MAX_WBITS to zconf.h because users might want to change that
- document explicitly that zalloc(64K) on MSDOS must return a normalized
pointer (zero offset)
- added Makefiles for Microsoft C, Turbo C, Borland C++
@@ -1456,7 +1559,7 @@ Changes in 0.9 (1 May 95)
Changes in 0.8 (29 April 95)
- added fast inflate (inffast.c)
- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this
- is incompatible with previous versions of zlib which returned Z_OK.
+ is incompatible with previous versions of zlib which returned Z_OK
- work around a TurboC compiler bug (bad code for b << 0, see infutil.h)
(actually that was not a compiler bug, see 0.81 above)
- gzread no longer reads one extra byte in certain cases
@@ -1466,50 +1569,50 @@ Changes in 0.8 (29 April 95)
Changes in 0.71 (14 April 95)
- Fixed more MSDOS compilation problems :( There is still a bug with
- TurboC large model.
+ TurboC large model
Changes in 0.7 (14 April 95)
-- Added full inflate support.
+- Added full inflate support
- Simplified the crc32() interface. The pre- and post-conditioning
(one's complement) is now done inside crc32(). WARNING: this is
- incompatible with previous versions; see zlib.h for the new usage.
+ incompatible with previous versions; see zlib.h for the new usage
Changes in 0.61 (12 April 95)
-- workaround for a bug in TurboC. example and minigzip now work on MSDOS.
+- workaround for a bug in TurboC. example and minigzip now work on MSDOS
Changes in 0.6 (11 April 95)
- added minigzip.c
- added gzdopen to reopen a file descriptor as gzFile
-- added transparent reading of non-gziped files in gzread.
+- added transparent reading of non-gziped files in gzread
- fixed bug in gzread (don't read crc as data)
-- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose).
+- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose)
- don't allocate big arrays in the stack (for MSDOS)
- fix some MSDOS compilation problems
Changes in 0.5:
- do real compression in deflate.c. Z_PARTIAL_FLUSH is supported but
- not yet Z_FULL_FLUSH.
+ not yet Z_FULL_FLUSH
- support decompression but only in a single step (forced Z_FINISH)
-- added opaque object for zalloc and zfree.
+- added opaque object for zalloc and zfree
- added deflateReset and inflateReset
-- added a variable zlib_version for consistency checking.
-- renamed the 'filter' parameter of deflateInit2 as 'strategy'.
- Added Z_FILTERED and Z_HUFFMAN_ONLY constants.
+- added a variable zlib_version for consistency checking
+- renamed the 'filter' parameter of deflateInit2 as 'strategy'
+ Added Z_FILTERED and Z_HUFFMAN_ONLY constants
Changes in 0.4:
-- avoid "zip" everywhere, use zlib instead of ziplib.
+- avoid "zip" everywhere, use zlib instead of ziplib
- suppress Z_BLOCK_FLUSH, interpret Z_PARTIAL_FLUSH as block flush
- if compression method == 8.
+ if compression method == 8
- added adler32 and crc32
- renamed deflateOptions as deflateInit2, call one or the other but not both
-- added the method parameter for deflateInit2.
+- added the method parameter for deflateInit2
- added inflateInit2
-- simplied considerably deflateInit and inflateInit by not supporting
+- simplified considerably deflateInit and inflateInit by not supporting
user-provided history buffer. This is supported only in deflateInit2
- and inflateInit2.
+ and inflateInit2
Changes in 0.3:
- prefix all macro names with Z_
-- use Z_FINISH instead of deflateEnd to finish compression.
+- use Z_FINISH instead of deflateEnd to finish compression
- added Z_HUFFMAN_ONLY
- added gzerror()
diff --git a/jdk/src/share/native/java/util/zip/zlib/README b/jdk/src/share/native/java/util/zip/zlib/README
index ba34d1894a..c5f917540b 100644
--- a/jdk/src/share/native/java/util/zip/zlib/README
+++ b/jdk/src/share/native/java/util/zip/zlib/README
@@ -1,6 +1,6 @@
ZLIB DATA COMPRESSION LIBRARY
-zlib 1.2.13 is a general purpose data compression library. All the code is
+zlib 1.3.1 is a general purpose data compression library. All the code is
thread safe. The data format used by the zlib library is described by RFCs
(Request for Comments) 1950 to 1952 in the files
http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and
@@ -29,18 +29,17 @@ PLEASE read the zlib FAQ http://zlib.net/zlib_faq.html before asking for help.
Mark Nelson wrote an article about zlib for the Jan. 1997
issue of Dr. Dobb's Journal; a copy of the article is available at
-http://marknelson.us/1997/01/01/zlib-engine/ .
+https://marknelson.us/posts/1997/01/01/zlib-engine.html .
-The changes made in version 1.2.13 are documented in the file ChangeLog.
+The changes made in version 1.3.1 are documented in the file ChangeLog.
Unsupported third party contributions are provided in directory contrib/ .
-zlib is available in Java using the java.util.zip package, documented at
-http://java.sun.com/developer/technicalArticles/Programming/compression/ .
+zlib is available in Java using the java.util.zip package. Follow the API
+Documentation link at: https://docs.oracle.com/search/?q=java.util.zip .
-A Perl interface to zlib written by Paul Marquess is available
-at CPAN (Comprehensive Perl Archive Network) sites, including
-http://search.cpan.org/~pmqs/IO-Compress-Zlib/ .
+A Perl interface to zlib and bzip2 written by Paul Marquess
+can be found at https://github.com/pmqs/IO-Compress .
A Python interface to zlib written by A.M. Kuchling is
available in Python 1.5 and later versions, see
@@ -64,7 +63,7 @@ Notes for some targets:
- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works
when compiled with cc.
-- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is
+- On Digital Unix 4.0D (formerly OSF/1) on AlphaServer, the cc option -std1 is
necessary to get gzprintf working correctly. This is done by configure.
- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with
@@ -84,7 +83,7 @@ Acknowledgments:
Copyright notice:
- (C) 1995-2022 Jean-loup Gailly and Mark Adler
+ (C) 1995-2024 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
diff --git a/jdk/src/share/native/java/util/zip/zlib/compress.c b/jdk/src/share/native/java/util/zip/zlib/compress.c
index bc09009678..d742137967 100644
--- a/jdk/src/share/native/java/util/zip/zlib/compress.c
+++ b/jdk/src/share/native/java/util/zip/zlib/compress.c
@@ -43,13 +43,8 @@
memory, Z_BUF_ERROR if there was not enough room in the output buffer,
Z_STREAM_ERROR if the level parameter is invalid.
*/
-int ZEXPORT compress2(dest, destLen, source, sourceLen, level)
- Bytef *dest;
- uLongf *destLen;
- const Bytef *source;
- uLong sourceLen;
- int level;
-{
+int ZEXPORT compress2(Bytef *dest, uLongf *destLen, const Bytef *source,
+ uLong sourceLen, int level) {
z_stream stream;
int err;
const uInt max = (uInt)-1;
@@ -89,12 +84,8 @@ int ZEXPORT compress2(dest, destLen, source, sourceLen, level)
/* ===========================================================================
*/
-int ZEXPORT compress(dest, destLen, source, sourceLen)
- Bytef *dest;
- uLongf *destLen;
- const Bytef *source;
- uLong sourceLen;
-{
+int ZEXPORT compress(Bytef *dest, uLongf *destLen, const Bytef *source,
+ uLong sourceLen) {
return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
}
@@ -102,9 +93,7 @@ int ZEXPORT compress(dest, destLen, source, sourceLen)
If the default memLevel or windowBits for deflateInit() is changed, then
this function needs to be updated.
*/
-uLong ZEXPORT compressBound(sourceLen)
- uLong sourceLen;
-{
+uLong ZEXPORT compressBound(uLong sourceLen) {
return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
(sourceLen >> 25) + 13;
}
diff --git a/jdk/src/share/native/java/util/zip/zlib/deflate.c b/jdk/src/share/native/java/util/zip/zlib/deflate.c
index 46d512d420..57fc6802bb 100644
--- a/jdk/src/share/native/java/util/zip/zlib/deflate.c
+++ b/jdk/src/share/native/java/util/zip/zlib/deflate.c
@@ -23,7 +23,7 @@
*/
/* deflate.c -- compress data using the deflation algorithm
- * Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler
+ * Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -76,7 +76,7 @@
#include "deflate.h"
const char deflate_copyright[] =
- " deflate 1.2.13 Copyright 1995-2022 Jean-loup Gailly and Mark Adler ";
+ " deflate 1.3.1 Copyright 1995-2024 Jean-loup Gailly and Mark Adler ";
/*
If you use the zlib library in a product, an acknowledgment is welcome
in the documentation of your product. If for some reason you cannot
@@ -84,9 +84,6 @@ const char deflate_copyright[] =
copyright string in the executable of your product.
*/
-/* ===========================================================================
- * Function prototypes.
- */
typedef enum {
need_more, /* block not completed, need more input or more output */
block_done, /* block flush performed */
@@ -94,29 +91,16 @@ typedef enum {
finish_done /* finish done, accept no more input or output */
} block_state;
-typedef block_state (*compress_func) OF((deflate_state *s, int flush));
+typedef block_state (*compress_func)(deflate_state *s, int flush);
/* Compression function. Returns the block state after the call. */
-local int deflateStateCheck OF((z_streamp strm));
-local void slide_hash OF((deflate_state *s));
-local void fill_window OF((deflate_state *s));
-local block_state deflate_stored OF((deflate_state *s, int flush));
-local block_state deflate_fast OF((deflate_state *s, int flush));
+local block_state deflate_stored(deflate_state *s, int flush);
+local block_state deflate_fast(deflate_state *s, int flush);
#ifndef FASTEST
-local block_state deflate_slow OF((deflate_state *s, int flush));
-#endif
-local block_state deflate_rle OF((deflate_state *s, int flush));
-local block_state deflate_huff OF((deflate_state *s, int flush));
-local void lm_init OF((deflate_state *s));
-local void putShortMSB OF((deflate_state *s, uInt b));
-local void flush_pending OF((z_streamp strm));
-local unsigned read_buf OF((z_streamp strm, Bytef *buf, unsigned size));
-local uInt longest_match OF((deflate_state *s, IPos cur_match));
-
-#ifdef ZLIB_DEBUG
-local void check_match OF((deflate_state *s, IPos start, IPos match,
- int length));
+local block_state deflate_slow(deflate_state *s, int flush);
#endif
+local block_state deflate_rle(deflate_state *s, int flush);
+local block_state deflate_huff(deflate_state *s, int flush);
/* ===========================================================================
* Local data
@@ -219,9 +203,12 @@ local const config configuration_table[10] = {
* bit values at the expense of memory usage). We slide even when level == 0 to
* keep the hash table consistent if we switch back to level > 0 later.
*/
-local void slide_hash(s)
- deflate_state *s;
-{
+#if defined(__has_feature)
+# if __has_feature(memory_sanitizer)
+ __attribute__((no_sanitize("memory")))
+# endif
+#endif
+local void slide_hash(deflate_state *s) {
unsigned n, m;
Posf *p;
uInt wsize = s->w_size;
@@ -245,30 +232,177 @@ local void slide_hash(s)
#endif
}
+/* ===========================================================================
+ * Read a new buffer from the current input stream, update the adler32
+ * and total number of bytes read. All deflate() input goes through
+ * this function so some applications may wish to modify it to avoid
+ * allocating a large strm->next_in buffer and copying from it.
+ * (See also flush_pending()).
+ */
+local unsigned read_buf(z_streamp strm, Bytef *buf, unsigned size) {
+ unsigned len = strm->avail_in;
+
+ if (len > size) len = size;
+ if (len == 0) return 0;
+
+ strm->avail_in -= len;
+
+ zmemcpy(buf, strm->next_in, len);
+ if (strm->state->wrap == 1) {
+ strm->adler = adler32(strm->adler, buf, len);
+ }
+#ifdef GZIP
+ else if (strm->state->wrap == 2) {
+ strm->adler = crc32(strm->adler, buf, len);
+ }
+#endif
+ strm->next_in += len;
+ strm->total_in += len;
+
+ return len;
+}
+
+/* ===========================================================================
+ * Fill the window when the lookahead becomes insufficient.
+ * Updates strstart and lookahead.
+ *
+ * IN assertion: lookahead < MIN_LOOKAHEAD
+ * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
+ * At least one byte has been read, or avail_in == 0; reads are
+ * performed for at least two bytes (required for the zip translate_eol
+ * option -- not supported here).
+ */
+local void fill_window(deflate_state *s) {
+ unsigned n;
+ unsigned more; /* Amount of free space at the end of the window. */
+ uInt wsize = s->w_size;
+
+ Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
+
+ do {
+ more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
+
+ /* Deal with !@#$% 64K limit: */
+ if (sizeof(int) <= 2) {
+ if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
+ more = wsize;
+
+ } else if (more == (unsigned)(-1)) {
+ /* Very unlikely, but possible on 16 bit machine if
+ * strstart == 0 && lookahead == 1 (input done a byte at time)
+ */
+ more--;
+ }
+ }
+
+ /* If the window is almost full and there is insufficient lookahead,
+ * move the upper half to the lower one to make room in the upper half.
+ */
+ if (s->strstart >= wsize + MAX_DIST(s)) {
+
+ zmemcpy(s->window, s->window + wsize, (unsigned)wsize - more);
+ s->match_start -= wsize;
+ s->strstart -= wsize; /* we now have strstart >= MAX_DIST */
+ s->block_start -= (long) wsize;
+ if (s->insert > s->strstart)
+ s->insert = s->strstart;
+ slide_hash(s);
+ more += wsize;
+ }
+ if (s->strm->avail_in == 0) break;
+
+ /* If there was no sliding:
+ * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
+ * more == window_size - lookahead - strstart
+ * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
+ * => more >= window_size - 2*WSIZE + 2
+ * In the BIG_MEM or MMAP case (not yet supported),
+ * window_size == input_size + MIN_LOOKAHEAD &&
+ * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
+ * Otherwise, window_size == 2*WSIZE so more >= 2.
+ * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
+ */
+ Assert(more >= 2, "more < 2");
+
+ n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
+ s->lookahead += n;
+
+ /* Initialize the hash value now that we have some input: */
+ if (s->lookahead + s->insert >= MIN_MATCH) {
+ uInt str = s->strstart - s->insert;
+ s->ins_h = s->window[str];
+ UPDATE_HASH(s, s->ins_h, s->window[str + 1]);
+#if MIN_MATCH != 3
+ Call UPDATE_HASH() MIN_MATCH-3 more times
+#endif
+ while (s->insert) {
+ UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
+#ifndef FASTEST
+ s->prev[str & s->w_mask] = s->head[s->ins_h];
+#endif
+ s->head[s->ins_h] = (Pos)str;
+ str++;
+ s->insert--;
+ if (s->lookahead + s->insert < MIN_MATCH)
+ break;
+ }
+ }
+ /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
+ * but this is not important since only literal bytes will be emitted.
+ */
+
+ } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);
+
+ /* If the WIN_INIT bytes after the end of the current data have never been
+ * written, then zero those bytes in order to avoid memory check reports of
+ * the use of uninitialized (or uninitialised as Julian writes) bytes by
+ * the longest match routines. Update the high water mark for the next
+ * time through here. WIN_INIT is set to MAX_MATCH since the longest match
+ * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
+ */
+ if (s->high_water < s->window_size) {
+ ulg curr = s->strstart + (ulg)(s->lookahead);
+ ulg init;
+
+ if (s->high_water < curr) {
+ /* Previous high water mark below current data -- zero WIN_INIT
+ * bytes or up to end of window, whichever is less.
+ */
+ init = s->window_size - curr;
+ if (init > WIN_INIT)
+ init = WIN_INIT;
+ zmemzero(s->window + curr, (unsigned)init);
+ s->high_water = curr + init;
+ }
+ else if (s->high_water < (ulg)curr + WIN_INIT) {
+ /* High water mark at or above current data, but below current data
+ * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
+ * to end of window, whichever is less.
+ */
+ init = (ulg)curr + WIN_INIT - s->high_water;
+ if (init > s->window_size - s->high_water)
+ init = s->window_size - s->high_water;
+ zmemzero(s->window + s->high_water, (unsigned)init);
+ s->high_water += init;
+ }
+ }
+
+ Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
+ "not enough room for search");
+}
+
/* ========================================================================= */
-int ZEXPORT deflateInit_(strm, level, version, stream_size)
- z_streamp strm;
- int level;
- const char *version;
- int stream_size;
-{
+int ZEXPORT deflateInit_(z_streamp strm, int level, const char *version,
+ int stream_size) {
return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL,
Z_DEFAULT_STRATEGY, version, stream_size);
/* To do: ignore strm->next_in if we use it as window */
}
/* ========================================================================= */
-int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
- version, stream_size)
- z_streamp strm;
- int level;
- int method;
- int windowBits;
- int memLevel;
- int strategy;
- const char *version;
- int stream_size;
-{
+int ZEXPORT deflateInit2_(z_streamp strm, int level, int method,
+ int windowBits, int memLevel, int strategy,
+ const char *version, int stream_size) {
deflate_state *s;
int wrap = 1;
static const char my_version[] = ZLIB_VERSION;
@@ -383,7 +517,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
* symbols from which it is being constructed.
*/
- s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, 4);
+ s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, LIT_BUFS);
s->pending_buf_size = (ulg)s->lit_bufsize * 4;
if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
@@ -393,8 +527,14 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
deflateEnd (strm);
return Z_MEM_ERROR;
}
+#ifdef LIT_MEM
+ s->d_buf = (ushf *)(s->pending_buf + (s->lit_bufsize << 1));
+ s->l_buf = s->pending_buf + (s->lit_bufsize << 2);
+ s->sym_end = s->lit_bufsize - 1;
+#else
s->sym_buf = s->pending_buf + s->lit_bufsize;
s->sym_end = (s->lit_bufsize - 1) * 3;
+#endif
/* We avoid equality with lit_bufsize*3 because of wraparound at 64K
* on 16 bit machines and because stored blocks are restricted to
* 64K-1 bytes.
@@ -410,9 +550,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
/* =========================================================================
* Check for a valid deflate stream state. Return 0 if ok, 1 if not.
*/
-local int deflateStateCheck(strm)
- z_streamp strm;
-{
+local int deflateStateCheck(z_streamp strm) {
deflate_state *s;
if (strm == Z_NULL ||
strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0)
@@ -433,11 +571,8 @@ local int deflateStateCheck(strm)
}
/* ========================================================================= */
-int ZEXPORT deflateSetDictionary(strm, dictionary, dictLength)
- z_streamp strm;
- const Bytef *dictionary;
- uInt dictLength;
-{
+int ZEXPORT deflateSetDictionary(z_streamp strm, const Bytef *dictionary,
+ uInt dictLength) {
deflate_state *s;
uInt str, n;
int wrap;
@@ -502,11 +637,8 @@ int ZEXPORT deflateSetDictionary(strm, dictionary, dictLength)
}
/* ========================================================================= */
-int ZEXPORT deflateGetDictionary(strm, dictionary, dictLength)
- z_streamp strm;
- Bytef *dictionary;
- uInt *dictLength;
-{
+int ZEXPORT deflateGetDictionary(z_streamp strm, Bytef *dictionary,
+ uInt *dictLength) {
deflate_state *s;
uInt len;
@@ -524,9 +656,7 @@ int ZEXPORT deflateGetDictionary(strm, dictionary, dictLength)
}
/* ========================================================================= */
-int ZEXPORT deflateResetKeep(strm)
- z_streamp strm;
-{
+int ZEXPORT deflateResetKeep(z_streamp strm) {
deflate_state *s;
if (deflateStateCheck(strm)) {
@@ -561,10 +691,32 @@ int ZEXPORT deflateResetKeep(strm)
return Z_OK;
}
+/* ===========================================================================
+ * Initialize the "longest match" routines for a new zlib stream
+ */
+local void lm_init(deflate_state *s) {
+ s->window_size = (ulg)2L*s->w_size;
+
+ CLEAR_HASH(s);
+
+ /* Set the default configuration parameters:
+ */
+ s->max_lazy_match = configuration_table[s->level].max_lazy;
+ s->good_match = configuration_table[s->level].good_length;
+ s->nice_match = configuration_table[s->level].nice_length;
+ s->max_chain_length = configuration_table[s->level].max_chain;
+
+ s->strstart = 0;
+ s->block_start = 0L;
+ s->lookahead = 0;
+ s->insert = 0;
+ s->match_length = s->prev_length = MIN_MATCH-1;
+ s->match_available = 0;
+ s->ins_h = 0;
+}
+
/* ========================================================================= */
-int ZEXPORT deflateReset(strm)
- z_streamp strm;
-{
+int ZEXPORT deflateReset(z_streamp strm) {
int ret;
ret = deflateResetKeep(strm);
@@ -574,10 +726,7 @@ int ZEXPORT deflateReset(strm)
}
/* ========================================================================= */
-int ZEXPORT deflateSetHeader(strm, head)
- z_streamp strm;
- gz_headerp head;
-{
+int ZEXPORT deflateSetHeader(z_streamp strm, gz_headerp head) {
if (deflateStateCheck(strm) || strm->state->wrap != 2)
return Z_STREAM_ERROR;
strm->state->gzhead = head;
@@ -585,11 +734,7 @@ int ZEXPORT deflateSetHeader(strm, head)
}
/* ========================================================================= */
-int ZEXPORT deflatePending(strm, pending, bits)
- unsigned *pending;
- int *bits;
- z_streamp strm;
-{
+int ZEXPORT deflatePending(z_streamp strm, unsigned *pending, int *bits) {
if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
if (pending != Z_NULL)
*pending = strm->state->pending;
@@ -599,19 +744,21 @@ int ZEXPORT deflatePending(strm, pending, bits)
}
/* ========================================================================= */
-int ZEXPORT deflatePrime(strm, bits, value)
- z_streamp strm;
- int bits;
- int value;
-{
+int ZEXPORT deflatePrime(z_streamp strm, int bits, int value) {
deflate_state *s;
int put;
if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
s = strm->state;
+#ifdef LIT_MEM
+ if (bits < 0 || bits > 16 ||
+ (uchf *)s->d_buf < s->pending_out + ((Buf_size + 7) >> 3))
+ return Z_BUF_ERROR;
+#else
if (bits < 0 || bits > 16 ||
s->sym_buf < s->pending_out + ((Buf_size + 7) >> 3))
return Z_BUF_ERROR;
+#endif
do {
put = Buf_size - s->bi_valid;
if (put > bits)
@@ -626,11 +773,7 @@ int ZEXPORT deflatePrime(strm, bits, value)
}
/* ========================================================================= */
-int ZEXPORT deflateParams(strm, level, strategy)
- z_streamp strm;
- int level;
- int strategy;
-{
+int ZEXPORT deflateParams(z_streamp strm, int level, int strategy) {
deflate_state *s;
compress_func func;
@@ -675,13 +818,8 @@ int ZEXPORT deflateParams(strm, level, strategy)
}
/* ========================================================================= */
-int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain)
- z_streamp strm;
- int good_length;
- int max_lazy;
- int nice_length;
- int max_chain;
-{
+int ZEXPORT deflateTune(z_streamp strm, int good_length, int max_lazy,
+ int nice_length, int max_chain) {
deflate_state *s;
if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
@@ -717,10 +855,7 @@ int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain)
*
* Shifts are used to approximate divisions, for speed.
*/
-uLong ZEXPORT deflateBound(strm, sourceLen)
- z_streamp strm;
- uLong sourceLen;
-{
+uLong ZEXPORT deflateBound(z_streamp strm, uLong sourceLen) {
deflate_state *s;
uLong fixedlen, storelen, wraplen;
@@ -776,7 +911,8 @@ uLong ZEXPORT deflateBound(strm, sourceLen)
/* if not default parameters, return one of the conservative bounds */
if (s->w_bits != 15 || s->hash_bits != 8 + 7)
- return (s->w_bits <= s->hash_bits ? fixedlen : storelen) + wraplen;
+ return (s->w_bits <= s->hash_bits && s->level ? fixedlen : storelen) +
+ wraplen;
/* default settings: return tight bound for that case -- ~0.03% overhead
plus a small constant */
@@ -789,10 +925,7 @@ uLong ZEXPORT deflateBound(strm, sourceLen)
* IN assertion: the stream state is correct and there is enough room in
* pending_buf.
*/
-local void putShortMSB(s, b)
- deflate_state *s;
- uInt b;
-{
+local void putShortMSB(deflate_state *s, uInt b) {
put_byte(s, (Byte)(b >> 8));
put_byte(s, (Byte)(b & 0xff));
}
@@ -803,9 +936,7 @@ local void putShortMSB(s, b)
* applications may wish to modify it to avoid allocating a large
* strm->next_out buffer and copying into it. (See also read_buf()).
*/
-local void flush_pending(strm)
- z_streamp strm;
-{
+local void flush_pending(z_streamp strm) {
unsigned len;
deflate_state *s = strm->state;
@@ -836,10 +967,7 @@ local void flush_pending(strm)
} while (0)
/* ========================================================================= */
-int ZEXPORT deflate(strm, flush)
- z_streamp strm;
- int flush;
-{
+int ZEXPORT deflate(z_streamp strm, int flush) {
int old_flush; /* value of flush param for previous deflate call */
deflate_state *s;
@@ -1151,9 +1279,7 @@ int ZEXPORT deflate(strm, flush)
}
/* ========================================================================= */
-int ZEXPORT deflateEnd(strm)
- z_streamp strm;
-{
+int ZEXPORT deflateEnd(z_streamp strm) {
int status;
if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
@@ -1177,11 +1303,10 @@ int ZEXPORT deflateEnd(strm)
* To simplify the source, this is not supported for 16-bit MSDOS (which
* doesn't have enough memory anyway to duplicate compression states).
*/
-int ZEXPORT deflateCopy(dest, source)
- z_streamp dest;
- z_streamp source;
-{
+int ZEXPORT deflateCopy(z_streamp dest, z_streamp source) {
#ifdef MAXSEG_64K
+ (void)dest;
+ (void)source;
return Z_STREAM_ERROR;
#else
deflate_state *ds;
@@ -1205,7 +1330,7 @@ int ZEXPORT deflateCopy(dest, source)
ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));
ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos));
ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos));
- ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, 4);
+ ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, LIT_BUFS);
if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL ||
ds->pending_buf == Z_NULL) {
@@ -1216,10 +1341,15 @@ int ZEXPORT deflateCopy(dest, source)
zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));
zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos));
zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos));
- zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);
+ zmemcpy(ds->pending_buf, ss->pending_buf, ds->lit_bufsize * LIT_BUFS);
ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);
+#ifdef LIT_MEM
+ ds->d_buf = (ushf *)(ds->pending_buf + (ds->lit_bufsize << 1));
+ ds->l_buf = ds->pending_buf + (ds->lit_bufsize << 2);
+#else
ds->sym_buf = ds->pending_buf + ds->lit_bufsize;
+#endif
ds->l_desc.dyn_tree = ds->dyn_ltree;
ds->d_desc.dyn_tree = ds->dyn_dtree;
@@ -1229,66 +1359,6 @@ int ZEXPORT deflateCopy(dest, source)
#endif /* MAXSEG_64K */
}
-/* ===========================================================================
- * Read a new buffer from the current input stream, update the adler32
- * and total number of bytes read. All deflate() input goes through
- * this function so some applications may wish to modify it to avoid
- * allocating a large strm->next_in buffer and copying from it.
- * (See also flush_pending()).
- */
-local unsigned read_buf(strm, buf, size)
- z_streamp strm;
- Bytef *buf;
- unsigned size;
-{
- unsigned len = strm->avail_in;
-
- if (len > size) len = size;
- if (len == 0) return 0;
-
- strm->avail_in -= len;
-
- zmemcpy(buf, strm->next_in, len);
- if (strm->state->wrap == 1) {
- strm->adler = adler32(strm->adler, buf, len);
- }
-#ifdef GZIP
- else if (strm->state->wrap == 2) {
- strm->adler = crc32(strm->adler, buf, len);
- }
-#endif
- strm->next_in += len;
- strm->total_in += len;
-
- return len;
-}
-
-/* ===========================================================================
- * Initialize the "longest match" routines for a new zlib stream
- */
-local void lm_init(s)
- deflate_state *s;
-{
- s->window_size = (ulg)2L*s->w_size;
-
- CLEAR_HASH(s);
-
- /* Set the default configuration parameters:
- */
- s->max_lazy_match = configuration_table[s->level].max_lazy;
- s->good_match = configuration_table[s->level].good_length;
- s->nice_match = configuration_table[s->level].nice_length;
- s->max_chain_length = configuration_table[s->level].max_chain;
-
- s->strstart = 0;
- s->block_start = 0L;
- s->lookahead = 0;
- s->insert = 0;
- s->match_length = s->prev_length = MIN_MATCH-1;
- s->match_available = 0;
- s->ins_h = 0;
-}
-
#ifndef FASTEST
/* ===========================================================================
* Set match_start to the longest match starting at the given string and
@@ -1299,10 +1369,7 @@ local void lm_init(s)
* string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
* OUT assertion: the match length is not greater than s->lookahead.
*/
-local uInt longest_match(s, cur_match)
- deflate_state *s;
- IPos cur_match; /* current match */
-{
+local uInt longest_match(deflate_state *s, IPos cur_match) {
unsigned chain_length = s->max_chain_length;/* max hash chain length */
register Bytef *scan = s->window + s->strstart; /* current string */
register Bytef *match; /* matched string */
@@ -1450,10 +1517,7 @@ local uInt longest_match(s, cur_match)
/* ---------------------------------------------------------------------------
* Optimized version for FASTEST only
*/
-local uInt longest_match(s, cur_match)
- deflate_state *s;
- IPos cur_match; /* current match */
-{
+local uInt longest_match(deflate_state *s, IPos cur_match) {
register Bytef *scan = s->window + s->strstart; /* current string */
register Bytef *match; /* matched string */
register int len; /* length of current match */
@@ -1514,19 +1578,23 @@ local uInt longest_match(s, cur_match)
/* ===========================================================================
* Check that the match at match_start is indeed a match.
*/
-local void check_match(s, start, match, length)
- deflate_state *s;
- IPos start, match;
- int length;
-{
+local void check_match(deflate_state *s, IPos start, IPos match, int length) {
/* check that the match is indeed a match */
- if (zmemcmp(s->window + match,
- s->window + start, length) != EQUAL) {
- fprintf(stderr, " start %u, match %u, length %d\n",
- start, match, length);
+ Bytef *back = s->window + (int)match, *here = s->window + start;
+ IPos len = length;
+ if (match == (IPos)-1) {
+ /* match starts one byte before the current window -- just compare the
+ subsequent length-1 bytes */
+ back++;
+ here++;
+ len--;
+ }
+ if (zmemcmp(back, here, len) != EQUAL) {
+ fprintf(stderr, " start %u, match %d, length %d\n",
+ start, (int)match, length);
do {
- fprintf(stderr, "%c%c", s->window[match++], s->window[start++]);
- } while (--length != 0);
+ fprintf(stderr, "(%02x %02x)", *back++, *here++);
+ } while (--len != 0);
z_error("invalid match");
}
if (z_verbose > 1) {
@@ -1538,137 +1606,6 @@ local void check_match(s, start, match, length)
# define check_match(s, start, match, length)
#endif /* ZLIB_DEBUG */
-/* ===========================================================================
- * Fill the window when the lookahead becomes insufficient.
- * Updates strstart and lookahead.
- *
- * IN assertion: lookahead < MIN_LOOKAHEAD
- * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
- * At least one byte has been read, or avail_in == 0; reads are
- * performed for at least two bytes (required for the zip translate_eol
- * option -- not supported here).
- */
-local void fill_window(s)
- deflate_state *s;
-{
- unsigned n;
- unsigned more; /* Amount of free space at the end of the window. */
- uInt wsize = s->w_size;
-
- Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
-
- do {
- more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
-
- /* Deal with !@#$% 64K limit: */
- if (sizeof(int) <= 2) {
- if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
- more = wsize;
-
- } else if (more == (unsigned)(-1)) {
- /* Very unlikely, but possible on 16 bit machine if
- * strstart == 0 && lookahead == 1 (input done a byte at time)
- */
- more--;
- }
- }
-
- /* If the window is almost full and there is insufficient lookahead,
- * move the upper half to the lower one to make room in the upper half.
- */
- if (s->strstart >= wsize + MAX_DIST(s)) {
-
- zmemcpy(s->window, s->window + wsize, (unsigned)wsize - more);
- s->match_start -= wsize;
- s->strstart -= wsize; /* we now have strstart >= MAX_DIST */
- s->block_start -= (long) wsize;
- if (s->insert > s->strstart)
- s->insert = s->strstart;
- slide_hash(s);
- more += wsize;
- }
- if (s->strm->avail_in == 0) break;
-
- /* If there was no sliding:
- * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
- * more == window_size - lookahead - strstart
- * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
- * => more >= window_size - 2*WSIZE + 2
- * In the BIG_MEM or MMAP case (not yet supported),
- * window_size == input_size + MIN_LOOKAHEAD &&
- * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
- * Otherwise, window_size == 2*WSIZE so more >= 2.
- * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
- */
- Assert(more >= 2, "more < 2");
-
- n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
- s->lookahead += n;
-
- /* Initialize the hash value now that we have some input: */
- if (s->lookahead + s->insert >= MIN_MATCH) {
- uInt str = s->strstart - s->insert;
- s->ins_h = s->window[str];
- UPDATE_HASH(s, s->ins_h, s->window[str + 1]);
-#if MIN_MATCH != 3
- Call UPDATE_HASH() MIN_MATCH-3 more times
-#endif
- while (s->insert) {
- UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
-#ifndef FASTEST
- s->prev[str & s->w_mask] = s->head[s->ins_h];
-#endif
- s->head[s->ins_h] = (Pos)str;
- str++;
- s->insert--;
- if (s->lookahead + s->insert < MIN_MATCH)
- break;
- }
- }
- /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
- * but this is not important since only literal bytes will be emitted.
- */
-
- } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);
-
- /* If the WIN_INIT bytes after the end of the current data have never been
- * written, then zero those bytes in order to avoid memory check reports of
- * the use of uninitialized (or uninitialised as Julian writes) bytes by
- * the longest match routines. Update the high water mark for the next
- * time through here. WIN_INIT is set to MAX_MATCH since the longest match
- * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
- */
- if (s->high_water < s->window_size) {
- ulg curr = s->strstart + (ulg)(s->lookahead);
- ulg init;
-
- if (s->high_water < curr) {
- /* Previous high water mark below current data -- zero WIN_INIT
- * bytes or up to end of window, whichever is less.
- */
- init = s->window_size - curr;
- if (init > WIN_INIT)
- init = WIN_INIT;
- zmemzero(s->window + curr, (unsigned)init);
- s->high_water = curr + init;
- }
- else if (s->high_water < (ulg)curr + WIN_INIT) {
- /* High water mark at or above current data, but below current data
- * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
- * to end of window, whichever is less.
- */
- init = (ulg)curr + WIN_INIT - s->high_water;
- if (init > s->window_size - s->high_water)
- init = s->window_size - s->high_water;
- zmemzero(s->window + s->high_water, (unsigned)init);
- s->high_water += init;
- }
- }
-
- Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
- "not enough room for search");
-}
-
/* ===========================================================================
* Flush the current block, with given end-of-file flag.
* IN assertion: strstart is set to the end of the current match.
@@ -1711,10 +1648,7 @@ local void fill_window(s)
* copied. It is most efficient with large input and output buffers, which
* maximizes the opportunities to have a single copy from next_in to next_out.
*/
-local block_state deflate_stored(s, flush)
- deflate_state *s;
- int flush;
-{
+local block_state deflate_stored(deflate_state *s, int flush) {
/* Smallest worthy block size when not flushing or finishing. By default
* this is 32K. This can be as small as 507 bytes for memLevel == 1. For
* large input and output buffers, the stored block size will be larger.
@@ -1898,10 +1832,7 @@ local block_state deflate_stored(s, flush)
* new strings in the dictionary only for unmatched strings or for short
* matches. It is used only for the fast compression options.
*/
-local block_state deflate_fast(s, flush)
- deflate_state *s;
- int flush;
-{
+local block_state deflate_fast(deflate_state *s, int flush) {
IPos hash_head; /* head of the hash chain */
int bflush; /* set if current block must be flushed */
@@ -2000,10 +1931,7 @@ local block_state deflate_fast(s, flush)
* evaluation for matches: a match is finally adopted only if there is
* no better match at the next window position.
*/
-local block_state deflate_slow(s, flush)
- deflate_state *s;
- int flush;
-{
+local block_state deflate_slow(deflate_state *s, int flush) {
IPos hash_head; /* head of hash chain */
int bflush; /* set if current block must be flushed */
@@ -2131,10 +2059,7 @@ local block_state deflate_slow(s, flush)
* one. Do not maintain a hash table. (It will be regenerated if this run of
* deflate switches away from Z_RLE.)
*/
-local block_state deflate_rle(s, flush)
- deflate_state *s;
- int flush;
-{
+local block_state deflate_rle(deflate_state *s, int flush) {
int bflush; /* set if current block must be flushed */
uInt prev; /* byte at distance one to match */
Bytef *scan, *strend; /* scan goes up to strend for length of run */
@@ -2205,10 +2130,7 @@ local block_state deflate_rle(s, flush)
* For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.
* (It will be regenerated if this run of deflate switches away from Huffman.)
*/
-local block_state deflate_huff(s, flush)
- deflate_state *s;
- int flush;
-{
+local block_state deflate_huff(deflate_state *s, int flush) {
int bflush; /* set if current block must be flushed */
for (;;) {
diff --git a/jdk/src/share/native/java/util/zip/zlib/deflate.h b/jdk/src/share/native/java/util/zip/zlib/deflate.h
index b73f5a04e1..830d46b889 100644
--- a/jdk/src/share/native/java/util/zip/zlib/deflate.h
+++ b/jdk/src/share/native/java/util/zip/zlib/deflate.h
@@ -23,7 +23,7 @@
*/
/* deflate.h -- internal compression state
- * Copyright (C) 1995-2018 Jean-loup Gailly
+ * Copyright (C) 1995-2024 Jean-loup Gailly
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -47,6 +47,10 @@
# define GZIP
#endif
+/* define LIT_MEM to slightly increase the speed of deflate (order 1% to 2%) at
+ the cost of a larger memory footprint */
+/* #define LIT_MEM */
+
/* ===========================================================================
* Internal compression state.
*/
@@ -241,7 +245,14 @@ typedef struct internal_state {
/* Depth of each subtree used as tie breaker for trees of equal frequency
*/
+#ifdef LIT_MEM
+# define LIT_BUFS 5
+ ushf *d_buf; /* buffer for distances */
+ uchf *l_buf; /* buffer for literals/lengths */
+#else
+# define LIT_BUFS 4
uchf *sym_buf; /* buffer for distances and literals/lengths */
+#endif
uInt lit_bufsize;
/* Size of match buffer for literals/lengths. There are 4 reasons for
@@ -263,7 +274,7 @@ typedef struct internal_state {
* - I can't count above 4
*/
- uInt sym_next; /* running index in sym_buf */
+ uInt sym_next; /* running index in symbol buffer */
uInt sym_end; /* symbol table full when sym_next reaches this */
ulg opt_len; /* bit length of current block with optimal trees */
@@ -315,14 +326,14 @@ typedef struct internal_state {
memory checker errors from longest match routines */
/* in trees.c */
-void ZLIB_INTERNAL _tr_init OF((deflate_state *s));
-int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc));
-void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf,
- ulg stored_len, int last));
-void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s));
-void ZLIB_INTERNAL _tr_align OF((deflate_state *s));
-void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf,
- ulg stored_len, int last));
+void ZLIB_INTERNAL _tr_init(deflate_state *s);
+int ZLIB_INTERNAL _tr_tally(deflate_state *s, unsigned dist, unsigned lc);
+void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, charf *buf,
+ ulg stored_len, int last);
+void ZLIB_INTERNAL _tr_flush_bits(deflate_state *s);
+void ZLIB_INTERNAL _tr_align(deflate_state *s);
+void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, charf *buf,
+ ulg stored_len, int last);
#define d_code(dist) \
((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)])
@@ -342,6 +353,25 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf,
extern const uch ZLIB_INTERNAL _dist_code[];
#endif
+#ifdef LIT_MEM
+# define _tr_tally_lit(s, c, flush) \
+ { uch cc = (c); \
+ s->d_buf[s->sym_next] = 0; \
+ s->l_buf[s->sym_next++] = cc; \
+ s->dyn_ltree[cc].Freq++; \
+ flush = (s->sym_next == s->sym_end); \
+ }
+# define _tr_tally_dist(s, distance, length, flush) \
+ { uch len = (uch)(length); \
+ ush dist = (ush)(distance); \
+ s->d_buf[s->sym_next] = dist; \
+ s->l_buf[s->sym_next++] = len; \
+ dist--; \
+ s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \
+ s->dyn_dtree[d_code(dist)].Freq++; \
+ flush = (s->sym_next == s->sym_end); \
+ }
+#else
# define _tr_tally_lit(s, c, flush) \
{ uch cc = (c); \
s->sym_buf[s->sym_next++] = 0; \
@@ -361,6 +391,7 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf,
s->dyn_dtree[d_code(dist)].Freq++; \
flush = (s->sym_next == s->sym_end); \
}
+#endif
#else
# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c)
# define _tr_tally_dist(s, distance, length, flush) \
diff --git a/jdk/src/share/native/java/util/zip/zlib/gzclose.c b/jdk/src/share/native/java/util/zip/zlib/gzclose.c
index 5cce4b03d2..eff53ace04 100644
--- a/jdk/src/share/native/java/util/zip/zlib/gzclose.c
+++ b/jdk/src/share/native/java/util/zip/zlib/gzclose.c
@@ -32,9 +32,7 @@
/* gzclose() is in a separate file so that it is linked in only if it is used.
That way the other gzclose functions can be used instead to avoid linking in
unneeded compression or decompression routines. */
-int ZEXPORT gzclose(file)
- gzFile file;
-{
+int ZEXPORT gzclose(gzFile file) {
#ifndef NO_GZCOMPRESS
gz_statep state;
diff --git a/jdk/src/share/native/java/util/zip/zlib/gzguts.h b/jdk/src/share/native/java/util/zip/zlib/gzguts.h
index 81bedce544..8cce2c69d2 100644
--- a/jdk/src/share/native/java/util/zip/zlib/gzguts.h
+++ b/jdk/src/share/native/java/util/zip/zlib/gzguts.h
@@ -23,7 +23,7 @@
*/
/* gzguts.h -- zlib internal header definitions for gz* operations
- * Copyright (C) 2004-2019 Mark Adler
+ * Copyright (C) 2004-2024 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -31,9 +31,8 @@
# ifndef _LARGEFILE_SOURCE
# define _LARGEFILE_SOURCE 1
# endif
-# ifdef _FILE_OFFSET_BITS
-# undef _FILE_OFFSET_BITS
-# endif
+# undef _FILE_OFFSET_BITS
+# undef _TIME_BITS
#endif
#ifdef HAVE_HIDDEN
@@ -143,8 +142,8 @@
/* gz* functions always use library allocation functions */
#ifndef STDC
- extern voidp malloc OF((uInt size));
- extern void free OF((voidpf ptr));
+ extern voidp malloc(uInt size);
+ extern void free(voidpf ptr);
#endif
/* get errno and strerror definition */
@@ -162,10 +161,10 @@
/* provide prototypes for these when building zlib without LFS */
#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0
- ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
- ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));
- ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));
- ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
+ ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *);
+ ZEXTERN z_off64_t ZEXPORT gzseek64(gzFile, z_off64_t, int);
+ ZEXTERN z_off64_t ZEXPORT gztell64(gzFile);
+ ZEXTERN z_off64_t ZEXPORT gzoffset64(gzFile);
#endif
/* default memLevel */
@@ -227,17 +226,13 @@ typedef struct {
typedef gz_state FAR *gz_statep;
/* shared functions */
-void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *));
+void ZLIB_INTERNAL gz_error(gz_statep, int, const char *);
#if defined UNDER_CE
-char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error));
+char ZLIB_INTERNAL *gz_strwinerror(DWORD error);
#endif
/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t
value -- needed when comparing unsigned to z_off64_t, which is signed
(possible z_off64_t types off_t, off64_t, and long are all signed) */
-#ifdef INT_MAX
-# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX)
-#else
-unsigned ZLIB_INTERNAL gz_intmax OF((void));
-# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax())
-#endif
+unsigned ZLIB_INTERNAL gz_intmax(void);
+#define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax())
diff --git a/jdk/src/share/native/java/util/zip/zlib/gzlib.c b/jdk/src/share/native/java/util/zip/zlib/gzlib.c
index 1cbc6d25b1..0f4dfae64a 100644
--- a/jdk/src/share/native/java/util/zip/zlib/gzlib.c
+++ b/jdk/src/share/native/java/util/zip/zlib/gzlib.c
@@ -23,7 +23,7 @@
*/
/* gzlib.c -- zlib functions common to reading and writing gzip files
- * Copyright (C) 2004-2019 Mark Adler
+ * Copyright (C) 2004-2024 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -39,10 +39,6 @@
#endif
#endif
-/* Local functions */
-local void gz_reset OF((gz_statep));
-local gzFile gz_open OF((const void *, int, const char *));
-
#if defined UNDER_CE
/* Map the Windows error number in ERROR to a locale-dependent error message
@@ -54,9 +50,7 @@ local gzFile gz_open OF((const void *, int, const char *));
The gz_strwinerror function does not change the current setting of
GetLastError. */
-char ZLIB_INTERNAL *gz_strwinerror(error)
- DWORD error;
-{
+char ZLIB_INTERNAL *gz_strwinerror(DWORD error) {
static char buf[1024];
wchar_t *msgbuf;
@@ -96,9 +90,7 @@ char ZLIB_INTERNAL *gz_strwinerror(error)
#endif /* UNDER_CE */
/* Reset gzip file state */
-local void gz_reset(state)
- gz_statep state;
-{
+local void gz_reset(gz_statep state) {
state->x.have = 0; /* no output data available */
if (state->mode == GZ_READ) { /* for reading ... */
state->eof = 0; /* not at end of file */
@@ -114,11 +106,7 @@ local void gz_reset(state)
}
/* Open a gzip file either by name or file descriptor. */
-local gzFile gz_open(path, fd, mode)
- const void *path;
- int fd;
- const char *mode;
-{
+local gzFile gz_open(const void *path, int fd, const char *mode) {
gz_statep state;
z_size_t len;
int oflag;
@@ -293,26 +281,17 @@ local gzFile gz_open(path, fd, mode)
}
/* -- see zlib.h -- */
-gzFile ZEXPORT gzopen(path, mode)
- const char *path;
- const char *mode;
-{
+gzFile ZEXPORT gzopen(const char *path, const char *mode) {
return gz_open(path, -1, mode);
}
/* -- see zlib.h -- */
-gzFile ZEXPORT gzopen64(path, mode)
- const char *path;
- const char *mode;
-{
+gzFile ZEXPORT gzopen64(const char *path, const char *mode) {
return gz_open(path, -1, mode);
}
/* -- see zlib.h -- */
-gzFile ZEXPORT gzdopen(fd, mode)
- int fd;
- const char *mode;
-{
+gzFile ZEXPORT gzdopen(int fd, const char *mode) {
char *path; /* identifier for error messages */
gzFile gz;
@@ -330,19 +309,13 @@ gzFile ZEXPORT gzdopen(fd, mode)
/* -- see zlib.h -- */
#ifdef WIDECHAR
-gzFile ZEXPORT gzopen_w(path, mode)
- const wchar_t *path;
- const char *mode;
-{
+gzFile ZEXPORT gzopen_w(const wchar_t *path, const char *mode) {
return gz_open(path, -2, mode);
}
#endif
/* -- see zlib.h -- */
-int ZEXPORT gzbuffer(file, size)
- gzFile file;
- unsigned size;
-{
+int ZEXPORT gzbuffer(gzFile file, unsigned size) {
gz_statep state;
/* get internal structure and check integrity */
@@ -359,16 +332,14 @@ int ZEXPORT gzbuffer(file, size)
/* check and set requested size */
if ((size << 1) < size)
return -1; /* need to be able to double it */
- if (size < 2)
- size = 2; /* need two bytes to check magic header */
+ if (size < 8)
+ size = 8; /* needed to behave well with flushing */
state->want = size;
return 0;
}
/* -- see zlib.h -- */
-int ZEXPORT gzrewind(file)
- gzFile file;
-{
+int ZEXPORT gzrewind(gzFile file) {
gz_statep state;
/* get internal structure */
@@ -389,11 +360,7 @@ int ZEXPORT gzrewind(file)
}
/* -- see zlib.h -- */
-z_off64_t ZEXPORT gzseek64(file, offset, whence)
- gzFile file;
- z_off64_t offset;
- int whence;
-{
+z_off64_t ZEXPORT gzseek64(gzFile file, z_off64_t offset, int whence) {
unsigned n;
z_off64_t ret;
gz_statep state;
@@ -466,11 +433,7 @@ z_off64_t ZEXPORT gzseek64(file, offset, whence)
}
/* -- see zlib.h -- */
-z_off_t ZEXPORT gzseek(file, offset, whence)
- gzFile file;
- z_off_t offset;
- int whence;
-{
+z_off_t ZEXPORT gzseek(gzFile file, z_off_t offset, int whence) {
z_off64_t ret;
ret = gzseek64(file, (z_off64_t)offset, whence);
@@ -478,9 +441,7 @@ z_off_t ZEXPORT gzseek(file, offset, whence)
}
/* -- see zlib.h -- */
-z_off64_t ZEXPORT gztell64(file)
- gzFile file;
-{
+z_off64_t ZEXPORT gztell64(gzFile file) {
gz_statep state;
/* get internal structure and check integrity */
@@ -495,9 +456,7 @@ z_off64_t ZEXPORT gztell64(file)
}
/* -- see zlib.h -- */
-z_off_t ZEXPORT gztell(file)
- gzFile file;
-{
+z_off_t ZEXPORT gztell(gzFile file) {
z_off64_t ret;
ret = gztell64(file);
@@ -505,9 +464,7 @@ z_off_t ZEXPORT gztell(file)
}
/* -- see zlib.h -- */
-z_off64_t ZEXPORT gzoffset64(file)
- gzFile file;
-{
+z_off64_t ZEXPORT gzoffset64(gzFile file) {
z_off64_t offset;
gz_statep state;
@@ -528,9 +485,7 @@ z_off64_t ZEXPORT gzoffset64(file)
}
/* -- see zlib.h -- */
-z_off_t ZEXPORT gzoffset(file)
- gzFile file;
-{
+z_off_t ZEXPORT gzoffset(gzFile file) {
z_off64_t ret;
ret = gzoffset64(file);
@@ -538,9 +493,7 @@ z_off_t ZEXPORT gzoffset(file)
}
/* -- see zlib.h -- */
-int ZEXPORT gzeof(file)
- gzFile file;
-{
+int ZEXPORT gzeof(gzFile file) {
gz_statep state;
/* get internal structure and check integrity */
@@ -555,10 +508,7 @@ int ZEXPORT gzeof(file)
}
/* -- see zlib.h -- */
-const char * ZEXPORT gzerror(file, errnum)
- gzFile file;
- int *errnum;
-{
+const char * ZEXPORT gzerror(gzFile file, int *errnum) {
gz_statep state;
/* get internal structure and check integrity */
@@ -576,9 +526,7 @@ const char * ZEXPORT gzerror(file, errnum)
}
/* -- see zlib.h -- */
-void ZEXPORT gzclearerr(file)
- gzFile file;
-{
+void ZEXPORT gzclearerr(gzFile file) {
gz_statep state;
/* get internal structure and check integrity */
@@ -602,11 +550,7 @@ void ZEXPORT gzclearerr(file)
memory). Simply save the error message as a static string. If there is an
allocation failure constructing the error message, then convert the error to
out of memory. */
-void ZLIB_INTERNAL gz_error(state, err, msg)
- gz_statep state;
- int err;
- const char *msg;
-{
+void ZLIB_INTERNAL gz_error(gz_statep state, int err, const char *msg) {
/* free previously allocated message and clear */
if (state->msg != NULL) {
if (state->err != Z_MEM_ERROR)
@@ -643,21 +587,20 @@ void ZLIB_INTERNAL gz_error(state, err, msg)
#endif
}
-#ifndef INT_MAX
/* portably return maximum value for an int (when limits.h presumed not
available) -- we need to do this to cover cases where 2's complement not
used, since C standard permits 1's complement and sign-bit representations,
otherwise we could just use ((unsigned)-1) >> 1 */
-unsigned ZLIB_INTERNAL gz_intmax()
-{
- unsigned p, q;
-
- p = 1;
+unsigned ZLIB_INTERNAL gz_intmax(void) {
+#ifdef INT_MAX
+ return INT_MAX;
+#else
+ unsigned p = 1, q;
do {
q = p;
p <<= 1;
p++;
} while (p > q);
return q >> 1;
-}
#endif
+}
diff --git a/jdk/src/share/native/java/util/zip/zlib/gzread.c b/jdk/src/share/native/java/util/zip/zlib/gzread.c
index fbe4281b4e..7b9c9df5fa 100644
--- a/jdk/src/share/native/java/util/zip/zlib/gzread.c
+++ b/jdk/src/share/native/java/util/zip/zlib/gzread.c
@@ -29,25 +29,12 @@
#include "gzguts.h"
-/* Local functions */
-local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *));
-local int gz_avail OF((gz_statep));
-local int gz_look OF((gz_statep));
-local int gz_decomp OF((gz_statep));
-local int gz_fetch OF((gz_statep));
-local int gz_skip OF((gz_statep, z_off64_t));
-local z_size_t gz_read OF((gz_statep, voidp, z_size_t));
-
/* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from
state->fd, and update state->eof, state->err, and state->msg as appropriate.
This function needs to loop on read(), since read() is not guaranteed to
read the number of bytes requested, depending on the type of descriptor. */
-local int gz_load(state, buf, len, have)
- gz_statep state;
- unsigned char *buf;
- unsigned len;
- unsigned *have;
-{
+local int gz_load(gz_statep state, unsigned char *buf, unsigned len,
+ unsigned *have) {
int ret;
unsigned get, max = ((unsigned)-1 >> 2) + 1;
@@ -77,9 +64,7 @@ local int gz_load(state, buf, len, have)
If strm->avail_in != 0, then the current data is moved to the beginning of
the input buffer, and then the remainder of the buffer is loaded with the
available data from the input file. */
-local int gz_avail(state)
- gz_statep state;
-{
+local int gz_avail(gz_statep state) {
unsigned got;
z_streamp strm = &(state->strm);
@@ -112,9 +97,7 @@ local int gz_avail(state)
case, all further file reads will be directly to either the output buffer or
a user buffer. If decompressing, the inflate state will be initialized.
gz_look() will return 0 on success or -1 on failure. */
-local int gz_look(state)
- gz_statep state;
-{
+local int gz_look(gz_statep state) {
z_streamp strm = &(state->strm);
/* allocate read buffers and inflate memory */
@@ -194,9 +177,7 @@ local int gz_look(state)
data. If the gzip stream completes, state->how is reset to LOOK to look for
the next gzip stream or raw data, once state->x.have is depleted. Returns 0
on success, -1 on failure. */
-local int gz_decomp(state)
- gz_statep state;
-{
+local int gz_decomp(gz_statep state) {
int ret = Z_OK;
unsigned had;
z_streamp strm = &(state->strm);
@@ -248,9 +229,7 @@ local int gz_decomp(state)
looked for to determine whether to copy or decompress. Returns -1 on error,
otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the
end of the input file has been reached and all data has been processed. */
-local int gz_fetch(state)
- gz_statep state;
-{
+local int gz_fetch(gz_statep state) {
z_streamp strm = &(state->strm);
do {
@@ -278,10 +257,7 @@ local int gz_fetch(state)
}
/* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */
-local int gz_skip(state, len)
- gz_statep state;
- z_off64_t len;
-{
+local int gz_skip(gz_statep state, z_off64_t len) {
unsigned n;
/* skip over len bytes or reach end-of-file, whichever comes first */
@@ -313,11 +289,7 @@ local int gz_skip(state, len)
input. Return the number of bytes read. If zero is returned, either the
end of file was reached, or there was an error. state->err must be
consulted in that case to determine which. */
-local z_size_t gz_read(state, buf, len)
- gz_statep state;
- voidp buf;
- z_size_t len;
-{
+local z_size_t gz_read(gz_statep state, voidp buf, z_size_t len) {
z_size_t got;
unsigned n;
@@ -394,11 +366,7 @@ local z_size_t gz_read(state, buf, len)
}
/* -- see zlib.h -- */
-int ZEXPORT gzread(file, buf, len)
- gzFile file;
- voidp buf;
- unsigned len;
-{
+int ZEXPORT gzread(gzFile file, voidp buf, unsigned len) {
gz_statep state;
/* get internal structure */
@@ -430,12 +398,7 @@ int ZEXPORT gzread(file, buf, len)
}
/* -- see zlib.h -- */
-z_size_t ZEXPORT gzfread(buf, size, nitems, file)
- voidp buf;
- z_size_t size;
- z_size_t nitems;
- gzFile file;
-{
+z_size_t ZEXPORT gzfread(voidp buf, z_size_t size, z_size_t nitems, gzFile file) {
z_size_t len;
gz_statep state;
@@ -466,9 +429,7 @@ z_size_t ZEXPORT gzfread(buf, size, nitems, file)
#else
# undef gzgetc
#endif
-int ZEXPORT gzgetc(file)
- gzFile file;
-{
+int ZEXPORT gzgetc(gzFile file) {
unsigned char buf[1];
gz_statep state;
@@ -493,17 +454,12 @@ int ZEXPORT gzgetc(file)
return gz_read(state, buf, 1) < 1 ? -1 : buf[0];
}
-int ZEXPORT gzgetc_(file)
-gzFile file;
-{
+int ZEXPORT gzgetc_(gzFile file) {
return gzgetc(file);
}
/* -- see zlib.h -- */
-int ZEXPORT gzungetc(c, file)
- int c;
- gzFile file;
-{
+int ZEXPORT gzungetc(int c, gzFile file) {
gz_statep state;
/* get internal structure */
@@ -511,6 +467,10 @@ int ZEXPORT gzungetc(c, file)
return -1;
state = (gz_statep)file;
+ /* in case this was just opened, set up the input buffer */
+ if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0)
+ (void)gz_look(state);
+
/* check that we're reading and that there's no (serious) error */
if (state->mode != GZ_READ ||
(state->err != Z_OK && state->err != Z_BUF_ERROR))
@@ -560,11 +520,7 @@ int ZEXPORT gzungetc(c, file)
}
/* -- see zlib.h -- */
-char * ZEXPORT gzgets(file, buf, len)
- gzFile file;
- char *buf;
- int len;
-{
+char * ZEXPORT gzgets(gzFile file, char *buf, int len) {
unsigned left, n;
char *str;
unsigned char *eol;
@@ -624,9 +580,7 @@ char * ZEXPORT gzgets(file, buf, len)
}
/* -- see zlib.h -- */
-int ZEXPORT gzdirect(file)
- gzFile file;
-{
+int ZEXPORT gzdirect(gzFile file) {
gz_statep state;
/* get internal structure */
@@ -644,9 +598,7 @@ int ZEXPORT gzdirect(file)
}
/* -- see zlib.h -- */
-int ZEXPORT gzclose_r(file)
- gzFile file;
-{
+int ZEXPORT gzclose_r(gzFile file) {
int ret, err;
gz_statep state;
diff --git a/jdk/src/share/native/java/util/zip/zlib/gzwrite.c b/jdk/src/share/native/java/util/zip/zlib/gzwrite.c
index 3aff44cc94..008b03e702 100644
--- a/jdk/src/share/native/java/util/zip/zlib/gzwrite.c
+++ b/jdk/src/share/native/java/util/zip/zlib/gzwrite.c
@@ -29,18 +29,10 @@
#include "gzguts.h"
-/* Local functions */
-local int gz_init OF((gz_statep));
-local int gz_comp OF((gz_statep, int));
-local int gz_zero OF((gz_statep, z_off64_t));
-local z_size_t gz_write OF((gz_statep, voidpc, z_size_t));
-
/* Initialize state for writing a gzip file. Mark initialization by setting
state->size to non-zero. Return -1 on a memory allocation failure, or 0 on
success. */
-local int gz_init(state)
- gz_statep state;
-{
+local int gz_init(gz_statep state) {
int ret;
z_streamp strm = &(state->strm);
@@ -94,10 +86,7 @@ local int gz_init(state)
deflate() flush value. If flush is Z_FINISH, then the deflate() state is
reset to start a new gzip stream. If gz->direct is true, then simply write
to the output file without compressing, and ignore flush. */
-local int gz_comp(state, flush)
- gz_statep state;
- int flush;
-{
+local int gz_comp(gz_statep state, int flush) {
int ret, writ;
unsigned have, put, max = ((unsigned)-1 >> 2) + 1;
z_streamp strm = &(state->strm);
@@ -175,10 +164,7 @@ local int gz_comp(state, flush)
/* Compress len zeros to output. Return -1 on a write error or memory
allocation failure by gz_comp(), or 0 on success. */
-local int gz_zero(state, len)
- gz_statep state;
- z_off64_t len;
-{
+local int gz_zero(gz_statep state, z_off64_t len) {
int first;
unsigned n;
z_streamp strm = &(state->strm);
@@ -208,11 +194,7 @@ local int gz_zero(state, len)
/* Write len bytes from buf to file. Return the number of bytes written. If
the returned value is less than len, then there was an error. */
-local z_size_t gz_write(state, buf, len)
- gz_statep state;
- voidpc buf;
- z_size_t len;
-{
+local z_size_t gz_write(gz_statep state, voidpc buf, z_size_t len) {
z_size_t put = len;
/* if len is zero, avoid unnecessary operations */
@@ -276,11 +258,7 @@ local z_size_t gz_write(state, buf, len)
}
/* -- see zlib.h -- */
-int ZEXPORT gzwrite(file, buf, len)
- gzFile file;
- voidpc buf;
- unsigned len;
-{
+int ZEXPORT gzwrite(gzFile file, voidpc buf, unsigned len) {
gz_statep state;
/* get internal structure */
@@ -304,12 +282,8 @@ int ZEXPORT gzwrite(file, buf, len)
}
/* -- see zlib.h -- */
-z_size_t ZEXPORT gzfwrite(buf, size, nitems, file)
- voidpc buf;
- z_size_t size;
- z_size_t nitems;
- gzFile file;
-{
+z_size_t ZEXPORT gzfwrite(voidpc buf, z_size_t size, z_size_t nitems,
+ gzFile file) {
z_size_t len;
gz_statep state;
@@ -334,10 +308,7 @@ z_size_t ZEXPORT gzfwrite(buf, size, nitems, file)
}
/* -- see zlib.h -- */
-int ZEXPORT gzputc(file, c)
- gzFile file;
- int c;
-{
+int ZEXPORT gzputc(gzFile file, int c) {
unsigned have;
unsigned char buf[1];
gz_statep state;
@@ -382,10 +353,7 @@ int ZEXPORT gzputc(file, c)
}
/* -- see zlib.h -- */
-int ZEXPORT gzputs(file, s)
- gzFile file;
- const char *s;
-{
+int ZEXPORT gzputs(gzFile file, const char *s) {
z_size_t len, put;
gz_statep state;
@@ -412,8 +380,7 @@ int ZEXPORT gzputs(file, s)
#include
/* -- see zlib.h -- */
-int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va)
-{
+int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) {
int len;
unsigned left;
char *next;
@@ -484,8 +451,7 @@ int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va)
return len;
}
-int ZEXPORTVA gzprintf(gzFile file, const char *format, ...)
-{
+int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) {
va_list va;
int ret;
@@ -498,13 +464,10 @@ int ZEXPORTVA gzprintf(gzFile file, const char *format, ...)
#else /* !STDC && !Z_HAVE_STDARG_H */
/* -- see zlib.h -- */
-int ZEXPORTVA gzprintf(file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
- a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
- gzFile file;
- const char *format;
- int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
- a11, a12, a13, a14, a15, a16, a17, a18, a19, a20;
-{
+int ZEXPORTVA gzprintf(gzFile file, const char *format, int a1, int a2, int a3,
+ int a4, int a5, int a6, int a7, int a8, int a9, int a10,
+ int a11, int a12, int a13, int a14, int a15, int a16,
+ int a17, int a18, int a19, int a20) {
unsigned len, left;
char *next;
gz_statep state;
@@ -586,10 +549,7 @@ int ZEXPORTVA gzprintf(file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
#endif
/* -- see zlib.h -- */
-int ZEXPORT gzflush(file, flush)
- gzFile file;
- int flush;
-{
+int ZEXPORT gzflush(gzFile file, int flush) {
gz_statep state;
/* get internal structure */
@@ -618,11 +578,7 @@ int ZEXPORT gzflush(file, flush)
}
/* -- see zlib.h -- */
-int ZEXPORT gzsetparams(file, level, strategy)
- gzFile file;
- int level;
- int strategy;
-{
+int ZEXPORT gzsetparams(gzFile file, int level, int strategy) {
gz_statep state;
z_streamp strm;
@@ -633,7 +589,7 @@ int ZEXPORT gzsetparams(file, level, strategy)
strm = &(state->strm);
/* check that we're writing and that there's no error */
- if (state->mode != GZ_WRITE || state->err != Z_OK)
+ if (state->mode != GZ_WRITE || state->err != Z_OK || state->direct)
return Z_STREAM_ERROR;
/* if no change is requested, then do nothing */
@@ -660,9 +616,7 @@ int ZEXPORT gzsetparams(file, level, strategy)
}
/* -- see zlib.h -- */
-int ZEXPORT gzclose_w(file)
- gzFile file;
-{
+int ZEXPORT gzclose_w(gzFile file) {
int ret = Z_OK;
gz_statep state;
diff --git a/jdk/src/share/native/java/util/zip/zlib/infback.c b/jdk/src/share/native/java/util/zip/zlib/infback.c
index ea7ea83d8d..f680e2cdbd 100644
--- a/jdk/src/share/native/java/util/zip/zlib/infback.c
+++ b/jdk/src/share/native/java/util/zip/zlib/infback.c
@@ -39,9 +39,6 @@
#include "inflate.h"
#include "inffast.h"
-/* function prototypes */
-local void fixedtables OF((struct inflate_state FAR *state));
-
/*
strm provides memory allocation functions in zalloc and zfree, or
Z_NULL to use the library memory allocation functions.
@@ -49,13 +46,9 @@ local void fixedtables OF((struct inflate_state FAR *state));
windowBits is in the range 8..15, and window is a user-supplied
window and output buffer that is 2**windowBits bytes.
*/
-int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size)
-z_streamp strm;
-int windowBits;
-unsigned char FAR *window;
-const char *version;
-int stream_size;
-{
+int ZEXPORT inflateBackInit_(z_streamp strm, int windowBits,
+ unsigned char FAR *window, const char *version,
+ int stream_size) {
struct inflate_state FAR *state;
if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
@@ -104,9 +97,7 @@ int stream_size;
used for threaded applications, since the rewriting of the tables and virgin
may not be thread-safe.
*/
-local void fixedtables(state)
-struct inflate_state FAR *state;
-{
+local void fixedtables(struct inflate_state FAR *state) {
#ifdef BUILDFIXED
static int virgin = 1;
static code *lenfix, *distfix;
@@ -272,13 +263,8 @@ struct inflate_state FAR *state;
inflateBack() can also return Z_STREAM_ERROR if the input parameters
are not correct, i.e. strm is Z_NULL or the state was not initialized.
*/
-int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc)
-z_streamp strm;
-in_func in;
-void FAR *in_desc;
-out_func out;
-void FAR *out_desc;
-{
+int ZEXPORT inflateBack(z_streamp strm, in_func in, void FAR *in_desc,
+ out_func out, void FAR *out_desc) {
struct inflate_state FAR *state;
z_const unsigned char FAR *next; /* next input */
unsigned char FAR *put; /* next output */
@@ -656,9 +642,7 @@ void FAR *out_desc;
return ret;
}
-int ZEXPORT inflateBackEnd(strm)
-z_streamp strm;
-{
+int ZEXPORT inflateBackEnd(z_streamp strm) {
if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
return Z_STREAM_ERROR;
ZFREE(strm, strm->state);
diff --git a/jdk/src/share/native/java/util/zip/zlib/inffast.c b/jdk/src/share/native/java/util/zip/zlib/inffast.c
index 45aa17d201..e86dd78d80 100644
--- a/jdk/src/share/native/java/util/zip/zlib/inffast.c
+++ b/jdk/src/share/native/java/util/zip/zlib/inffast.c
@@ -71,10 +71,7 @@
requires strm->avail_out >= 258 for each loop to avoid checking for
output space.
*/
-void ZLIB_INTERNAL inflate_fast(strm, start)
-z_streamp strm;
-unsigned start; /* inflate()'s starting value for strm->avail_out */
-{
+void ZLIB_INTERNAL inflate_fast(z_streamp strm, unsigned start) {
struct inflate_state FAR *state;
z_const unsigned char FAR *in; /* local strm->next_in */
z_const unsigned char FAR *last; /* have enough input while in < last */
diff --git a/jdk/src/share/native/java/util/zip/zlib/inffast.h b/jdk/src/share/native/java/util/zip/zlib/inffast.h
index b8da8bb757..bc4fb6b0df 100644
--- a/jdk/src/share/native/java/util/zip/zlib/inffast.h
+++ b/jdk/src/share/native/java/util/zip/zlib/inffast.h
@@ -32,4 +32,4 @@
subject to change. Applications should only use zlib.h.
*/
-void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start));
+void ZLIB_INTERNAL inflate_fast(z_streamp strm, unsigned start);
diff --git a/jdk/src/share/native/java/util/zip/zlib/inflate.c b/jdk/src/share/native/java/util/zip/zlib/inflate.c
index b236dcafd8..3370cfe956 100644
--- a/jdk/src/share/native/java/util/zip/zlib/inflate.c
+++ b/jdk/src/share/native/java/util/zip/zlib/inflate.c
@@ -115,20 +115,7 @@
# endif
#endif
-/* function prototypes */
-local int inflateStateCheck OF((z_streamp strm));
-local void fixedtables OF((struct inflate_state FAR *state));
-local int updatewindow OF((z_streamp strm, const unsigned char FAR *end,
- unsigned copy));
-#ifdef BUILDFIXED
- void makefixed OF((void));
-#endif
-local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf,
- unsigned len));
-
-local int inflateStateCheck(strm)
-z_streamp strm;
-{
+local int inflateStateCheck(z_streamp strm) {
struct inflate_state FAR *state;
if (strm == Z_NULL ||
strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0)
@@ -140,9 +127,7 @@ z_streamp strm;
return 0;
}
-int ZEXPORT inflateResetKeep(strm)
-z_streamp strm;
-{
+int ZEXPORT inflateResetKeep(z_streamp strm) {
struct inflate_state FAR *state;
if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
@@ -166,9 +151,7 @@ z_streamp strm;
return Z_OK;
}
-int ZEXPORT inflateReset(strm)
-z_streamp strm;
-{
+int ZEXPORT inflateReset(z_streamp strm) {
struct inflate_state FAR *state;
if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
@@ -179,10 +162,7 @@ z_streamp strm;
return inflateResetKeep(strm);
}
-int ZEXPORT inflateReset2(strm, windowBits)
-z_streamp strm;
-int windowBits;
-{
+int ZEXPORT inflateReset2(z_streamp strm, int windowBits) {
int wrap;
struct inflate_state FAR *state;
@@ -219,12 +199,8 @@ int windowBits;
return inflateReset(strm);
}
-int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size)
-z_streamp strm;
-int windowBits;
-const char *version;
-int stream_size;
-{
+int ZEXPORT inflateInit2_(z_streamp strm, int windowBits,
+ const char *version, int stream_size) {
int ret;
struct inflate_state FAR *state;
@@ -263,22 +239,17 @@ int stream_size;
return ret;
}
-int ZEXPORT inflateInit_(strm, version, stream_size)
-z_streamp strm;
-const char *version;
-int stream_size;
-{
+int ZEXPORT inflateInit_(z_streamp strm, const char *version,
+ int stream_size) {
return inflateInit2_(strm, DEF_WBITS, version, stream_size);
}
-int ZEXPORT inflatePrime(strm, bits, value)
-z_streamp strm;
-int bits;
-int value;
-{
+int ZEXPORT inflatePrime(z_streamp strm, int bits, int value) {
struct inflate_state FAR *state;
if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
+ if (bits == 0)
+ return Z_OK;
state = (struct inflate_state FAR *)strm->state;
if (bits < 0) {
state->hold = 0;
@@ -302,9 +273,7 @@ int value;
used for threaded applications, since the rewriting of the tables and virgin
may not be thread-safe.
*/
-local void fixedtables(state)
-struct inflate_state FAR *state;
-{
+local void fixedtables(struct inflate_state FAR *state) {
#ifdef BUILDFIXED
static int virgin = 1;
static code *lenfix, *distfix;
@@ -366,7 +335,7 @@ struct inflate_state FAR *state;
a.out > inffixed.h
*/
-void makefixed()
+void makefixed(void)
{
unsigned low, size;
struct inflate_state state;
@@ -420,11 +389,7 @@ void makefixed()
output will fall in the output data, making match copies simpler and faster.
The advantage may be dependent on the size of the processor's data caches.
*/
-local int updatewindow(strm, end, copy)
-z_streamp strm;
-const Bytef *end;
-unsigned copy;
-{
+local int updatewindow(z_streamp strm, const Bytef *end, unsigned copy) {
struct inflate_state FAR *state;
unsigned dist;
@@ -646,10 +611,7 @@ unsigned copy;
will return Z_BUF_ERROR if it has not reached the end of the stream.
*/
-int ZEXPORT inflate(strm, flush)
-z_streamp strm;
-int flush;
-{
+int ZEXPORT inflate(z_streamp strm, int flush) {
struct inflate_state FAR *state;
z_const unsigned char FAR *next; /* next input */
unsigned char FAR *put; /* next output */
@@ -1325,9 +1287,7 @@ int flush;
return ret;
}
-int ZEXPORT inflateEnd(strm)
-z_streamp strm;
-{
+int ZEXPORT inflateEnd(z_streamp strm) {
struct inflate_state FAR *state;
if (inflateStateCheck(strm))
return Z_STREAM_ERROR;
@@ -1339,11 +1299,8 @@ z_streamp strm;
return Z_OK;
}
-int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength)
-z_streamp strm;
-Bytef *dictionary;
-uInt *dictLength;
-{
+int ZEXPORT inflateGetDictionary(z_streamp strm, Bytef *dictionary,
+ uInt *dictLength) {
struct inflate_state FAR *state;
/* check state */
@@ -1362,11 +1319,8 @@ uInt *dictLength;
return Z_OK;
}
-int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength)
-z_streamp strm;
-const Bytef *dictionary;
-uInt dictLength;
-{
+int ZEXPORT inflateSetDictionary(z_streamp strm, const Bytef *dictionary,
+ uInt dictLength) {
struct inflate_state FAR *state;
unsigned long dictid;
int ret;
@@ -1397,10 +1351,7 @@ uInt dictLength;
return Z_OK;
}
-int ZEXPORT inflateGetHeader(strm, head)
-z_streamp strm;
-gz_headerp head;
-{
+int ZEXPORT inflateGetHeader(z_streamp strm, gz_headerp head) {
struct inflate_state FAR *state;
/* check state */
@@ -1425,11 +1376,8 @@ gz_headerp head;
called again with more data and the *have state. *have is initialized to
zero for the first call.
*/
-local unsigned syncsearch(have, buf, len)
-unsigned FAR *have;
-const unsigned char FAR *buf;
-unsigned len;
-{
+local unsigned syncsearch(unsigned FAR *have, const unsigned char FAR *buf,
+ unsigned len) {
unsigned got;
unsigned next;
@@ -1448,9 +1396,7 @@ unsigned len;
return next;
}
-int ZEXPORT inflateSync(strm)
-z_streamp strm;
-{
+int ZEXPORT inflateSync(z_streamp strm) {
unsigned len; /* number of bytes to look at or looked at */
int flags; /* temporary to save header status */
unsigned long in, out; /* temporary to save total_in and total_out */
@@ -1465,7 +1411,7 @@ z_streamp strm;
/* if first time, start search in bit buffer */
if (state->mode != SYNC) {
state->mode = SYNC;
- state->hold <<= state->bits & 7;
+ state->hold >>= state->bits & 7;
state->bits -= state->bits & 7;
len = 0;
while (state->bits >= 8) {
@@ -1506,9 +1452,7 @@ z_streamp strm;
block. When decompressing, PPP checks that at the end of input packet,
inflate is waiting for these length bytes.
*/
-int ZEXPORT inflateSyncPoint(strm)
-z_streamp strm;
-{
+int ZEXPORT inflateSyncPoint(z_streamp strm) {
struct inflate_state FAR *state;
if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
@@ -1516,10 +1460,7 @@ z_streamp strm;
return state->mode == STORED && state->bits == 0;
}
-int ZEXPORT inflateCopy(dest, source)
-z_streamp dest;
-z_streamp source;
-{
+int ZEXPORT inflateCopy(z_streamp dest, z_streamp source) {
struct inflate_state FAR *state;
struct inflate_state FAR *copy;
unsigned char FAR *window;
@@ -1563,10 +1504,7 @@ z_streamp source;
return Z_OK;
}
-int ZEXPORT inflateUndermine(strm, subvert)
-z_streamp strm;
-int subvert;
-{
+int ZEXPORT inflateUndermine(z_streamp strm, int subvert) {
struct inflate_state FAR *state;
if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
@@ -1581,10 +1519,7 @@ int subvert;
#endif
}
-int ZEXPORT inflateValidate(strm, check)
-z_streamp strm;
-int check;
-{
+int ZEXPORT inflateValidate(z_streamp strm, int check) {
struct inflate_state FAR *state;
if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
@@ -1596,9 +1531,7 @@ int check;
return Z_OK;
}
-long ZEXPORT inflateMark(strm)
-z_streamp strm;
-{
+long ZEXPORT inflateMark(z_streamp strm) {
struct inflate_state FAR *state;
if (inflateStateCheck(strm))
@@ -1609,9 +1542,7 @@ z_streamp strm;
(state->mode == MATCH ? state->was - state->length : 0));
}
-unsigned long ZEXPORT inflateCodesUsed(strm)
-z_streamp strm;
-{
+unsigned long ZEXPORT inflateCodesUsed(z_streamp strm) {
struct inflate_state FAR *state;
if (inflateStateCheck(strm)) return (unsigned long)-1;
state = (struct inflate_state FAR *)strm->state;
diff --git a/jdk/src/share/native/java/util/zip/zlib/inftrees.c b/jdk/src/share/native/java/util/zip/zlib/inftrees.c
index a60b1bfb39..c4913bc435 100644
--- a/jdk/src/share/native/java/util/zip/zlib/inftrees.c
+++ b/jdk/src/share/native/java/util/zip/zlib/inftrees.c
@@ -23,7 +23,7 @@
*/
/* inftrees.c -- generate Huffman trees for efficient decoding
- * Copyright (C) 1995-2022 Mark Adler
+ * Copyright (C) 1995-2024 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -33,7 +33,7 @@
#define MAXBITS 15
const char inflate_copyright[] =
- " inflate 1.2.13 Copyright 1995-2022 Mark Adler ";
+ " inflate 1.3.1 Copyright 1995-2024 Mark Adler ";
/*
If you use the zlib library in a product, an acknowledgment is welcome
in the documentation of your product. If for some reason you cannot
@@ -53,14 +53,9 @@ const char inflate_copyright[] =
table index bits. It will differ if the request is greater than the
longest code or if it is less than the shortest code.
*/
-int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work)
-codetype type;
-unsigned short FAR *lens;
-unsigned codes;
-code FAR * FAR *table;
-unsigned FAR *bits;
-unsigned short FAR *work;
-{
+int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens,
+ unsigned codes, code FAR * FAR *table,
+ unsigned FAR *bits, unsigned short FAR *work) {
unsigned len; /* a code's length in bits */
unsigned sym; /* index of code symbols */
unsigned min, max; /* minimum and maximum code lengths */
@@ -86,7 +81,7 @@ unsigned short FAR *work;
35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
static const unsigned short lext[31] = { /* Length codes 257..285 extra */
16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
- 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 194, 65};
+ 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 203, 77};
static const unsigned short dbase[32] = { /* Distance codes 0..29 base */
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
diff --git a/jdk/src/share/native/java/util/zip/zlib/inftrees.h b/jdk/src/share/native/java/util/zip/zlib/inftrees.h
index a05314fefb..3e2e889301 100644
--- a/jdk/src/share/native/java/util/zip/zlib/inftrees.h
+++ b/jdk/src/share/native/java/util/zip/zlib/inftrees.h
@@ -65,8 +65,8 @@ typedef struct {
examples/enough.c found in the zlib distribution. The arguments to that
program are the number of symbols, the initial root table size, and the
maximum bit length of a code. "enough 286 9 15" for literal/length codes
- returns returns 852, and "enough 30 6 15" for distance codes returns 592.
- The initial root table size (9 or 6) is found in the fifth argument of the
+ returns 852, and "enough 30 6 15" for distance codes returns 592. The
+ initial root table size (9 or 6) is found in the fifth argument of the
inflate_table() calls in inflate.c and infback.c. If the root table size is
changed, then these maximum sizes would be need to be recalculated and
updated. */
@@ -81,6 +81,6 @@ typedef enum {
DISTS
} codetype;
-int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens,
- unsigned codes, code FAR * FAR *table,
- unsigned FAR *bits, unsigned short FAR *work));
+int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens,
+ unsigned codes, code FAR * FAR *table,
+ unsigned FAR *bits, unsigned short FAR *work);
diff --git a/jdk/src/share/native/java/util/zip/zlib/patches/ChangeLog_java b/jdk/src/share/native/java/util/zip/zlib/patches/ChangeLog_java
index ff48fdaea0..3296c5f2fa 100644
--- a/jdk/src/share/native/java/util/zip/zlib/patches/ChangeLog_java
+++ b/jdk/src/share/native/java/util/zip/zlib/patches/ChangeLog_java
@@ -1,4 +1,4 @@
-Changes from zlib 1.2.13
+Changes from zlib 1.3.1
(1) renamed adler32.c -> zadler32.c, crc32c -> zcrc32.c
diff --git a/jdk/src/share/native/java/util/zip/zlib/trees.c b/jdk/src/share/native/java/util/zip/zlib/trees.c
index 7214373826..bbfa9deee5 100644
--- a/jdk/src/share/native/java/util/zip/zlib/trees.c
+++ b/jdk/src/share/native/java/util/zip/zlib/trees.c
@@ -23,7 +23,7 @@
*/
/* trees.c -- output deflated data using Huffman coding
- * Copyright (C) 1995-2021 Jean-loup Gailly
+ * Copyright (C) 1995-2024 Jean-loup Gailly
* detect_data_type() function provided freely by Cosmin Truta, 2006
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -146,39 +146,116 @@ struct static_tree_desc_s {
int max_length; /* max bit length for the codes */
};
-local const static_tree_desc static_l_desc =
+#ifdef NO_INIT_GLOBAL_POINTERS
+# define TCONST
+#else
+# define TCONST const
+#endif
+
+local TCONST static_tree_desc static_l_desc =
{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS};
-local const static_tree_desc static_d_desc =
+local TCONST static_tree_desc static_d_desc =
{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS};
-local const static_tree_desc static_bl_desc =
+local TCONST static_tree_desc static_bl_desc =
{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS};
/* ===========================================================================
- * Local (static) routines in this file.
+ * Output a short LSB first on the stream.
+ * IN assertion: there is enough room in pendingBuf.
+ */
+#define put_short(s, w) { \
+ put_byte(s, (uch)((w) & 0xff)); \
+ put_byte(s, (uch)((ush)(w) >> 8)); \
+}
+
+/* ===========================================================================
+ * Reverse the first len bits of a code, using straightforward code (a faster
+ * method would use a table)
+ * IN assertion: 1 <= len <= 15
*/
+local unsigned bi_reverse(unsigned code, int len) {
+ register unsigned res = 0;
+ do {
+ res |= code & 1;
+ code >>= 1, res <<= 1;
+ } while (--len > 0);
+ return res >> 1;
+}
-local void tr_static_init OF((void));
-local void init_block OF((deflate_state *s));
-local void pqdownheap OF((deflate_state *s, ct_data *tree, int k));
-local void gen_bitlen OF((deflate_state *s, tree_desc *desc));
-local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count));
-local void build_tree OF((deflate_state *s, tree_desc *desc));
-local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code));
-local void send_tree OF((deflate_state *s, ct_data *tree, int max_code));
-local int build_bl_tree OF((deflate_state *s));
-local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes,
- int blcodes));
-local void compress_block OF((deflate_state *s, const ct_data *ltree,
- const ct_data *dtree));
-local int detect_data_type OF((deflate_state *s));
-local unsigned bi_reverse OF((unsigned code, int len));
-local void bi_windup OF((deflate_state *s));
-local void bi_flush OF((deflate_state *s));
+/* ===========================================================================
+ * Flush the bit buffer, keeping at most 7 bits in it.
+ */
+local void bi_flush(deflate_state *s) {
+ if (s->bi_valid == 16) {
+ put_short(s, s->bi_buf);
+ s->bi_buf = 0;
+ s->bi_valid = 0;
+ } else if (s->bi_valid >= 8) {
+ put_byte(s, (Byte)s->bi_buf);
+ s->bi_buf >>= 8;
+ s->bi_valid -= 8;
+ }
+}
+
+/* ===========================================================================
+ * Flush the bit buffer and align the output on a byte boundary
+ */
+local void bi_windup(deflate_state *s) {
+ if (s->bi_valid > 8) {
+ put_short(s, s->bi_buf);
+ } else if (s->bi_valid > 0) {
+ put_byte(s, (Byte)s->bi_buf);
+ }
+ s->bi_buf = 0;
+ s->bi_valid = 0;
+#ifdef ZLIB_DEBUG
+ s->bits_sent = (s->bits_sent + 7) & ~7;
+#endif
+}
+
+/* ===========================================================================
+ * Generate the codes for a given tree and bit counts (which need not be
+ * optimal).
+ * IN assertion: the array bl_count contains the bit length statistics for
+ * the given tree and the field len is set for all tree elements.
+ * OUT assertion: the field code is set for all tree elements of non
+ * zero code length.
+ */
+local void gen_codes(ct_data *tree, int max_code, ushf *bl_count) {
+ ush next_code[MAX_BITS+1]; /* next code value for each bit length */
+ unsigned code = 0; /* running code value */
+ int bits; /* bit index */
+ int n; /* code index */
+
+ /* The distribution counts are first used to generate the code values
+ * without bit reversal.
+ */
+ for (bits = 1; bits <= MAX_BITS; bits++) {
+ code = (code + bl_count[bits - 1]) << 1;
+ next_code[bits] = (ush)code;
+ }
+ /* Check that the bit counts in bl_count are consistent. The last code
+ * must be all ones.
+ */
+ Assert (code + bl_count[MAX_BITS] - 1 == (1 << MAX_BITS) - 1,
+ "inconsistent bit counts");
+ Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
+
+ for (n = 0; n <= max_code; n++) {
+ int len = tree[n].Len;
+ if (len == 0) continue;
+ /* Now reverse the bits */
+ tree[n].Code = (ush)bi_reverse(next_code[len]++, len);
+
+ Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
+ n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len] - 1));
+ }
+}
#ifdef GEN_TREES_H
-local void gen_trees_header OF((void));
+local void gen_trees_header(void);
#endif
#ifndef ZLIB_DEBUG
@@ -191,27 +268,12 @@ local void gen_trees_header OF((void));
send_bits(s, tree[c].Code, tree[c].Len); }
#endif
-/* ===========================================================================
- * Output a short LSB first on the stream.
- * IN assertion: there is enough room in pendingBuf.
- */
-#define put_short(s, w) { \
- put_byte(s, (uch)((w) & 0xff)); \
- put_byte(s, (uch)((ush)(w) >> 8)); \
-}
-
/* ===========================================================================
* Send a value on a given number of bits.
* IN assertion: length <= 16 and value fits in length bits.
*/
#ifdef ZLIB_DEBUG
-local void send_bits OF((deflate_state *s, int value, int length));
-
-local void send_bits(s, value, length)
- deflate_state *s;
- int value; /* value to send */
- int length; /* number of bits */
-{
+local void send_bits(deflate_state *s, int value, int length) {
Tracevv((stderr," l %2d v %4x ", length, value));
Assert(length > 0 && length <= 15, "invalid length");
s->bits_sent += (ulg)length;
@@ -253,8 +315,7 @@ local void send_bits(s, value, length)
/* ===========================================================================
* Initialize the various 'constant' tables.
*/
-local void tr_static_init()
-{
+local void tr_static_init(void) {
#if defined(GEN_TREES_H) || !defined(STDC)
static int static_init_done = 0;
int n; /* iterates over tree elements */
@@ -347,8 +408,7 @@ local void tr_static_init()
((i) == (last)? "\n};\n\n" : \
((i) % (width) == (width) - 1 ? ",\n" : ", "))
-void gen_trees_header()
-{
+void gen_trees_header(void) {
FILE *header = fopen("trees.h", "w");
int i;
@@ -397,12 +457,26 @@ void gen_trees_header()
}
#endif /* GEN_TREES_H */
+/* ===========================================================================
+ * Initialize a new block.
+ */
+local void init_block(deflate_state *s) {
+ int n; /* iterates over tree elements */
+
+ /* Initialize the trees. */
+ for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0;
+ for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0;
+ for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0;
+
+ s->dyn_ltree[END_BLOCK].Freq = 1;
+ s->opt_len = s->static_len = 0L;
+ s->sym_next = s->matches = 0;
+}
+
/* ===========================================================================
* Initialize the tree data structures for a new zlib stream.
*/
-void ZLIB_INTERNAL _tr_init(s)
- deflate_state *s;
-{
+void ZLIB_INTERNAL _tr_init(deflate_state *s) {
tr_static_init();
s->l_desc.dyn_tree = s->dyn_ltree;
@@ -425,24 +499,6 @@ void ZLIB_INTERNAL _tr_init(s)
init_block(s);
}
-/* ===========================================================================
- * Initialize a new block.
- */
-local void init_block(s)
- deflate_state *s;
-{
- int n; /* iterates over tree elements */
-
- /* Initialize the trees. */
- for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0;
- for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0;
- for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0;
-
- s->dyn_ltree[END_BLOCK].Freq = 1;
- s->opt_len = s->static_len = 0L;
- s->sym_next = s->matches = 0;
-}
-
#define SMALLEST 1
/* Index within the heap array of least frequent node in the Huffman tree */
@@ -472,11 +528,7 @@ local void init_block(s)
* when the heap property is re-established (each father smaller than its
* two sons).
*/
-local void pqdownheap(s, tree, k)
- deflate_state *s;
- ct_data *tree; /* the tree to restore */
- int k; /* node to move down */
-{
+local void pqdownheap(deflate_state *s, ct_data *tree, int k) {
int v = s->heap[k];
int j = k << 1; /* left son of k */
while (j <= s->heap_len) {
@@ -507,10 +559,7 @@ local void pqdownheap(s, tree, k)
* The length opt_len is updated; static_len is also updated if stree is
* not null.
*/
-local void gen_bitlen(s, desc)
- deflate_state *s;
- tree_desc *desc; /* the tree descriptor */
-{
+local void gen_bitlen(deflate_state *s, tree_desc *desc) {
ct_data *tree = desc->dyn_tree;
int max_code = desc->max_code;
const ct_data *stree = desc->stat_desc->static_tree;
@@ -585,48 +634,9 @@ local void gen_bitlen(s, desc)
}
}
-/* ===========================================================================
- * Generate the codes for a given tree and bit counts (which need not be
- * optimal).
- * IN assertion: the array bl_count contains the bit length statistics for
- * the given tree and the field len is set for all tree elements.
- * OUT assertion: the field code is set for all tree elements of non
- * zero code length.
- */
-local void gen_codes(tree, max_code, bl_count)
- ct_data *tree; /* the tree to decorate */
- int max_code; /* largest code with non zero frequency */
- ushf *bl_count; /* number of codes at each bit length */
-{
- ush next_code[MAX_BITS+1]; /* next code value for each bit length */
- unsigned code = 0; /* running code value */
- int bits; /* bit index */
- int n; /* code index */
-
- /* The distribution counts are first used to generate the code values
- * without bit reversal.
- */
- for (bits = 1; bits <= MAX_BITS; bits++) {
- code = (code + bl_count[bits - 1]) << 1;
- next_code[bits] = (ush)code;
- }
- /* Check that the bit counts in bl_count are consistent. The last code
- * must be all ones.
- */
- Assert (code + bl_count[MAX_BITS] - 1 == (1 << MAX_BITS) - 1,
- "inconsistent bit counts");
- Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
-
- for (n = 0; n <= max_code; n++) {
- int len = tree[n].Len;
- if (len == 0) continue;
- /* Now reverse the bits */
- tree[n].Code = (ush)bi_reverse(next_code[len]++, len);
-
- Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
- n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len] - 1));
- }
-}
+#ifdef DUMP_BL_TREE
+# include
+#endif
/* ===========================================================================
* Construct one Huffman tree and assigns the code bit strings and lengths.
@@ -636,10 +646,7 @@ local void gen_codes(tree, max_code, bl_count)
* and corresponding code. The length opt_len is updated; static_len is
* also updated if stree is not null. The field max_code is set.
*/
-local void build_tree(s, desc)
- deflate_state *s;
- tree_desc *desc; /* the tree descriptor */
-{
+local void build_tree(deflate_state *s, tree_desc *desc) {
ct_data *tree = desc->dyn_tree;
const ct_data *stree = desc->stat_desc->static_tree;
int elems = desc->stat_desc->elems;
@@ -724,11 +731,7 @@ local void build_tree(s, desc)
* Scan a literal or distance tree to determine the frequencies of the codes
* in the bit length tree.
*/
-local void scan_tree(s, tree, max_code)
- deflate_state *s;
- ct_data *tree; /* the tree to be scanned */
- int max_code; /* and its largest code of non zero frequency */
-{
+local void scan_tree(deflate_state *s, ct_data *tree, int max_code) {
int n; /* iterates over all tree elements */
int prevlen = -1; /* last emitted length */
int curlen; /* length of current code */
@@ -769,11 +772,7 @@ local void scan_tree(s, tree, max_code)
* Send a literal or distance tree in compressed form, using the codes in
* bl_tree.
*/
-local void send_tree(s, tree, max_code)
- deflate_state *s;
- ct_data *tree; /* the tree to be scanned */
- int max_code; /* and its largest code of non zero frequency */
-{
+local void send_tree(deflate_state *s, ct_data *tree, int max_code) {
int n; /* iterates over all tree elements */
int prevlen = -1; /* last emitted length */
int curlen; /* length of current code */
@@ -820,9 +819,7 @@ local void send_tree(s, tree, max_code)
* Construct the Huffman tree for the bit lengths and return the index in
* bl_order of the last bit length code to send.
*/
-local int build_bl_tree(s)
- deflate_state *s;
-{
+local int build_bl_tree(deflate_state *s) {
int max_blindex; /* index of last bit length code of non zero freq */
/* Determine the bit length frequencies for literal and distance trees */
@@ -855,10 +852,8 @@ local int build_bl_tree(s)
* lengths of the bit length codes, the literal tree and the distance tree.
* IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
*/
-local void send_all_trees(s, lcodes, dcodes, blcodes)
- deflate_state *s;
- int lcodes, dcodes, blcodes; /* number of codes for each tree */
-{
+local void send_all_trees(deflate_state *s, int lcodes, int dcodes,
+ int blcodes) {
int rank; /* index in bl_order */
Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
@@ -884,12 +879,8 @@ local void send_all_trees(s, lcodes, dcodes, blcodes)
/* ===========================================================================
* Send a stored block
*/
-void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last)
- deflate_state *s;
- charf *buf; /* input block */
- ulg stored_len; /* length of input block */
- int last; /* one if this is the last block for a file */
-{
+void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, charf *buf,
+ ulg stored_len, int last) {
send_bits(s, (STORED_BLOCK<<1) + last, 3); /* send block type */
bi_windup(s); /* align on byte boundary */
put_short(s, (ush)stored_len);
@@ -908,9 +899,7 @@ void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last)
/* ===========================================================================
* Flush the bits in the bit buffer to pending output (leaves at most 7 bits)
*/
-void ZLIB_INTERNAL _tr_flush_bits(s)
- deflate_state *s;
-{
+void ZLIB_INTERNAL _tr_flush_bits(deflate_state *s) {
bi_flush(s);
}
@@ -918,9 +907,7 @@ void ZLIB_INTERNAL _tr_flush_bits(s)
* Send one empty static block to give enough lookahead for inflate.
* This takes 10 bits, of which 7 may remain in the bit buffer.
*/
-void ZLIB_INTERNAL _tr_align(s)
- deflate_state *s;
-{
+void ZLIB_INTERNAL _tr_align(deflate_state *s) {
send_bits(s, STATIC_TREES<<1, 3);
send_code(s, END_BLOCK, static_ltree);
#ifdef ZLIB_DEBUG
@@ -929,16 +916,108 @@ void ZLIB_INTERNAL _tr_align(s)
bi_flush(s);
}
+/* ===========================================================================
+ * Send the block data compressed using the given Huffman trees
+ */
+local void compress_block(deflate_state *s, const ct_data *ltree,
+ const ct_data *dtree) {
+ unsigned dist; /* distance of matched string */
+ int lc; /* match length or unmatched char (if dist == 0) */
+ unsigned sx = 0; /* running index in symbol buffers */
+ unsigned code; /* the code to send */
+ int extra; /* number of extra bits to send */
+
+ if (s->sym_next != 0) do {
+#ifdef LIT_MEM
+ dist = s->d_buf[sx];
+ lc = s->l_buf[sx++];
+#else
+ dist = s->sym_buf[sx++] & 0xff;
+ dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8;
+ lc = s->sym_buf[sx++];
+#endif
+ if (dist == 0) {
+ send_code(s, lc, ltree); /* send a literal byte */
+ Tracecv(isgraph(lc), (stderr," '%c' ", lc));
+ } else {
+ /* Here, lc is the match length - MIN_MATCH */
+ code = _length_code[lc];
+ send_code(s, code + LITERALS + 1, ltree); /* send length code */
+ extra = extra_lbits[code];
+ if (extra != 0) {
+ lc -= base_length[code];
+ send_bits(s, lc, extra); /* send the extra length bits */
+ }
+ dist--; /* dist is now the match distance - 1 */
+ code = d_code(dist);
+ Assert (code < D_CODES, "bad d_code");
+
+ send_code(s, code, dtree); /* send the distance code */
+ extra = extra_dbits[code];
+ if (extra != 0) {
+ dist -= (unsigned)base_dist[code];
+ send_bits(s, dist, extra); /* send the extra distance bits */
+ }
+ } /* literal or match pair ? */
+
+ /* Check for no overlay of pending_buf on needed symbols */
+#ifdef LIT_MEM
+ Assert(s->pending < 2 * (s->lit_bufsize + sx), "pendingBuf overflow");
+#else
+ Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow");
+#endif
+
+ } while (sx < s->sym_next);
+
+ send_code(s, END_BLOCK, ltree);
+}
+
+/* ===========================================================================
+ * Check if the data type is TEXT or BINARY, using the following algorithm:
+ * - TEXT if the two conditions below are satisfied:
+ * a) There are no non-portable control characters belonging to the
+ * "block list" (0..6, 14..25, 28..31).
+ * b) There is at least one printable character belonging to the
+ * "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
+ * - BINARY otherwise.
+ * - The following partially-portable control characters form a
+ * "gray list" that is ignored in this detection algorithm:
+ * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
+ * IN assertion: the fields Freq of dyn_ltree are set.
+ */
+local int detect_data_type(deflate_state *s) {
+ /* block_mask is the bit mask of block-listed bytes
+ * set bits 0..6, 14..25, and 28..31
+ * 0xf3ffc07f = binary 11110011111111111100000001111111
+ */
+ unsigned long block_mask = 0xf3ffc07fUL;
+ int n;
+
+ /* Check for non-textual ("block-listed") bytes. */
+ for (n = 0; n <= 31; n++, block_mask >>= 1)
+ if ((block_mask & 1) && (s->dyn_ltree[n].Freq != 0))
+ return Z_BINARY;
+
+ /* Check for textual ("allow-listed") bytes. */
+ if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0
+ || s->dyn_ltree[13].Freq != 0)
+ return Z_TEXT;
+ for (n = 32; n < LITERALS; n++)
+ if (s->dyn_ltree[n].Freq != 0)
+ return Z_TEXT;
+
+ /* There are no "block-listed" or "allow-listed" bytes:
+ * this stream either is empty or has tolerated ("gray-listed") bytes only.
+ */
+ return Z_BINARY;
+}
+
/* ===========================================================================
* Determine the best encoding for the current block: dynamic trees, static
* trees or store, and write out the encoded block.
*/
-void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)
- deflate_state *s;
- charf *buf; /* input block, or NULL if too old */
- ulg stored_len; /* length of input block */
- int last; /* one if this is the last block for a file */
-{
+void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, charf *buf,
+ ulg stored_len, int last) {
ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */
int max_blindex = 0; /* index of last bit length code of non zero freq */
@@ -1035,14 +1114,15 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)
* Save the match info and tally the frequency counts. Return true if
* the current block must be flushed.
*/
-int ZLIB_INTERNAL _tr_tally(s, dist, lc)
- deflate_state *s;
- unsigned dist; /* distance of matched string */
- unsigned lc; /* match length - MIN_MATCH or unmatched char (dist==0) */
-{
+int ZLIB_INTERNAL _tr_tally(deflate_state *s, unsigned dist, unsigned lc) {
+#ifdef LIT_MEM
+ s->d_buf[s->sym_next] = (ush)dist;
+ s->l_buf[s->sym_next++] = (uch)lc;
+#else
s->sym_buf[s->sym_next++] = (uch)dist;
s->sym_buf[s->sym_next++] = (uch)(dist >> 8);
s->sym_buf[s->sym_next++] = (uch)lc;
+#endif
if (dist == 0) {
/* lc is the unmatched char */
s->dyn_ltree[lc].Freq++;
@@ -1059,147 +1139,3 @@ int ZLIB_INTERNAL _tr_tally(s, dist, lc)
}
return (s->sym_next == s->sym_end);
}
-
-/* ===========================================================================
- * Send the block data compressed using the given Huffman trees
- */
-local void compress_block(s, ltree, dtree)
- deflate_state *s;
- const ct_data *ltree; /* literal tree */
- const ct_data *dtree; /* distance tree */
-{
- unsigned dist; /* distance of matched string */
- int lc; /* match length or unmatched char (if dist == 0) */
- unsigned sx = 0; /* running index in sym_buf */
- unsigned code; /* the code to send */
- int extra; /* number of extra bits to send */
-
- if (s->sym_next != 0) do {
- dist = s->sym_buf[sx++] & 0xff;
- dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8;
- lc = s->sym_buf[sx++];
- if (dist == 0) {
- send_code(s, lc, ltree); /* send a literal byte */
- Tracecv(isgraph(lc), (stderr," '%c' ", lc));
- } else {
- /* Here, lc is the match length - MIN_MATCH */
- code = _length_code[lc];
- send_code(s, code + LITERALS + 1, ltree); /* send length code */
- extra = extra_lbits[code];
- if (extra != 0) {
- lc -= base_length[code];
- send_bits(s, lc, extra); /* send the extra length bits */
- }
- dist--; /* dist is now the match distance - 1 */
- code = d_code(dist);
- Assert (code < D_CODES, "bad d_code");
-
- send_code(s, code, dtree); /* send the distance code */
- extra = extra_dbits[code];
- if (extra != 0) {
- dist -= (unsigned)base_dist[code];
- send_bits(s, dist, extra); /* send the extra distance bits */
- }
- } /* literal or match pair ? */
-
- /* Check that the overlay between pending_buf and sym_buf is ok: */
- Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow");
-
- } while (sx < s->sym_next);
-
- send_code(s, END_BLOCK, ltree);
-}
-
-/* ===========================================================================
- * Check if the data type is TEXT or BINARY, using the following algorithm:
- * - TEXT if the two conditions below are satisfied:
- * a) There are no non-portable control characters belonging to the
- * "block list" (0..6, 14..25, 28..31).
- * b) There is at least one printable character belonging to the
- * "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
- * - BINARY otherwise.
- * - The following partially-portable control characters form a
- * "gray list" that is ignored in this detection algorithm:
- * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
- * IN assertion: the fields Freq of dyn_ltree are set.
- */
-local int detect_data_type(s)
- deflate_state *s;
-{
- /* block_mask is the bit mask of block-listed bytes
- * set bits 0..6, 14..25, and 28..31
- * 0xf3ffc07f = binary 11110011111111111100000001111111
- */
- unsigned long block_mask = 0xf3ffc07fUL;
- int n;
-
- /* Check for non-textual ("block-listed") bytes. */
- for (n = 0; n <= 31; n++, block_mask >>= 1)
- if ((block_mask & 1) && (s->dyn_ltree[n].Freq != 0))
- return Z_BINARY;
-
- /* Check for textual ("allow-listed") bytes. */
- if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0
- || s->dyn_ltree[13].Freq != 0)
- return Z_TEXT;
- for (n = 32; n < LITERALS; n++)
- if (s->dyn_ltree[n].Freq != 0)
- return Z_TEXT;
-
- /* There are no "block-listed" or "allow-listed" bytes:
- * this stream either is empty or has tolerated ("gray-listed") bytes only.
- */
- return Z_BINARY;
-}
-
-/* ===========================================================================
- * Reverse the first len bits of a code, using straightforward code (a faster
- * method would use a table)
- * IN assertion: 1 <= len <= 15
- */
-local unsigned bi_reverse(code, len)
- unsigned code; /* the value to invert */
- int len; /* its bit length */
-{
- register unsigned res = 0;
- do {
- res |= code & 1;
- code >>= 1, res <<= 1;
- } while (--len > 0);
- return res >> 1;
-}
-
-/* ===========================================================================
- * Flush the bit buffer, keeping at most 7 bits in it.
- */
-local void bi_flush(s)
- deflate_state *s;
-{
- if (s->bi_valid == 16) {
- put_short(s, s->bi_buf);
- s->bi_buf = 0;
- s->bi_valid = 0;
- } else if (s->bi_valid >= 8) {
- put_byte(s, (Byte)s->bi_buf);
- s->bi_buf >>= 8;
- s->bi_valid -= 8;
- }
-}
-
-/* ===========================================================================
- * Flush the bit buffer and align the output on a byte boundary
- */
-local void bi_windup(s)
- deflate_state *s;
-{
- if (s->bi_valid > 8) {
- put_short(s, s->bi_buf);
- } else if (s->bi_valid > 0) {
- put_byte(s, (Byte)s->bi_buf);
- }
- s->bi_buf = 0;
- s->bi_valid = 0;
-#ifdef ZLIB_DEBUG
- s->bits_sent = (s->bits_sent + 7) & ~7;
-#endif
-}
diff --git a/jdk/src/share/native/java/util/zip/zlib/uncompr.c b/jdk/src/share/native/java/util/zip/zlib/uncompr.c
index 24af8d2453..219c1d264d 100644
--- a/jdk/src/share/native/java/util/zip/zlib/uncompr.c
+++ b/jdk/src/share/native/java/util/zip/zlib/uncompr.c
@@ -48,12 +48,8 @@
Z_DATA_ERROR if the input data was corrupted, including if the input data is
an incomplete zlib stream.
*/
-int ZEXPORT uncompress2(dest, destLen, source, sourceLen)
- Bytef *dest;
- uLongf *destLen;
- const Bytef *source;
- uLong *sourceLen;
-{
+int ZEXPORT uncompress2(Bytef *dest, uLongf *destLen, const Bytef *source,
+ uLong *sourceLen) {
z_stream stream;
int err;
const uInt max = (uInt)-1;
@@ -107,11 +103,7 @@ int ZEXPORT uncompress2(dest, destLen, source, sourceLen)
err;
}
-int ZEXPORT uncompress(dest, destLen, source, sourceLen)
- Bytef *dest;
- uLongf *destLen;
- const Bytef *source;
- uLong sourceLen;
-{
+int ZEXPORT uncompress(Bytef *dest, uLongf *destLen, const Bytef *source,
+ uLong sourceLen) {
return uncompress2(dest, destLen, source, &sourceLen);
}
diff --git a/jdk/src/share/native/java/util/zip/zlib/zadler32.c b/jdk/src/share/native/java/util/zip/zlib/zadler32.c
index e148022631..acfd75b908 100644
--- a/jdk/src/share/native/java/util/zip/zlib/zadler32.c
+++ b/jdk/src/share/native/java/util/zip/zlib/zadler32.c
@@ -31,8 +31,6 @@
#include "zutil.h"
-local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2));
-
#define BASE 65521U /* largest prime smaller than 65536 */
#define NMAX 5552
/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
@@ -84,11 +82,7 @@ local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2));
#endif
/* ========================================================================= */
-uLong ZEXPORT adler32_z(adler, buf, len)
- uLong adler;
- const Bytef *buf;
- z_size_t len;
-{
+uLong ZEXPORT adler32_z(uLong adler, const Bytef *buf, z_size_t len) {
unsigned long sum2;
unsigned n;
@@ -155,20 +149,12 @@ uLong ZEXPORT adler32_z(adler, buf, len)
}
/* ========================================================================= */
-uLong ZEXPORT adler32(adler, buf, len)
- uLong adler;
- const Bytef *buf;
- uInt len;
-{
+uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len) {
return adler32_z(adler, buf, len);
}
/* ========================================================================= */
-local uLong adler32_combine_(adler1, adler2, len2)
- uLong adler1;
- uLong adler2;
- z_off64_t len2;
-{
+local uLong adler32_combine_(uLong adler1, uLong adler2, z_off64_t len2) {
unsigned long sum1;
unsigned long sum2;
unsigned rem;
@@ -193,18 +179,10 @@ local uLong adler32_combine_(adler1, adler2, len2)
}
/* ========================================================================= */
-uLong ZEXPORT adler32_combine(adler1, adler2, len2)
- uLong adler1;
- uLong adler2;
- z_off_t len2;
-{
+uLong ZEXPORT adler32_combine(uLong adler1, uLong adler2, z_off_t len2) {
return adler32_combine_(adler1, adler2, len2);
}
-uLong ZEXPORT adler32_combine64(adler1, adler2, len2)
- uLong adler1;
- uLong adler2;
- z_off64_t len2;
-{
+uLong ZEXPORT adler32_combine64(uLong adler1, uLong adler2, z_off64_t len2) {
return adler32_combine_(adler1, adler2, len2);
}
diff --git a/jdk/src/share/native/java/util/zip/zlib/zconf.h b/jdk/src/share/native/java/util/zip/zlib/zconf.h
index 92b7eb2388..46204222f5 100644
--- a/jdk/src/share/native/java/util/zip/zlib/zconf.h
+++ b/jdk/src/share/native/java/util/zip/zlib/zconf.h
@@ -23,7 +23,7 @@
*/
/* zconf.h -- configuration of the zlib compression library
- * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler
+ * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -265,7 +265,11 @@
#endif
#ifdef Z_SOLO
- typedef unsigned long z_size_t;
+# ifdef _WIN64
+ typedef unsigned long long z_size_t;
+# else
+ typedef unsigned long z_size_t;
+# endif
#else
# define z_longlong long long
# if defined(NO_SIZE_T)
@@ -320,14 +324,6 @@
# endif
#endif
-#ifndef Z_ARG /* function prototypes for stdarg */
-# if defined(STDC) || defined(Z_HAVE_STDARG_H)
-# define Z_ARG(args) args
-# else
-# define Z_ARG(args) ()
-# endif
-#endif
-
/* The following definitions for FAR are needed only for MSDOS mixed
* model programming (small or medium model with some far allocations).
* This was tested only with MSC; for other MSDOS compilers you may have
@@ -544,7 +540,7 @@ typedef uLong FAR uLongf;
#if !defined(_WIN32) && defined(Z_LARGE64)
# define z_off64_t off64_t
#else
-# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO)
+# if defined(_WIN32) && !defined(__GNUC__)
# define z_off64_t __int64
# else
# define z_off64_t z_off_t
diff --git a/jdk/src/share/native/java/util/zip/zlib/zcrc32.c b/jdk/src/share/native/java/util/zip/zlib/zcrc32.c
index 24f2350b55..3f918f76b7 100644
--- a/jdk/src/share/native/java/util/zip/zlib/zcrc32.c
+++ b/jdk/src/share/native/java/util/zip/zlib/zcrc32.c
@@ -127,19 +127,6 @@
# define ARMCRC32
#endif
-/* Local functions. */
-local z_crc_t multmodp OF((z_crc_t a, z_crc_t b));
-local z_crc_t x2nmodp OF((z_off64_t n, unsigned k));
-
-#if defined(W) && (!defined(ARMCRC32) || defined(DYNAMIC_CRC_TABLE))
- local z_word_t byte_swap OF((z_word_t word));
-#endif
-
-#if defined(W) && !defined(ARMCRC32)
- local z_crc_t crc_word OF((z_word_t data));
- local z_word_t crc_word_big OF((z_word_t data));
-#endif
-
#if defined(W) && (!defined(ARMCRC32) || defined(DYNAMIC_CRC_TABLE))
/*
Swap the bytes in a z_word_t to convert between little and big endian. Any
@@ -147,9 +134,7 @@ local z_crc_t x2nmodp OF((z_off64_t n, unsigned k));
instruction, if one is available. This assumes that word_t is either 32 bits
or 64 bits.
*/
-local z_word_t byte_swap(word)
- z_word_t word;
-{
+local z_word_t byte_swap(z_word_t word) {
# if W == 8
return
(word & 0xff00000000000000) >> 56 |
@@ -170,24 +155,77 @@ local z_word_t byte_swap(word)
}
#endif
+#ifdef DYNAMIC_CRC_TABLE
+/* =========================================================================
+ * Table of powers of x for combining CRC-32s, filled in by make_crc_table()
+ * below.
+ */
+ local z_crc_t FAR x2n_table[32];
+#else
+/* =========================================================================
+ * Tables for byte-wise and braided CRC-32 calculations, and a table of powers
+ * of x for combining CRC-32s, all made by make_crc_table().
+ */
+# include "crc32.h"
+#endif
+
/* CRC polynomial. */
#define POLY 0xedb88320 /* p(x) reflected, with x^32 implied */
-#ifdef DYNAMIC_CRC_TABLE
+/*
+ Return a(x) multiplied by b(x) modulo p(x), where p(x) is the CRC polynomial,
+ reflected. For speed, this requires that a not be zero.
+ */
+local z_crc_t multmodp(z_crc_t a, z_crc_t b) {
+ z_crc_t m, p;
+
+ m = (z_crc_t)1 << 31;
+ p = 0;
+ for (;;) {
+ if (a & m) {
+ p ^= b;
+ if ((a & (m - 1)) == 0)
+ break;
+ }
+ m >>= 1;
+ b = b & 1 ? (b >> 1) ^ POLY : b >> 1;
+ }
+ return p;
+}
+/*
+ Return x^(n * 2^k) modulo p(x). Requires that x2n_table[] has been
+ initialized.
+ */
+local z_crc_t x2nmodp(z_off64_t n, unsigned k) {
+ z_crc_t p;
+
+ p = (z_crc_t)1 << 31; /* x^0 == 1 */
+ while (n) {
+ if (n & 1)
+ p = multmodp(x2n_table[k & 31], p);
+ n >>= 1;
+ k++;
+ }
+ return p;
+}
+
+#ifdef DYNAMIC_CRC_TABLE
+/* =========================================================================
+ * Build the tables for byte-wise and braided CRC-32 calculations, and a table
+ * of powers of x for combining CRC-32s.
+ */
local z_crc_t FAR crc_table[256];
-local z_crc_t FAR x2n_table[32];
-local void make_crc_table OF((void));
#ifdef W
local z_word_t FAR crc_big_table[256];
local z_crc_t FAR crc_braid_table[W][256];
local z_word_t FAR crc_braid_big_table[W][256];
- local void braid OF((z_crc_t [][256], z_word_t [][256], int, int));
+ local void braid(z_crc_t [][256], z_word_t [][256], int, int);
#endif
#ifdef MAKECRCH
- local void write_table OF((FILE *, const z_crc_t FAR *, int));
- local void write_table32hi OF((FILE *, const z_word_t FAR *, int));
- local void write_table64 OF((FILE *, const z_word_t FAR *, int));
+ local void write_table(FILE *, const z_crc_t FAR *, int);
+ local void write_table32hi(FILE *, const z_word_t FAR *, int);
+ local void write_table64(FILE *, const z_word_t FAR *, int);
#endif /* MAKECRCH */
/*
@@ -200,7 +238,6 @@ local void make_crc_table OF((void));
/* Definition of once functionality. */
typedef struct once_s once_t;
-local void once OF((once_t *, void (*)(void)));
/* Check for the availability of atomics. */
#if defined(__STDC__) && __STDC_VERSION__ >= 201112L && \
@@ -220,10 +257,7 @@ struct once_s {
invoke once() at the same time. The state must be a once_t initialized with
ONCE_INIT.
*/
-local void once(state, init)
- once_t *state;
- void (*init)(void);
-{
+local void once(once_t *state, void (*init)(void)) {
if (!atomic_load(&state->done)) {
if (atomic_flag_test_and_set(&state->begun))
while (!atomic_load(&state->done))
@@ -246,10 +280,7 @@ struct once_s {
/* Test and set. Alas, not atomic, but tries to minimize the period of
vulnerability. */
-local int test_and_set OF((int volatile *));
-local int test_and_set(flag)
- int volatile *flag;
-{
+local int test_and_set(int volatile *flag) {
int was;
was = *flag;
@@ -258,10 +289,7 @@ local int test_and_set(flag)
}
/* Run the provided init() function once. This is not thread-safe. */
-local void once(state, init)
- once_t *state;
- void (*init)(void);
-{
+local void once(once_t *state, void (*init)(void)) {
if (!state->done) {
if (test_and_set(&state->begun))
while (!state->done)
@@ -303,8 +331,7 @@ local once_t made = ONCE_INIT;
combinations of CRC register values and incoming bytes.
*/
-local void make_crc_table()
-{
+local void make_crc_table(void) {
unsigned i, j, n;
z_crc_t p;
@@ -471,11 +498,7 @@ local void make_crc_table()
Write the 32-bit values in table[0..k-1] to out, five per line in
hexadecimal separated by commas.
*/
-local void write_table(out, table, k)
- FILE *out;
- const z_crc_t FAR *table;
- int k;
-{
+local void write_table(FILE *out, const z_crc_t FAR *table, int k) {
int n;
for (n = 0; n < k; n++)
@@ -488,11 +511,7 @@ local void write_table(out, table, k)
Write the high 32-bits of each value in table[0..k-1] to out, five per line
in hexadecimal separated by commas.
*/
-local void write_table32hi(out, table, k)
-FILE *out;
-const z_word_t FAR *table;
-int k;
-{
+local void write_table32hi(FILE *out, const z_word_t FAR *table, int k) {
int n;
for (n = 0; n < k; n++)
@@ -508,11 +527,7 @@ int k;
bits. If not, then the type cast and format string can be adjusted
accordingly.
*/
-local void write_table64(out, table, k)
- FILE *out;
- const z_word_t FAR *table;
- int k;
-{
+local void write_table64(FILE *out, const z_word_t FAR *table, int k) {
int n;
for (n = 0; n < k; n++)
@@ -522,8 +537,7 @@ local void write_table64(out, table, k)
}
/* Actually do the deed. */
-int main()
-{
+int main(void) {
make_crc_table();
return 0;
}
@@ -535,12 +549,7 @@ int main()
Generate the little and big-endian braid tables for the given n and z_word_t
size w. Each array must have room for w blocks of 256 elements.
*/
-local void braid(ltl, big, n, w)
- z_crc_t ltl[][256];
- z_word_t big[][256];
- int n;
- int w;
-{
+local void braid(z_crc_t ltl[][256], z_word_t big[][256], int n, int w) {
int k;
z_crc_t i, p, q;
for (k = 0; k < w; k++) {
@@ -555,69 +564,13 @@ local void braid(ltl, big, n, w)
}
#endif
-#else /* !DYNAMIC_CRC_TABLE */
-/* ========================================================================
- * Tables for byte-wise and braided CRC-32 calculations, and a table of powers
- * of x for combining CRC-32s, all made by make_crc_table().
- */
-#include "crc32.h"
#endif /* DYNAMIC_CRC_TABLE */
-/* ========================================================================
- * Routines used for CRC calculation. Some are also required for the table
- * generation above.
- */
-
-/*
- Return a(x) multiplied by b(x) modulo p(x), where p(x) is the CRC polynomial,
- reflected. For speed, this requires that a not be zero.
- */
-local z_crc_t multmodp(a, b)
- z_crc_t a;
- z_crc_t b;
-{
- z_crc_t m, p;
-
- m = (z_crc_t)1 << 31;
- p = 0;
- for (;;) {
- if (a & m) {
- p ^= b;
- if ((a & (m - 1)) == 0)
- break;
- }
- m >>= 1;
- b = b & 1 ? (b >> 1) ^ POLY : b >> 1;
- }
- return p;
-}
-
-/*
- Return x^(n * 2^k) modulo p(x). Requires that x2n_table[] has been
- initialized.
- */
-local z_crc_t x2nmodp(n, k)
- z_off64_t n;
- unsigned k;
-{
- z_crc_t p;
-
- p = (z_crc_t)1 << 31; /* x^0 == 1 */
- while (n) {
- if (n & 1)
- p = multmodp(x2n_table[k & 31], p);
- n >>= 1;
- k++;
- }
- return p;
-}
-
/* =========================================================================
* This function can be used by asm versions of crc32(), and to force the
* generation of the CRC tables in a threaded application.
*/
-const z_crc_t FAR * ZEXPORT get_crc_table()
-{
+const z_crc_t FAR * ZEXPORT get_crc_table(void) {
#ifdef DYNAMIC_CRC_TABLE
once(&made, make_crc_table);
#endif /* DYNAMIC_CRC_TABLE */
@@ -643,11 +596,8 @@ const z_crc_t FAR * ZEXPORT get_crc_table()
#define Z_BATCH_ZEROS 0xa10d3d0c /* computed from Z_BATCH = 3990 */
#define Z_BATCH_MIN 800 /* fewest words in a final batch */
-unsigned long ZEXPORT crc32_z(crc, buf, len)
- unsigned long crc;
- const unsigned char FAR *buf;
- z_size_t len;
-{
+unsigned long ZEXPORT crc32_z(unsigned long crc, const unsigned char FAR *buf,
+ z_size_t len) {
z_crc_t val;
z_word_t crc1, crc2;
const z_word_t *word;
@@ -747,18 +697,14 @@ unsigned long ZEXPORT crc32_z(crc, buf, len)
least-significant byte of the word as the first byte of data, without any pre
or post conditioning. This is used to combine the CRCs of each braid.
*/
-local z_crc_t crc_word(data)
- z_word_t data;
-{
+local z_crc_t crc_word(z_word_t data) {
int k;
for (k = 0; k < W; k++)
data = (data >> 8) ^ crc_table[data & 0xff];
return (z_crc_t)data;
}
-local z_word_t crc_word_big(data)
- z_word_t data;
-{
+local z_word_t crc_word_big(z_word_t data) {
int k;
for (k = 0; k < W; k++)
data = (data << 8) ^
@@ -769,11 +715,8 @@ local z_word_t crc_word_big(data)
#endif
/* ========================================================================= */
-unsigned long ZEXPORT crc32_z(crc, buf, len)
- unsigned long crc;
- const unsigned char FAR *buf;
- z_size_t len;
-{
+unsigned long ZEXPORT crc32_z(unsigned long crc, const unsigned char FAR *buf,
+ z_size_t len) {
/* Return initial CRC, if requested. */
if (buf == Z_NULL) return 0;
@@ -805,8 +748,8 @@ unsigned long ZEXPORT crc32_z(crc, buf, len)
words = (z_word_t const *)buf;
/* Do endian check at execution time instead of compile time, since ARM
- processors can change the endianess at execution time. If the
- compiler knows what the endianess will be, it can optimize out the
+ processors can change the endianness at execution time. If the
+ compiler knows what the endianness will be, it can optimize out the
check and the unused branch. */
endian = 1;
if (*(unsigned char *)&endian) {
@@ -1093,20 +1036,13 @@ unsigned long ZEXPORT crc32_z(crc, buf, len)
#endif
/* ========================================================================= */
-unsigned long ZEXPORT crc32(crc, buf, len)
- unsigned long crc;
- const unsigned char FAR *buf;
- uInt len;
-{
+unsigned long ZEXPORT crc32(unsigned long crc, const unsigned char FAR *buf,
+ uInt len) {
return crc32_z(crc, buf, len);
}
/* ========================================================================= */
-uLong ZEXPORT crc32_combine64(crc1, crc2, len2)
- uLong crc1;
- uLong crc2;
- z_off64_t len2;
-{
+uLong ZEXPORT crc32_combine64(uLong crc1, uLong crc2, z_off64_t len2) {
#ifdef DYNAMIC_CRC_TABLE
once(&made, make_crc_table);
#endif /* DYNAMIC_CRC_TABLE */
@@ -1114,18 +1050,12 @@ uLong ZEXPORT crc32_combine64(crc1, crc2, len2)
}
/* ========================================================================= */
-uLong ZEXPORT crc32_combine(crc1, crc2, len2)
- uLong crc1;
- uLong crc2;
- z_off_t len2;
-{
+uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2) {
return crc32_combine64(crc1, crc2, (z_off64_t)len2);
}
/* ========================================================================= */
-uLong ZEXPORT crc32_combine_gen64(len2)
- z_off64_t len2;
-{
+uLong ZEXPORT crc32_combine_gen64(z_off64_t len2) {
#ifdef DYNAMIC_CRC_TABLE
once(&made, make_crc_table);
#endif /* DYNAMIC_CRC_TABLE */
@@ -1133,17 +1063,11 @@ uLong ZEXPORT crc32_combine_gen64(len2)
}
/* ========================================================================= */
-uLong ZEXPORT crc32_combine_gen(len2)
- z_off_t len2;
-{
+uLong ZEXPORT crc32_combine_gen(z_off_t len2) {
return crc32_combine_gen64((z_off64_t)len2);
}
/* ========================================================================= */
-uLong ZEXPORT crc32_combine_op(crc1, crc2, op)
- uLong crc1;
- uLong crc2;
- uLong op;
-{
+uLong ZEXPORT crc32_combine_op(uLong crc1, uLong crc2, uLong op) {
return multmodp(op, crc1) ^ (crc2 & 0xffffffff);
}
diff --git a/jdk/src/share/native/java/util/zip/zlib/zlib.h b/jdk/src/share/native/java/util/zip/zlib/zlib.h
index 1014608879..07496b5f98 100644
--- a/jdk/src/share/native/java/util/zip/zlib/zlib.h
+++ b/jdk/src/share/native/java/util/zip/zlib/zlib.h
@@ -23,9 +23,9 @@
*/
/* zlib.h -- interface of the 'zlib' general purpose compression library
- version 1.2.13, October 13th, 2022
+ version 1.3.1, January 22nd, 2024
- Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler
+ Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
@@ -61,11 +61,11 @@
extern "C" {
#endif
-#define ZLIB_VERSION "1.2.13"
-#define ZLIB_VERNUM 0x12d0
+#define ZLIB_VERSION "1.3.1"
+#define ZLIB_VERNUM 0x1310
#define ZLIB_VER_MAJOR 1
-#define ZLIB_VER_MINOR 2
-#define ZLIB_VER_REVISION 13
+#define ZLIB_VER_MINOR 3
+#define ZLIB_VER_REVISION 1
#define ZLIB_VER_SUBREVISION 0
/*
@@ -102,8 +102,8 @@ extern "C" {
even in the case of corrupted input.
*/
-typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
-typedef void (*free_func) OF((voidpf opaque, voidpf address));
+typedef voidpf (*alloc_func)(voidpf opaque, uInt items, uInt size);
+typedef void (*free_func)(voidpf opaque, voidpf address);
struct internal_state;
@@ -241,7 +241,7 @@ typedef gz_header FAR *gz_headerp;
/* basic functions */
-ZEXTERN const char * ZEXPORT zlibVersion OF((void));
+ZEXTERN const char * ZEXPORT zlibVersion(void);
/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
If the first character differs, the library code actually used is not
compatible with the zlib.h header file used by the application. This check
@@ -249,12 +249,12 @@ ZEXTERN const char * ZEXPORT zlibVersion OF((void));
*/
/*
-ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
+ZEXTERN int ZEXPORT deflateInit(z_streamp strm, int level);
Initializes the internal stream state for compression. The fields
zalloc, zfree and opaque must be initialized before by the caller. If
zalloc and zfree are set to Z_NULL, deflateInit updates them to use default
- allocation functions.
+ allocation functions. total_in, total_out, adler, and msg are initialized.
The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:
1 gives best speed, 9 gives best compression, 0 gives no compression at all
@@ -271,7 +271,7 @@ ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
*/
-ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
+ZEXTERN int ZEXPORT deflate(z_streamp strm, int flush);
/*
deflate compresses as much data as possible, and stops when the input
buffer becomes empty or the output buffer becomes full. It may introduce
@@ -344,8 +344,8 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
with the same value of the flush parameter and more output space (updated
avail_out), until the flush is complete (deflate returns with non-zero
avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that
- avail_out is greater than six to avoid repeated flush markers due to
- avail_out == 0 on return.
+ avail_out is greater than six when the flush marker begins, in order to avoid
+ repeated flush markers upon calling deflate() again when avail_out == 0.
If the parameter flush is set to Z_FINISH, pending input is processed,
pending output is flushed and deflate returns with Z_STREAM_END if there was
@@ -384,7 +384,7 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
*/
-ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
+ZEXTERN int ZEXPORT deflateEnd(z_streamp strm);
/*
All dynamically allocated data structures for this stream are freed.
This function discards any unprocessed input and does not flush any pending
@@ -399,7 +399,7 @@ ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
/*
-ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
+ZEXTERN int ZEXPORT inflateInit(z_streamp strm);
Initializes the internal stream state for decompression. The fields
next_in, avail_in, zalloc, zfree and opaque must be initialized before by
@@ -407,7 +407,8 @@ ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
read or consumed. The allocation of a sliding window will be deferred to
the first call of inflate (if the decompression does not complete on the
first call). If zalloc and zfree are set to Z_NULL, inflateInit updates
- them to use default allocation functions.
+ them to use default allocation functions. total_in, total_out, adler, and
+ msg are initialized.
inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
@@ -421,7 +422,7 @@ ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
*/
-ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
+ZEXTERN int ZEXPORT inflate(z_streamp strm, int flush);
/*
inflate decompresses as much data as possible, and stops when the input
buffer becomes empty or the output buffer becomes full. It may introduce
@@ -541,7 +542,7 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
*/
-ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));
+ZEXTERN int ZEXPORT inflateEnd(z_streamp strm);
/*
All dynamically allocated data structures for this stream are freed.
This function discards any unprocessed input and does not flush any pending
@@ -559,12 +560,12 @@ ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));
*/
/*
-ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
- int level,
- int method,
- int windowBits,
- int memLevel,
- int strategy));
+ZEXTERN int ZEXPORT deflateInit2(z_streamp strm,
+ int level,
+ int method,
+ int windowBits,
+ int memLevel,
+ int strategy);
This is another version of deflateInit with more compression options. The
fields zalloc, zfree and opaque must be initialized before by the caller.
@@ -631,9 +632,9 @@ ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
compression: this will be done by deflate().
*/
-ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
- const Bytef *dictionary,
- uInt dictLength));
+ZEXTERN int ZEXPORT deflateSetDictionary(z_streamp strm,
+ const Bytef *dictionary,
+ uInt dictLength);
/*
Initializes the compression dictionary from the given byte sequence
without producing any compressed output. When using the zlib format, this
@@ -675,9 +676,9 @@ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
not perform any compression: this will be done by deflate().
*/
-ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm,
- Bytef *dictionary,
- uInt *dictLength));
+ZEXTERN int ZEXPORT deflateGetDictionary(z_streamp strm,
+ Bytef *dictionary,
+ uInt *dictLength);
/*
Returns the sliding dictionary being maintained by deflate. dictLength is
set to the number of bytes in the dictionary, and that many bytes are copied
@@ -697,8 +698,8 @@ ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm,
stream state is inconsistent.
*/
-ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
- z_streamp source));
+ZEXTERN int ZEXPORT deflateCopy(z_streamp dest,
+ z_streamp source);
/*
Sets the destination stream as a complete copy of the source stream.
@@ -715,20 +716,20 @@ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
destination.
*/
-ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));
+ZEXTERN int ZEXPORT deflateReset(z_streamp strm);
/*
This function is equivalent to deflateEnd followed by deflateInit, but
does not free and reallocate the internal compression state. The stream
will leave the compression level and any other attributes that may have been
- set unchanged.
+ set unchanged. total_in, total_out, adler, and msg are initialized.
deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
stream state was inconsistent (such as zalloc or state being Z_NULL).
*/
-ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
- int level,
- int strategy));
+ZEXTERN int ZEXPORT deflateParams(z_streamp strm,
+ int level,
+ int strategy);
/*
Dynamically update the compression level and compression strategy. The
interpretation of level and strategy is as in deflateInit2(). This can be
@@ -753,7 +754,7 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
Then no more input data should be provided before the deflateParams() call.
If this is done, the old level and strategy will be applied to the data
compressed before deflateParams(), and the new level and strategy will be
- applied to the the data compressed after deflateParams().
+ applied to the data compressed after deflateParams().
deflateParams returns Z_OK on success, Z_STREAM_ERROR if the source stream
state was inconsistent or if a parameter was invalid, or Z_BUF_ERROR if
@@ -764,11 +765,11 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
retried with more output space.
*/
-ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm,
- int good_length,
- int max_lazy,
- int nice_length,
- int max_chain));
+ZEXTERN int ZEXPORT deflateTune(z_streamp strm,
+ int good_length,
+ int max_lazy,
+ int nice_length,
+ int max_chain);
/*
Fine tune deflate's internal compression parameters. This should only be
used by someone who understands the algorithm used by zlib's deflate for
@@ -781,8 +782,8 @@ ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm,
returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream.
*/
-ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm,
- uLong sourceLen));
+ZEXTERN uLong ZEXPORT deflateBound(z_streamp strm,
+ uLong sourceLen);
/*
deflateBound() returns an upper bound on the compressed size after
deflation of sourceLen bytes. It must be called after deflateInit() or
@@ -796,9 +797,9 @@ ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm,
than Z_FINISH or Z_NO_FLUSH are used.
*/
-ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm,
- unsigned *pending,
- int *bits));
+ZEXTERN int ZEXPORT deflatePending(z_streamp strm,
+ unsigned *pending,
+ int *bits);
/*
deflatePending() returns the number of bytes and bits of output that have
been generated, but not yet provided in the available output. The bytes not
@@ -811,9 +812,9 @@ ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm,
stream state was inconsistent.
*/
-ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm,
- int bits,
- int value));
+ZEXTERN int ZEXPORT deflatePrime(z_streamp strm,
+ int bits,
+ int value);
/*
deflatePrime() inserts bits in the deflate output stream. The intent
is that this function is used to start off the deflate output with the bits
@@ -828,8 +829,8 @@ ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm,
source stream state was inconsistent.
*/
-ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm,
- gz_headerp head));
+ZEXTERN int ZEXPORT deflateSetHeader(z_streamp strm,
+ gz_headerp head);
/*
deflateSetHeader() provides gzip header information for when a gzip
stream is requested by deflateInit2(). deflateSetHeader() may be called
@@ -845,16 +846,17 @@ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm,
gzip file" and give up.
If deflateSetHeader is not used, the default gzip header has text false,
- the time set to zero, and os set to 255, with no extra, name, or comment
- fields. The gzip header is returned to the default state by deflateReset().
+ the time set to zero, and os set to the current operating system, with no
+ extra, name, or comment fields. The gzip header is returned to the default
+ state by deflateReset().
deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
stream state was inconsistent.
*/
/*
-ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
- int windowBits));
+ZEXTERN int ZEXPORT inflateInit2(z_streamp strm,
+ int windowBits);
This is another version of inflateInit with an extra parameter. The
fields next_in, avail_in, zalloc, zfree and opaque must be initialized
@@ -907,9 +909,9 @@ ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
deferred until inflate() is called.
*/
-ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
- const Bytef *dictionary,
- uInt dictLength));
+ZEXTERN int ZEXPORT inflateSetDictionary(z_streamp strm,
+ const Bytef *dictionary,
+ uInt dictLength);
/*
Initializes the decompression dictionary from the given uncompressed byte
sequence. This function must be called immediately after a call of inflate,
@@ -930,9 +932,9 @@ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
inflate().
*/
-ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm,
- Bytef *dictionary,
- uInt *dictLength));
+ZEXTERN int ZEXPORT inflateGetDictionary(z_streamp strm,
+ Bytef *dictionary,
+ uInt *dictLength);
/*
Returns the sliding dictionary being maintained by inflate. dictLength is
set to the number of bytes in the dictionary, and that many bytes are copied
@@ -945,7 +947,7 @@ ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm,
stream state is inconsistent.
*/
-ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
+ZEXTERN int ZEXPORT inflateSync(z_streamp strm);
/*
Skips invalid compressed data until a possible full flush point (see above
for the description of deflate with Z_FULL_FLUSH) can be found, or until all
@@ -958,14 +960,14 @@ ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
inflateSync returns Z_OK if a possible full flush point has been found,
Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point
has been found, or Z_STREAM_ERROR if the stream structure was inconsistent.
- In the success case, the application may save the current current value of
- total_in which indicates where valid compressed data was found. In the
- error case, the application may repeatedly call inflateSync, providing more
- input each time, until success or end of the input data.
+ In the success case, the application may save the current value of total_in
+ which indicates where valid compressed data was found. In the error case,
+ the application may repeatedly call inflateSync, providing more input each
+ time, until success or end of the input data.
*/
-ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,
- z_streamp source));
+ZEXTERN int ZEXPORT inflateCopy(z_streamp dest,
+ z_streamp source);
/*
Sets the destination stream as a complete copy of the source stream.
@@ -980,18 +982,19 @@ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,
destination.
*/
-ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));
+ZEXTERN int ZEXPORT inflateReset(z_streamp strm);
/*
This function is equivalent to inflateEnd followed by inflateInit,
but does not free and reallocate the internal decompression state. The
stream will keep attributes that may have been set by inflateInit2.
+ total_in, total_out, adler, and msg are initialized.
inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
stream state was inconsistent (such as zalloc or state being Z_NULL).
*/
-ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm,
- int windowBits));
+ZEXTERN int ZEXPORT inflateReset2(z_streamp strm,
+ int windowBits);
/*
This function is the same as inflateReset, but it also permits changing
the wrap and window size requests. The windowBits parameter is interpreted
@@ -1004,9 +1007,9 @@ ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm,
the windowBits parameter is invalid.
*/
-ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm,
- int bits,
- int value));
+ZEXTERN int ZEXPORT inflatePrime(z_streamp strm,
+ int bits,
+ int value);
/*
This function inserts bits in the inflate input stream. The intent is
that this function is used to start inflating at a bit position in the
@@ -1025,7 +1028,7 @@ ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm,
stream state was inconsistent.
*/
-ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm));
+ZEXTERN long ZEXPORT inflateMark(z_streamp strm);
/*
This function returns two values, one in the lower 16 bits of the return
value, and the other in the remaining upper bits, obtained by shifting the
@@ -1053,8 +1056,8 @@ ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm));
source stream state was inconsistent.
*/
-ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm,
- gz_headerp head));
+ZEXTERN int ZEXPORT inflateGetHeader(z_streamp strm,
+ gz_headerp head);
/*
inflateGetHeader() requests that gzip header information be stored in the
provided gz_header structure. inflateGetHeader() may be called after
@@ -1094,8 +1097,8 @@ ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm,
*/
/*
-ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,
- unsigned char FAR *window));
+ZEXTERN int ZEXPORT inflateBackInit(z_streamp strm, int windowBits,
+ unsigned char FAR *window);
Initialize the internal stream state for decompression using inflateBack()
calls. The fields zalloc, zfree and opaque in strm must be initialized
@@ -1115,13 +1118,13 @@ ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,
the version of the header file.
*/
-typedef unsigned (*in_func) OF((void FAR *,
- z_const unsigned char FAR * FAR *));
-typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));
+typedef unsigned (*in_func)(void FAR *,
+ z_const unsigned char FAR * FAR *);
+typedef int (*out_func)(void FAR *, unsigned char FAR *, unsigned);
-ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
- in_func in, void FAR *in_desc,
- out_func out, void FAR *out_desc));
+ZEXTERN int ZEXPORT inflateBack(z_streamp strm,
+ in_func in, void FAR *in_desc,
+ out_func out, void FAR *out_desc);
/*
inflateBack() does a raw inflate with a single call using a call-back
interface for input and output. This is potentially more efficient than
@@ -1189,7 +1192,7 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
cannot return Z_OK.
*/
-ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm));
+ZEXTERN int ZEXPORT inflateBackEnd(z_streamp strm);
/*
All memory allocated by inflateBackInit() is freed.
@@ -1197,7 +1200,7 @@ ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm));
state was inconsistent.
*/
-ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));
+ZEXTERN uLong ZEXPORT zlibCompileFlags(void);
/* Return flags indicating compile-time options.
Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other:
@@ -1250,8 +1253,8 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));
you need special options.
*/
-ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen,
- const Bytef *source, uLong sourceLen));
+ZEXTERN int ZEXPORT compress(Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen);
/*
Compresses the source buffer into the destination buffer. sourceLen is
the byte length of the source buffer. Upon entry, destLen is the total size
@@ -1265,9 +1268,9 @@ ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen,
buffer.
*/
-ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,
- const Bytef *source, uLong sourceLen,
- int level));
+ZEXTERN int ZEXPORT compress2(Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen,
+ int level);
/*
Compresses the source buffer into the destination buffer. The level
parameter has the same meaning as in deflateInit. sourceLen is the byte
@@ -1281,15 +1284,15 @@ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,
Z_STREAM_ERROR if the level parameter is invalid.
*/
-ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen));
+ZEXTERN uLong ZEXPORT compressBound(uLong sourceLen);
/*
compressBound() returns an upper bound on the compressed size after
compress() or compress2() on sourceLen bytes. It would be used before a
compress() or compress2() call to allocate the destination buffer.
*/
-ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
- const Bytef *source, uLong sourceLen));
+ZEXTERN int ZEXPORT uncompress(Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen);
/*
Decompresses the source buffer into the destination buffer. sourceLen is
the byte length of the source buffer. Upon entry, destLen is the total size
@@ -1306,8 +1309,8 @@ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
buffer with the uncompressed data up to that point.
*/
-ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen,
- const Bytef *source, uLong *sourceLen));
+ZEXTERN int ZEXPORT uncompress2(Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong *sourceLen);
/*
Same as uncompress, except that sourceLen is a pointer, where the
length of the source is *sourceLen. On return, *sourceLen is the number of
@@ -1326,7 +1329,7 @@ ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen,
typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */
/*
-ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
+ZEXTERN gzFile ZEXPORT gzopen(const char *path, const char *mode);
Open the gzip (.gz) file at path for reading and decompressing, or
compressing and writing. The mode parameter is as in fopen ("rb" or "wb")
@@ -1363,7 +1366,7 @@ ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
file could not be opened.
*/
-ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
+ZEXTERN gzFile ZEXPORT gzdopen(int fd, const char *mode);
/*
Associate a gzFile with the file descriptor fd. File descriptors are
obtained from calls like open, dup, creat, pipe or fileno (if the file has
@@ -1386,7 +1389,7 @@ ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
will not detect if fd is invalid (unless fd is -1).
*/
-ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size));
+ZEXTERN int ZEXPORT gzbuffer(gzFile file, unsigned size);
/*
Set the internal buffer size used by this library's functions for file to
size. The default buffer size is 8192 bytes. This function must be called
@@ -1402,7 +1405,7 @@ ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size));
too late.
*/
-ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
+ZEXTERN int ZEXPORT gzsetparams(gzFile file, int level, int strategy);
/*
Dynamically update the compression level and strategy for file. See the
description of deflateInit2 for the meaning of these parameters. Previously
@@ -1413,7 +1416,7 @@ ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
or Z_MEM_ERROR if there is a memory allocation error.
*/
-ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
+ZEXTERN int ZEXPORT gzread(gzFile file, voidp buf, unsigned len);
/*
Read and decompress up to len uncompressed bytes from file into buf. If
the input file is not in gzip format, gzread copies the given number of
@@ -1443,8 +1446,8 @@ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
Z_STREAM_ERROR.
*/
-ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems,
- gzFile file));
+ZEXTERN z_size_t ZEXPORT gzfread(voidp buf, z_size_t size, z_size_t nitems,
+ gzFile file);
/*
Read and decompress up to nitems items of size size from file into buf,
otherwise operating as gzread() does. This duplicates the interface of
@@ -1469,14 +1472,14 @@ ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems,
file, resetting and retrying on end-of-file, when size is not 1.
*/
-ZEXTERN int ZEXPORT gzwrite OF((gzFile file, voidpc buf, unsigned len));
+ZEXTERN int ZEXPORT gzwrite(gzFile file, voidpc buf, unsigned len);
/*
Compress and write the len uncompressed bytes at buf to file. gzwrite
returns the number of uncompressed bytes written or 0 in case of error.
*/
-ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size,
- z_size_t nitems, gzFile file));
+ZEXTERN z_size_t ZEXPORT gzfwrite(voidpc buf, z_size_t size,
+ z_size_t nitems, gzFile file);
/*
Compress and write nitems items of size size from buf to file, duplicating
the interface of stdio's fwrite(), with size_t request and return types. If
@@ -1489,7 +1492,7 @@ ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size,
is returned, and the error state is set to Z_STREAM_ERROR.
*/
-ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...));
+ZEXTERN int ZEXPORTVA gzprintf(gzFile file, const char *format, ...);
/*
Convert, format, compress, and write the arguments (...) to file under
control of the string format, as in fprintf. gzprintf returns the number of
@@ -1504,7 +1507,7 @@ ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...));
This can be determined using zlibCompileFlags().
*/
-ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
+ZEXTERN int ZEXPORT gzputs(gzFile file, const char *s);
/*
Compress and write the given null-terminated string s to file, excluding
the terminating null character.
@@ -1512,7 +1515,7 @@ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
gzputs returns the number of characters written, or -1 in case of error.
*/
-ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
+ZEXTERN char * ZEXPORT gzgets(gzFile file, char *buf, int len);
/*
Read and decompress bytes from file into buf, until len-1 characters are
read, or until a newline character is read and transferred to buf, or an
@@ -1526,13 +1529,13 @@ ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
buf are indeterminate.
*/
-ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));
+ZEXTERN int ZEXPORT gzputc(gzFile file, int c);
/*
Compress and write c, converted to an unsigned char, into file. gzputc
returns the value that was written, or -1 in case of error.
*/
-ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
+ZEXTERN int ZEXPORT gzgetc(gzFile file);
/*
Read and decompress one byte from file. gzgetc returns this byte or -1
in case of end of file or error. This is implemented as a macro for speed.
@@ -1541,7 +1544,7 @@ ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
points to has been clobbered or not.
*/
-ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));
+ZEXTERN int ZEXPORT gzungetc(int c, gzFile file);
/*
Push c back onto the stream for file to be read as the first character on
the next read. At least one character of push-back is always allowed.
@@ -1553,7 +1556,7 @@ ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));
gzseek() or gzrewind().
*/
-ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
+ZEXTERN int ZEXPORT gzflush(gzFile file, int flush);
/*
Flush all pending output to file. The parameter flush is as in the
deflate() function. The return value is the zlib error number (see function
@@ -1569,8 +1572,8 @@ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
*/
/*
-ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,
- z_off_t offset, int whence));
+ZEXTERN z_off_t ZEXPORT gzseek(gzFile file,
+ z_off_t offset, int whence);
Set the starting position to offset relative to whence for the next gzread
or gzwrite on file. The offset represents a number of bytes in the
@@ -1588,7 +1591,7 @@ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,
would be before the current position.
*/
-ZEXTERN int ZEXPORT gzrewind OF((gzFile file));
+ZEXTERN int ZEXPORT gzrewind(gzFile file);
/*
Rewind file. This function is supported only for reading.
@@ -1596,7 +1599,7 @@ ZEXTERN int ZEXPORT gzrewind OF((gzFile file));
*/
/*
-ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file));
+ZEXTERN z_off_t ZEXPORT gztell(gzFile file);
Return the starting position for the next gzread or gzwrite on file.
This position represents a number of bytes in the uncompressed data stream,
@@ -1607,7 +1610,7 @@ ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file));
*/
/*
-ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file));
+ZEXTERN z_off_t ZEXPORT gzoffset(gzFile file);
Return the current compressed (actual) read or write offset of file. This
offset includes the count of bytes that precede the gzip stream, for example
@@ -1616,7 +1619,7 @@ ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file));
be used for a progress indicator. On error, gzoffset() returns -1.
*/
-ZEXTERN int ZEXPORT gzeof OF((gzFile file));
+ZEXTERN int ZEXPORT gzeof(gzFile file);
/*
Return true (1) if the end-of-file indicator for file has been set while
reading, false (0) otherwise. Note that the end-of-file indicator is set
@@ -1631,7 +1634,7 @@ ZEXTERN int ZEXPORT gzeof OF((gzFile file));
has grown since the previous end of file was detected.
*/
-ZEXTERN int ZEXPORT gzdirect OF((gzFile file));
+ZEXTERN int ZEXPORT gzdirect(gzFile file);
/*
Return true (1) if file is being copied directly while reading, or false
(0) if file is a gzip stream being decompressed.
@@ -1652,7 +1655,7 @@ ZEXTERN int ZEXPORT gzdirect OF((gzFile file));
gzip file reading and decompression, which may not be desired.)
*/
-ZEXTERN int ZEXPORT gzclose OF((gzFile file));
+ZEXTERN int ZEXPORT gzclose(gzFile file);
/*
Flush all pending output for file, if necessary, close file and
deallocate the (de)compression state. Note that once file is closed, you
@@ -1665,8 +1668,8 @@ ZEXTERN int ZEXPORT gzclose OF((gzFile file));
last read ended in the middle of a gzip stream, or Z_OK on success.
*/
-ZEXTERN int ZEXPORT gzclose_r OF((gzFile file));
-ZEXTERN int ZEXPORT gzclose_w OF((gzFile file));
+ZEXTERN int ZEXPORT gzclose_r(gzFile file);
+ZEXTERN int ZEXPORT gzclose_w(gzFile file);
/*
Same as gzclose(), but gzclose_r() is only for use when reading, and
gzclose_w() is only for use when writing or appending. The advantage to
@@ -1677,7 +1680,7 @@ ZEXTERN int ZEXPORT gzclose_w OF((gzFile file));
zlib library.
*/
-ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
+ZEXTERN const char * ZEXPORT gzerror(gzFile file, int *errnum);
/*
Return the error message for the last error which occurred on file.
errnum is set to zlib error number. If an error occurred in the file system
@@ -1693,7 +1696,7 @@ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
functions above that do not distinguish those cases in their return values.
*/
-ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));
+ZEXTERN void ZEXPORT gzclearerr(gzFile file);
/*
Clear the error and end-of-file flags for file. This is analogous to the
clearerr() function in stdio. This is useful for continuing to read a gzip
@@ -1710,7 +1713,7 @@ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));
library.
*/
-ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
+ZEXTERN uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len);
/*
Update a running Adler-32 checksum with the bytes buf[0..len-1] and
return the updated checksum. An Adler-32 value is in the range of a 32-bit
@@ -1730,15 +1733,15 @@ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
if (adler != original_adler) error();
*/
-ZEXTERN uLong ZEXPORT adler32_z OF((uLong adler, const Bytef *buf,
- z_size_t len));
+ZEXTERN uLong ZEXPORT adler32_z(uLong adler, const Bytef *buf,
+ z_size_t len);
/*
Same as adler32(), but with a size_t length.
*/
/*
-ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,
- z_off_t len2));
+ZEXTERN uLong ZEXPORT adler32_combine(uLong adler1, uLong adler2,
+ z_off_t len2);
Combine two Adler-32 checksums into one. For two sequences of bytes, seq1
and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for
@@ -1748,7 +1751,7 @@ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,
negative, the result has no meaning or utility.
*/
-ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
+ZEXTERN uLong ZEXPORT crc32(uLong crc, const Bytef *buf, uInt len);
/*
Update a running CRC-32 with the bytes buf[0..len-1] and return the
updated CRC-32. A CRC-32 value is in the range of a 32-bit unsigned integer.
@@ -1766,30 +1769,30 @@ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
if (crc != original_crc) error();
*/
-ZEXTERN uLong ZEXPORT crc32_z OF((uLong crc, const Bytef *buf,
- z_size_t len));
+ZEXTERN uLong ZEXPORT crc32_z(uLong crc, const Bytef *buf,
+ z_size_t len);
/*
Same as crc32(), but with a size_t length.
*/
/*
-ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2));
+ZEXTERN uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2);
Combine two CRC-32 check values into one. For two sequences of bytes,
seq1 and seq2 with lengths len1 and len2, CRC-32 check values were
calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32
check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and
- len2.
+ len2. len2 must be non-negative.
*/
/*
-ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t len2));
+ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t len2);
Return the operator corresponding to length len2, to be used with
- crc32_combine_op().
+ crc32_combine_op(). len2 must be non-negative.
*/
-ZEXTERN uLong ZEXPORT crc32_combine_op OF((uLong crc1, uLong crc2, uLong op));
+ZEXTERN uLong ZEXPORT crc32_combine_op(uLong crc1, uLong crc2, uLong op);
/*
Give the same result as crc32_combine(), using op in place of len2. op is
is generated from len2 by crc32_combine_gen(). This will be faster than
@@ -1802,20 +1805,20 @@ ZEXTERN uLong ZEXPORT crc32_combine_op OF((uLong crc1, uLong crc2, uLong op));
/* deflateInit and inflateInit are macros to allow checking the zlib version
* and the compiler's view of z_stream:
*/
-ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,
- const char *version, int stream_size));
-ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,
- const char *version, int stream_size));
-ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method,
- int windowBits, int memLevel,
- int strategy, const char *version,
- int stream_size));
-ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits,
- const char *version, int stream_size));
-ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,
- unsigned char FAR *window,
- const char *version,
- int stream_size));
+ZEXTERN int ZEXPORT deflateInit_(z_streamp strm, int level,
+ const char *version, int stream_size);
+ZEXTERN int ZEXPORT inflateInit_(z_streamp strm,
+ const char *version, int stream_size);
+ZEXTERN int ZEXPORT deflateInit2_(z_streamp strm, int level, int method,
+ int windowBits, int memLevel,
+ int strategy, const char *version,
+ int stream_size);
+ZEXTERN int ZEXPORT inflateInit2_(z_streamp strm, int windowBits,
+ const char *version, int stream_size);
+ZEXTERN int ZEXPORT inflateBackInit_(z_streamp strm, int windowBits,
+ unsigned char FAR *window,
+ const char *version,
+ int stream_size);
#ifdef Z_PREFIX_SET
# define z_deflateInit(strm, level) \
deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream))
@@ -1860,7 +1863,7 @@ struct gzFile_s {
unsigned char *next;
z_off64_t pos;
};
-ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
+ZEXTERN int ZEXPORT gzgetc_(gzFile file); /* backward compatibility */
#ifdef Z_PREFIX_SET
# undef z_gzgetc
# define z_gzgetc(g) \
@@ -1877,13 +1880,13 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
* without large file support, _LFS64_LARGEFILE must also be true
*/
#ifdef Z_LARGE64
- ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
- ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));
- ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));
- ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
- ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t));
- ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t));
- ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off64_t));
+ ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *);
+ ZEXTERN z_off64_t ZEXPORT gzseek64(gzFile, z_off64_t, int);
+ ZEXTERN z_off64_t ZEXPORT gztell64(gzFile);
+ ZEXTERN z_off64_t ZEXPORT gzoffset64(gzFile);
+ ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off64_t);
+ ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off64_t);
+ ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off64_t);
#endif
#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64)
@@ -1905,50 +1908,50 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
# define crc32_combine_gen crc32_combine_gen64
# endif
# ifndef Z_LARGE64
- ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
- ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int));
- ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile));
- ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile));
- ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));
- ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));
- ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off_t));
+ ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *);
+ ZEXTERN z_off_t ZEXPORT gzseek64(gzFile, z_off_t, int);
+ ZEXTERN z_off_t ZEXPORT gztell64(gzFile);
+ ZEXTERN z_off_t ZEXPORT gzoffset64(gzFile);
+ ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off_t);
+ ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off_t);
+ ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off_t);
# endif
#else
- ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *));
- ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int));
- ZEXTERN z_off_t ZEXPORT gztell OF((gzFile));
- ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile));
- ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));
- ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));
- ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t));
+ ZEXTERN gzFile ZEXPORT gzopen(const char *, const char *);
+ ZEXTERN z_off_t ZEXPORT gzseek(gzFile, z_off_t, int);
+ ZEXTERN z_off_t ZEXPORT gztell(gzFile);
+ ZEXTERN z_off_t ZEXPORT gzoffset(gzFile);
+ ZEXTERN uLong ZEXPORT adler32_combine(uLong, uLong, z_off_t);
+ ZEXTERN uLong ZEXPORT crc32_combine(uLong, uLong, z_off_t);
+ ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t);
#endif
#else /* Z_SOLO */
- ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));
- ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));
- ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t));
+ ZEXTERN uLong ZEXPORT adler32_combine(uLong, uLong, z_off_t);
+ ZEXTERN uLong ZEXPORT crc32_combine(uLong, uLong, z_off_t);
+ ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t);
#endif /* !Z_SOLO */
/* undocumented functions */
-ZEXTERN const char * ZEXPORT zError OF((int));
-ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp));
-ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void));
-ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int));
-ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int));
-ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF((z_streamp));
-ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp));
-ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp));
+ZEXTERN const char * ZEXPORT zError(int);
+ZEXTERN int ZEXPORT inflateSyncPoint(z_streamp);
+ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table(void);
+ZEXTERN int ZEXPORT inflateUndermine(z_streamp, int);
+ZEXTERN int ZEXPORT inflateValidate(z_streamp, int);
+ZEXTERN unsigned long ZEXPORT inflateCodesUsed(z_streamp);
+ZEXTERN int ZEXPORT inflateResetKeep(z_streamp);
+ZEXTERN int ZEXPORT deflateResetKeep(z_streamp);
#if defined(_WIN32) && !defined(Z_SOLO)
-ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path,
- const char *mode));
+ZEXTERN gzFile ZEXPORT gzopen_w(const wchar_t *path,
+ const char *mode);
#endif
#if defined(STDC) || defined(Z_HAVE_STDARG_H)
# ifndef Z_SOLO
-ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file,
- const char *format,
- va_list va));
+ZEXTERN int ZEXPORTVA gzvprintf(gzFile file,
+ const char *format,
+ va_list va);
# endif
#endif
diff --git a/jdk/src/share/native/java/util/zip/zlib/zutil.c b/jdk/src/share/native/java/util/zip/zlib/zutil.c
index ae14796786..92dda78497 100644
--- a/jdk/src/share/native/java/util/zip/zlib/zutil.c
+++ b/jdk/src/share/native/java/util/zip/zlib/zutil.c
@@ -48,13 +48,11 @@ z_const char * const z_errmsg[10] = {
};
-const char * ZEXPORT zlibVersion()
-{
+const char * ZEXPORT zlibVersion(void) {
return ZLIB_VERSION;
}
-uLong ZEXPORT zlibCompileFlags()
-{
+uLong ZEXPORT zlibCompileFlags(void) {
uLong flags;
flags = 0;
@@ -145,9 +143,7 @@ uLong ZEXPORT zlibCompileFlags()
# endif
int ZLIB_INTERNAL z_verbose = verbose;
-void ZLIB_INTERNAL z_error(m)
- char *m;
-{
+void ZLIB_INTERNAL z_error(char *m) {
fprintf(stderr, "%s\n", m);
exit(1);
}
@@ -156,9 +152,7 @@ void ZLIB_INTERNAL z_error(m)
/* exported to allow conversion of error code to string for compress() and
* uncompress()
*/
-const char * ZEXPORT zError(err)
- int err;
-{
+const char * ZEXPORT zError(int err) {
return ERR_MSG(err);
}
@@ -172,22 +166,14 @@ const char * ZEXPORT zError(err)
#ifndef HAVE_MEMCPY
-void ZLIB_INTERNAL zmemcpy(dest, source, len)
- Bytef* dest;
- const Bytef* source;
- uInt len;
-{
+void ZLIB_INTERNAL zmemcpy(Bytef* dest, const Bytef* source, uInt len) {
if (len == 0) return;
do {
*dest++ = *source++; /* ??? to be unrolled */
} while (--len != 0);
}
-int ZLIB_INTERNAL zmemcmp(s1, s2, len)
- const Bytef* s1;
- const Bytef* s2;
- uInt len;
-{
+int ZLIB_INTERNAL zmemcmp(const Bytef* s1, const Bytef* s2, uInt len) {
uInt j;
for (j = 0; j < len; j++) {
@@ -196,10 +182,7 @@ int ZLIB_INTERNAL zmemcmp(s1, s2, len)
return 0;
}
-void ZLIB_INTERNAL zmemzero(dest, len)
- Bytef* dest;
- uInt len;
-{
+void ZLIB_INTERNAL zmemzero(Bytef* dest, uInt len) {
if (len == 0) return;
do {
*dest++ = 0; /* ??? to be unrolled */
@@ -240,8 +223,7 @@ local ptr_table table[MAX_PTR];
* a protected system like OS/2. Use Microsoft C instead.
*/
-voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size)
-{
+voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) {
voidpf buf;
ulg bsize = (ulg)items*size;
@@ -266,8 +248,7 @@ voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size)
return buf;
}
-void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr)
-{
+void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) {
int n;
(void)opaque;
@@ -303,14 +284,12 @@ void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr)
# define _hfree hfree
#endif
-voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, uInt items, uInt size)
-{
+voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, uInt items, uInt size) {
(void)opaque;
return _halloc((long)items, size);
}
-void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr)
-{
+void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) {
(void)opaque;
_hfree(ptr);
}
@@ -323,25 +302,18 @@ void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr)
#ifndef MY_ZCALLOC /* Any system without a special alloc function */
#ifndef STDC
-extern voidp malloc OF((uInt size));
-extern voidp calloc OF((uInt items, uInt size));
-extern void free OF((voidpf ptr));
+extern voidp malloc(uInt size);
+extern voidp calloc(uInt items, uInt size);
+extern void free(voidpf ptr);
#endif
-voidpf ZLIB_INTERNAL zcalloc(opaque, items, size)
- voidpf opaque;
- unsigned items;
- unsigned size;
-{
+voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) {
(void)opaque;
return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) :
(voidpf)calloc(items, size);
}
-void ZLIB_INTERNAL zcfree(opaque, ptr)
- voidpf opaque;
- voidpf ptr;
-{
+void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) {
(void)opaque;
free(ptr);
}
diff --git a/jdk/src/share/native/java/util/zip/zlib/zutil.h b/jdk/src/share/native/java/util/zip/zlib/zutil.h
index a7c842d26d..2b7e697bef 100644
--- a/jdk/src/share/native/java/util/zip/zlib/zutil.h
+++ b/jdk/src/share/native/java/util/zip/zlib/zutil.h
@@ -23,7 +23,7 @@
*/
/* zutil.h -- internal interface and configuration of the compression library
- * Copyright (C) 1995-2022 Jean-loup Gailly, Mark Adler
+ * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -80,7 +80,7 @@ typedef unsigned long ulg;
extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
/* (size given to avoid silly warnings with Visual C++) */
-#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]
+#define ERR_MSG(err) z_errmsg[(err) < -6 || (err) > 2 ? 9 : 2 - (err)]
#define ERR_RETURN(strm,err) \
return (strm->msg = ERR_MSG(err), (err))
@@ -161,17 +161,8 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
# endif
#endif
-#if defined(MACOS) || defined(TARGET_OS_MAC)
+#if defined(MACOS)
# define OS_CODE 7
-# ifndef Z_SOLO
-# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
-# include /* for fdopen */
-# else
-# ifndef fdopen
-# define fdopen(fd,mode) NULL /* No fdopen() */
-# endif
-# endif
-# endif
#endif
#ifdef __acorn
@@ -194,18 +185,6 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
# define OS_CODE 19
#endif
-#if defined(_BEOS_) || defined(RISCOS)
-# define fdopen(fd,mode) NULL /* No fdopen() */
-#endif
-
-#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX
-# if defined(_WIN32_WCE)
-# define fdopen(fd,mode) NULL /* No fdopen() */
-# else
-# define fdopen(fd,type) _fdopen(fd,type)
-# endif
-#endif
-
#if defined(__BORLANDC__) && !defined(MSDOS)
#pragma warn -8004
#pragma warn -8008
@@ -215,9 +194,9 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
/* provide prototypes for these when building zlib without LFS */
#if !defined(_WIN32) && \
(!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0)
- ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));
- ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));
- ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off_t));
+ ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off_t);
+ ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off_t);
+ ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off_t);
#endif
/* common defaults */
@@ -256,16 +235,16 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
# define zmemzero(dest, len) memset(dest, 0, len)
# endif
#else
- void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len));
- int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len));
- void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len));
+ void ZLIB_INTERNAL zmemcpy(Bytef* dest, const Bytef* source, uInt len);
+ int ZLIB_INTERNAL zmemcmp(const Bytef* s1, const Bytef* s2, uInt len);
+ void ZLIB_INTERNAL zmemzero(Bytef* dest, uInt len);
#endif
/* Diagnostic functions */
#ifdef ZLIB_DEBUG
# include
extern int ZLIB_INTERNAL z_verbose;
- extern void ZLIB_INTERNAL z_error OF((char *m));
+ extern void ZLIB_INTERNAL z_error(char *m);
# define Assert(cond,msg) {if(!(cond)) z_error(msg);}
# define Trace(x) {if (z_verbose>=0) fprintf x ;}
# define Tracev(x) {if (z_verbose>0) fprintf x ;}
@@ -282,9 +261,9 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
#endif
#ifndef Z_SOLO
- voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items,
- unsigned size));
- void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr));
+ voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items,
+ unsigned size);
+ void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr);
#endif
#define ZALLOC(strm, items, size) \
diff --git a/langtools/THIRD_PARTY_README b/langtools/THIRD_PARTY_README
index f26a5f3ec5..97fc700d46 100644
--- a/langtools/THIRD_PARTY_README
+++ b/langtools/THIRD_PARTY_README
@@ -3043,14 +3043,14 @@ performance, or use of this material.
-------------------------------------------------------------------------------
-%% This notice is provided with respect to zlib v1.2.11, which may be included
+%% This notice is provided with respect to zlib v1.3.1, which may be included
with JRE 8, JDK 8, and OpenJDK 8.
--- begin of LICENSE ---
- version 1.2.11, January 15th, 2017
+ version 1.3.1, January 22, 2024
- Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
+ Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
diff --git a/nashorn/THIRD_PARTY_README b/nashorn/THIRD_PARTY_README
index f26a5f3ec5..97fc700d46 100644
--- a/nashorn/THIRD_PARTY_README
+++ b/nashorn/THIRD_PARTY_README
@@ -3043,14 +3043,14 @@ performance, or use of this material.
-------------------------------------------------------------------------------
-%% This notice is provided with respect to zlib v1.2.11, which may be included
+%% This notice is provided with respect to zlib v1.3.1, which may be included
with JRE 8, JDK 8, and OpenJDK 8.
--- begin of LICENSE ---
- version 1.2.11, January 15th, 2017
+ version 1.3.1, January 22, 2024
- Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
+ Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
From bfb1a7d1e34ed2e0e88e67a5f77410de097fc489 Mon Sep 17 00:00:00 2001
From: Kazuhisa Takakuri
Date: Thu, 13 Jun 2024 23:35:09 +0000
Subject: [PATCH 08/66] 4660158: TTY: NumberFormatException while trying to set
values by 'set' command
Reviewed-by: andrew
Backport-of: 6c4e462b47983509cea416c001982559edf53b59
---
.../com/sun/tools/example/debug/expr/Expr.jj | 12 +-
.../example/debug/expr/ExpressionParser.java | 3166 ++++-------------
.../debug/expr/ExpressionParserConstants.java | 129 +-
.../expr/ExpressionParserTokenManager.java | 829 ++---
.../example/debug/expr/JavaCharStream.java | 642 ++++
.../sun/tools/example/debug/expr/LValue.java | 99 +-
.../example/debug/expr/ParseException.java | 90 +-
.../sun/tools/example/debug/expr/Token.java | 98 +-
.../example/debug/expr/TokenMgrError.java | 280 +-
jdk/test/com/sun/jdi/JdbExprTest.sh | 158 +
10 files changed, 2392 insertions(+), 3111 deletions(-)
create mode 100644 jdk/src/share/classes/com/sun/tools/example/debug/expr/JavaCharStream.java
create mode 100644 jdk/test/com/sun/jdi/JdbExprTest.sh
diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/expr/Expr.jj b/jdk/src/share/classes/com/sun/tools/example/debug/expr/Expr.jj
index ffe12e35d7..ece3be3d69 100644
--- a/jdk/src/share/classes/com/sun/tools/example/debug/expr/Expr.jj
+++ b/jdk/src/share/classes/com/sun/tools/example/debug/expr/Expr.jj
@@ -539,10 +539,10 @@ void MultiplicativeExpression() :
}
void UnaryExpression() :
-{}
+{Token tok;}
{
- ( "+" | "-" ) UnaryExpression()
- { throw new ParseException("operation not yet supported"); }
+ ( tok = "+" | tok = "-" ) UnaryExpression()
+ { push( LValue.operation(vm, tok, pop(), frameGetter) ); }
|
PreIncrementExpression()
|
@@ -566,10 +566,10 @@ void PreDecrementExpression() :
}
void UnaryExpressionNotPlusMinus() :
-{}
+{Token tok;}
{
- ( "~" | "!" ) UnaryExpression()
- { throw new ParseException("operation not yet supported"); }
+ ( tok = "~" | tok = "!" ) UnaryExpression()
+ { push( LValue.operation(vm, tok, pop(), frameGetter) ); }
|
LOOKAHEAD( CastLookahead() )
CastExpression()
diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/expr/ExpressionParser.java b/jdk/src/share/classes/com/sun/tools/example/debug/expr/ExpressionParser.java
index 5a56667149..5cf2229d30 100644
--- a/jdk/src/share/classes/com/sun/tools/example/debug/expr/ExpressionParser.java
+++ b/jdk/src/share/classes/com/sun/tools/example/debug/expr/ExpressionParser.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* 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,38 +23,28 @@
* questions.
*/
-/*
- * This source code is provided to illustrate the usage of a given feature
- * or technique and has been deliberately simplified. Additional steps
- * required for a production-quality application, such as security checks,
- * input validation and proper error handling, might not be present in
- * this sample code.
- */
-
-
/* Generated By:JavaCC: Do not edit this line. ExpressionParser.java */
package com.sun.tools.example.debug.expr;
import com.sun.jdi.*;
-
import java.util.Stack;
import java.util.List;
import java.util.ArrayList;
public class ExpressionParser implements ExpressionParserConstants {
- Stack stack = new Stack();
+ Stack stack = new Stack();
VirtualMachine vm = null;
GetFrame frameGetter = null;
private static GetFrame lastFrameGetter;
private static LValue lastLValue;
LValue peek() {
- return stack.peek();
+ return (LValue)stack.peek();
}
LValue pop() {
- return stack.pop();
+ return (LValue)stack.pop();
}
void push(LValue lval) {
@@ -62,7 +52,7 @@ void push(LValue lval) {
}
public static Value getMassagedValue() throws ParseException {
- return lastLValue.getMassagedValue(lastFrameGetter);
+ return lastLValue.getMassagedValue(lastFrameGetter);
}
public interface GetFrame {
@@ -70,14 +60,17 @@ public interface GetFrame {
}
public static Value evaluate(String expr, VirtualMachine vm,
- GetFrame frameGetter) throws ParseException, InvocationException,
- InvalidTypeException, ClassNotLoadedException,
+ GetFrame frameGetter) throws ParseException,
+ InvocationException,
+ InvalidTypeException,
+ ClassNotLoadedException,
IncompatibleThreadStateException {
// TODO StringBufferInputStream is deprecated.
java.io.InputStream in = new java.io.StringBufferInputStream(expr);
ExpressionParser parser = new ExpressionParser(in);
parser.vm = vm;
parser.frameGetter = frameGetter;
+ Value value = null;
parser.Expression();
lastFrameGetter = frameGetter;
lastLValue = parser.pop();
@@ -95,8 +88,8 @@ public static void main(String args[]) {
try {
parser = new ExpressionParser(new java.io.FileInputStream(args[0]));
} catch (java.io.FileNotFoundException e) {
- System.out.println("Java Parser Version 1.0.2: File " + args[0]
- + " not found.");
+ System.out.println("Java Parser Version 1.0.2: File " +
+ args[0] + " not found.");
return;
}
} else {
@@ -143,7 +136,8 @@ final public void Type() throws ParseException {
jj_consume_token(-1);
throw new ParseException();
}
- label_1: while (true) {
+ label_1:
+ while (true) {
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case LBRACKET:
;
@@ -194,7 +188,8 @@ final public String Name() throws ParseException {
StringBuffer sb = new StringBuffer();
jj_consume_token(IDENTIFIER);
sb.append(token);
- label_2: while (true) {
+ label_2:
+ while (true) {
if (jj_2_1(2)) {
;
} else {
@@ -202,18 +197,16 @@ final public String Name() throws ParseException {
}
jj_consume_token(DOT);
jj_consume_token(IDENTIFIER);
- sb.append('.');
- sb.append(token);
- }
- if (true) {
- return sb.toString();
- }
+ sb.append('.'); sb.append(token);
+ }
+ {if (true) return sb.toString();}
throw new Error("Missing return statement in function");
}
final public void NameList() throws ParseException {
Name();
- label_3: while (true) {
+ label_3:
+ while (true) {
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case COMMA:
;
@@ -267,9 +260,7 @@ final public void Assignment() throws ParseException {
PrimaryExpression();
AssignmentOperator();
Expression();
- LValue exprVal = pop();
- pop().setValue(exprVal);
- push(exprVal);
+ LValue exprVal = pop(); pop().setValue(exprVal); push(exprVal);
}
final public void AssignmentOperator() throws ParseException {
@@ -325,18 +316,13 @@ final public void ConditionalExpression() throws ParseException {
Expression();
jj_consume_token(COLON);
ConditionalExpression();
- LValue falseBranch = pop();
- LValue trueBranch = pop();
+ LValue falseBranch = pop(); LValue trueBranch = pop();
Value cond = pop().interiorGetValue();
if (cond instanceof BooleanValue) {
- push(((BooleanValue) cond).booleanValue() ? trueBranch
- : falseBranch);
+ push(((BooleanValue)cond).booleanValue()?
+ trueBranch : falseBranch);
} else {
- {
- if (true) {
- throw new ParseException("Condition must be boolean");
- }
- }
+ {if (true) throw new ParseException("Condition must be boolean");}
}
break;
default:
@@ -347,7 +333,8 @@ final public void ConditionalExpression() throws ParseException {
final public void ConditionalOrExpression() throws ParseException {
ConditionalAndExpression();
- label_4: while (true) {
+ label_4:
+ while (true) {
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case SC_OR:
;
@@ -358,17 +345,14 @@ final public void ConditionalOrExpression() throws ParseException {
}
jj_consume_token(SC_OR);
ConditionalAndExpression();
- {
- if (true) {
- throw new ParseException("operation not yet supported");
- }
- }
+ {if (true) throw new ParseException("operation not yet supported");}
}
}
final public void ConditionalAndExpression() throws ParseException {
InclusiveOrExpression();
- label_5: while (true) {
+ label_5:
+ while (true) {
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case SC_AND:
;
@@ -379,17 +363,14 @@ final public void ConditionalAndExpression() throws ParseException {
}
jj_consume_token(SC_AND);
InclusiveOrExpression();
- {
- if (true) {
- throw new ParseException("operation not yet supported");
- }
- }
+ {if (true) throw new ParseException("operation not yet supported");}
}
}
final public void InclusiveOrExpression() throws ParseException {
ExclusiveOrExpression();
- label_6: while (true) {
+ label_6:
+ while (true) {
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case BIT_OR:
;
@@ -400,17 +381,14 @@ final public void InclusiveOrExpression() throws ParseException {
}
jj_consume_token(BIT_OR);
ExclusiveOrExpression();
- {
- if (true) {
- throw new ParseException("operation not yet supported");
- }
- }
+ {if (true) throw new ParseException("operation not yet supported");}
}
}
final public void ExclusiveOrExpression() throws ParseException {
AndExpression();
- label_7: while (true) {
+ label_7:
+ while (true) {
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case XOR:
;
@@ -421,17 +399,14 @@ final public void ExclusiveOrExpression() throws ParseException {
}
jj_consume_token(XOR);
AndExpression();
- {
- if (true) {
- throw new ParseException("operation not yet supported");
- }
- }
+ {if (true) throw new ParseException("operation not yet supported");}
}
}
final public void AndExpression() throws ParseException {
EqualityExpression();
- label_8: while (true) {
+ label_8:
+ while (true) {
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case BIT_AND:
;
@@ -442,18 +417,15 @@ final public void AndExpression() throws ParseException {
}
jj_consume_token(BIT_AND);
EqualityExpression();
- {
- if (true) {
- throw new ParseException("operation not yet supported");
- }
- }
+ {if (true) throw new ParseException("operation not yet supported");}
}
}
final public void EqualityExpression() throws ParseException {
Token tok;
InstanceOfExpression();
- label_9: while (true) {
+ label_9:
+ while (true) {
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case EQ:
case NE:
@@ -487,11 +459,7 @@ final public void InstanceOfExpression() throws ParseException {
case INSTANCEOF:
jj_consume_token(INSTANCEOF);
Type();
- {
- if (true) {
- throw new ParseException("operation not yet supported");
- }
- }
+ {if (true) throw new ParseException("operation not yet supported");}
break;
default:
jj_la1[14] = jj_gen;
@@ -502,7 +470,8 @@ final public void InstanceOfExpression() throws ParseException {
final public void RelationalExpression() throws ParseException {
Token tok;
ShiftExpression();
- label_10: while (true) {
+ label_10:
+ while (true) {
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case GT:
case LT:
@@ -540,7 +509,8 @@ final public void RelationalExpression() throws ParseException {
final public void ShiftExpression() throws ParseException {
AdditiveExpression();
- label_11: while (true) {
+ label_11:
+ while (true) {
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case LSHIFT:
case RSIGNEDSHIFT:
@@ -567,18 +537,15 @@ final public void ShiftExpression() throws ParseException {
throw new ParseException();
}
AdditiveExpression();
- {
- if (true) {
- throw new ParseException("operation not yet supported");
- }
- }
+ {if (true) throw new ParseException("operation not yet supported");}
}
}
final public void AdditiveExpression() throws ParseException {
Token tok;
MultiplicativeExpression();
- label_12: while (true) {
+ label_12:
+ while (true) {
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case PLUS:
case MINUS:
@@ -609,7 +576,8 @@ final public void AdditiveExpression() throws ParseException {
final public void MultiplicativeExpression() throws ParseException {
Token tok;
UnaryExpression();
- label_13: while (true) {
+ label_13:
+ while (true) {
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case STAR:
case SLASH:
@@ -642,15 +610,16 @@ final public void MultiplicativeExpression() throws ParseException {
}
final public void UnaryExpression() throws ParseException {
+ Token tok;
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case PLUS:
case MINUS:
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case PLUS:
- jj_consume_token(PLUS);
+ tok = jj_consume_token(PLUS);
break;
case MINUS:
- jj_consume_token(MINUS);
+ tok = jj_consume_token(MINUS);
break;
default:
jj_la1[23] = jj_gen;
@@ -658,11 +627,7 @@ final public void UnaryExpression() throws ParseException {
throw new ParseException();
}
UnaryExpression();
- {
- if (true) {
- throw new ParseException("operation not yet supported");
- }
- }
+ push( LValue.operation(vm, tok, pop(), frameGetter) );
break;
case INCR:
PreIncrementExpression();
@@ -696,33 +661,26 @@ final public void UnaryExpression() throws ParseException {
final public void PreIncrementExpression() throws ParseException {
jj_consume_token(INCR);
PrimaryExpression();
- {
- if (true) {
- throw new ParseException("operation not yet supported");
- }
- }
+ {if (true) throw new ParseException("operation not yet supported");}
}
final public void PreDecrementExpression() throws ParseException {
jj_consume_token(DECR);
PrimaryExpression();
- {
- if (true) {
- throw new ParseException("operation not yet supported");
- }
- }
+ {if (true) throw new ParseException("operation not yet supported");}
}
final public void UnaryExpressionNotPlusMinus() throws ParseException {
+ Token tok;
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case BANG:
case TILDE:
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case TILDE:
- jj_consume_token(TILDE);
+ tok = jj_consume_token(TILDE);
break;
case BANG:
- jj_consume_token(BANG);
+ tok = jj_consume_token(BANG);
break;
default:
jj_la1[25] = jj_gen;
@@ -730,11 +688,7 @@ final public void UnaryExpressionNotPlusMinus() throws ParseException {
throw new ParseException();
}
UnaryExpression();
- {
- if (true) {
- throw new ParseException("operation not yet supported");
- }
- }
+ push( LValue.operation(vm, tok, pop(), frameGetter) );
break;
default:
jj_la1[26] = jj_gen;
@@ -765,10 +719,8 @@ final public void UnaryExpressionNotPlusMinus() throws ParseException {
}
}
- // This production is to determine lookahead only. The LOOKAHEAD
- // specifications
- // below are not used, but they are there just to indicate that we know
- // about
+// This production is to determine lookahead only. The LOOKAHEAD specifications
+// below are not used, but they are there just to indicate that we know about
// this.
final public void CastLookahead() throws ParseException {
if (jj_2_4(2)) {
@@ -841,11 +793,7 @@ final public void PostfixExpression() throws ParseException {
break;
case DECR:
jj_consume_token(DECR);
- {
- if (true) {
- throw new ParseException("operation not yet supported");
- }
- }
+ {if (true) throw new ParseException("operation not yet supported");}
break;
default:
jj_la1[30] = jj_gen;
@@ -863,7 +811,8 @@ final public void CastExpression() throws ParseException {
if (jj_2_6(2)) {
jj_consume_token(LPAREN);
PrimitiveType();
- label_14: while (true) {
+ label_14:
+ while (true) {
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case LBRACKET:
;
@@ -882,7 +831,8 @@ final public void CastExpression() throws ParseException {
case LPAREN:
jj_consume_token(LPAREN);
Name();
- label_15: while (true) {
+ label_15:
+ while (true) {
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case LBRACKET:
;
@@ -907,7 +857,8 @@ final public void CastExpression() throws ParseException {
final public void PrimaryExpression() throws ParseException {
PrimaryPrefix();
- label_16: while (true) {
+ label_16:
+ while (true) {
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case LPAREN:
case LBRACKET:
@@ -946,11 +897,7 @@ final public void PrimaryPrefix() throws ParseException {
jj_consume_token(SUPER);
jj_consume_token(DOT);
jj_consume_token(IDENTIFIER);
- {
- if (true) {
- throw new ParseException("operation not yet supported");
- }
- }
+ {if (true) throw new ParseException("operation not yet supported");}
break;
case LPAREN:
jj_consume_token(LPAREN);
@@ -968,7 +915,7 @@ final public void PrimaryPrefix() throws ParseException {
}
final public void PrimarySuffix() throws ParseException {
- List argList;
+ List argList;
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case LBRACKET:
jj_consume_token(LBRACKET);
@@ -1046,8 +993,8 @@ final public void NullLiteral() throws ParseException {
jj_consume_token(NULL);
}
- final public List Arguments() throws ParseException {
- List argList = new ArrayList();
+ final public List Arguments() throws ParseException {
+ List argList = new ArrayList();
jj_consume_token(LPAREN);
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case FALSE:
@@ -1075,18 +1022,15 @@ final public List Arguments() throws ParseException {
;
}
jj_consume_token(RPAREN);
- {
- if (true) {
- return argList;
- }
- }
+ {if (true) return argList;}
throw new Error("Missing return statement in function");
}
- final public void ArgumentList(List argList) throws ParseException {
+ final public void ArgumentList(List argList) throws ParseException {
Expression();
argList.add(pop().interiorGetValue());
- label_17: while (true) {
+ label_17:
+ while (true) {
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case COMMA:
;
@@ -1102,8 +1046,7 @@ final public void ArgumentList(List argList) throws ParseException {
}
final public void AllocationExpression() throws ParseException {
- List argList;
- String className;
+ List argList; String className;
if (jj_2_7(2)) {
jj_consume_token(NEW);
PrimitiveType();
@@ -1120,11 +1063,7 @@ final public void AllocationExpression() throws ParseException {
break;
case LBRACKET:
ArrayDimensions();
- {
- if (true) {
- throw new ParseException("operation not yet supported");
- }
- }
+ {if (true) throw new ParseException("operation not yet supported");}
break;
default:
jj_la1[42] = jj_gen;
@@ -1141,11 +1080,12 @@ final public void AllocationExpression() throws ParseException {
}
/*
- * The second LOOKAHEAD specification below is to parse to PrimarySuffix if
- * there is an expression between the "[...]".
+ * The second LOOKAHEAD specification below is to parse to PrimarySuffix
+ * if there is an expression between the "[...]".
*/
final public void ArrayDimensions() throws ParseException {
- label_18: while (true) {
+ label_18:
+ while (true) {
jj_consume_token(LBRACKET);
Expression();
jj_consume_token(RBRACKET);
@@ -1155,7 +1095,8 @@ final public void ArrayDimensions() throws ParseException {
break label_18;
}
}
- label_19: while (true) {
+ label_19:
+ while (true) {
if (jj_2_9(2)) {
;
} else {
@@ -1166,2552 +1107,1060 @@ final public void ArrayDimensions() throws ParseException {
}
}
- final private boolean jj_2_1(int xla) {
- jj_la = xla;
- jj_lastpos = jj_scanpos = token;
- boolean retval = !jj_3_1();
- jj_save(0, xla);
- return retval;
+ private boolean jj_2_1(int xla) {
+ jj_la = xla; jj_lastpos = jj_scanpos = token;
+ try { return !jj_3_1(); }
+ catch(LookaheadSuccess ls) { return true; }
+ finally { jj_save(0, xla); }
}
- final private boolean jj_2_2(int xla) {
- jj_la = xla;
- jj_lastpos = jj_scanpos = token;
- boolean retval = !jj_3_2();
- jj_save(1, xla);
- return retval;
+ private boolean jj_2_2(int xla) {
+ jj_la = xla; jj_lastpos = jj_scanpos = token;
+ try { return !jj_3_2(); }
+ catch(LookaheadSuccess ls) { return true; }
+ finally { jj_save(1, xla); }
}
- final private boolean jj_2_3(int xla) {
- jj_la = xla;
- jj_lastpos = jj_scanpos = token;
- boolean retval = !jj_3_3();
- jj_save(2, xla);
- return retval;
+ private boolean jj_2_3(int xla) {
+ jj_la = xla; jj_lastpos = jj_scanpos = token;
+ try { return !jj_3_3(); }
+ catch(LookaheadSuccess ls) { return true; }
+ finally { jj_save(2, xla); }
}
- final private boolean jj_2_4(int xla) {
- jj_la = xla;
- jj_lastpos = jj_scanpos = token;
- boolean retval = !jj_3_4();
- jj_save(3, xla);
- return retval;
+ private boolean jj_2_4(int xla) {
+ jj_la = xla; jj_lastpos = jj_scanpos = token;
+ try { return !jj_3_4(); }
+ catch(LookaheadSuccess ls) { return true; }
+ finally { jj_save(3, xla); }
}
- final private boolean jj_2_5(int xla) {
- jj_la = xla;
- jj_lastpos = jj_scanpos = token;
- boolean retval = !jj_3_5();
- jj_save(4, xla);
- return retval;
+ private boolean jj_2_5(int xla) {
+ jj_la = xla; jj_lastpos = jj_scanpos = token;
+ try { return !jj_3_5(); }
+ catch(LookaheadSuccess ls) { return true; }
+ finally { jj_save(4, xla); }
}
- final private boolean jj_2_6(int xla) {
- jj_la = xla;
- jj_lastpos = jj_scanpos = token;
- boolean retval = !jj_3_6();
- jj_save(5, xla);
- return retval;
+ private boolean jj_2_6(int xla) {
+ jj_la = xla; jj_lastpos = jj_scanpos = token;
+ try { return !jj_3_6(); }
+ catch(LookaheadSuccess ls) { return true; }
+ finally { jj_save(5, xla); }
}
- final private boolean jj_2_7(int xla) {
- jj_la = xla;
- jj_lastpos = jj_scanpos = token;
- boolean retval = !jj_3_7();
- jj_save(6, xla);
- return retval;
+ private boolean jj_2_7(int xla) {
+ jj_la = xla; jj_lastpos = jj_scanpos = token;
+ try { return !jj_3_7(); }
+ catch(LookaheadSuccess ls) { return true; }
+ finally { jj_save(6, xla); }
}
- final private boolean jj_2_8(int xla) {
- jj_la = xla;
- jj_lastpos = jj_scanpos = token;
- boolean retval = !jj_3_8();
- jj_save(7, xla);
- return retval;
+ private boolean jj_2_8(int xla) {
+ jj_la = xla; jj_lastpos = jj_scanpos = token;
+ try { return !jj_3_8(); }
+ catch(LookaheadSuccess ls) { return true; }
+ finally { jj_save(7, xla); }
}
- final private boolean jj_2_9(int xla) {
- jj_la = xla;
- jj_lastpos = jj_scanpos = token;
- boolean retval = !jj_3_9();
- jj_save(8, xla);
- return retval;
+ private boolean jj_2_9(int xla) {
+ jj_la = xla; jj_lastpos = jj_scanpos = token;
+ try { return !jj_3_9(); }
+ catch(LookaheadSuccess ls) { return true; }
+ finally { jj_save(8, xla); }
}
- final private boolean jj_3R_154() {
- if (jj_scan_token(INCR)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_94() {
+ if (jj_scan_token(DECR)) return true;
+ if (jj_3R_20()) return true;
return false;
}
- final private boolean jj_3R_151() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_154()) {
- jj_scanpos = xsp;
- if (jj_3R_155()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_86() {
+ if (jj_3R_24()) return true;
return false;
}
- final private boolean jj_3R_148() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3_6()) {
- jj_scanpos = xsp;
- if (jj_3R_150()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_93() {
+ if (jj_scan_token(INCR)) return true;
+ if (jj_3R_20()) return true;
return false;
}
- final private boolean jj_3_6() {
- if (jj_scan_token(LPAREN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_23()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_152()) {
- jj_scanpos = xsp;
- break;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- }
- if (jj_scan_token(RPAREN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_115()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_91() {
+ if (jj_3R_95()) return true;
return false;
}
- final private boolean jj_3R_25() {
+ private boolean jj_3R_23() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_50()) {
+ if (jj_scan_token(10)) {
jj_scanpos = xsp;
- if (jj_3R_51()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ if (jj_scan_token(15)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(12)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(45)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(34)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(36)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(27)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(21)) return true;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
return false;
}
- final private boolean jj_3R_50() {
- if (jj_3R_67()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_90() {
+ if (jj_3R_94()) return true;
return false;
}
- final private boolean jj_3_5() {
- if (jj_scan_token(LPAREN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_24()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_scan_token(LBRACKET)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_89() {
+ if (jj_3R_93()) return true;
return false;
}
- final private boolean jj_3R_149() {
- if (jj_3R_20()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_85() {
+ if (jj_3R_23()) return true;
+ return false;
+ }
+
+ private boolean jj_3R_60() {
+ if (jj_3R_58()) return true;
+ return false;
+ }
+
+ private boolean jj_3R_88() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_151()) {
- jj_scanpos = xsp;
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ if (jj_scan_token(94)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(95)) return true;
+ }
+ if (jj_3R_83()) return true;
return false;
}
- final private boolean jj_3R_41() {
- if (jj_scan_token(LPAREN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_24()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_scan_token(RPAREN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_83() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_59()) {
+ if (jj_3R_88()) {
jj_scanpos = xsp;
- if (jj_3R_60()) {
+ if (jj_3R_89()) {
jj_scanpos = xsp;
- if (jj_3R_61()) {
+ if (jj_3R_90()) {
jj_scanpos = xsp;
- if (jj_3R_62()) {
- jj_scanpos = xsp;
- if (jj_3R_63()) {
+ if (jj_3R_91()) return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_82() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_85()) {
jj_scanpos = xsp;
- if (jj_3R_64()) {
+ if (jj_3R_86()) return true;
+ }
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_87()) { jj_scanpos = xsp; break; }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_59() {
+ if (jj_3R_55()) return true;
+ return false;
+ }
+
+ private boolean jj_3R_96() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_scan_token(96)) {
jj_scanpos = xsp;
- if (jj_3R_65()) {
+ if (jj_scan_token(97)) {
jj_scanpos = xsp;
- if (jj_3R_66()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ if (jj_scan_token(101)) return true;
+ }
+ }
+ if (jj_3R_83()) return true;
return false;
}
- final private boolean jj_3R_40() {
- if (jj_scan_token(LPAREN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_24()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_scan_token(LBRACKET)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_scan_token(RBRACKET)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_80() {
+ if (jj_3R_83()) return true;
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_96()) { jj_scanpos = xsp; break; }
+ }
return false;
}
- final private boolean jj_3R_123() {
- if (jj_scan_token(LBRACKET)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_scan_token(RBRACKET)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_92() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_scan_token(94)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(95)) return true;
+ }
+ if (jj_3R_80()) return true;
return false;
}
- final private boolean jj_3_1() {
- if (jj_scan_token(DOT)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_scan_token(IDENTIFIER)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3_8() {
+ if (jj_scan_token(LBRACKET)) return true;
+ if (jj_3R_25()) return true;
+ if (jj_scan_token(RBRACKET)) return true;
return false;
}
- final private boolean jj_3_4() {
- if (jj_scan_token(LPAREN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_23()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_58() {
+ Token xsp;
+ if (jj_3_8()) return true;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3_8()) { jj_scanpos = xsp; break; }
+ }
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3_9()) { jj_scanpos = xsp; break; }
+ }
return false;
}
- final private boolean jj_3R_22() {
+ private boolean jj_3R_84() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3_4()) {
+ if (jj_scan_token(102)) {
jj_scanpos = xsp;
- if (jj_3R_40()) {
+ if (jj_scan_token(103)) {
jj_scanpos = xsp;
- if (jj_3R_41()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ if (jj_scan_token(104)) return true;
+ }
+ }
+ if (jj_3R_78()) return true;
return false;
}
- final private boolean jj_3_3() {
- if (jj_3R_22()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_78() {
+ if (jj_3R_80()) return true;
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_92()) { jj_scanpos = xsp; break; }
+ }
return false;
}
- final private boolean jj_3R_24() {
- if (jj_scan_token(IDENTIFIER)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_54() {
+ if (jj_scan_token(NEW)) return true;
+ if (jj_3R_24()) return true;
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_59()) {
+ jj_scanpos = xsp;
+ if (jj_3R_60()) return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3R_76() {
+ if (jj_3R_78()) return true;
Token xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3_1()) {
- jj_scanpos = xsp;
- break;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ if (jj_3R_84()) { jj_scanpos = xsp; break; }
}
return false;
}
- final private boolean jj_3R_147() {
- if (jj_scan_token(BANG)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_81() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_scan_token(81)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(80)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(87)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(88)) return true;
+ }
+ }
+ }
+ if (jj_3R_76()) return true;
return false;
}
- final private boolean jj_3R_142() {
- if (jj_3R_149()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_43() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3_7()) {
+ jj_scanpos = xsp;
+ if (jj_3R_54()) return true;
+ }
return false;
}
- final private boolean jj_3R_122() {
- if (jj_3R_24()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3_7() {
+ if (jj_scan_token(NEW)) return true;
+ if (jj_3R_23()) return true;
+ if (jj_3R_58()) return true;
return false;
}
- final private boolean jj_3R_49() {
- if (jj_scan_token(DOUBLE)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_67() {
+ if (jj_scan_token(COMMA)) return true;
+ if (jj_3R_25()) return true;
return false;
}
- final private boolean jj_3R_141() {
- if (jj_3R_148()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_64() {
+ if (jj_3R_25()) return true;
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_67()) { jj_scanpos = xsp; break; }
+ }
return false;
}
- final private boolean jj_3R_48() {
- if (jj_scan_token(FLOAT)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_61() {
+ if (jj_3R_64()) return true;
return false;
}
- final private boolean jj_3R_146() {
- if (jj_scan_token(TILDE)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_79() {
+ if (jj_scan_token(INSTANCEOF)) return true;
+ if (jj_3R_82()) return true;
return false;
}
- final private boolean jj_3R_47() {
- if (jj_scan_token(LONG)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_74() {
+ if (jj_3R_76()) return true;
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_81()) { jj_scanpos = xsp; break; }
+ }
return false;
}
- final private boolean jj_3R_140() {
+ private boolean jj_3R_55() {
+ if (jj_scan_token(LPAREN)) return true;
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_146()) {
- jj_scanpos = xsp;
- if (jj_3R_147()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_115()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ if (jj_3R_61()) jj_scanpos = xsp;
+ if (jj_scan_token(RPAREN)) return true;
return false;
}
- final private boolean jj_3R_136() {
+ private boolean jj_3R_72() {
+ if (jj_3R_74()) return true;
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_140()) {
- jj_scanpos = xsp;
- if (jj_3R_141()) {
- jj_scanpos = xsp;
- if (jj_3R_142()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ if (jj_3R_79()) jj_scanpos = xsp;
return false;
}
- final private boolean jj_3R_46() {
- if (jj_scan_token(INT)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_77() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_scan_token(86)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(89)) return true;
+ }
+ if (jj_3R_72()) return true;
return false;
}
- final private boolean jj_3R_145() {
- if (jj_scan_token(REM)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_75() {
+ if (jj_scan_token(BIT_AND)) return true;
+ if (jj_3R_70()) return true;
return false;
}
- final private boolean jj_3R_45() {
- if (jj_scan_token(SHORT)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_70() {
+ if (jj_3R_72()) return true;
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_77()) { jj_scanpos = xsp; break; }
+ }
return false;
}
- final private boolean jj_3R_44() {
- if (jj_scan_token(BYTE)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_135() {
- if (jj_scan_token(DECR)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_20()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_43() {
- if (jj_scan_token(CHAR)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_23() {
+ private boolean jj_3R_57() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_42()) {
- jj_scanpos = xsp;
- if (jj_3R_43()) {
+ if (jj_scan_token(54)) {
jj_scanpos = xsp;
- if (jj_3R_44()) {
- jj_scanpos = xsp;
- if (jj_3R_45()) {
- jj_scanpos = xsp;
- if (jj_3R_46()) {
- jj_scanpos = xsp;
- if (jj_3R_47()) {
- jj_scanpos = xsp;
- if (jj_3R_48()) {
- jj_scanpos = xsp;
- if (jj_3R_49()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_42() {
- if (jj_scan_token(BOOLEAN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3_9() {
- if (jj_scan_token(LBRACKET)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_scan_token(RBRACKET)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_121() {
- if (jj_3R_23()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ if (jj_scan_token(24)) return true;
+ }
return false;
}
- final private boolean jj_3R_144() {
- if (jj_scan_token(SLASH)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_53() {
+ if (jj_scan_token(39)) return true;
return false;
}
- final private boolean jj_3R_134() {
- if (jj_scan_token(INCR)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_20()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_39() {
+ if (jj_3R_42()) return true;
return false;
}
- final private boolean jj_3R_114() {
+ private boolean jj_3R_68() {
+ if (jj_3R_70()) return true;
Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_121()) {
- jj_scanpos = xsp;
- if (jj_3R_122()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
while (true) {
xsp = jj_scanpos;
- if (jj_3R_123()) {
- jj_scanpos = xsp;
- break;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ if (jj_3R_75()) { jj_scanpos = xsp; break; }
}
return false;
}
- final private boolean jj_3R_120() {
- if (jj_scan_token(GE)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_133() {
- if (jj_scan_token(MINUS)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_127() {
- if (jj_3R_136()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_126() {
- if (jj_3R_135()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_139() {
- if (jj_scan_token(MINUS)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_125() {
- if (jj_3R_134()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_132() {
- if (jj_scan_token(PLUS)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_143() {
- if (jj_scan_token(STAR)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_124() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_132()) {
- jj_scanpos = xsp;
- if (jj_3R_133()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_115()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_115() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_124()) {
- jj_scanpos = xsp;
- if (jj_3R_125()) {
- jj_scanpos = xsp;
- if (jj_3R_126()) {
- jj_scanpos = xsp;
- if (jj_3R_127()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_137() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_143()) {
- jj_scanpos = xsp;
- if (jj_3R_144()) {
- jj_scanpos = xsp;
- if (jj_3R_145()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_115()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_73() {
+ if (jj_scan_token(XOR)) return true;
+ if (jj_3R_68()) return true;
return false;
}
- final private boolean jj_3R_131() {
- if (jj_scan_token(RUNSIGNEDSHIFT)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_52() {
+ if (jj_3R_57()) return true;
return false;
}
- final private boolean jj_3R_119() {
- if (jj_scan_token(LE)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_51() {
+ if (jj_scan_token(STRING_LITERAL)) return true;
return false;
}
- final private boolean jj_3R_138() {
- if (jj_scan_token(PLUS)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_50() {
+ if (jj_scan_token(CHARACTER_LITERAL)) return true;
return false;
}
- final private boolean jj_3R_112() {
- if (jj_3R_115()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_65() {
+ if (jj_3R_68()) return true;
Token xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_137()) {
- jj_scanpos = xsp;
- break;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ if (jj_3R_73()) { jj_scanpos = xsp; break; }
}
return false;
}
- final private boolean jj_3R_88() {
- if (jj_3R_86()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_71() {
+ if (jj_scan_token(BIT_OR)) return true;
+ if (jj_3R_65()) return true;
return false;
}
- final private boolean jj_3R_130() {
- if (jj_scan_token(RSIGNEDSHIFT)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_49() {
+ if (jj_scan_token(FLOATING_POINT_LITERAL)) return true;
return false;
}
- final private boolean jj_3R_128() {
+ private boolean jj_3R_42() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_138()) {
+ if (jj_3R_48()) {
jj_scanpos = xsp;
- if (jj_3R_139()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_112()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_87() {
- if (jj_3R_82()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_118() {
- if (jj_scan_token(GT)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_129() {
- if (jj_scan_token(LSHIFT)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_116() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_129()) {
+ if (jj_3R_49()) {
jj_scanpos = xsp;
- if (jj_3R_130()) {
+ if (jj_3R_50()) {
jj_scanpos = xsp;
- if (jj_3R_131()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_108()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_108() {
- if (jj_3R_112()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_128()) {
- jj_scanpos = xsp;
- break;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ if (jj_3R_51()) {
+ jj_scanpos = xsp;
+ if (jj_3R_52()) {
+ jj_scanpos = xsp;
+ if (jj_3R_53()) return true;
+ }
+ }
}
- return false;
- }
-
- final private boolean jj_3_8() {
- if (jj_scan_token(LBRACKET)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_25()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_scan_token(RBRACKET)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_86() {
- Token xsp;
- if (jj_3_8()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- while (true) {
- xsp = jj_scanpos;
- if (jj_3_8()) {
- jj_scanpos = xsp;
- break;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
}
- while (true) {
- xsp = jj_scanpos;
- if (jj_3_9()) {
- jj_scanpos = xsp;
- break;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
}
return false;
}
- final private boolean jj_3R_117() {
- if (jj_scan_token(LT)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_48() {
+ if (jj_scan_token(INTEGER_LITERAL)) return true;
return false;
}
- final private boolean jj_3R_106() {
- if (jj_3R_108()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_62() {
+ if (jj_3R_65()) return true;
Token xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_116()) {
- jj_scanpos = xsp;
- break;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ if (jj_3R_71()) { jj_scanpos = xsp; break; }
}
return false;
}
- final private boolean jj_3R_113() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_117()) {
- jj_scanpos = xsp;
- if (jj_3R_118()) {
- jj_scanpos = xsp;
- if (jj_3R_119()) {
- jj_scanpos = xsp;
- if (jj_3R_120()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_106()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_69() {
+ if (jj_scan_token(SC_AND)) return true;
+ if (jj_3R_62()) return true;
return false;
}
- final private boolean jj_3R_111() {
- if (jj_scan_token(NE)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_46() {
+ if (jj_3R_55()) return true;
return false;
}
- final private boolean jj_3R_109() {
- if (jj_scan_token(INSTANCEOF)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_114()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_45() {
+ if (jj_scan_token(DOT)) return true;
+ if (jj_scan_token(IDENTIFIER)) return true;
return false;
}
- final private boolean jj_3R_104() {
- if (jj_3R_106()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_56() {
+ if (jj_3R_62()) return true;
Token xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_113()) {
- jj_scanpos = xsp;
- break;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ if (jj_3R_69()) { jj_scanpos = xsp; break; }
}
return false;
}
- final private boolean jj_3R_81() {
- if (jj_scan_token(NEW)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_24()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_87()) {
- jj_scanpos = xsp;
- if (jj_3R_88()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_66() {
+ if (jj_scan_token(SC_OR)) return true;
+ if (jj_3R_56()) return true;
return false;
}
- final private boolean jj_3_7() {
- if (jj_scan_token(NEW)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_23()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_86()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_44() {
+ if (jj_scan_token(LBRACKET)) return true;
+ if (jj_3R_25()) return true;
+ if (jj_scan_token(RBRACKET)) return true;
return false;
}
- final private boolean jj_3R_70() {
+ private boolean jj_3R_38() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3_7()) {
+ if (jj_3R_44()) {
jj_scanpos = xsp;
- if (jj_3R_81()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_97() {
- if (jj_scan_token(COMMA)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_25()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_39() {
- if (jj_scan_token(ORASSIGN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_110() {
- if (jj_scan_token(EQ)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_102() {
- if (jj_3R_104()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_109()) {
- jj_scanpos = xsp;
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_107() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_110()) {
+ if (jj_3R_45()) {
jj_scanpos = xsp;
- if (jj_3R_111()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_102()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_94() {
- if (jj_3R_25()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_97()) {
- jj_scanpos = xsp;
- break;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ if (jj_3R_46()) return true;
}
- return false;
- }
-
- final private boolean jj_3R_89() {
- if (jj_3R_94()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_38() {
- if (jj_scan_token(XORASSIGN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_82() {
- if (jj_scan_token(LPAREN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_89()) {
- jj_scanpos = xsp;
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_scan_token(RPAREN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_105() {
- if (jj_scan_token(BIT_AND)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_100()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_100() {
- if (jj_3R_102()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_107()) {
- jj_scanpos = xsp;
- break;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
}
return false;
}
- final private boolean jj_3R_37() {
- if (jj_scan_token(ANDASSIGN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_37() {
+ if (jj_3R_43()) return true;
return false;
}
- final private boolean jj_3R_85() {
- if (jj_scan_token(NULL)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_27() {
+ if (jj_3R_38()) return true;
return false;
}
- final private boolean jj_3R_103() {
- if (jj_scan_token(XOR)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_98()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_36() {
+ if (jj_scan_token(LPAREN)) return true;
+ if (jj_3R_25()) return true;
+ if (jj_scan_token(RPAREN)) return true;
return false;
}
- final private boolean jj_3R_98() {
- if (jj_3R_100()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_47() {
+ if (jj_3R_56()) return true;
Token xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_105()) {
- jj_scanpos = xsp;
- break;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ if (jj_3R_66()) { jj_scanpos = xsp; break; }
}
return false;
}
- final private boolean jj_3R_92() {
- if (jj_scan_token(FALSE)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_36() {
- if (jj_scan_token(RUNSIGNEDSHIFTASSIGN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_104() {
+ if (jj_scan_token(LBRACKET)) return true;
+ if (jj_scan_token(RBRACKET)) return true;
return false;
}
- final private boolean jj_3R_91() {
- if (jj_scan_token(TRUE)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_35() {
+ if (jj_scan_token(SUPER)) return true;
+ if (jj_scan_token(DOT)) return true;
+ if (jj_scan_token(IDENTIFIER)) return true;
return false;
}
- final private boolean jj_3R_84() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_91()) {
- jj_scanpos = xsp;
- if (jj_3R_92()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_34() {
+ if (jj_scan_token(THIS)) return true;
return false;
}
- final private boolean jj_3R_101() {
- if (jj_scan_token(BIT_OR)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_95()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_63() {
+ if (jj_scan_token(HOOK)) return true;
+ if (jj_3R_25()) return true;
+ if (jj_scan_token(COLON)) return true;
+ if (jj_3R_41()) return true;
return false;
}
- final private boolean jj_3R_95() {
- if (jj_3R_98()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_103()) {
- jj_scanpos = xsp;
- break;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- }
+ private boolean jj_3R_33() {
+ if (jj_3R_24()) return true;
return false;
}
- final private boolean jj_3R_35() {
- if (jj_scan_token(RSIGNEDSHIFTASSIGN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_105() {
+ if (jj_scan_token(LBRACKET)) return true;
+ if (jj_scan_token(RBRACKET)) return true;
return false;
}
- final private boolean jj_3R_80() {
- if (jj_3R_85()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_32() {
+ if (jj_3R_42()) return true;
return false;
}
- final private boolean jj_3R_66() {
- if (jj_3R_69()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_79() {
- if (jj_3R_84()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_78() {
- if (jj_scan_token(STRING_LITERAL)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_99() {
- if (jj_scan_token(SC_AND)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_90()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_90() {
- if (jj_3R_95()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_101()) {
- jj_scanpos = xsp;
- break;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- }
- return false;
- }
-
- final private boolean jj_3R_34() {
- if (jj_scan_token(LSHIFTASSIGN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_65() {
- if (jj_scan_token(NEW)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_77() {
- if (jj_scan_token(CHARACTER_LITERAL)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_76() {
- if (jj_scan_token(FLOATING_POINT_LITERAL)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_33() {
- if (jj_scan_token(MINUSASSIGN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_69() {
+ private boolean jj_3R_26() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_75()) {
+ if (jj_3R_32()) {
jj_scanpos = xsp;
- if (jj_3R_76()) {
+ if (jj_3R_33()) {
jj_scanpos = xsp;
- if (jj_3R_77()) {
+ if (jj_3R_34()) {
jj_scanpos = xsp;
- if (jj_3R_78()) {
+ if (jj_3R_35()) {
jj_scanpos = xsp;
- if (jj_3R_79()) {
+ if (jj_3R_36()) {
jj_scanpos = xsp;
- if (jj_3R_80()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_75() {
- if (jj_scan_token(INTEGER_LITERAL)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_96() {
- if (jj_scan_token(SC_OR)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_83()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_83() {
- if (jj_3R_90()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_99()) {
- jj_scanpos = xsp;
- break;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ if (jj_3R_37()) return true;
+ }
+ }
+ }
}
- return false;
- }
-
- final private boolean jj_3R_64() {
- if (jj_scan_token(SUPER)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_32() {
- if (jj_scan_token(PLUSASSIGN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_73() {
- if (jj_3R_82()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_72() {
- if (jj_scan_token(DOT)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_scan_token(IDENTIFIER)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_74() {
- if (jj_3R_83()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_96()) {
- jj_scanpos = xsp;
- break;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
}
return false;
}
- final private boolean jj_3R_63() {
- if (jj_scan_token(THIS)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_31() {
- if (jj_scan_token(REMASSIGN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_20() {
+ if (jj_3R_26()) return true;
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_27()) { jj_scanpos = xsp; break; }
+ }
return false;
}
- final private boolean jj_3R_58() {
+ private boolean jj_3R_41() {
+ if (jj_3R_47()) return true;
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_71()) {
- jj_scanpos = xsp;
- if (jj_3R_72()) {
- jj_scanpos = xsp;
- if (jj_3R_73()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ if (jj_3R_63()) jj_scanpos = xsp;
return false;
}
- final private boolean jj_3R_71() {
- if (jj_scan_token(LBRACKET)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_25()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_scan_token(RBRACKET)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_106() {
+ if (jj_scan_token(DECR)) return true;
return false;
}
- final private boolean jj_3R_93() {
- if (jj_scan_token(HOOK)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_25()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_scan_token(COLON)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_68()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_102() {
+ if (jj_scan_token(LPAREN)) return true;
+ if (jj_3R_24()) return true;
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_105()) { jj_scanpos = xsp; break; }
+ }
+ if (jj_scan_token(RPAREN)) return true;
+ if (jj_3R_95()) return true;
return false;
}
- final private boolean jj_3R_57() {
- if (jj_3R_70()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_21() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_scan_token(79)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(107)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(108)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(112)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(105)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(106)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(113)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(114)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(115)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(109)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(111)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(110)) return true;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
return false;
}
- final private boolean jj_3R_30() {
- if (jj_scan_token(SLASHASSIGN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_103() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_scan_token(92)) {
+ jj_scanpos = xsp;
+ if (jj_3R_106()) return true;
+ }
return false;
}
- final private boolean jj_3R_27() {
- if (jj_3R_58()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_100() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3_6()) {
+ jj_scanpos = xsp;
+ if (jj_3R_102()) return true;
+ }
return false;
}
- final private boolean jj_3R_56() {
- if (jj_scan_token(LPAREN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_25()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_scan_token(RPAREN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3_6() {
+ if (jj_scan_token(LPAREN)) return true;
+ if (jj_3R_23()) return true;
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_104()) { jj_scanpos = xsp; break; }
+ }
+ if (jj_scan_token(RPAREN)) return true;
+ if (jj_3R_83()) return true;
return false;
}
- final private boolean jj_3R_152() {
- if (jj_scan_token(LBRACKET)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_scan_token(RBRACKET)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3_2() {
+ if (jj_3R_20()) return true;
+ if (jj_3R_21()) return true;
return false;
}
- final private boolean jj_3R_55() {
- if (jj_scan_token(SUPER)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_scan_token(DOT)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_scan_token(IDENTIFIER)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_40() {
+ if (jj_3R_20()) return true;
+ if (jj_3R_21()) return true;
+ if (jj_3R_25()) return true;
return false;
}
- final private boolean jj_3R_29() {
- if (jj_scan_token(STARASSIGN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3_5() {
+ if (jj_scan_token(LPAREN)) return true;
+ if (jj_3R_24()) return true;
+ if (jj_scan_token(LBRACKET)) return true;
return false;
}
- final private boolean jj_3R_68() {
- if (jj_3R_74()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_101() {
+ if (jj_3R_20()) return true;
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_93()) {
- jj_scanpos = xsp;
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_54() {
- if (jj_scan_token(THIS)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ if (jj_3R_103()) jj_scanpos = xsp;
return false;
}
- final private boolean jj_3R_62() {
- if (jj_scan_token(IDENTIFIER)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_31() {
+ if (jj_3R_41()) return true;
return false;
}
- final private boolean jj_3R_53() {
- if (jj_3R_24()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_30() {
+ if (jj_3R_40()) return true;
return false;
}
- final private boolean jj_3R_153() {
- if (jj_scan_token(LBRACKET)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_scan_token(RBRACKET)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_25() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_30()) {
+ jj_scanpos = xsp;
+ if (jj_3R_31()) return true;
+ }
return false;
}
- final private boolean jj_3R_26() {
+ private boolean jj_3R_29() {
+ if (jj_scan_token(LPAREN)) return true;
+ if (jj_3R_24()) return true;
+ if (jj_scan_token(RPAREN)) return true;
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_52()) {
+ if (jj_scan_token(83)) {
jj_scanpos = xsp;
- if (jj_3R_53()) {
+ if (jj_scan_token(82)) {
jj_scanpos = xsp;
- if (jj_3R_54()) {
+ if (jj_scan_token(70)) {
jj_scanpos = xsp;
- if (jj_3R_55()) {
+ if (jj_scan_token(67)) {
jj_scanpos = xsp;
- if (jj_3R_56()) {
+ if (jj_scan_token(50)) {
jj_scanpos = xsp;
- if (jj_3R_57()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ if (jj_scan_token(47)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(38)) {
+ jj_scanpos = xsp;
+ if (jj_3R_39()) return true;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
return false;
}
- final private boolean jj_3R_52() {
- if (jj_3R_69()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_28() {
+ if (jj_scan_token(LPAREN)) return true;
+ if (jj_3R_24()) return true;
+ if (jj_scan_token(LBRACKET)) return true;
+ if (jj_scan_token(RBRACKET)) return true;
+ return false;
+ }
+
+ private boolean jj_3_4() {
+ if (jj_scan_token(LPAREN)) return true;
+ if (jj_3R_23()) return true;
return false;
}
- final private boolean jj_3R_21() {
+ private boolean jj_3R_22() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3R_28()) {
- jj_scanpos = xsp;
- if (jj_3R_29()) {
- jj_scanpos = xsp;
- if (jj_3R_30()) {
- jj_scanpos = xsp;
- if (jj_3R_31()) {
- jj_scanpos = xsp;
- if (jj_3R_32()) {
- jj_scanpos = xsp;
- if (jj_3R_33()) {
- jj_scanpos = xsp;
- if (jj_3R_34()) {
- jj_scanpos = xsp;
- if (jj_3R_35()) {
- jj_scanpos = xsp;
- if (jj_3R_36()) {
- jj_scanpos = xsp;
- if (jj_3R_37()) {
+ if (jj_3_4()) {
jj_scanpos = xsp;
- if (jj_3R_38()) {
+ if (jj_3R_28()) {
jj_scanpos = xsp;
- if (jj_3R_39()) {
- return true;
- }
- if (jj_la == 0
- && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0
- && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0
- && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- return false;
- }
-
- final private boolean jj_3R_28() {
- if (jj_scan_token(ASSIGN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ if (jj_3R_29()) return true;
+ }
+ }
return false;
}
- final private boolean jj_3R_61() {
- if (jj_scan_token(LPAREN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3_3() {
+ if (jj_3R_22()) return true;
return false;
}
- final private boolean jj_3_2() {
- if (jj_3R_20()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_21()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_99() {
+ if (jj_3R_101()) return true;
return false;
}
- final private boolean jj_3R_20() {
- if (jj_3R_26()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_27()) {
- jj_scanpos = xsp;
- break;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- }
+ private boolean jj_3R_87() {
+ if (jj_scan_token(LBRACKET)) return true;
+ if (jj_scan_token(RBRACKET)) return true;
return false;
}
- final private boolean jj_3R_60() {
- if (jj_scan_token(BANG)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_98() {
+ if (jj_3R_100()) return true;
return false;
}
- final private boolean jj_3R_155() {
- if (jj_scan_token(DECR)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3_1() {
+ if (jj_scan_token(DOT)) return true;
+ if (jj_scan_token(IDENTIFIER)) return true;
return false;
}
- final private boolean jj_3R_67() {
- if (jj_3R_20()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_21()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_25()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3_9() {
+ if (jj_scan_token(LBRACKET)) return true;
+ if (jj_scan_token(RBRACKET)) return true;
return false;
}
- final private boolean jj_3R_150() {
- if (jj_scan_token(LPAREN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_24()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_97() {
Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_153()) {
- jj_scanpos = xsp;
- break;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- }
- if (jj_scan_token(RPAREN)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
- if (jj_3R_136()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ xsp = jj_scanpos;
+ if (jj_scan_token(83)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(82)) return true;
+ }
+ if (jj_3R_83()) return true;
return false;
}
- final private boolean jj_3R_59() {
- if (jj_scan_token(TILDE)) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_95() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_97()) {
+ jj_scanpos = xsp;
+ if (jj_3R_98()) {
+ jj_scanpos = xsp;
+ if (jj_3R_99()) return true;
+ }
+ }
return false;
}
- final private boolean jj_3R_51() {
- if (jj_3R_68()) {
- return true;
- }
- if (jj_la == 0 && jj_scanpos == jj_lastpos) {
- return false;
- }
+ private boolean jj_3R_24() {
+ if (jj_scan_token(IDENTIFIER)) return true;
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3_1()) { jj_scanpos = xsp; break; }
+ }
return false;
}
+ /** Generated Token Manager. */
public ExpressionParserTokenManager token_source;
- ASCII_UCodeESC_CharStream jj_input_stream;
- public Token token, jj_nt;
+ JavaCharStream jj_input_stream;
+ /** Current token. */
+ public Token token;
+ /** Next token. */
+ public Token jj_nt;
private int jj_ntk;
private Token jj_scanpos, jj_lastpos;
private int jj_la;
- public boolean lookingAhead = false;
private int jj_gen;
final private int[] jj_la1 = new int[44];
- final private int[] jj_la1_0 = { 0x8209400, 0x0, 0x8209400, 0x0, 0x1000000,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x1000000, 0x0, 0x0, 0x1000000, 0x1000000,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1000000, 0x0, 0x1000000,
- 0x1000000, 0x1000000, 0x0, 0x0, 0x0, };
- final private int[] jj_la1_1 = { 0x2014, 0x0, 0x2014, 0x0, 0x884480c0, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x884480c0, 0x0, 0x0, 0x884480c0, 0x884480c0, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x884480c0, 0x0, 0x88400080, 0x400000,
- 0x884480c0, 0x0, 0x0, 0x40, };
- final private int[] jj_la1_2 = { 0x8, 0x400, 0x0, 0x2000, 0xf00c004e,
- 0x8000, 0x100000, 0x4000000, 0x8000000, 0x0, 0x0, 0x0, 0x2400000,
- 0x2400000, 0x0, 0x1830000, 0x1830000, 0x0, 0x0, 0xc0000000,
- 0xc0000000, 0x0, 0x0, 0xc0000000, 0xf00c004e, 0xc0000, 0xc0000, 0x4e,
- 0xc004e, 0x40, 0x30000000, 0x30000000, 0x400, 0x400, 0x40, 0x4440,
- 0x4e, 0x4440, 0x6, 0x0, 0xf00c004e, 0x2000, 0x440, 0x0, };
- final private int[] jj_la1_3 = { 0x0, 0x0, 0x0, 0x0, 0x0, 0xffe00, 0x0, 0x0,
- 0x0, 0x8, 0x10, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c0, 0x1c0, 0x0, 0x0,
- 0x23, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, };
- final private JJExpressionParserCalls[] jj_2_rtns = new JJExpressionParserCalls[9];
+ static private int[] jj_la1_0;
+ static private int[] jj_la1_1;
+ static private int[] jj_la1_2;
+ static private int[] jj_la1_3;
+ static {
+ jj_la1_init_0();
+ jj_la1_init_1();
+ jj_la1_init_2();
+ jj_la1_init_3();
+ }
+ private static void jj_la1_init_0() {
+ jj_la1_0 = new int[] {0x8209400,0x0,0x8209400,0x0,0x1000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000000,0x0,0x0,0x1000000,0x1000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000000,0x0,0x1000000,0x1000000,0x1000000,0x0,0x0,0x0,};
+ }
+ private static void jj_la1_init_1() {
+ jj_la1_1 = new int[] {0x2014,0x0,0x2014,0x0,0x884480c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x884480c0,0x0,0x0,0x884480c0,0x884480c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x884480c0,0x0,0x88400080,0x400000,0x884480c0,0x0,0x0,0x40,};
+ }
+ private static void jj_la1_init_2() {
+ jj_la1_2 = new int[] {0x8,0x400,0x0,0x2000,0xf00c004e,0x8000,0x100000,0x4000000,0x8000000,0x0,0x0,0x0,0x2400000,0x2400000,0x0,0x1830000,0x1830000,0x0,0x0,0xc0000000,0xc0000000,0x0,0x0,0xc0000000,0xf00c004e,0xc0000,0xc0000,0x4e,0xc004e,0x40,0x30000000,0x30000000,0x400,0x400,0x40,0x4440,0x4e,0x4440,0x6,0x0,0xf00c004e,0x2000,0x440,0x0,};
+ }
+ private static void jj_la1_init_3() {
+ jj_la1_3 = new int[] {0x0,0x0,0x0,0x0,0x0,0xffe00,0x0,0x0,0x0,0x8,0x10,0x4,0x0,0x0,0x0,0x0,0x0,0x1c0,0x1c0,0x0,0x0,0x23,0x23,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
+ }
+ final private JJCalls[] jj_2_rtns = new JJCalls[9];
private boolean jj_rescan = false;
private int jj_gc = 0;
+ /** Constructor with InputStream. */
public ExpressionParser(java.io.InputStream stream) {
- jj_input_stream = new ASCII_UCodeESC_CharStream(stream, 1, 1);
+ this(stream, null);
+ }
+ /** Constructor with InputStream and supplied encoding */
+ public ExpressionParser(java.io.InputStream stream, String encoding) {
+ try { jj_input_stream = new JavaCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
token_source = new ExpressionParserTokenManager(jj_input_stream);
token = new Token();
jj_ntk = -1;
jj_gen = 0;
- for (int i = 0; i < 44; i++) {
- jj_la1[i] = -1;
- }
- for (int i = 0; i < jj_2_rtns.length; i++) {
- jj_2_rtns[i] = new JJExpressionParserCalls();
- }
+ for (int i = 0; i < 44; i++) jj_la1[i] = -1;
+ for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
}
+ /** Reinitialise. */
public void ReInit(java.io.InputStream stream) {
+ ReInit(stream, null);
+ }
+ /** Reinitialise. */
+ public void ReInit(java.io.InputStream stream, String encoding) {
+ try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
+ token_source.ReInit(jj_input_stream);
+ token = new Token();
+ jj_ntk = -1;
+ jj_gen = 0;
+ for (int i = 0; i < 44; i++) jj_la1[i] = -1;
+ for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
+ }
+
+ /** Constructor. */
+ public ExpressionParser(java.io.Reader stream) {
+ jj_input_stream = new JavaCharStream(stream, 1, 1);
+ token_source = new ExpressionParserTokenManager(jj_input_stream);
+ token = new Token();
+ jj_ntk = -1;
+ jj_gen = 0;
+ for (int i = 0; i < 44; i++) jj_la1[i] = -1;
+ for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
+ }
+
+ /** Reinitialise. */
+ public void ReInit(java.io.Reader stream) {
jj_input_stream.ReInit(stream, 1, 1);
token_source.ReInit(jj_input_stream);
token = new Token();
jj_ntk = -1;
jj_gen = 0;
- for (int i = 0; i < 44; i++) {
- jj_la1[i] = -1;
- }
- for (int i = 0; i < jj_2_rtns.length; i++) {
- jj_2_rtns[i] = new JJExpressionParserCalls();
- }
+ for (int i = 0; i < 44; i++) jj_la1[i] = -1;
+ for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
}
+ /** Constructor with generated Token Manager. */
public ExpressionParser(ExpressionParserTokenManager tm) {
token_source = tm;
token = new Token();
jj_ntk = -1;
jj_gen = 0;
- for (int i = 0; i < 44; i++) {
- jj_la1[i] = -1;
- }
- for (int i = 0; i < jj_2_rtns.length; i++) {
- jj_2_rtns[i] = new JJExpressionParserCalls();
- }
+ for (int i = 0; i < 44; i++) jj_la1[i] = -1;
+ for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
}
+ /** Reinitialise. */
public void ReInit(ExpressionParserTokenManager tm) {
token_source = tm;
token = new Token();
jj_ntk = -1;
jj_gen = 0;
- for (int i = 0; i < 44; i++) {
- jj_la1[i] = -1;
- }
- for (int i = 0; i < jj_2_rtns.length; i++) {
- jj_2_rtns[i] = new JJExpressionParserCalls();
- }
+ for (int i = 0; i < 44; i++) jj_la1[i] = -1;
+ for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
}
- final private Token jj_consume_token(int kind) throws ParseException {
+ private Token jj_consume_token(int kind) throws ParseException {
Token oldToken;
- if ((oldToken = token).next != null) {
- token = token.next;
- } else {
- token = token.next = token_source.getNextToken();
- }
+ if ((oldToken = token).next != null) token = token.next;
+ else token = token.next = token_source.getNextToken();
jj_ntk = -1;
if (token.kind == kind) {
jj_gen++;
if (++jj_gc > 100) {
jj_gc = 0;
- for (JJExpressionParserCalls jj_2_rtn : jj_2_rtns) {
- JJExpressionParserCalls c = jj_2_rtn;
+ for (int i = 0; i < jj_2_rtns.length; i++) {
+ JJCalls c = jj_2_rtns[i];
while (c != null) {
- if (c.gen < jj_gen) {
- c.first = null;
- }
+ if (c.gen < jj_gen) c.first = null;
c = c.next;
}
}
@@ -3723,12 +2172,13 @@ final private Token jj_consume_token(int kind) throws ParseException {
throw generateParseException();
}
- final private boolean jj_scan_token(int kind) {
+ static private final class LookaheadSuccess extends java.lang.Error { }
+ final private LookaheadSuccess jj_ls = new LookaheadSuccess();
+ private boolean jj_scan_token(int kind) {
if (jj_scanpos == jj_lastpos) {
jj_la--;
if (jj_scanpos.next == null) {
- jj_lastpos = jj_scanpos = jj_scanpos.next = token_source
- .getNextToken();
+ jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
} else {
jj_lastpos = jj_scanpos = jj_scanpos.next;
}
@@ -3736,60 +2186,50 @@ final private boolean jj_scan_token(int kind) {
jj_scanpos = jj_scanpos.next;
}
if (jj_rescan) {
- int i = 0;
- Token tok = token;
- while (tok != null && tok != jj_scanpos) {
- i++;
- tok = tok.next;
- }
- if (tok != null) {
- jj_add_error_token(kind, i);
- }
+ int i = 0; Token tok = token;
+ while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; }
+ if (tok != null) jj_add_error_token(kind, i);
}
- return (jj_scanpos.kind != kind);
+ if (jj_scanpos.kind != kind) return true;
+ if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;
+ return false;
}
+
+/** Get the next Token. */
final public Token getNextToken() {
- if (token.next != null) {
- token = token.next;
- } else {
- token = token.next = token_source.getNextToken();
- }
+ if (token.next != null) token = token.next;
+ else token = token.next = token_source.getNextToken();
jj_ntk = -1;
jj_gen++;
return token;
}
+/** Get the specific Token. */
final public Token getToken(int index) {
- Token t = lookingAhead ? jj_scanpos : token;
+ Token t = token;
for (int i = 0; i < index; i++) {
- if (t.next != null) {
- t = t.next;
- } else {
- t = t.next = token_source.getNextToken();
- }
+ if (t.next != null) t = t.next;
+ else t = t.next = token_source.getNextToken();
}
return t;
}
- final private int jj_ntk() {
- if ((jj_nt = token.next) == null) {
+ private int jj_ntk() {
+ if ((jj_nt=token.next) == null)
return (jj_ntk = (token.next=token_source.getNextToken()).kind);
- } else {
+ else
return (jj_ntk = jj_nt.kind);
}
- }
- private java.util.Vector jj_expentries = new java.util.Vector();
+ private java.util.List jj_expentries = new java.util.ArrayList();
private int[] jj_expentry;
private int jj_kind = -1;
private int[] jj_lasttokens = new int[100];
private int jj_endpos;
private void jj_add_error_token(int kind, int pos) {
- if (pos >= 100) {
- return;
- }
+ if (pos >= 100) return;
if (pos == jj_endpos + 1) {
jj_lasttokens[jj_endpos++] = kind;
} else if (jj_endpos != 0) {
@@ -3797,38 +2237,26 @@ private void jj_add_error_token(int kind, int pos) {
for (int i = 0; i < jj_endpos; i++) {
jj_expentry[i] = jj_lasttokens[i];
}
- boolean exists = false;
- for (java.util.Enumeration enum_ = jj_expentries.elements(); enum_
- .hasMoreElements();) {
- int[] oldentry = (enum_.nextElement());
+ jj_entries_loop: for (java.util.Iterator> it = jj_expentries.iterator(); it.hasNext();) {
+ int[] oldentry = (int[])(it.next());
if (oldentry.length == jj_expentry.length) {
- exists = true;
for (int i = 0; i < jj_expentry.length; i++) {
if (oldentry[i] != jj_expentry[i]) {
- exists = false;
- break;
+ continue jj_entries_loop;
}
}
- if (exists) {
- break;
- }
- }
- }
- if (!exists) {
- jj_expentries.addElement(jj_expentry);
- }
- if (pos != 0) {
- jj_lasttokens[(jj_endpos = pos) - 1] = kind;
- }
+ jj_expentries.add(jj_expentry);
+ break jj_entries_loop;
+ }
+ }
+ if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind;
}
}
- final public ParseException generateParseException() {
- jj_expentries.removeAllElements();
+ /** Generate ParseException. */
+ public ParseException generateParseException() {
+ jj_expentries.clear();
boolean[] la1tokens = new boolean[116];
- for (int i = 0; i < 116; i++) {
- la1tokens[i] = false;
- }
if (jj_kind >= 0) {
la1tokens[jj_kind] = true;
jj_kind = -1;
@@ -3855,7 +2283,7 @@ final public ParseException generateParseException() {
if (la1tokens[i]) {
jj_expentry = new int[1];
jj_expentry[0] = i;
- jj_expentries.addElement(jj_expentry);
+ jj_expentries.add(jj_expentry);
}
}
jj_endpos = 0;
@@ -3863,80 +2291,60 @@ final public ParseException generateParseException() {
jj_add_error_token(0, 0);
int[][] exptokseq = new int[jj_expentries.size()][];
for (int i = 0; i < jj_expentries.size(); i++) {
- exptokseq[i] = jj_expentries.elementAt(i);
+ exptokseq[i] = jj_expentries.get(i);
}
return new ParseException(token, exptokseq, tokenImage);
}
+ /** Enable tracing. */
final public void enable_tracing() {
}
+ /** Disable tracing. */
final public void disable_tracing() {
}
- final private void jj_rescan_token() {
+ private void jj_rescan_token() {
jj_rescan = true;
for (int i = 0; i < 9; i++) {
- JJExpressionParserCalls p = jj_2_rtns[i];
+ try {
+ JJCalls p = jj_2_rtns[i];
do {
if (p.gen > jj_gen) {
- jj_la = p.arg;
- jj_lastpos = jj_scanpos = p.first;
+ jj_la = p.arg; jj_lastpos = jj_scanpos = p.first;
switch (i) {
- case 0:
- jj_3_1();
- break;
- case 1:
- jj_3_2();
- break;
- case 2:
- jj_3_3();
- break;
- case 3:
- jj_3_4();
- break;
- case 4:
- jj_3_5();
- break;
- case 5:
- jj_3_6();
- break;
- case 6:
- jj_3_7();
- break;
- case 7:
- jj_3_8();
- break;
- case 8:
- jj_3_9();
- break;
+ case 0: jj_3_1(); break;
+ case 1: jj_3_2(); break;
+ case 2: jj_3_3(); break;
+ case 3: jj_3_4(); break;
+ case 4: jj_3_5(); break;
+ case 5: jj_3_6(); break;
+ case 6: jj_3_7(); break;
+ case 7: jj_3_8(); break;
+ case 8: jj_3_9(); break;
}
}
p = p.next;
} while (p != null);
+ } catch(LookaheadSuccess ls) { }
}
jj_rescan = false;
}
- final private void jj_save(int index, int xla) {
- JJExpressionParserCalls p = jj_2_rtns[index];
+ private void jj_save(int index, int xla) {
+ JJCalls p = jj_2_rtns[index];
while (p.gen > jj_gen) {
- if (p.next == null) {
- p = p.next = new JJExpressionParserCalls();
- break;
- }
+ if (p.next == null) { p = p.next = new JJCalls(); break; }
p = p.next;
}
- p.gen = jj_gen + xla - jj_la;
- p.first = token;
- p.arg = xla;
+ p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla;
}
-}
+ static final class JJCalls {
+ int gen;
+ Token first;
+ int arg;
+ JJCalls next;
+ }
-final class JJExpressionParserCalls {
- int gen;
- Token first;
- int arg;
- JJExpressionParserCalls next;
}
diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/expr/ExpressionParserConstants.java b/jdk/src/share/classes/com/sun/tools/example/debug/expr/ExpressionParserConstants.java
index fd46b36d8f..c74d21fa75 100644
--- a/jdk/src/share/classes/com/sun/tools/example/debug/expr/ExpressionParserConstants.java
+++ b/jdk/src/share/classes/com/sun/tools/example/debug/expr/ExpressionParserConstants.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* 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,134 +23,243 @@
* questions.
*/
-/*
- * This source code is provided to illustrate the usage of a given feature
- * or technique and has been deliberately simplified. Additional steps
- * required for a production-quality application, such as security checks,
- * input validation and proper error handling, might not be present in
- * this sample code.
- */
-
-
/* Generated By:JavaCC: Do not edit this line. ExpressionParserConstants.java */
package com.sun.tools.example.debug.expr;
+
+/**
+ * Token literal values and constants.
+ * Generated by org.javacc.parser.OtherFilesGen#start()
+ */
public interface ExpressionParserConstants {
+ /** End of File. */
int EOF = 0;
+ /** RegularExpression Id. */
int SINGLE_LINE_COMMENT = 6;
+ /** RegularExpression Id. */
int FORMAL_COMMENT = 7;
+ /** RegularExpression Id. */
int MULTI_LINE_COMMENT = 8;
+ /** RegularExpression Id. */
int ABSTRACT = 9;
+ /** RegularExpression Id. */
int BOOLEAN = 10;
+ /** RegularExpression Id. */
int BREAK = 11;
+ /** RegularExpression Id. */
int BYTE = 12;
+ /** RegularExpression Id. */
int CASE = 13;
+ /** RegularExpression Id. */
int CATCH = 14;
+ /** RegularExpression Id. */
int CHAR = 15;
+ /** RegularExpression Id. */
int CLASS = 16;
+ /** RegularExpression Id. */
int CONST = 17;
+ /** RegularExpression Id. */
int CONTINUE = 18;
+ /** RegularExpression Id. */
int _DEFAULT = 19;
+ /** RegularExpression Id. */
int DO = 20;
+ /** RegularExpression Id. */
int DOUBLE = 21;
+ /** RegularExpression Id. */
int ELSE = 22;
+ /** RegularExpression Id. */
int EXTENDS = 23;
+ /** RegularExpression Id. */
int FALSE = 24;
+ /** RegularExpression Id. */
int FINAL = 25;
+ /** RegularExpression Id. */
int FINALLY = 26;
+ /** RegularExpression Id. */
int FLOAT = 27;
+ /** RegularExpression Id. */
int FOR = 28;
+ /** RegularExpression Id. */
int GOTO = 29;
+ /** RegularExpression Id. */
int IF = 30;
+ /** RegularExpression Id. */
int IMPLEMENTS = 31;
+ /** RegularExpression Id. */
int IMPORT = 32;
+ /** RegularExpression Id. */
int INSTANCEOF = 33;
+ /** RegularExpression Id. */
int INT = 34;
+ /** RegularExpression Id. */
int INTERFACE = 35;
+ /** RegularExpression Id. */
int LONG = 36;
+ /** RegularExpression Id. */
int NATIVE = 37;
+ /** RegularExpression Id. */
int NEW = 38;
+ /** RegularExpression Id. */
int NULL = 39;
+ /** RegularExpression Id. */
int PACKAGE = 40;
+ /** RegularExpression Id. */
int PRIVATE = 41;
+ /** RegularExpression Id. */
int PROTECTED = 42;
+ /** RegularExpression Id. */
int PUBLIC = 43;
+ /** RegularExpression Id. */
int RETURN = 44;
+ /** RegularExpression Id. */
int SHORT = 45;
+ /** RegularExpression Id. */
int STATIC = 46;
+ /** RegularExpression Id. */
int SUPER = 47;
+ /** RegularExpression Id. */
int SWITCH = 48;
+ /** RegularExpression Id. */
int SYNCHRONIZED = 49;
+ /** RegularExpression Id. */
int THIS = 50;
+ /** RegularExpression Id. */
int THROW = 51;
+ /** RegularExpression Id. */
int THROWS = 52;
+ /** RegularExpression Id. */
int TRANSIENT = 53;
+ /** RegularExpression Id. */
int TRUE = 54;
+ /** RegularExpression Id. */
int TRY = 55;
+ /** RegularExpression Id. */
int VOID = 56;
+ /** RegularExpression Id. */
int VOLATILE = 57;
+ /** RegularExpression Id. */
int WHILE = 58;
+ /** RegularExpression Id. */
int INTEGER_LITERAL = 59;
+ /** RegularExpression Id. */
int DECIMAL_LITERAL = 60;
+ /** RegularExpression Id. */
int HEX_LITERAL = 61;
+ /** RegularExpression Id. */
int OCTAL_LITERAL = 62;
+ /** RegularExpression Id. */
int FLOATING_POINT_LITERAL = 63;
+ /** RegularExpression Id. */
int EXPONENT = 64;
+ /** RegularExpression Id. */
int CHARACTER_LITERAL = 65;
+ /** RegularExpression Id. */
int STRING_LITERAL = 66;
+ /** RegularExpression Id. */
int IDENTIFIER = 67;
+ /** RegularExpression Id. */
int LETTER = 68;
+ /** RegularExpression Id. */
int DIGIT = 69;
+ /** RegularExpression Id. */
int LPAREN = 70;
+ /** RegularExpression Id. */
int RPAREN = 71;
+ /** RegularExpression Id. */
int LBRACE = 72;
+ /** RegularExpression Id. */
int RBRACE = 73;
+ /** RegularExpression Id. */
int LBRACKET = 74;
+ /** RegularExpression Id. */
int RBRACKET = 75;
+ /** RegularExpression Id. */
int SEMICOLON = 76;
+ /** RegularExpression Id. */
int COMMA = 77;
+ /** RegularExpression Id. */
int DOT = 78;
+ /** RegularExpression Id. */
int ASSIGN = 79;
+ /** RegularExpression Id. */
int GT = 80;
+ /** RegularExpression Id. */
int LT = 81;
+ /** RegularExpression Id. */
int BANG = 82;
+ /** RegularExpression Id. */
int TILDE = 83;
+ /** RegularExpression Id. */
int HOOK = 84;
+ /** RegularExpression Id. */
int COLON = 85;
+ /** RegularExpression Id. */
int EQ = 86;
+ /** RegularExpression Id. */
int LE = 87;
+ /** RegularExpression Id. */
int GE = 88;
+ /** RegularExpression Id. */
int NE = 89;
+ /** RegularExpression Id. */
int SC_OR = 90;
+ /** RegularExpression Id. */
int SC_AND = 91;
+ /** RegularExpression Id. */
int INCR = 92;
+ /** RegularExpression Id. */
int DECR = 93;
+ /** RegularExpression Id. */
int PLUS = 94;
+ /** RegularExpression Id. */
int MINUS = 95;
+ /** RegularExpression Id. */
int STAR = 96;
+ /** RegularExpression Id. */
int SLASH = 97;
+ /** RegularExpression Id. */
int BIT_AND = 98;
+ /** RegularExpression Id. */
int BIT_OR = 99;
+ /** RegularExpression Id. */
int XOR = 100;
+ /** RegularExpression Id. */
int REM = 101;
+ /** RegularExpression Id. */
int LSHIFT = 102;
+ /** RegularExpression Id. */
int RSIGNEDSHIFT = 103;
+ /** RegularExpression Id. */
int RUNSIGNEDSHIFT = 104;
+ /** RegularExpression Id. */
int PLUSASSIGN = 105;
+ /** RegularExpression Id. */
int MINUSASSIGN = 106;
+ /** RegularExpression Id. */
int STARASSIGN = 107;
+ /** RegularExpression Id. */
int SLASHASSIGN = 108;
+ /** RegularExpression Id. */
int ANDASSIGN = 109;
+ /** RegularExpression Id. */
int ORASSIGN = 110;
+ /** RegularExpression Id. */
int XORASSIGN = 111;
+ /** RegularExpression Id. */
int REMASSIGN = 112;
+ /** RegularExpression Id. */
int LSHIFTASSIGN = 113;
+ /** RegularExpression Id. */
int RSIGNEDSHIFTASSIGN = 114;
+ /** RegularExpression Id. */
int RUNSIGNEDSHIFTASSIGN = 115;
+ /** Lexical state. */
int DEFAULT = 0;
+ /** Literal token values. */
String[] tokenImage = {
"",
"\" \"",
diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/expr/ExpressionParserTokenManager.java b/jdk/src/share/classes/com/sun/tools/example/debug/expr/ExpressionParserTokenManager.java
index 7e1f57090d..b2f16f03e5 100644
--- a/jdk/src/share/classes/com/sun/tools/example/debug/expr/ExpressionParserTokenManager.java
+++ b/jdk/src/share/classes/com/sun/tools/example/debug/expr/ExpressionParserTokenManager.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* 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,38 +23,39 @@
* questions.
*/
-/*
- * This source code is provided to illustrate the usage of a given feature
- * or technique and has been deliberately simplified. Additional steps
- * required for a production-quality application, such as security checks,
- * input validation and proper error handling, might not be present in
- * this sample code.
- */
-
-
/* Generated By:JavaCC: Do not edit this line. ExpressionParserTokenManager.java */
package com.sun.tools.example.debug.expr;
+import com.sun.jdi.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+/** Token Manager. */
public class ExpressionParserTokenManager implements ExpressionParserConstants
{
+
+ /** Debug output. */
+ public java.io.PrintStream debugStream = System.out;
+ /** Set debug output. */
+ public void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1)
{
switch (pos)
{
case 0:
- if ((active1 & 0x4000L) != 0L) {
+ if ((active1 & 0x100200000000L) != 0L)
+ return 49;
+ if ((active1 & 0x4000L) != 0L)
return 4;
- }
if ((active0 & 0x7fffffffffffe00L) != 0L)
{
jjmatchedKind = 67;
return 28;
}
- if ((active1 & 0x100200000000L) != 0L) {
- return 49;
- }
return -1;
case 1:
+ if ((active0 & 0x40300000L) != 0L)
+ return 28;
if ((active0 & 0x7ffffffbfcffe00L) != 0L)
{
if (jjmatchedPos != 1)
@@ -64,11 +65,10 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1)
}
return 28;
}
- if ((active0 & 0x40300000L) != 0L) {
- return 28;
- }
return -1;
case 2:
+ if ((active0 & 0x80004c10000000L) != 0L)
+ return 28;
if ((active0 & 0x77fffb3afeffe00L) != 0L)
{
if (jjmatchedPos != 2)
@@ -78,9 +78,6 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1)
}
return 28;
}
- if ((active0 & 0x80004c10000000L) != 0L) {
- return 28;
- }
return -1;
case 3:
if ((active0 & 0x63bff2b8faf4e00L) != 0L)
@@ -89,11 +86,12 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1)
jjmatchedPos = 3;
return 28;
}
- if ((active0 & 0x14400902040b000L) != 0L) {
+ if ((active0 & 0x14400902040b000L) != 0L)
return 28;
- }
return -1;
case 4:
+ if ((active0 & 0x418a0000f034800L) != 0L)
+ return 28;
if ((active0 & 0x2235f2b80ac0600L) != 0L)
{
if (jjmatchedPos != 4)
@@ -103,20 +101,16 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1)
}
return 28;
}
- if ((active0 & 0x418a0000f034800L) != 0L) {
- return 28;
- }
return -1;
case 5:
+ if ((active0 & 0x11582100200000L) != 0L)
+ return 28;
if ((active0 & 0x222070a848c0600L) != 0L)
{
jjmatchedKind = 67;
jjmatchedPos = 5;
return 28;
}
- if ((active0 & 0x11582100200000L) != 0L) {
- return 28;
- }
return -1;
case 6:
if ((active0 & 0x222040a80040200L) != 0L)
@@ -125,31 +119,28 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1)
jjmatchedPos = 6;
return 28;
}
- if ((active0 & 0x30004880400L) != 0L) {
+ if ((active0 & 0x30004880400L) != 0L)
return 28;
- }
return -1;
case 7:
+ if ((active0 & 0x200000000040200L) != 0L)
+ return 28;
if ((active0 & 0x22040a80000000L) != 0L)
{
jjmatchedKind = 67;
jjmatchedPos = 7;
return 28;
}
- if ((active0 & 0x200000000040200L) != 0L) {
- return 28;
- }
return -1;
case 8:
+ if ((active0 & 0x20040800000000L) != 0L)
+ return 28;
if ((active0 & 0x2000280000000L) != 0L)
{
jjmatchedKind = 67;
jjmatchedPos = 8;
return 28;
}
- if ((active0 & 0x20040800000000L) != 0L) {
- return 28;
- }
return -1;
case 9:
if ((active0 & 0x2000000000000L) != 0L)
@@ -158,9 +149,8 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1)
jjmatchedPos = 9;
return 28;
}
- if ((active0 & 0x280000000L) != 0L) {
+ if ((active0 & 0x280000000L) != 0L)
return 28;
- }
return -1;
case 10:
if ((active0 & 0x2000000000000L) != 0L)
@@ -178,21 +168,13 @@ private final int jjStartNfa_0(int pos, long active0, long active1)
{
return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0, active1), pos + 1);
}
-private final int jjStopAtPos(int pos, int kind)
+private int jjStopAtPos(int pos, int kind)
{
jjmatchedKind = kind;
jjmatchedPos = pos;
return pos + 1;
}
-private final int jjStartNfaWithStates_0(int pos, int kind, int state)
-{
- jjmatchedKind = kind;
- jjmatchedPos = pos;
- try { curChar = input_stream.readChar(); }
- catch(java.io.IOException e) { return pos + 1; }
- return jjMoveNfa_0(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_0()
+private int jjMoveStringLiteralDfa0_0()
{
switch(curChar)
{
@@ -292,7 +274,7 @@ private final int jjMoveStringLiteralDfa0_0()
return jjMoveNfa_0(0, 0);
}
}
-private final int jjMoveStringLiteralDfa1_0(long active0, long active1)
+private int jjMoveStringLiteralDfa1_0(long active0, long active1)
{
try { curChar = input_stream.readChar(); }
catch(java.io.IOException e) {
@@ -302,19 +284,16 @@ private final int jjMoveStringLiteralDfa1_0(long active0, long active1)
switch(curChar)
{
case 38:
- if ((active1 & 0x8000000L) != 0L) {
+ if ((active1 & 0x8000000L) != 0L)
return jjStopAtPos(1, 91);
- }
break;
case 43:
- if ((active1 & 0x10000000L) != 0L) {
+ if ((active1 & 0x10000000L) != 0L)
return jjStopAtPos(1, 92);
- }
break;
case 45:
- if ((active1 & 0x20000000L) != 0L) {
+ if ((active1 & 0x20000000L) != 0L)
return jjStopAtPos(1, 93);
- }
break;
case 60:
if ((active1 & 0x4000000000L) != 0L)
@@ -324,31 +303,30 @@ private final int jjMoveStringLiteralDfa1_0(long active0, long active1)
}
return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x2000000000000L);
case 61:
- if ((active1 & 0x400000L) != 0L) {
+ if ((active1 & 0x400000L) != 0L)
return jjStopAtPos(1, 86);
- } else if ((active1 & 0x800000L) != 0L) {
+ else if ((active1 & 0x800000L) != 0L)
return jjStopAtPos(1, 87);
- } else if ((active1 & 0x1000000L) != 0L) {
+ else if ((active1 & 0x1000000L) != 0L)
return jjStopAtPos(1, 88);
- } else if ((active1 & 0x2000000L) != 0L) {
+ else if ((active1 & 0x2000000L) != 0L)
return jjStopAtPos(1, 89);
- } else if ((active1 & 0x20000000000L) != 0L) {
+ else if ((active1 & 0x20000000000L) != 0L)
return jjStopAtPos(1, 105);
- } else if ((active1 & 0x40000000000L) != 0L) {
+ else if ((active1 & 0x40000000000L) != 0L)
return jjStopAtPos(1, 106);
- } else if ((active1 & 0x80000000000L) != 0L) {
+ else if ((active1 & 0x80000000000L) != 0L)
return jjStopAtPos(1, 107);
- } else if ((active1 & 0x100000000000L) != 0L) {
+ else if ((active1 & 0x100000000000L) != 0L)
return jjStopAtPos(1, 108);
- } else if ((active1 & 0x200000000000L) != 0L) {
+ else if ((active1 & 0x200000000000L) != 0L)
return jjStopAtPos(1, 109);
- } else if ((active1 & 0x400000000000L) != 0L) {
+ else if ((active1 & 0x400000000000L) != 0L)
return jjStopAtPos(1, 110);
- } else if ((active1 & 0x800000000000L) != 0L) {
+ else if ((active1 & 0x800000000000L) != 0L)
return jjStopAtPos(1, 111);
- } else if ((active1 & 0x1000000000000L) != 0L) {
+ else if ((active1 & 0x1000000000000L) != 0L)
return jjStopAtPos(1, 112);
- }
break;
case 62:
if ((active1 & 0x8000000000L) != 0L)
@@ -364,9 +342,8 @@ private final int jjMoveStringLiteralDfa1_0(long active0, long active1)
case 101:
return jjMoveStringLiteralDfa2_0(active0, 0x104000080000L, active1, 0L);
case 102:
- if ((active0 & 0x40000000L) != 0L) {
+ if ((active0 & 0x40000000L) != 0L)
return jjStartNfaWithStates_0(1, 30, 28);
- }
break;
case 104:
return jjMoveStringLiteralDfa2_0(active0, 0x41c200000008000L, active1, 0L);
@@ -398,20 +375,18 @@ private final int jjMoveStringLiteralDfa1_0(long active0, long active1)
case 121:
return jjMoveStringLiteralDfa2_0(active0, 0x2000000001000L, active1, 0L);
case 124:
- if ((active1 & 0x4000000L) != 0L) {
+ if ((active1 & 0x4000000L) != 0L)
return jjStopAtPos(1, 90);
- }
break;
default :
break;
}
return jjStartNfa_0(0, active0, active1);
}
-private final int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long active1)
+private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long active1)
{
- if (((active0 &= old0) | (active1 &= old1)) == 0L) {
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
return jjStartNfa_0(0, old0, old1);
- }
try { curChar = input_stream.readChar(); }
catch(java.io.IOException e) {
jjStopStringLiteralDfa_0(1, active0, active1);
@@ -420,11 +395,10 @@ private final int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1,
switch(curChar)
{
case 61:
- if ((active1 & 0x2000000000000L) != 0L) {
+ if ((active1 & 0x2000000000000L) != 0L)
return jjStopAtPos(2, 113);
- } else if ((active1 & 0x4000000000000L) != 0L) {
+ else if ((active1 & 0x4000000000000L) != 0L)
return jjStopAtPos(2, 114);
- }
break;
case 62:
if ((active1 & 0x10000000000L) != 0L)
@@ -454,9 +428,8 @@ private final int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1,
case 112:
return jjMoveStringLiteralDfa3_0(active0, 0x800180000000L, active1, 0L);
case 114:
- if ((active0 & 0x10000000L) != 0L) {
+ if ((active0 & 0x10000000L) != 0L)
return jjStartNfaWithStates_0(2, 28, 28);
- }
return jjMoveStringLiteralDfa3_0(active0, 0x18000000000000L, active1, 0L);
case 115:
return jjMoveStringLiteralDfa3_0(active0, 0x200402200L, active1, 0L);
@@ -470,25 +443,22 @@ private final int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1,
case 117:
return jjMoveStringLiteralDfa3_0(active0, 0x40000000200000L, active1, 0L);
case 119:
- if ((active0 & 0x4000000000L) != 0L) {
+ if ((active0 & 0x4000000000L) != 0L)
return jjStartNfaWithStates_0(2, 38, 28);
- }
break;
case 121:
- if ((active0 & 0x80000000000000L) != 0L) {
+ if ((active0 & 0x80000000000000L) != 0L)
return jjStartNfaWithStates_0(2, 55, 28);
- }
break;
default :
break;
}
return jjStartNfa_0(1, active0, active1);
}
-private final int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long active1)
+private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long active1)
{
- if (((active0 &= old0) | (active1 &= old1)) == 0L) {
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
return jjStartNfa_0(1, old0, old1);
- }
try { curChar = input_stream.readChar(); }
catch(java.io.IOException e) {
jjStopStringLiteralDfa_0(2, active0, active1);
@@ -497,9 +467,8 @@ private final int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1,
switch(curChar)
{
case 61:
- if ((active1 & 0x8000000000000L) != 0L) {
+ if ((active1 & 0x8000000000000L) != 0L)
return jjStopAtPos(3, 115);
- }
break;
case 97:
return jjMoveStringLiteralDfa4_0(active0, 0x20000000e080800L, active1, 0L);
@@ -508,51 +477,44 @@ private final int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1,
case 99:
return jjMoveStringLiteralDfa4_0(active0, 0x2000000004000L, active1, 0L);
case 100:
- if ((active0 & 0x100000000000000L) != 0L) {
+ if ((active0 & 0x100000000000000L) != 0L)
return jjStartNfaWithStates_0(3, 56, 28);
- }
break;
case 101:
- if ((active0 & 0x1000L) != 0L) {
+ if ((active0 & 0x1000L) != 0L)
return jjStartNfaWithStates_0(3, 12, 28);
- } else if ((active0 & 0x2000L) != 0L) {
+ else if ((active0 & 0x2000L) != 0L)
return jjStartNfaWithStates_0(3, 13, 28);
- } else if ((active0 & 0x400000L) != 0L) {
+ else if ((active0 & 0x400000L) != 0L)
return jjStartNfaWithStates_0(3, 22, 28);
- } else if ((active0 & 0x40000000000000L) != 0L) {
+ else if ((active0 & 0x40000000000000L) != 0L)
return jjStartNfaWithStates_0(3, 54, 28);
- }
return jjMoveStringLiteralDfa4_0(active0, 0x800800800000L, active1, 0L);
case 103:
- if ((active0 & 0x1000000000L) != 0L) {
+ if ((active0 & 0x1000000000L) != 0L)
return jjStartNfaWithStates_0(3, 36, 28);
- }
break;
case 105:
return jjMoveStringLiteralDfa4_0(active0, 0x2000000000L, active1, 0L);
case 107:
return jjMoveStringLiteralDfa4_0(active0, 0x10000000000L, active1, 0L);
case 108:
- if ((active0 & 0x8000000000L) != 0L) {
+ if ((active0 & 0x8000000000L) != 0L)
return jjStartNfaWithStates_0(3, 39, 28);
- }
return jjMoveStringLiteralDfa4_0(active0, 0x400080080000400L, active1, 0L);
case 110:
return jjMoveStringLiteralDfa4_0(active0, 0x20000000000000L, active1, 0L);
case 111:
- if ((active0 & 0x20000000L) != 0L) {
+ if ((active0 & 0x20000000L) != 0L)
return jjStartNfaWithStates_0(3, 29, 28);
- }
return jjMoveStringLiteralDfa4_0(active0, 0x18000100000000L, active1, 0L);
case 114:
- if ((active0 & 0x8000L) != 0L) {
+ if ((active0 & 0x8000L) != 0L)
return jjStartNfaWithStates_0(3, 15, 28);
- }
return jjMoveStringLiteralDfa4_0(active0, 0x200000000000L, active1, 0L);
case 115:
- if ((active0 & 0x4000000000000L) != 0L) {
+ if ((active0 & 0x4000000000000L) != 0L)
return jjStartNfaWithStates_0(3, 50, 28);
- }
return jjMoveStringLiteralDfa4_0(active0, 0x1030000L, active1, 0L);
case 116:
return jjMoveStringLiteralDfa4_0(active0, 0x1440200040200L, active1, 0L);
@@ -565,11 +527,10 @@ private final int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1,
}
return jjStartNfa_0(2, active0, active1);
}
-private final int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long active1)
+private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long active1)
{
- if (((active0 &= old0) | (active1 &= old1)) == 0L) {
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
return jjStartNfa_0(2, old0, old1);
- }
try { curChar = input_stream.readChar(); }
catch(java.io.IOException e) {
jjStopStringLiteralDfa_0(3, active0, 0L);
@@ -582,23 +543,20 @@ private final int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1,
case 99:
return jjMoveStringLiteralDfa5_0(active0, 0x1000000000000L);
case 101:
- if ((active0 & 0x1000000L) != 0L) {
+ if ((active0 & 0x1000000L) != 0L)
return jjStartNfaWithStates_0(4, 24, 28);
- } else if ((active0 & 0x400000000000000L) != 0L) {
+ else if ((active0 & 0x400000000000000L) != 0L)
return jjStartNfaWithStates_0(4, 58, 28);
- }
return jjMoveStringLiteralDfa5_0(active0, 0x40080000400L);
case 104:
- if ((active0 & 0x4000L) != 0L) {
+ if ((active0 & 0x4000L) != 0L)
return jjStartNfaWithStates_0(4, 14, 28);
- }
return jjMoveStringLiteralDfa5_0(active0, 0x2000000000000L);
case 105:
return jjMoveStringLiteralDfa5_0(active0, 0x480000040000L);
case 107:
- if ((active0 & 0x800L) != 0L) {
+ if ((active0 & 0x800L) != 0L)
return jjStartNfaWithStates_0(4, 11, 28);
- }
break;
case 108:
if ((active0 & 0x2000000L) != 0L)
@@ -610,23 +568,20 @@ private final int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1,
case 110:
return jjMoveStringLiteralDfa5_0(active0, 0x800000L);
case 114:
- if ((active0 & 0x800000000000L) != 0L) {
+ if ((active0 & 0x800000000000L) != 0L)
return jjStartNfaWithStates_0(4, 47, 28);
- }
return jjMoveStringLiteralDfa5_0(active0, 0x100900000200L);
case 115:
- if ((active0 & 0x10000L) != 0L) {
+ if ((active0 & 0x10000L) != 0L)
return jjStartNfaWithStates_0(4, 16, 28);
- }
return jjMoveStringLiteralDfa5_0(active0, 0x20000000000000L);
case 116:
- if ((active0 & 0x20000L) != 0L) {
+ if ((active0 & 0x20000L) != 0L)
return jjStartNfaWithStates_0(4, 17, 28);
- } else if ((active0 & 0x8000000L) != 0L) {
+ else if ((active0 & 0x8000000L) != 0L)
return jjStartNfaWithStates_0(4, 27, 28);
- } else if ((active0 & 0x200000000000L) != 0L) {
+ else if ((active0 & 0x200000000000L) != 0L)
return jjStartNfaWithStates_0(4, 45, 28);
- }
return jjMoveStringLiteralDfa5_0(active0, 0x200000000000000L);
case 117:
return jjMoveStringLiteralDfa5_0(active0, 0x80000L);
@@ -644,11 +599,10 @@ private final int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1,
}
return jjStartNfa_0(3, active0, 0L);
}
-private final int jjMoveStringLiteralDfa5_0(long old0, long active0)
+private int jjMoveStringLiteralDfa5_0(long old0, long active0)
{
- if (((active0 &= old0)) == 0L) {
+ if (((active0 &= old0)) == 0L)
return jjStartNfa_0(3, old0, 0L);
- }
try { curChar = input_stream.readChar(); }
catch(java.io.IOException e) {
jjStopStringLiteralDfa_0(4, active0, 0L);
@@ -659,29 +613,26 @@ private final int jjMoveStringLiteralDfa5_0(long old0, long active0)
case 97:
return jjMoveStringLiteralDfa6_0(active0, 0x600L);
case 99:
- if ((active0 & 0x80000000000L) != 0L) {
+ if ((active0 & 0x80000000000L) != 0L)
return jjStartNfaWithStates_0(5, 43, 28);
- } else if ((active0 & 0x400000000000L) != 0L) {
+ else if ((active0 & 0x400000000000L) != 0L)
return jjStartNfaWithStates_0(5, 46, 28);
- }
return jjMoveStringLiteralDfa6_0(active0, 0x40000000000L);
case 100:
return jjMoveStringLiteralDfa6_0(active0, 0x800000L);
case 101:
- if ((active0 & 0x200000L) != 0L) {
+ if ((active0 & 0x200000L) != 0L)
return jjStartNfaWithStates_0(5, 21, 28);
- } else if ((active0 & 0x2000000000L) != 0L) {
+ else if ((active0 & 0x2000000000L) != 0L)
return jjStartNfaWithStates_0(5, 37, 28);
- }
break;
case 102:
return jjMoveStringLiteralDfa6_0(active0, 0x800000000L);
case 103:
return jjMoveStringLiteralDfa6_0(active0, 0x10000000000L);
case 104:
- if ((active0 & 0x1000000000000L) != 0L) {
+ if ((active0 & 0x1000000000000L) != 0L)
return jjStartNfaWithStates_0(5, 48, 28);
- }
break;
case 105:
return jjMoveStringLiteralDfa6_0(active0, 0x220000000000000L);
@@ -690,32 +641,28 @@ private final int jjMoveStringLiteralDfa5_0(long old0, long active0)
case 109:
return jjMoveStringLiteralDfa6_0(active0, 0x80000000L);
case 110:
- if ((active0 & 0x100000000000L) != 0L) {
+ if ((active0 & 0x100000000000L) != 0L)
return jjStartNfaWithStates_0(5, 44, 28);
- }
return jjMoveStringLiteralDfa6_0(active0, 0x200040000L);
case 114:
return jjMoveStringLiteralDfa6_0(active0, 0x2000000000000L);
case 115:
- if ((active0 & 0x10000000000000L) != 0L) {
+ if ((active0 & 0x10000000000000L) != 0L)
return jjStartNfaWithStates_0(5, 52, 28);
- }
break;
case 116:
- if ((active0 & 0x100000000L) != 0L) {
+ if ((active0 & 0x100000000L) != 0L)
return jjStartNfaWithStates_0(5, 32, 28);
- }
return jjMoveStringLiteralDfa6_0(active0, 0x20000000000L);
default :
break;
}
return jjStartNfa_0(4, active0, 0L);
}
-private final int jjMoveStringLiteralDfa6_0(long old0, long active0)
+private int jjMoveStringLiteralDfa6_0(long old0, long active0)
{
- if (((active0 &= old0)) == 0L) {
+ if (((active0 &= old0)) == 0L)
return jjStartNfa_0(4, old0, 0L);
- }
try { curChar = input_stream.readChar(); }
catch(java.io.IOException e) {
jjStopStringLiteralDfa_0(5, active0, 0L);
@@ -728,48 +675,42 @@ private final int jjMoveStringLiteralDfa6_0(long old0, long active0)
case 99:
return jjMoveStringLiteralDfa7_0(active0, 0x200000200L);
case 101:
- if ((active0 & 0x10000000000L) != 0L) {
+ if ((active0 & 0x10000000000L) != 0L)
return jjStartNfaWithStates_0(6, 40, 28);
- } else if ((active0 & 0x20000000000L) != 0L) {
+ else if ((active0 & 0x20000000000L) != 0L)
return jjStartNfaWithStates_0(6, 41, 28);
- }
return jjMoveStringLiteralDfa7_0(active0, 0x20000080000000L);
case 108:
return jjMoveStringLiteralDfa7_0(active0, 0x200000000000000L);
case 110:
- if ((active0 & 0x400L) != 0L) {
+ if ((active0 & 0x400L) != 0L)
return jjStartNfaWithStates_0(6, 10, 28);
- }
break;
case 111:
return jjMoveStringLiteralDfa7_0(active0, 0x2000000000000L);
case 115:
- if ((active0 & 0x800000L) != 0L) {
+ if ((active0 & 0x800000L) != 0L)
return jjStartNfaWithStates_0(6, 23, 28);
- }
break;
case 116:
- if ((active0 & 0x80000L) != 0L) {
+ if ((active0 & 0x80000L) != 0L)
return jjStartNfaWithStates_0(6, 19, 28);
- }
return jjMoveStringLiteralDfa7_0(active0, 0x40000000000L);
case 117:
return jjMoveStringLiteralDfa7_0(active0, 0x40000L);
case 121:
- if ((active0 & 0x4000000L) != 0L) {
+ if ((active0 & 0x4000000L) != 0L)
return jjStartNfaWithStates_0(6, 26, 28);
- }
break;
default :
break;
}
return jjStartNfa_0(5, active0, 0L);
}
-private final int jjMoveStringLiteralDfa7_0(long old0, long active0)
+private int jjMoveStringLiteralDfa7_0(long old0, long active0)
{
- if (((active0 &= old0)) == 0L) {
+ if (((active0 &= old0)) == 0L)
return jjStartNfa_0(5, old0, 0L);
- }
try { curChar = input_stream.readChar(); }
catch(java.io.IOException e) {
jjStopStringLiteralDfa_0(6, active0, 0L);
@@ -780,29 +721,26 @@ private final int jjMoveStringLiteralDfa7_0(long old0, long active0)
case 99:
return jjMoveStringLiteralDfa8_0(active0, 0x800000000L);
case 101:
- if ((active0 & 0x40000L) != 0L) {
+ if ((active0 & 0x40000L) != 0L)
return jjStartNfaWithStates_0(7, 18, 28);
- } else if ((active0 & 0x200000000000000L) != 0L) {
+ else if ((active0 & 0x200000000000000L) != 0L)
return jjStartNfaWithStates_0(7, 57, 28);
- }
return jjMoveStringLiteralDfa8_0(active0, 0x40200000000L);
case 110:
return jjMoveStringLiteralDfa8_0(active0, 0x22000080000000L);
case 116:
- if ((active0 & 0x200L) != 0L) {
+ if ((active0 & 0x200L) != 0L)
return jjStartNfaWithStates_0(7, 9, 28);
- }
break;
default :
break;
}
return jjStartNfa_0(6, active0, 0L);
}
-private final int jjMoveStringLiteralDfa8_0(long old0, long active0)
+private int jjMoveStringLiteralDfa8_0(long old0, long active0)
{
- if (((active0 &= old0)) == 0L) {
+ if (((active0 &= old0)) == 0L)
return jjStartNfa_0(6, old0, 0L);
- }
try { curChar = input_stream.readChar(); }
catch(java.io.IOException e) {
jjStopStringLiteralDfa_0(7, active0, 0L);
@@ -811,34 +749,30 @@ private final int jjMoveStringLiteralDfa8_0(long old0, long active0)
switch(curChar)
{
case 100:
- if ((active0 & 0x40000000000L) != 0L) {
+ if ((active0 & 0x40000000000L) != 0L)
return jjStartNfaWithStates_0(8, 42, 28);
- }
break;
case 101:
- if ((active0 & 0x800000000L) != 0L) {
+ if ((active0 & 0x800000000L) != 0L)
return jjStartNfaWithStates_0(8, 35, 28);
- }
break;
case 105:
return jjMoveStringLiteralDfa9_0(active0, 0x2000000000000L);
case 111:
return jjMoveStringLiteralDfa9_0(active0, 0x200000000L);
case 116:
- if ((active0 & 0x20000000000000L) != 0L) {
+ if ((active0 & 0x20000000000000L) != 0L)
return jjStartNfaWithStates_0(8, 53, 28);
- }
return jjMoveStringLiteralDfa9_0(active0, 0x80000000L);
default :
break;
}
return jjStartNfa_0(7, active0, 0L);
}
-private final int jjMoveStringLiteralDfa9_0(long old0, long active0)
+private int jjMoveStringLiteralDfa9_0(long old0, long active0)
{
- if (((active0 &= old0)) == 0L) {
+ if (((active0 &= old0)) == 0L)
return jjStartNfa_0(7, old0, 0L);
- }
try { curChar = input_stream.readChar(); }
catch(java.io.IOException e) {
jjStopStringLiteralDfa_0(8, active0, 0L);
@@ -847,14 +781,12 @@ private final int jjMoveStringLiteralDfa9_0(long old0, long active0)
switch(curChar)
{
case 102:
- if ((active0 & 0x200000000L) != 0L) {
+ if ((active0 & 0x200000000L) != 0L)
return jjStartNfaWithStates_0(9, 33, 28);
- }
break;
case 115:
- if ((active0 & 0x80000000L) != 0L) {
+ if ((active0 & 0x80000000L) != 0L)
return jjStartNfaWithStates_0(9, 31, 28);
- }
break;
case 122:
return jjMoveStringLiteralDfa10_0(active0, 0x2000000000000L);
@@ -863,11 +795,10 @@ private final int jjMoveStringLiteralDfa9_0(long old0, long active0)
}
return jjStartNfa_0(8, active0, 0L);
}
-private final int jjMoveStringLiteralDfa10_0(long old0, long active0)
+private int jjMoveStringLiteralDfa10_0(long old0, long active0)
{
- if (((active0 &= old0)) == 0L) {
+ if (((active0 &= old0)) == 0L)
return jjStartNfa_0(8, old0, 0L);
- }
try { curChar = input_stream.readChar(); }
catch(java.io.IOException e) {
jjStopStringLiteralDfa_0(9, active0, 0L);
@@ -882,11 +813,10 @@ private final int jjMoveStringLiteralDfa10_0(long old0, long active0)
}
return jjStartNfa_0(9, active0, 0L);
}
-private final int jjMoveStringLiteralDfa11_0(long old0, long active0)
+private int jjMoveStringLiteralDfa11_0(long old0, long active0)
{
- if (((active0 &= old0)) == 0L) {
+ if (((active0 &= old0)) == 0L)
return jjStartNfa_0(9, old0, 0L);
- }
try { curChar = input_stream.readChar(); }
catch(java.io.IOException e) {
jjStopStringLiteralDfa_0(10, active0, 0L);
@@ -895,44 +825,21 @@ private final int jjMoveStringLiteralDfa11_0(long old0, long active0)
switch(curChar)
{
case 100:
- if ((active0 & 0x2000000000000L) != 0L) {
+ if ((active0 & 0x2000000000000L) != 0L)
return jjStartNfaWithStates_0(11, 49, 28);
- }
break;
default :
break;
}
return jjStartNfa_0(10, active0, 0L);
}
-private final void jjCheckNAdd(int state)
-{
- if (jjrounds[state] != jjround)
- {
- jjstateSet[jjnewStateCnt++] = state;
- jjrounds[state] = jjround;
- }
-}
-private final void jjAddStates(int start, int end)
-{
- do {
- jjstateSet[jjnewStateCnt++] = jjnextStates[start];
- } while (start++ != end);
-}
-private final void jjCheckNAddTwoStates(int state1, int state2)
-{
- jjCheckNAdd(state1);
- jjCheckNAdd(state2);
-}
-private final void jjCheckNAddStates(int start, int end)
+private int jjStartNfaWithStates_0(int pos, int kind, int state)
{
- do {
- jjCheckNAdd(jjnextStates[start]);
- } while (start++ != end);
-}
-private final void jjCheckNAddStates(int start)
-{
- jjCheckNAdd(jjnextStates[start]);
- jjCheckNAdd(jjnextStates[start + 1]);
+ jjmatchedKind = kind;
+ jjmatchedPos = pos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return pos + 1; }
+ return jjMoveNfa_0(state, pos + 1);
}
static final long[] jjbitVec0 = {
0xfffffffffffffffeL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL
@@ -958,7 +865,7 @@ private final void jjCheckNAddStates(int start)
static final long[] jjbitVec8 = {
0x3fffffffffffL, 0x0L, 0x0L, 0x0L
};
-private final int jjMoveNfa_0(int startState, int curPos)
+private int jjMoveNfa_0(int startState, int curPos)
{
int startsAt = 0;
jjnewStateCnt = 67;
@@ -967,388 +874,312 @@ private final int jjMoveNfa_0(int startState, int curPos)
int kind = 0x7fffffff;
for (;;)
{
- if (++jjround == 0x7fffffff) {
+ if (++jjround == 0x7fffffff)
ReInitRounds();
- }
if (curChar < 64)
{
long l = 1L << curChar;
- //MatchLoop
do
{
switch(jjstateSet[--i])
{
+ case 49:
+ if (curChar == 42)
+ jjCheckNAddTwoStates(62, 63);
+ else if (curChar == 47)
+ jjCheckNAddStates(0, 2);
+ if (curChar == 42)
+ jjstateSet[jjnewStateCnt++] = 54;
+ break;
case 0:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(0, 6);
- } else if (curChar == 47) {
- jjAddStates(7, 9);
- } else if (curChar == 36)
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(3, 9);
+ else if (curChar == 47)
+ jjAddStates(10, 12);
+ else if (curChar == 36)
{
- if (kind > 67) {
+ if (kind > 67)
kind = 67;
- }
jjCheckNAdd(28);
}
- else if (curChar == 34) {
- jjCheckNAddStates(10, 12);
- } else if (curChar == 39) {
- jjAddStates(13, 14);
- } else if (curChar == 46) {
+ else if (curChar == 34)
+ jjCheckNAddStates(13, 15);
+ else if (curChar == 39)
+ jjAddStates(16, 17);
+ else if (curChar == 46)
jjCheckNAdd(4);
- }
if ((0x3fe000000000000L & l) != 0L)
{
- if (kind > 59) {
+ if (kind > 59)
kind = 59;
- }
jjCheckNAddTwoStates(1, 2);
}
else if (curChar == 48)
{
- if (kind > 59) {
+ if (kind > 59)
kind = 59;
- }
- jjCheckNAddStates(15, 17);
- }
- break;
- case 49:
- if (curChar == 42) {
- jjCheckNAddTwoStates(62, 63);
- } else if (curChar == 47) {
jjCheckNAddStates(18, 20);
}
- if (curChar == 42) {
- jjstateSet[jjnewStateCnt++] = 54;
- }
break;
case 1:
- if ((0x3ff000000000000L & l) == 0L) {
+ if ((0x3ff000000000000L & l) == 0L)
break;
- }
- if (kind > 59) {
+ if (kind > 59)
kind = 59;
- }
jjCheckNAddTwoStates(1, 2);
break;
case 3:
- if (curChar == 46) {
+ if (curChar == 46)
jjCheckNAdd(4);
- }
break;
case 4:
- if ((0x3ff000000000000L & l) == 0L) {
+ if ((0x3ff000000000000L & l) == 0L)
break;
- }
- if (kind > 63) {
+ if (kind > 63)
kind = 63;
- }
jjCheckNAddStates(21, 23);
break;
case 6:
- if ((0x280000000000L & l) != 0L) {
+ if ((0x280000000000L & l) != 0L)
jjCheckNAdd(7);
- }
break;
case 7:
- if ((0x3ff000000000000L & l) == 0L) {
+ if ((0x3ff000000000000L & l) == 0L)
break;
- }
- if (kind > 63) {
+ if (kind > 63)
kind = 63;
- }
jjCheckNAddTwoStates(7, 8);
break;
case 9:
- if (curChar == 39) {
- jjAddStates(13, 14);
- }
+ if (curChar == 39)
+ jjAddStates(16, 17);
break;
case 10:
- if ((0xffffff7fffffdbffL & l) != 0L) {
+ if ((0xffffff7fffffdbffL & l) != 0L)
jjCheckNAdd(11);
- }
break;
case 11:
- if (curChar == 39 && kind > 65) {
+ if (curChar == 39 && kind > 65)
kind = 65;
- }
break;
case 13:
- if ((0x8400000000L & l) != 0L) {
+ if ((0x8400000000L & l) != 0L)
jjCheckNAdd(11);
- }
break;
case 14:
- if ((0xff000000000000L & l) != 0L) {
+ if ((0xff000000000000L & l) != 0L)
jjCheckNAddTwoStates(15, 11);
- }
break;
case 15:
- if ((0xff000000000000L & l) != 0L) {
+ if ((0xff000000000000L & l) != 0L)
jjCheckNAdd(11);
- }
break;
case 16:
- if ((0xf000000000000L & l) != 0L) {
+ if ((0xf000000000000L & l) != 0L)
jjstateSet[jjnewStateCnt++] = 17;
- }
break;
case 17:
- if ((0xff000000000000L & l) != 0L) {
+ if ((0xff000000000000L & l) != 0L)
jjCheckNAdd(15);
- }
break;
case 18:
- if (curChar == 34) {
- jjCheckNAddStates(10, 12);
- }
+ if (curChar == 34)
+ jjCheckNAddStates(13, 15);
break;
case 19:
- if ((0xfffffffbffffdbffL & l) != 0L) {
- jjCheckNAddStates(10, 12);
- }
+ if ((0xfffffffbffffdbffL & l) != 0L)
+ jjCheckNAddStates(13, 15);
break;
case 21:
- if ((0x8400000000L & l) != 0L) {
- jjCheckNAddStates(10, 12);
- }
+ if ((0x8400000000L & l) != 0L)
+ jjCheckNAddStates(13, 15);
break;
case 22:
- if (curChar == 34 && kind > 66) {
+ if (curChar == 34 && kind > 66)
kind = 66;
- }
break;
case 23:
- if ((0xff000000000000L & l) != 0L) {
+ if ((0xff000000000000L & l) != 0L)
jjCheckNAddStates(24, 27);
- }
break;
case 24:
- if ((0xff000000000000L & l) != 0L) {
- jjCheckNAddStates(10, 12);
- }
+ if ((0xff000000000000L & l) != 0L)
+ jjCheckNAddStates(13, 15);
break;
case 25:
- if ((0xf000000000000L & l) != 0L) {
+ if ((0xf000000000000L & l) != 0L)
jjstateSet[jjnewStateCnt++] = 26;
- }
break;
case 26:
- if ((0xff000000000000L & l) != 0L) {
+ if ((0xff000000000000L & l) != 0L)
jjCheckNAdd(24);
- }
break;
case 27:
- if (curChar != 36) {
+ if (curChar != 36)
break;
- }
- if (kind > 67) {
+ if (kind > 67)
kind = 67;
- }
jjCheckNAdd(28);
break;
case 28:
- if ((0x3ff001000000000L & l) == 0L) {
+ if ((0x3ff001000000000L & l) == 0L)
break;
- }
- if (kind > 67) {
+ if (kind > 67)
kind = 67;
- }
jjCheckNAdd(28);
break;
case 29:
- if ((0x3ff000000000000L & l) != 0L) {
- jjCheckNAddStates(0, 6);
- }
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(3, 9);
break;
case 30:
- if ((0x3ff000000000000L & l) != 0L) {
+ if ((0x3ff000000000000L & l) != 0L)
jjCheckNAddTwoStates(30, 31);
- }
break;
case 31:
- if (curChar != 46) {
+ if (curChar != 46)
break;
- }
- if (kind > 63) {
+ if (kind > 63)
kind = 63;
- }
jjCheckNAddStates(28, 30);
break;
case 32:
- if ((0x3ff000000000000L & l) == 0L) {
+ if ((0x3ff000000000000L & l) == 0L)
break;
- }
- if (kind > 63) {
+ if (kind > 63)
kind = 63;
- }
jjCheckNAddStates(28, 30);
break;
case 34:
- if ((0x280000000000L & l) != 0L) {
+ if ((0x280000000000L & l) != 0L)
jjCheckNAdd(35);
- }
break;
case 35:
- if ((0x3ff000000000000L & l) == 0L) {
+ if ((0x3ff000000000000L & l) == 0L)
break;
- }
- if (kind > 63) {
+ if (kind > 63)
kind = 63;
- }
jjCheckNAddTwoStates(35, 8);
break;
case 36:
- if ((0x3ff000000000000L & l) != 0L) {
+ if ((0x3ff000000000000L & l) != 0L)
jjCheckNAddTwoStates(36, 37);
- }
break;
case 38:
- if ((0x280000000000L & l) != 0L) {
+ if ((0x280000000000L & l) != 0L)
jjCheckNAdd(39);
- }
break;
case 39:
- if ((0x3ff000000000000L & l) == 0L) {
+ if ((0x3ff000000000000L & l) == 0L)
break;
- }
- if (kind > 63) {
+ if (kind > 63)
kind = 63;
- }
jjCheckNAddTwoStates(39, 8);
break;
case 40:
- if ((0x3ff000000000000L & l) != 0L) {
+ if ((0x3ff000000000000L & l) != 0L)
jjCheckNAddStates(31, 33);
- }
break;
case 42:
- if ((0x280000000000L & l) != 0L) {
+ if ((0x280000000000L & l) != 0L)
jjCheckNAdd(43);
- }
break;
case 43:
- if ((0x3ff000000000000L & l) != 0L) {
+ if ((0x3ff000000000000L & l) != 0L)
jjCheckNAddTwoStates(43, 8);
- }
break;
case 44:
- if (curChar != 48) {
+ if (curChar != 48)
break;
- }
- if (kind > 59) {
+ if (kind > 59)
kind = 59;
- }
- jjCheckNAddStates(15, 17);
+ jjCheckNAddStates(18, 20);
break;
case 46:
- if ((0x3ff000000000000L & l) == 0L) {
+ if ((0x3ff000000000000L & l) == 0L)
break;
- }
- if (kind > 59) {
+ if (kind > 59)
kind = 59;
- }
jjCheckNAddTwoStates(46, 2);
break;
case 47:
- if ((0xff000000000000L & l) == 0L) {
+ if ((0xff000000000000L & l) == 0L)
break;
- }
- if (kind > 59) {
+ if (kind > 59)
kind = 59;
- }
jjCheckNAddTwoStates(47, 2);
break;
case 48:
- if (curChar == 47) {
- jjAddStates(7, 9);
- }
+ if (curChar == 47)
+ jjAddStates(10, 12);
break;
case 50:
- if ((0xffffffffffffdbffL & l) != 0L) {
- jjCheckNAddStates(18, 20);
- }
+ if ((0xffffffffffffdbffL & l) != 0L)
+ jjCheckNAddStates(0, 2);
break;
case 51:
- if ((0x2400L & l) != 0L && kind > 6) {
+ if ((0x2400L & l) != 0L && kind > 6)
kind = 6;
- }
break;
case 52:
- if (curChar == 10 && kind > 6) {
+ if (curChar == 10 && kind > 6)
kind = 6;
- }
break;
case 53:
- if (curChar == 13) {
+ if (curChar == 13)
jjstateSet[jjnewStateCnt++] = 52;
- }
break;
case 54:
- if (curChar == 42) {
+ if (curChar == 42)
jjCheckNAddTwoStates(55, 56);
- }
break;
case 55:
- if ((0xfffffbffffffffffL & l) != 0L) {
+ if ((0xfffffbffffffffffL & l) != 0L)
jjCheckNAddTwoStates(55, 56);
- }
break;
case 56:
- if (curChar == 42) {
+ if (curChar == 42)
jjCheckNAddStates(34, 36);
- }
break;
case 57:
- if ((0xffff7bffffffffffL & l) != 0L) {
+ if ((0xffff7bffffffffffL & l) != 0L)
jjCheckNAddTwoStates(58, 56);
- }
break;
case 58:
- if ((0xfffffbffffffffffL & l) != 0L) {
+ if ((0xfffffbffffffffffL & l) != 0L)
jjCheckNAddTwoStates(58, 56);
- }
break;
case 59:
- if (curChar == 47 && kind > 7) {
+ if (curChar == 47 && kind > 7)
kind = 7;
- }
break;
case 60:
- if (curChar == 42) {
+ if (curChar == 42)
jjstateSet[jjnewStateCnt++] = 54;
- }
break;
case 61:
- if (curChar == 42) {
+ if (curChar == 42)
jjCheckNAddTwoStates(62, 63);
- }
break;
case 62:
- if ((0xfffffbffffffffffL & l) != 0L) {
+ if ((0xfffffbffffffffffL & l) != 0L)
jjCheckNAddTwoStates(62, 63);
- }
break;
case 63:
- if (curChar == 42) {
+ if (curChar == 42)
jjCheckNAddStates(37, 39);
- }
break;
case 64:
- if ((0xffff7bffffffffffL & l) != 0L) {
+ if ((0xffff7bffffffffffL & l) != 0L)
jjCheckNAddTwoStates(65, 63);
- }
break;
case 65:
- if ((0xfffffbffffffffffL & l) != 0L) {
+ if ((0xfffffbffffffffffL & l) != 0L)
jjCheckNAddTwoStates(65, 63);
- }
break;
case 66:
- if (curChar == 47 && kind > 8) {
+ if (curChar == 47 && kind > 8)
kind = 8;
- }
break;
default : break;
}
@@ -1357,97 +1188,79 @@ else if (curChar == 48)
else if (curChar < 128)
{
long l = 1L << (curChar & 077);
- //MatchLoop
do
{
switch(jjstateSet[--i])
{
case 0:
case 28:
- if ((0x7fffffe87fffffeL & l) == 0L) {
+ if ((0x7fffffe87fffffeL & l) == 0L)
break;
- }
- if (kind > 67) {
+ if (kind > 67)
kind = 67;
- }
jjCheckNAdd(28);
break;
case 2:
- if ((0x100000001000L & l) != 0L && kind > 59) {
+ if ((0x100000001000L & l) != 0L && kind > 59)
kind = 59;
- }
break;
case 5:
- if ((0x2000000020L & l) != 0L) {
+ if ((0x2000000020L & l) != 0L)
jjAddStates(40, 41);
- }
break;
case 8:
- if ((0x5000000050L & l) != 0L && kind > 63) {
+ if ((0x5000000050L & l) != 0L && kind > 63)
kind = 63;
- }
break;
case 10:
- if ((0xffffffffefffffffL & l) != 0L) {
+ if ((0xffffffffefffffffL & l) != 0L)
jjCheckNAdd(11);
- }
break;
case 12:
- if (curChar == 92) {
+ if (curChar == 92)
jjAddStates(42, 44);
- }
break;
case 13:
- if ((0x14404410000000L & l) != 0L) {
+ if ((0x14404410000000L & l) != 0L)
jjCheckNAdd(11);
- }
break;
case 19:
- if ((0xffffffffefffffffL & l) != 0L) {
- jjCheckNAddStates(10, 12);
- }
+ if ((0xffffffffefffffffL & l) != 0L)
+ jjCheckNAddStates(13, 15);
break;
case 20:
- if (curChar == 92) {
+ if (curChar == 92)
jjAddStates(45, 47);
- }
break;
case 21:
- if ((0x14404410000000L & l) != 0L) {
- jjCheckNAddStates(10, 12);
- }
+ if ((0x14404410000000L & l) != 0L)
+ jjCheckNAddStates(13, 15);
break;
case 33:
- if ((0x2000000020L & l) != 0L) {
+ if ((0x2000000020L & l) != 0L)
jjAddStates(48, 49);
- }
break;
case 37:
- if ((0x2000000020L & l) != 0L) {
+ if ((0x2000000020L & l) != 0L)
jjAddStates(50, 51);
- }
break;
case 41:
- if ((0x2000000020L & l) != 0L) {
+ if ((0x2000000020L & l) != 0L)
jjAddStates(52, 53);
- }
break;
case 45:
- if ((0x100000001000000L & l) != 0L) {
+ if ((0x100000001000000L & l) != 0L)
jjCheckNAdd(46);
- }
break;
case 46:
- if ((0x7e0000007eL & l) == 0L) {
+ if ((0x7e0000007eL & l) == 0L)
break;
- }
- if (kind > 59) {
+ if (kind > 59)
kind = 59;
- }
jjCheckNAddTwoStates(46, 2);
break;
case 50:
- jjAddStates(18, 20);
+ jjAddStates(0, 2);
break;
case 55:
jjCheckNAddTwoStates(55, 56);
@@ -1474,57 +1287,47 @@ else if (curChar < 128)
long l1 = 1L << (hiByte & 077);
int i2 = (curChar & 0xff) >> 6;
long l2 = 1L << (curChar & 077);
- //MatchLoop
do
{
switch(jjstateSet[--i])
{
case 0:
case 28:
- if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) {
+ if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
break;
- }
- if (kind > 67) {
+ if (kind > 67)
kind = 67;
- }
jjCheckNAdd(28);
break;
case 10:
- if (jjCanMove_0(hiByte, i1, i2, l1, l2)) {
+ if (jjCanMove_0(hiByte, i1, i2, l1, l2))
jjstateSet[jjnewStateCnt++] = 11;
- }
break;
case 19:
- if (jjCanMove_0(hiByte, i1, i2, l1, l2)) {
- jjAddStates(10, 12);
- }
+ if (jjCanMove_0(hiByte, i1, i2, l1, l2))
+ jjAddStates(13, 15);
break;
case 50:
- if (jjCanMove_0(hiByte, i1, i2, l1, l2)) {
- jjAddStates(18, 20);
- }
+ if (jjCanMove_0(hiByte, i1, i2, l1, l2))
+ jjAddStates(0, 2);
break;
case 55:
- if (jjCanMove_0(hiByte, i1, i2, l1, l2)) {
+ if (jjCanMove_0(hiByte, i1, i2, l1, l2))
jjCheckNAddTwoStates(55, 56);
- }
break;
case 57:
case 58:
- if (jjCanMove_0(hiByte, i1, i2, l1, l2)) {
+ if (jjCanMove_0(hiByte, i1, i2, l1, l2))
jjCheckNAddTwoStates(58, 56);
- }
break;
case 62:
- if (jjCanMove_0(hiByte, i1, i2, l1, l2)) {
+ if (jjCanMove_0(hiByte, i1, i2, l1, l2))
jjCheckNAddTwoStates(62, 63);
- }
break;
case 64:
case 65:
- if (jjCanMove_0(hiByte, i1, i2, l1, l2)) {
+ if (jjCanMove_0(hiByte, i1, i2, l1, l2))
jjCheckNAddTwoStates(65, 63);
- }
break;
default : break;
}
@@ -1537,16 +1340,15 @@ else if (curChar < 128)
kind = 0x7fffffff;
}
++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 67 - (jjnewStateCnt = startsAt))) {
+ if ((i = jjnewStateCnt) == (startsAt = 67 - (jjnewStateCnt = startsAt)))
return curPos;
- }
try { curChar = input_stream.readChar(); }
catch(java.io.IOException e) { return curPos; }
}
}
static final int[] jjnextStates = {
- 30, 31, 36, 37, 40, 41, 8, 49, 60, 61, 19, 20, 22, 10, 12, 45,
- 47, 2, 50, 51, 53, 4, 5, 8, 19, 20, 24, 22, 32, 33, 8, 40,
+ 50, 51, 53, 30, 31, 36, 37, 40, 41, 8, 49, 60, 61, 19, 20, 22,
+ 10, 12, 45, 47, 2, 4, 5, 8, 19, 20, 24, 22, 32, 33, 8, 40,
41, 8, 56, 57, 59, 63, 64, 66, 6, 7, 13, 14, 16, 21, 23, 25,
34, 35, 38, 39, 42, 43,
};
@@ -1557,9 +1359,8 @@ private static final boolean jjCanMove_0(int hiByte, int i1, int i2, long l1, lo
case 0:
return ((jjbitVec2[i2] & l2) != 0L);
default :
- if ((jjbitVec0[i1] & l1) != 0L) {
+ if ((jjbitVec0[i1] & l1) != 0L)
return true;
- }
return false;
}
}
@@ -1578,12 +1379,13 @@ private static final boolean jjCanMove_1(int hiByte, int i1, int i2, long l1, lo
case 61:
return ((jjbitVec8[i2] & l2) != 0L);
default :
- if ((jjbitVec3[i1] & l1) != 0L) {
+ if ((jjbitVec3[i1] & l1) != 0L)
return true;
- }
return false;
}
}
+
+/** Token literal values. */
public static final String[] jjstrLiteralImages = {
"", null, null, null, null, null, null, null, null,
"\141\142\163\164\162\141\143\164", "\142\157\157\154\145\141\156", "\142\162\145\141\153", "\142\171\164\145",
@@ -1606,6 +1408,8 @@ private static final boolean jjCanMove_1(int hiByte, int i1, int i2, long l1, lo
"\46\46", "\53\53", "\55\55", "\53", "\55", "\52", "\57", "\46", "\174", "\136", "\45",
"\74\74", "\76\76", "\76\76\76", "\53\75", "\55\75", "\52\75", "\57\75", "\46\75",
"\174\75", "\136\75", "\45\75", "\74\74\75", "\76\76\75", "\76\76\76\75", };
+
+/** Lexer state names. */
public static final String[] lexStateNames = {
"DEFAULT",
};
@@ -1618,61 +1422,76 @@ private static final boolean jjCanMove_1(int hiByte, int i1, int i2, long l1, lo
static final long[] jjtoSpecial = {
0x1c0L, 0x0L,
};
-private ASCII_UCodeESC_CharStream input_stream;
+protected JavaCharStream input_stream;
private final int[] jjrounds = new int[67];
private final int[] jjstateSet = new int[134];
protected char curChar;
-public ExpressionParserTokenManager(ASCII_UCodeESC_CharStream stream)
-{
- if (ASCII_UCodeESC_CharStream.staticFlag) {
+/** Constructor. */
+public ExpressionParserTokenManager(JavaCharStream stream){
+ if (JavaCharStream.staticFlag)
throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
- }
input_stream = stream;
}
-public ExpressionParserTokenManager(ASCII_UCodeESC_CharStream stream, int lexState)
-{
+
+/** Constructor. */
+public ExpressionParserTokenManager(JavaCharStream stream, int lexState){
this(stream);
SwitchTo(lexState);
}
-public void ReInit(ASCII_UCodeESC_CharStream stream)
+
+/** Reinitialise parser. */
+public void ReInit(JavaCharStream stream)
{
jjmatchedPos = jjnewStateCnt = 0;
curLexState = defaultLexState;
input_stream = stream;
ReInitRounds();
}
-private final void ReInitRounds()
+private void ReInitRounds()
{
int i;
jjround = 0x80000001;
- for (i = 67; i-- > 0;) {
+ for (i = 67; i-- > 0;)
jjrounds[i] = 0x80000000;
}
-}
-public void ReInit(ASCII_UCodeESC_CharStream stream, int lexState)
+
+/** Reinitialise parser. */
+public void ReInit(JavaCharStream stream, int lexState)
{
ReInit(stream);
SwitchTo(lexState);
}
+
+/** Switch to specified lex state. */
public void SwitchTo(int lexState)
{
- if (lexState >= 1 || lexState < 0) {
+ if (lexState >= 1 || lexState < 0)
throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
- } else {
+ else
curLexState = lexState;
}
-}
-private final Token jjFillToken()
+protected Token jjFillToken()
{
- Token t = Token.newToken(jjmatchedKind);
- t.kind = jjmatchedKind;
+ final Token t;
+ final String curTokenImage;
+ final int beginLine;
+ final int endLine;
+ final int beginColumn;
+ final int endColumn;
String im = jjstrLiteralImages[jjmatchedKind];
- t.image = (im == null) ? input_stream.GetImage() : im;
- t.beginLine = input_stream.getBeginLine();
- t.beginColumn = input_stream.getBeginColumn();
- t.endLine = input_stream.getEndLine();
- t.endColumn = input_stream.getEndColumn();
+ curTokenImage = (im == null) ? input_stream.GetImage() : im;
+ beginLine = input_stream.getBeginLine();
+ beginColumn = input_stream.getBeginColumn();
+ endLine = input_stream.getEndLine();
+ endColumn = input_stream.getEndColumn();
+ t = Token.newToken(jjmatchedKind, curTokenImage);
+
+ t.beginLine = beginLine;
+ t.endLine = endLine;
+ t.beginColumn = beginColumn;
+ t.endColumn = endColumn;
+
return t;
}
@@ -1683,7 +1502,8 @@ private final Token jjFillToken()
int jjmatchedPos;
int jjmatchedKind;
-public final Token getNextToken()
+/** Get the next Token. */
+public Token getNextToken()
{
Token specialToken = null;
Token matchedToken;
@@ -1704,20 +1524,18 @@ public final Token getNextToken()
return matchedToken;
}
- try {
- while (curChar <= 32 && (0x100003600L & (1L << curChar)) != 0L) {
+ try { input_stream.backup(0);
+ while (curChar <= 32 && (0x100003600L & (1L << curChar)) != 0L)
curChar = input_stream.BeginToken();
}
- }
catch (java.io.IOException e1) { continue EOFLoop; }
jjmatchedKind = 0x7fffffff;
jjmatchedPos = 0;
curPos = jjMoveStringLiteralDfa0_0();
if (jjmatchedKind != 0x7fffffff)
{
- if (jjmatchedPos + 1 < curPos) {
+ if (jjmatchedPos + 1 < curPos)
input_stream.backup(curPos - jjmatchedPos - 1);
- }
if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
{
matchedToken = jjFillToken();
@@ -1729,9 +1547,9 @@ public final Token getNextToken()
if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
{
matchedToken = jjFillToken();
- if (specialToken == null) {
+ if (specialToken == null)
specialToken = matchedToken;
- } else
+ else
{
matchedToken.specialToken = specialToken;
specialToken = (specialToken.next = matchedToken);
@@ -1751,9 +1569,9 @@ public final Token getNextToken()
if (curChar == '\n' || curChar == '\r') {
error_line++;
error_column = 0;
- } else {
- error_column++;
}
+ else
+ error_column++;
}
if (!EOFSeen) {
input_stream.backup(1);
@@ -1763,4 +1581,31 @@ public final Token getNextToken()
}
}
+private void jjCheckNAdd(int state)
+{
+ if (jjrounds[state] != jjround)
+ {
+ jjstateSet[jjnewStateCnt++] = state;
+ jjrounds[state] = jjround;
+ }
+}
+private void jjAddStates(int start, int end)
+{
+ do {
+ jjstateSet[jjnewStateCnt++] = jjnextStates[start];
+ } while (start++ != end);
+}
+private void jjCheckNAddTwoStates(int state1, int state2)
+{
+ jjCheckNAdd(state1);
+ jjCheckNAdd(state2);
+}
+
+private void jjCheckNAddStates(int start, int end)
+{
+ do {
+ jjCheckNAdd(jjnextStates[start]);
+ } while (start++ != end);
+}
+
}
diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/expr/JavaCharStream.java b/jdk/src/share/classes/com/sun/tools/example/debug/expr/JavaCharStream.java
new file mode 100644
index 0000000000..cc4581f1a2
--- /dev/null
+++ b/jdk/src/share/classes/com/sun/tools/example/debug/expr/JavaCharStream.java
@@ -0,0 +1,642 @@
+/*
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* Generated By:JavaCC: Do not edit this line. JavaCharStream.java Version 5.0 */
+/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
+package com.sun.tools.example.debug.expr;
+
+/**
+ * An implementation of interface CharStream, where the stream is assumed to
+ * contain only ASCII characters (with java-like unicode escape processing).
+ */
+
+public
+class JavaCharStream
+{
+ /** Whether parser is static. */
+ public static final boolean staticFlag = false;
+
+ static final int hexval(char c) throws java.io.IOException {
+ switch(c)
+ {
+ case '0' :
+ return 0;
+ case '1' :
+ return 1;
+ case '2' :
+ return 2;
+ case '3' :
+ return 3;
+ case '4' :
+ return 4;
+ case '5' :
+ return 5;
+ case '6' :
+ return 6;
+ case '7' :
+ return 7;
+ case '8' :
+ return 8;
+ case '9' :
+ return 9;
+
+ case 'a' :
+ case 'A' :
+ return 10;
+ case 'b' :
+ case 'B' :
+ return 11;
+ case 'c' :
+ case 'C' :
+ return 12;
+ case 'd' :
+ case 'D' :
+ return 13;
+ case 'e' :
+ case 'E' :
+ return 14;
+ case 'f' :
+ case 'F' :
+ return 15;
+ }
+
+ throw new java.io.IOException(); // Should never come here
+ }
+
+/** Position in buffer. */
+ public int bufpos = -1;
+ int bufsize;
+ int available;
+ int tokenBegin;
+ protected int bufline[];
+ protected int bufcolumn[];
+
+ protected int column = 0;
+ protected int line = 1;
+
+ protected boolean prevCharIsCR = false;
+ protected boolean prevCharIsLF = false;
+
+ protected java.io.Reader inputStream;
+
+ protected char[] nextCharBuf;
+ protected char[] buffer;
+ protected int maxNextCharInd = 0;
+ protected int nextCharInd = -1;
+ protected int inBuf = 0;
+ protected int tabSize = 8;
+
+ protected void setTabSize(int i) { tabSize = i; }
+ protected int getTabSize(int i) { return tabSize; }
+
+ protected void ExpandBuff(boolean wrapAround)
+ {
+ char[] newbuffer = new char[bufsize + 2048];
+ int newbufline[] = new int[bufsize + 2048];
+ int newbufcolumn[] = new int[bufsize + 2048];
+
+ try
+ {
+ if (wrapAround)
+ {
+ System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
+ System.arraycopy(buffer, 0, newbuffer, bufsize - tokenBegin, bufpos);
+ buffer = newbuffer;
+
+ System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
+ System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
+ bufline = newbufline;
+
+ System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
+ System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
+ bufcolumn = newbufcolumn;
+
+ bufpos += (bufsize - tokenBegin);
+ }
+ else
+ {
+ System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
+ buffer = newbuffer;
+
+ System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
+ bufline = newbufline;
+
+ System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
+ bufcolumn = newbufcolumn;
+
+ bufpos -= tokenBegin;
+ }
+ }
+ catch (Throwable t)
+ {
+ throw new Error(t.getMessage());
+ }
+
+ available = (bufsize += 2048);
+ tokenBegin = 0;
+ }
+
+ protected void FillBuff() throws java.io.IOException
+ {
+ int i;
+ if (maxNextCharInd == 4096)
+ maxNextCharInd = nextCharInd = 0;
+
+ try {
+ if ((i = inputStream.read(nextCharBuf, maxNextCharInd,
+ 4096 - maxNextCharInd)) == -1)
+ {
+ inputStream.close();
+ throw new java.io.IOException();
+ }
+ else
+ maxNextCharInd += i;
+ return;
+ }
+ catch(java.io.IOException e) {
+ if (bufpos != 0)
+ {
+ --bufpos;
+ backup(0);
+ }
+ else
+ {
+ bufline[bufpos] = line;
+ bufcolumn[bufpos] = column;
+ }
+ throw e;
+ }
+ }
+
+ protected char ReadByte() throws java.io.IOException
+ {
+ if (++nextCharInd >= maxNextCharInd)
+ FillBuff();
+
+ return nextCharBuf[nextCharInd];
+ }
+
+/** @return starting character for token. */
+ public char BeginToken() throws java.io.IOException
+ {
+ if (inBuf > 0)
+ {
+ --inBuf;
+
+ if (++bufpos == bufsize)
+ bufpos = 0;
+
+ tokenBegin = bufpos;
+ return buffer[bufpos];
+ }
+
+ tokenBegin = 0;
+ bufpos = -1;
+
+ return readChar();
+ }
+
+ protected void AdjustBuffSize()
+ {
+ if (available == bufsize)
+ {
+ if (tokenBegin > 2048)
+ {
+ bufpos = 0;
+ available = tokenBegin;
+ }
+ else
+ ExpandBuff(false);
+ }
+ else if (available > tokenBegin)
+ available = bufsize;
+ else if ((tokenBegin - available) < 2048)
+ ExpandBuff(true);
+ else
+ available = tokenBegin;
+ }
+
+ protected void UpdateLineColumn(char c)
+ {
+ column++;
+
+ if (prevCharIsLF)
+ {
+ prevCharIsLF = false;
+ line += (column = 1);
+ }
+ else if (prevCharIsCR)
+ {
+ prevCharIsCR = false;
+ if (c == '\n')
+ {
+ prevCharIsLF = true;
+ }
+ else
+ line += (column = 1);
+ }
+
+ switch (c)
+ {
+ case '\r' :
+ prevCharIsCR = true;
+ break;
+ case '\n' :
+ prevCharIsLF = true;
+ break;
+ case '\t' :
+ column--;
+ column += (tabSize - (column % tabSize));
+ break;
+ default :
+ break;
+ }
+
+ bufline[bufpos] = line;
+ bufcolumn[bufpos] = column;
+ }
+
+/** Read a character. */
+ public char readChar() throws java.io.IOException
+ {
+ if (inBuf > 0)
+ {
+ --inBuf;
+
+ if (++bufpos == bufsize)
+ bufpos = 0;
+
+ return buffer[bufpos];
+ }
+
+ char c;
+
+ if (++bufpos == available)
+ AdjustBuffSize();
+
+ if ((buffer[bufpos] = c = ReadByte()) == '\\')
+ {
+ UpdateLineColumn(c);
+
+ int backSlashCnt = 1;
+
+ for (;;) // Read all the backslashes
+ {
+ if (++bufpos == available)
+ AdjustBuffSize();
+
+ try
+ {
+ if ((buffer[bufpos] = c = ReadByte()) != '\\')
+ {
+ UpdateLineColumn(c);
+ // found a non-backslash char.
+ if ((c == 'u') && ((backSlashCnt & 1) == 1))
+ {
+ if (--bufpos < 0)
+ bufpos = bufsize - 1;
+
+ break;
+ }
+
+ backup(backSlashCnt);
+ return '\\';
+ }
+ }
+ catch(java.io.IOException e)
+ {
+ // We are returning one backslash so we should only backup (count-1)
+ if (backSlashCnt > 1)
+ backup(backSlashCnt-1);
+
+ return '\\';
+ }
+
+ UpdateLineColumn(c);
+ backSlashCnt++;
+ }
+
+ // Here, we have seen an odd number of backslash's followed by a 'u'
+ try
+ {
+ while ((c = ReadByte()) == 'u')
+ ++column;
+
+ buffer[bufpos] = c = (char)(hexval(c) << 12 |
+ hexval(ReadByte()) << 8 |
+ hexval(ReadByte()) << 4 |
+ hexval(ReadByte()));
+
+ column += 4;
+ }
+ catch(java.io.IOException e)
+ {
+ throw new Error("Invalid escape character at line " + line +
+ " column " + column + ".");
+ }
+
+ if (backSlashCnt == 1)
+ return c;
+ else
+ {
+ backup(backSlashCnt - 1);
+ return '\\';
+ }
+ }
+ else
+ {
+ UpdateLineColumn(c);
+ return c;
+ }
+ }
+
+ @Deprecated
+ /**
+ * @deprecated
+ * @see #getEndColumn
+ */
+ public int getColumn() {
+ return bufcolumn[bufpos];
+ }
+
+ @Deprecated
+ /**
+ * @deprecated
+ * @see #getEndLine
+ */
+ public int getLine() {
+ return bufline[bufpos];
+ }
+
+/** Get end column. */
+ public int getEndColumn() {
+ return bufcolumn[bufpos];
+ }
+
+/** Get end line. */
+ public int getEndLine() {
+ return bufline[bufpos];
+ }
+
+/** @return column of token start */
+ public int getBeginColumn() {
+ return bufcolumn[tokenBegin];
+ }
+
+/** @return line number of token start */
+ public int getBeginLine() {
+ return bufline[tokenBegin];
+ }
+
+/** Retreat. */
+ public void backup(int amount) {
+
+ inBuf += amount;
+ if ((bufpos -= amount) < 0)
+ bufpos += bufsize;
+ }
+
+/** Constructor. */
+ public JavaCharStream(java.io.Reader dstream,
+ int startline, int startcolumn, int buffersize)
+ {
+ inputStream = dstream;
+ line = startline;
+ column = startcolumn - 1;
+
+ available = bufsize = buffersize;
+ buffer = new char[buffersize];
+ bufline = new int[buffersize];
+ bufcolumn = new int[buffersize];
+ nextCharBuf = new char[4096];
+ }
+
+/** Constructor. */
+ public JavaCharStream(java.io.Reader dstream,
+ int startline, int startcolumn)
+ {
+ this(dstream, startline, startcolumn, 4096);
+ }
+
+/** Constructor. */
+ public JavaCharStream(java.io.Reader dstream)
+ {
+ this(dstream, 1, 1, 4096);
+ }
+/** Reinitialise. */
+ public void ReInit(java.io.Reader dstream,
+ int startline, int startcolumn, int buffersize)
+ {
+ inputStream = dstream;
+ line = startline;
+ column = startcolumn - 1;
+
+ if (buffer == null || buffersize != buffer.length)
+ {
+ available = bufsize = buffersize;
+ buffer = new char[buffersize];
+ bufline = new int[buffersize];
+ bufcolumn = new int[buffersize];
+ nextCharBuf = new char[4096];
+ }
+ prevCharIsLF = prevCharIsCR = false;
+ tokenBegin = inBuf = maxNextCharInd = 0;
+ nextCharInd = bufpos = -1;
+ }
+
+/** Reinitialise. */
+ public void ReInit(java.io.Reader dstream,
+ int startline, int startcolumn)
+ {
+ ReInit(dstream, startline, startcolumn, 4096);
+ }
+
+/** Reinitialise. */
+ public void ReInit(java.io.Reader dstream)
+ {
+ ReInit(dstream, 1, 1, 4096);
+ }
+/** Constructor. */
+ public JavaCharStream(java.io.InputStream dstream, String encoding, int startline,
+ int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
+ {
+ this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
+ }
+
+/** Constructor. */
+ public JavaCharStream(java.io.InputStream dstream, int startline,
+ int startcolumn, int buffersize)
+ {
+ this(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
+ }
+
+/** Constructor. */
+ public JavaCharStream(java.io.InputStream dstream, String encoding, int startline,
+ int startcolumn) throws java.io.UnsupportedEncodingException
+ {
+ this(dstream, encoding, startline, startcolumn, 4096);
+ }
+
+/** Constructor. */
+ public JavaCharStream(java.io.InputStream dstream, int startline,
+ int startcolumn)
+ {
+ this(dstream, startline, startcolumn, 4096);
+ }
+
+/** Constructor. */
+ public JavaCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
+ {
+ this(dstream, encoding, 1, 1, 4096);
+ }
+
+/** Constructor. */
+ public JavaCharStream(java.io.InputStream dstream)
+ {
+ this(dstream, 1, 1, 4096);
+ }
+
+/** Reinitialise. */
+ public void ReInit(java.io.InputStream dstream, String encoding, int startline,
+ int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
+ {
+ ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
+ }
+
+/** Reinitialise. */
+ public void ReInit(java.io.InputStream dstream, int startline,
+ int startcolumn, int buffersize)
+ {
+ ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
+ }
+/** Reinitialise. */
+ public void ReInit(java.io.InputStream dstream, String encoding, int startline,
+ int startcolumn) throws java.io.UnsupportedEncodingException
+ {
+ ReInit(dstream, encoding, startline, startcolumn, 4096);
+ }
+/** Reinitialise. */
+ public void ReInit(java.io.InputStream dstream, int startline,
+ int startcolumn)
+ {
+ ReInit(dstream, startline, startcolumn, 4096);
+ }
+/** Reinitialise. */
+ public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
+ {
+ ReInit(dstream, encoding, 1, 1, 4096);
+ }
+
+/** Reinitialise. */
+ public void ReInit(java.io.InputStream dstream)
+ {
+ ReInit(dstream, 1, 1, 4096);
+ }
+
+ /** @return token image as String */
+ public String GetImage()
+ {
+ if (bufpos >= tokenBegin)
+ return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
+ else
+ return new String(buffer, tokenBegin, bufsize - tokenBegin) +
+ new String(buffer, 0, bufpos + 1);
+ }
+
+ /** @return suffix */
+ public char[] GetSuffix(int len)
+ {
+ char[] ret = new char[len];
+
+ if ((bufpos + 1) >= len)
+ System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
+ else
+ {
+ System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
+ len - bufpos - 1);
+ System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
+ }
+
+ return ret;
+ }
+
+ /** Set buffers back to null when finished. */
+ public void Done()
+ {
+ nextCharBuf = null;
+ buffer = null;
+ bufline = null;
+ bufcolumn = null;
+ }
+
+ /**
+ * Method to adjust line and column numbers for the start of a token.
+ */
+ public void adjustBeginLineColumn(int newLine, int newCol)
+ {
+ int start = tokenBegin;
+ int len;
+
+ if (bufpos >= tokenBegin)
+ {
+ len = bufpos - tokenBegin + inBuf + 1;
+ }
+ else
+ {
+ len = bufsize - tokenBegin + bufpos + 1 + inBuf;
+ }
+
+ int i = 0, j = 0, k = 0;
+ int nextColDiff = 0, columnDiff = 0;
+
+ while (i < len && bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
+ {
+ bufline[j] = newLine;
+ nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
+ bufcolumn[j] = newCol + columnDiff;
+ columnDiff = nextColDiff;
+ i++;
+ }
+
+ if (i < len)
+ {
+ bufline[j] = newLine++;
+ bufcolumn[j] = newCol + columnDiff;
+
+ while (i++ < len)
+ {
+ if (bufline[j = start % bufsize] != bufline[++start % bufsize])
+ bufline[j] = newLine++;
+ else
+ bufline[j] = newLine;
+ }
+ }
+
+ line = bufline[j];
+ column = bufcolumn[j];
+ }
+
+}
+/* JavaCC - OriginalChecksum=17a580b005f6229e8445521923427bab (do not edit this line) */
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 1737137b9c..4ae7d68b41 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 (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -743,7 +743,30 @@ static LValue makeDouble(VirtualMachine vm, Token token) {
}
static LValue makeInteger(VirtualMachine vm, Token token) {
- return make(vm, Integer.parseInt(token.image));
+ String image = token.image;
+
+ // Here we have to deal with the fact that an INTEGER_LITERAL
+ // can be DECIMAL_LITERAL, HEX_LITERAL or OCTAL_LITERAL. All of these
+ // can have an optional "L" or "l" at the end signifying that it is
+ // a long value. Otherwise, we treat values that are in range for an
+ // int as int and anything else as long.
+
+ if (image.endsWith("L") || image.endsWith("l")) {
+ // This is a long without doubt - drop the final "Ll" and decode
+ image = image.substring(0, image.length() - 1);
+ return make(vm, Long.decode(image));
+ }
+
+ long longValue = Long.decode(image);
+ int intValue = (int) longValue;
+ if (intValue == longValue) {
+ // the value fits in an integer, lets return it as an integer
+ return make(vm, intValue);
+ }
+ else {
+ // otherwise treat it as a long
+ return make(vm, longValue);
+ }
}
static LValue makeShort(VirtualMachine vm, Token token) {
@@ -1065,4 +1088,76 @@ static LValue operation(VirtualMachine vm, Token token,
return make(vm, res);
}
}
+
+ static LValue operation(VirtualMachine vm, Token token, LValue rightL,
+ ExpressionParser.GetFrame frameGetter)
+ throws ParseException {
+ String op = token.image;
+ Value right = rightL.interiorGetValue();
+ if (right instanceof ObjectReference) {
+ throw new ParseException("Invalid operation '" + op
+ + "' on an Object");
+ }
+ if (right instanceof BooleanValue) {
+ if (op.equals("!")) {
+ boolean rr = ((BooleanValue) right).value();
+ return make(vm, !rr);
+ }
+ throw new ParseException("Invalid operation '" + op
+ + "' on a Boolean");
+ }
+ // from here on, we know it is a integer kind of type
+ PrimitiveValue primRight = (PrimitiveValue) right;
+ if (primRight instanceof DoubleValue) {
+ double rr = primRight.doubleValue();
+ double res;
+ if (op.equals("+")) {
+ res = rr;
+ } else if (op.equals("-")) {
+ res = -rr;
+ } else {
+ throw new ParseException("Unknown operation: " + op);
+ }
+ return make(vm, res);
+ }
+ if (primRight instanceof FloatValue) {
+ float rr = primRight.floatValue();
+ float res;
+ if (op.equals("+")) {
+ res = rr;
+ } else if (op.equals("-")) {
+ res = -rr;
+ } else {
+ throw new ParseException("Unknown operation: " + op);
+ }
+ return make(vm, res);
+ }
+ if (primRight instanceof LongValue) {
+ long rr = primRight.longValue();
+ long res;
+ if (op.equals("+")) {
+ res = rr;
+ } else if (op.equals("-")) {
+ res = -rr;
+ } else if (op.equals("~")) {
+ res = ~rr;
+ } else {
+ throw new ParseException("Unknown operation: " + op);
+ }
+ return make(vm, res);
+ } else {
+ int rr = primRight.intValue();
+ int res;
+ if (op.equals("+")) {
+ res = rr;
+ } else if (op.equals("-")) {
+ res = -rr;
+ } else if (op.equals("~")) {
+ res = ~rr;
+ } else {
+ throw new ParseException("Unknown operation: " + op);
+ }
+ return make(vm, res);
+ }
+ }
}
diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/expr/ParseException.java b/jdk/src/share/classes/com/sun/tools/example/debug/expr/ParseException.java
index 795b40c001..6df5e4bafc 100644
--- a/jdk/src/share/classes/com/sun/tools/example/debug/expr/ParseException.java
+++ b/jdk/src/share/classes/com/sun/tools/example/debug/expr/ParseException.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* 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,16 +23,8 @@
* questions.
*/
-/*
- * This source code is provided to illustrate the usage of a given feature
- * or technique and has been deliberately simplified. Additional steps
- * required for a production-quality application, such as security checks,
- * input validation and proper error handling, might not be present in
- * this sample code.
- */
-
-
-/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 0.7pre6 */
+/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 5.0 */
+/* JavaCCOptions:KEEP_LINE_COL=null */
package com.sun.tools.example.debug.expr;
/**
@@ -46,27 +38,25 @@
*/
public class ParseException extends Exception {
- private static final long serialVersionUID = 7978489144303647901L;
+ /**
+ * The version identifier for this Serializable class.
+ * Increment only if the serialized form of the
+ * class changes.
+ */
+ private static final long serialVersionUID = 1L;
/**
* This constructor is used by the method "generateParseException"
* in the generated parser. Calling this constructor generates
* a new object of this type with the fields "currentToken",
- * "expectedTokenSequences", and "tokenImage" set. The boolean
- * flag "specialConstructor" is also set to true to indicate that
- * this constructor was used to create this object.
- * This constructor calls its super class with the empty string
- * to force the "toString" method of parent class "Throwable" to
- * print the error message in the form:
- * ParseException:
+ * "expectedTokenSequences", and "tokenImage" set.
*/
public ParseException(Token currentTokenVal,
int[][] expectedTokenSequencesVal,
String[] tokenImageVal
)
{
- super("");
- specialConstructor = true;
+ super(initialise(currentTokenVal, expectedTokenSequencesVal, tokenImageVal));
currentToken = currentTokenVal;
expectedTokenSequences = expectedTokenSequencesVal;
tokenImage = tokenImageVal;
@@ -84,20 +74,13 @@ public ParseException(Token currentTokenVal,
public ParseException() {
super();
- specialConstructor = false;
}
+ /** Constructor with message. */
public ParseException(String message) {
super(message);
- specialConstructor = false;
}
- /**
- * This variable determines which constructor was used to create
- * this object and thereby affects the semantics of the
- * "getMessage" method (see below).
- */
- protected boolean specialConstructor;
/**
* This is the last token that has been consumed successfully. If
@@ -121,54 +104,52 @@ public ParseException(String message) {
public String[] tokenImage;
/**
- * This method has the standard behavior when this object has been
- * created using the standard constructors. Otherwise, it uses
- * "currentToken" and "expectedTokenSequences" to generate a parse
+ * It uses "currentToken" and "expectedTokenSequences" to generate a parse
* error message and returns it. If this object has been created
* due to a parse error, and you do not catch it (it gets thrown
- * from the parser), then this method is called during the printing
- * of the final stack trace, and hence the correct error message
+ * from the parser) the correct error message
* gets displayed.
*/
- @Override
- public String getMessage() {
- if (!specialConstructor) {
- return super.getMessage();
- }
- String expected = "";
+ private static String initialise(Token currentToken,
+ int[][] expectedTokenSequences,
+ String[] tokenImage) {
+ String eol = System.getProperty("line.separator", "\n");
+ StringBuffer expected = new StringBuffer();
int maxSize = 0;
- for (int[] expectedTokenSequence : expectedTokenSequences) {
- if (maxSize < expectedTokenSequence.length) {
- maxSize = expectedTokenSequence.length;
+ for (int i = 0; i < expectedTokenSequences.length; i++) {
+ if (maxSize < expectedTokenSequences[i].length) {
+ maxSize = expectedTokenSequences[i].length;
}
- for (int j = 0; j < expectedTokenSequence.length; j++) {
- expected += tokenImage[expectedTokenSequence[j]] + " ";
+ for (int j = 0; j < expectedTokenSequences[i].length; j++) {
+ expected.append(tokenImage[expectedTokenSequences[i][j]]).append(' ');
}
- if (expectedTokenSequence[expectedTokenSequence.length - 1] != 0) {
- expected += "...";
+ if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
+ expected.append("...");
}
- expected += eol + " ";
+ expected.append(eol).append(" ");
}
String retval = "Encountered \"";
Token tok = currentToken.next;
for (int i = 0; i < maxSize; i++) {
- if (i != 0) {
- retval += " ";
- }
+ if (i != 0) retval += " ";
if (tok.kind == 0) {
retval += tokenImage[0];
break;
}
+ retval += " " + tokenImage[tok.kind];
+ retval += " \"";
retval += add_escapes(tok.image);
+ retval += " \"";
tok = tok.next;
}
- retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn + "." + eol;
+ retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
+ retval += "." + eol;
if (expectedTokenSequences.length == 1) {
retval += "Was expecting:" + eol + " ";
} else {
retval += "Was expecting one of:" + eol + " ";
}
- retval += expected;
+ retval += expected.toString();
return retval;
}
@@ -182,7 +163,7 @@ public String getMessage() {
* when these raw version cannot be used as part of an ASCII
* string literal.
*/
- protected String add_escapes(String str) {
+ static String add_escapes(String str) {
StringBuffer retval = new StringBuffer();
char ch;
for (int i = 0; i < str.length(); i++) {
@@ -228,3 +209,4 @@ protected String add_escapes(String str) {
}
}
+/* JavaCC - OriginalChecksum=3c9f049ed2bb6ade635c5bf58a386169 (do not edit this line) */
diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/expr/Token.java b/jdk/src/share/classes/com/sun/tools/example/debug/expr/Token.java
index a1c17bf3f3..3bfd69506f 100644
--- a/jdk/src/share/classes/com/sun/tools/example/debug/expr/Token.java
+++ b/jdk/src/share/classes/com/sun/tools/example/debug/expr/Token.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* 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,23 +23,22 @@
* questions.
*/
-/*
- * This source code is provided to illustrate the usage of a given feature
- * or technique and has been deliberately simplified. Additional steps
- * required for a production-quality application, such as security checks,
- * input validation and proper error handling, might not be present in
- * this sample code.
- */
-
-
-/* Generated By:JavaCC: Do not edit this line. Token.java Version 0.7pre3 */
+/* Generated By:JavaCC: Do not edit this line. Token.java Version 5.0 */
+/* JavaCCOptions:TOKEN_EXTENDS=,KEEP_LINE_COL=null,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
package com.sun.tools.example.debug.expr;
/**
* Describes the input token stream.
*/
-public class Token {
+public class Token implements java.io.Serializable {
+
+ /**
+ * The version identifier for this Serializable class.
+ * Increment only if the serialized form of the
+ * class changes.
+ */
+ private static final long serialVersionUID = 1L;
/**
* An integer that describes the kind of this token. This numbering
@@ -48,12 +47,14 @@ public class Token {
*/
public int kind;
- /**
- * beginLine and beginColumn describe the position of the first character
- * of this token; endLine and endColumn describe the position of the
- * last character of this token.
- */
- public int beginLine, beginColumn, endLine, endColumn;
+ /** The line number of the first character of this Token. */
+ public int beginLine;
+ /** The column number of the first character of this Token. */
+ public int beginColumn;
+ /** The line number of the last character of this Token. */
+ public int endLine;
+ /** The column number of the last character of this Token. */
+ public int endColumn;
/**
* The string image of the token.
@@ -84,13 +85,46 @@ public class Token {
*/
public Token specialToken;
+ /**
+ * An optional attribute value of the Token.
+ * Tokens which are not used as syntactic sugar will often contain
+ * meaningful values that will be used later on by the compiler or
+ * interpreter. This attribute value is often different from the image.
+ * Any subclass of Token that actually wants to return a non-null value can
+ * override this method as appropriate.
+ */
+ public Object getValue() {
+ return null;
+ }
+
+ /**
+ * No-argument constructor
+ */
+ public Token() {}
+
+ /**
+ * Constructs a new token for the specified Image.
+ */
+ public Token(int kind)
+ {
+ this(kind, null);
+ }
+
+ /**
+ * Constructs a new token for the specified Image and Kind.
+ */
+ public Token(int kind, String image)
+ {
+ this.kind = kind;
+ this.image = image;
+ }
+
/**
* Returns the image.
*/
- @Override
- public final String toString()
+ public String toString()
{
- return image;
+ return image;
}
/**
@@ -98,19 +132,25 @@ public final String toString()
* can create and return subclass objects based on the value of ofKind.
* Simply add the cases to the switch for all those special cases.
* For example, if you have a subclass of Token called IDToken that
- * you want to create if ofKind is ID, simlpy add something like :
+ * you want to create if ofKind is ID, simply add something like :
*
- * case MyParserConstants.ID : return new IDToken();
+ * case MyParserConstants.ID : return new IDToken(ofKind, image);
*
* to the following switch statement. Then you can cast matchedToken
- * variable to the appropriate type and use it in your lexical actions.
+ * variable to the appropriate type and use sit in your lexical actions.
*/
- public static final Token newToken(int ofKind)
+ public static Token newToken(int ofKind, String image)
+ {
+ switch(ofKind)
+ {
+ default : return new Token(ofKind, image);
+ }
+ }
+
+ public static Token newToken(int ofKind)
{
- switch(ofKind)
- {
- default : return new Token();
- }
+ return newToken(ofKind, null);
}
}
+/* JavaCC - OriginalChecksum=1f1783cae2d4cc94bc225889842dfa8b (do not edit this line) */
diff --git a/jdk/src/share/classes/com/sun/tools/example/debug/expr/TokenMgrError.java b/jdk/src/share/classes/com/sun/tools/example/debug/expr/TokenMgrError.java
index b9f2328c96..5bc49c343a 100644
--- a/jdk/src/share/classes/com/sun/tools/example/debug/expr/TokenMgrError.java
+++ b/jdk/src/share/classes/com/sun/tools/example/debug/expr/TokenMgrError.java
@@ -23,148 +23,150 @@
* questions.
*/
-/*
- * This source code is provided to illustrate the usage of a given feature
- * or technique and has been deliberately simplified. Additional steps
- * required for a production-quality application, such as security checks,
- * input validation and proper error handling, might not be present in
- * this sample code.
- */
-
-
-/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 0.7pre2 */
+/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 5.0 */
+/* JavaCCOptions: */
package com.sun.tools.example.debug.expr;
+/** Token Manager Error. */
public class TokenMgrError extends Error
{
- /*
- * Ordinals for various reasons why an Error of this type can be thrown.
- */
-
- private static final long serialVersionUID = -6236440836177601522L;
-
- /**
- * Lexical error occurred.
- */
- static final int LEXICAL_ERROR = 0;
-
- /**
- * An attempt wass made to create a second instance of a static token manager.
- */
- static final int STATIC_LEXER_ERROR = 1;
-
- /**
- * Tried to change to an invalid lexical state.
- */
- static final int INVALID_LEXICAL_STATE = 2;
-
- /**
- * Detected (and bailed out of) an infinite loop in the token manager.
- */
- static final int LOOP_DETECTED = 3;
-
- /**
- * Indicates the reason why the exception is thrown. It will have
- * one of the above 4 values.
- */
- int errorCode;
-
- /**
- * Replaces unprintable characters by their espaced (or unicode escaped)
- * equivalents in the given string
- */
- protected static final String addEscapes(String str) {
- StringBuffer retval = new StringBuffer();
- char ch;
- for (int i = 0; i < str.length(); i++) {
- switch (str.charAt(i))
- {
- case 0 :
- continue;
- case '\b':
- retval.append("\\b");
- continue;
- case '\t':
- retval.append("\\t");
- continue;
- case '\n':
- retval.append("\\n");
- continue;
- case '\f':
- retval.append("\\f");
- continue;
- case '\r':
- retval.append("\\r");
- continue;
- case '\"':
- retval.append("\\\"");
- continue;
- case '\'':
- retval.append("\\\'");
- continue;
- case '\\':
- retval.append("\\\\");
- continue;
- default:
- if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
- String s = "0000" + Integer.toString(ch, 16);
- retval.append("\\u" + s.substring(s.length() - 4, s.length()));
- } else {
- retval.append(ch);
- }
- continue;
- }
+
+ /**
+ * The version identifier for this Serializable class.
+ * Increment only if the serialized form of the
+ * class changes.
+ */
+ private static final long serialVersionUID = 1L;
+
+ /*
+ * Ordinals for various reasons why an Error of this type can be thrown.
+ */
+
+ /**
+ * Lexical error occurred.
+ */
+ static final int LEXICAL_ERROR = 0;
+
+ /**
+ * An attempt was made to create a second instance of a static token manager.
+ */
+ static final int STATIC_LEXER_ERROR = 1;
+
+ /**
+ * Tried to change to an invalid lexical state.
+ */
+ static final int INVALID_LEXICAL_STATE = 2;
+
+ /**
+ * Detected (and bailed out of) an infinite loop in the token manager.
+ */
+ static final int LOOP_DETECTED = 3;
+
+ /**
+ * Indicates the reason why the exception is thrown. It will have
+ * one of the above 4 values.
+ */
+ int errorCode;
+
+ /**
+ * Replaces unprintable characters by their escaped (or unicode escaped)
+ * equivalents in the given string
+ */
+ protected static final String addEscapes(String str) {
+ StringBuffer retval = new StringBuffer();
+ char ch;
+ for (int i = 0; i < str.length(); i++) {
+ switch (str.charAt(i))
+ {
+ case 0 :
+ continue;
+ case '\b':
+ retval.append("\\b");
+ continue;
+ case '\t':
+ retval.append("\\t");
+ continue;
+ case '\n':
+ retval.append("\\n");
+ continue;
+ case '\f':
+ retval.append("\\f");
+ continue;
+ case '\r':
+ retval.append("\\r");
+ continue;
+ case '\"':
+ retval.append("\\\"");
+ continue;
+ case '\'':
+ retval.append("\\\'");
+ continue;
+ case '\\':
+ retval.append("\\\\");
+ continue;
+ default:
+ if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
+ String s = "0000" + Integer.toString(ch, 16);
+ retval.append("\\u" + s.substring(s.length() - 4, s.length()));
+ } else {
+ retval.append(ch);
+ }
+ continue;
}
- return retval.toString();
- }
-
- /**
- * Returns a detailed message for the Error when it is thrown by the
- * token manager to indicate a lexical error.
- * Parameters :
- * EOFSeen : indicates if EOF caused the lexicl error
- * curLexState : lexical state in which this error occurred
- * errorLine : line number when the error occurred
- * errorColumn : column number when the error occurred
- * errorAfter : prefix that was seen before this error occurred
- * curchar : the offending character
- * Note: You can customize the lexical error message by modifying this method.
- */
- private static final String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
- return("Lexical error at line " +
- errorLine + ", column " +
- errorColumn + ". Encountered: " +
- (EOFSeen ? " " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
- "after : \"" + addEscapes(errorAfter) + "\"");
- }
-
- /**
- * You can also modify the body of this method to customize your error messages.
- * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
- * of end-users concern, so you can return something like :
- *
- * "Internal Error : Please file a bug report .... "
- *
- * from this method for such cases in the release version of your parser.
- */
- @Override
- public String getMessage() {
- return super.getMessage();
- }
-
- /*
- * Constructors of various flavors follow.
- */
-
- public TokenMgrError() {
- }
-
- public TokenMgrError(String message, int reason) {
- super(message);
- errorCode = reason;
- }
-
- public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
- this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
- }
+ }
+ return retval.toString();
+ }
+
+ /**
+ * Returns a detailed message for the Error when it is thrown by the
+ * token manager to indicate a lexical error.
+ * Parameters :
+ * EOFSeen : indicates if EOF caused the lexical error
+ * curLexState : lexical state in which this error occurred
+ * errorLine : line number when the error occurred
+ * errorColumn : column number when the error occurred
+ * errorAfter : prefix that was seen before this error occurred
+ * curchar : the offending character
+ * Note: You can customize the lexical error message by modifying this method.
+ */
+ protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
+ return("Lexical error at line " +
+ errorLine + ", column " +
+ errorColumn + ". Encountered: " +
+ (EOFSeen ? " " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
+ "after : \"" + addEscapes(errorAfter) + "\"");
+ }
+
+ /**
+ * You can also modify the body of this method to customize your error messages.
+ * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
+ * of end-users concern, so you can return something like :
+ *
+ * "Internal Error : Please file a bug report .... "
+ *
+ * from this method for such cases in the release version of your parser.
+ */
+ public String getMessage() {
+ return super.getMessage();
+ }
+
+ /*
+ * Constructors of various flavors follow.
+ */
+
+ /** No arg constructor. */
+ public TokenMgrError() {
+ }
+
+ /** Constructor with message and reason. */
+ public TokenMgrError(String message, int reason) {
+ super(message);
+ errorCode = reason;
+ }
+
+ /** Full Constructor. */
+ public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
+ this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
+ }
}
+/* JavaCC - OriginalChecksum=9b5d040f247411cad7f77688386c48e7 (do not edit this line) */
diff --git a/jdk/test/com/sun/jdi/JdbExprTest.sh b/jdk/test/com/sun/jdi/JdbExprTest.sh
new file mode 100644
index 0000000000..e60b51b7ac
--- /dev/null
+++ b/jdk/test/com/sun/jdi/JdbExprTest.sh
@@ -0,0 +1,158 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+
+# @test
+# @bug 4660158
+# @author Staffan Larsen
+# @run shell JdbExprTest.sh
+
+# These are variables that can be set to control execution
+
+#pkg=untitled7
+classname=JdbExprTest
+compileOptions=-g
+#java="java_g"
+#set -x
+
+createJavaFile()
+{
+ cat < $classname.java.1
+import java.util.*;
+import java.net.URLClassLoader;
+import java.net.URL;
+
+class $classname {
+
+ static long aLong;
+ static int anInt;
+ static boolean aBoolean;
+
+ public static void bkpt() {
+ int i = 0; //@1 breakpoint
+ }
+
+ public static void main(String[] args) {
+ bkpt();
+ }
+}
+EOF
+}
+
+
+# drive jdb by sending cmds to it and examining its output
+dojdbCmds()
+{
+ setBkpts @1
+ runToBkpt @1
+
+ cmd print java.lang.Long.MAX_VALUE
+ jdbFailIfNotPresent " \= 9223372036854775807" 3
+
+ cmd print java.lang.Long.MIN_VALUE
+ jdbFailIfNotPresent " \= \-9223372036854775808" 3
+
+ cmd print 9223372036854775807L
+ jdbFailIfNotPresent "9223372036854775807L = 9223372036854775807" 3
+ cmd print 9223372036854775807
+ jdbFailIfNotPresent "9223372036854775807 = 9223372036854775807" 3
+
+ cmd print -9223372036854775807L
+ jdbFailIfNotPresent "\-9223372036854775807L = \-9223372036854775807" 3
+ cmd print -9223372036854775807
+ jdbFailIfNotPresent "\-9223372036854775807 = \-9223372036854775807" 3
+
+ cmd print -1
+ jdbFailIfNotPresent "\-1 = \-1" 3
+ cmd print 1L
+ jdbFailIfNotPresent "1L = 1" 3
+ cmd print -1L
+ jdbFailIfNotPresent "\-1L = \-1" 3
+ cmd print 0x1
+ jdbFailIfNotPresent "0x1 = 1" 3
+
+ cmd set $classname.aLong = 9223372036854775807L
+ cmd print $classname.aLong
+ jdbFailIfNotPresent "$classname.aLong = 9223372036854775807" 3
+
+ cmd set $classname.anInt = java.lang.Integer.MAX_VALUE + 1
+ cmd print $classname.anInt
+ jdbFailIfNotPresent "$classname.anInt = \-2147483648" 3
+
+ cmd set $classname.aLong = java.lang.Integer.MAX_VALUE + 1L
+ cmd print $classname.aLong
+ jdbFailIfNotPresent "$classname.aLong = 2147483648" 3
+
+ cmd set $classname.anInt = 0x80000000
+ jdbFailIfNotPresent "Can\'t convert 2147483648 to int" 3
+ cmd set $classname.anInt = 0x8000000000000000L
+ jdbFailIfNotPresent "java.lang.NumberFormatException: For input string: \"8000000000000000\"" 3
+
+ cmd set $classname.anInt = 0x7fffffff
+ jdbFailIfNotPresent "0x7fffffff = 2147483647" 3
+ cmd set $classname.aLong = 0x7fffffffffffffff
+ jdbFailIfNotPresent "0x7fffffffffffffff = 9223372036854775807" 3
+
+ cmd print 3.1415
+ jdbFailIfNotPresent "3.1415 = 3.1415" 3
+ cmd print -3.1415
+ jdbFailIfNotPresent "\-3.1415 = \-3.1415" 3
+ cmd print 011
+ jdbFailIfNotPresent "011 = 9" 3
+
+ cmd set $classname.aBoolean = false
+ jdbFailIfNotPresent "JdbExprTest.aBoolean = false = false" 3
+ cmd print $classname.aBoolean
+ jdbFailIfNotPresent "JdbExprTest.aBoolean = false" 3
+ cmd print !$classname.aBoolean
+ jdbFailIfNotPresent "JdbExprTest.aBoolean = true" 3
+
+ cmd print ~1
+ jdbFailIfNotPresent "~1 = -2" 3
+
+ cmd quit
+}
+
+
+mysetup()
+{
+ if [ -z "$TESTSRC" ] ; then
+ TESTSRC=.
+ fi
+
+ for ii in . $TESTSRC $TESTSRC/.. ; do
+ if [ -r "$ii/ShellScaffold.sh" ] ; then
+ . $ii/ShellScaffold.sh
+ break
+ fi
+ done
+}
+
+# You could replace this next line with the contents
+# of ShellScaffold.sh and this script will run just the same.
+mysetup
+
+runit
+jdbFailIfNotPresent "Breakpoint hit"
+pass
From 683860572c87e9c89ba7de45264c1d32b195db8c Mon Sep 17 00:00:00 2001
From: Sergey Bylokhov
Date: Mon, 17 Jun 2024 00:43:44 +0000
Subject: [PATCH 09/66] 8311666: Disabled tests in test/jdk/sun/java2d/marlin
Reviewed-by: andrew
Backport-of: b285ed72aebe2d802fa9c071372cea6c09870b9a
---
jdk/test/sun/pisces/ScaleTest.java | 6 +++++-
jdk/test/sun/pisces/StrokeShapeTest.java | 6 ++++++
jdk/test/sun/pisces/ThinLineTest.java | 6 ++++++
3 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/jdk/test/sun/pisces/ScaleTest.java b/jdk/test/sun/pisces/ScaleTest.java
index bfd56422ba..c9778a6477 100644
--- a/jdk/test/sun/pisces/ScaleTest.java
+++ b/jdk/test/sun/pisces/ScaleTest.java
@@ -21,13 +21,17 @@
* questions.
*/
+/* @test
+ * @summary Circle is rendered in C shape
+ * @bug 6829659 8311666
+ */
+
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
-
public class ScaleTest {
public static void main(String[] args) throws Exception {
BufferedImage image = new BufferedImage(200, 200, BufferedImage.TYPE_INT_RGB);
diff --git a/jdk/test/sun/pisces/StrokeShapeTest.java b/jdk/test/sun/pisces/StrokeShapeTest.java
index 41413bff3e..bc23f29e15 100644
--- a/jdk/test/sun/pisces/StrokeShapeTest.java
+++ b/jdk/test/sun/pisces/StrokeShapeTest.java
@@ -20,6 +20,12 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
+/* @test
+ * @summary StrokeShapeTest: createStrokedShape() behaves differently
+ * @bug 6829678 8311666
+ */
+
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.geom.GeneralPath;
diff --git a/jdk/test/sun/pisces/ThinLineTest.java b/jdk/test/sun/pisces/ThinLineTest.java
index a1a033c0bd..7450f4e421 100644
--- a/jdk/test/sun/pisces/ThinLineTest.java
+++ b/jdk/test/sun/pisces/ThinLineTest.java
@@ -20,6 +20,12 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
+/* @test
+ * @summary ThinLineTest: A line < 1 pixel disappears.
+ * @bug 6829673 8311666
+ */
+
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
From 6abb3f27b9a535f741c7d3a8dfa0d6b811263a9e Mon Sep 17 00:00:00 2001
From: Kazuhisa Takakuri
Date: Mon, 17 Jun 2024 17:57:59 +0000
Subject: [PATCH 10/66] 8035395:
sun/management/jmxremote/startstop/JMXStartStopTest.java fails
intermittently: Port already in use
Reviewed-by: phh, andrew
Backport-of: 70f2238ba9a81ba0bb3fe6cbd98a553009992ecb
---
.../jmxremote/startstop/JMXStartStopTest.java | 142 ++++++++++++------
1 file changed, 96 insertions(+), 46 deletions(-)
diff --git a/jdk/test/sun/management/jmxremote/startstop/JMXStartStopTest.java b/jdk/test/sun/management/jmxremote/startstop/JMXStartStopTest.java
index 20a2de0453..6270297727 100644
--- a/jdk/test/sun/management/jmxremote/startstop/JMXStartStopTest.java
+++ b/jdk/test/sun/management/jmxremote/startstop/JMXStartStopTest.java
@@ -62,6 +62,47 @@ public class JMXStartStopTest {
private static final boolean verbose = false;
+ /**
+ * Dynamically allocates two distinct ports using {@linkplain java.net.ServerSocket}
+ * It keeps each of those ports blocked until it is first accessed by its getter
+ */
+ private static class PortAllocator {
+ private final int port1, port2;
+ private final ServerSocket ss1, ss2;
+ PortAllocator() {
+ try {
+ ss1 = new ServerSocket(0);
+ ss2 = new ServerSocket(0);
+ port1 = ss1.getLocalPort();
+ port2 = ss2.getLocalPort();
+ } catch (IOException e) {
+ throw new Error("Error while obtaining free ports", e);
+ }
+ }
+
+ public int getPort1() {
+ if (!ss1.isClosed()) {
+ try {
+ ss1.close();
+ } catch (IOException e) {
+ // just ignore
+ }
+ }
+ return port1;
+ }
+
+ public int getPort2() {
+ if (!ss2.isClosed()) {
+ try {
+ ss2.close();
+ } catch (IOException e) {
+ // just ignore
+ }
+ }
+ return port2;
+ }
+ }
+
private static void dbg_print(String msg){
if (verbose) {
System.out.println("DBG: " +msg);
@@ -407,29 +448,28 @@ private static void jcmd(String target, final Consumer c, String ... com
private static final String CMD_STOP = "ManagementAgent.stop";
private static final String CMD_START= "ManagementAgent.start";
private static final String CMD_START_LOCAL = "ManagementAgent.start_local";
- private static final int port1 = 50234;
- private static final int port2 = 50235;
static void test_01() throws Exception {
// Run an app with JMX enabled stop it and
// restart on other port
System.out.println("**** Test one ****");
+ PortAllocator pa = new PortAllocator();
Something s = doSomething(
"test_01",
- "-Dcom.sun.management.jmxremote.port=" + port1,
+ "-Dcom.sun.management.jmxremote.port=" + pa.getPort1(),
"-Dcom.sun.management.jmxremote.authenticate=false",
"-Dcom.sun.management.jmxremote.ssl=false");
try {
- testConnect(port1);
+ testConnect(pa.getPort1());
jcmd(CMD_STOP);
- testNoConnect(port1);
+ testNoConnect(pa.getPort1());
- jcmd(CMD_START, "jmxremote.port=" + port2);
- testConnect(port2);
+ jcmd(CMD_START, "jmxremote.port=" + pa.getPort2());
+ testConnect(pa.getPort2());
} finally {
s.stop();
}
@@ -442,14 +482,16 @@ static void test_02() throws Exception {
System.out.println("**** Test two ****");
Something s = doSomething("test_02");
+ PortAllocator pa = new PortAllocator();
try {
jcmd(CMD_START,
- "jmxremote.port=" + port1,
+ "jmxremote.port=" + pa.getPort1(),
"jmxremote.authenticate=false",
"jmxremote.ssl=false");
- testConnect(port1);
+ testConnect(pa.getPort1());
} finally {
+// debugPortUsage(pa);
s.stop();
}
}
@@ -461,23 +503,24 @@ static void test_03() throws Exception {
System.out.println("**** Test three ****");
Something s = doSomething("test_03");
+ PortAllocator pa = new PortAllocator();
try {
jcmd(CMD_START,
- "jmxremote.port=" + port1,
+ "jmxremote.port=" + pa.getPort1(),
"jmxremote.authenticate=false",
"jmxremote.ssl=false");
// Second agent shouldn't start
jcmd(CMD_START,
- "jmxremote.port=" + port2,
+ "jmxremote.port=" + pa.getPort2(),
"jmxremote.authenticate=false",
"jmxremote.ssl=false");
// First agent should connect
- testConnect(port1);
+ testConnect(pa.getPort1());
// Second agent should not connect
- testNoConnect(port2);
+ testNoConnect(pa.getPort2());
} finally {
s.stop();
}
@@ -490,15 +533,15 @@ static void test_04() throws Exception {
System.out.println("**** Test four ****");
Something s = doSomething("test_04");
-
+ PortAllocator pa = new PortAllocator();
try {
jcmd(CMD_START,
- "jmxremote.port=" + port1,
- "jmxremote.rmi.port=" + port2,
+ "jmxremote.port=" + pa.getPort1(),
+ "jmxremote.rmi.port=" + pa.getPort2(),
"jmxremote.authenticate=false",
"jmxremote.ssl=false");
- testConnect(port1, port2);
+ testConnect(pa.getPort1(), pa.getPort2());
} finally {
s.stop();
}
@@ -511,10 +554,11 @@ static void test_05() throws Exception {
System.out.println("**** Test five ****");
Something s = doSomething("test_05");
+ PortAllocator pa = new PortAllocator();
try {
jcmd(CMD_START_LOCAL);
- testNoConnect(port1);
+ testNoConnect(pa.getPort1());
testConnectLocal(s.getPid());
} finally {
s.stop();
@@ -533,14 +577,14 @@ static void test_06() throws Exception {
System.out.println("**** Test six ****");
Something s = doSomething("test_06");
-
+ PortAllocator pa = new PortAllocator();
try {
jcmd(CMD_START,
- "jmxremote.port=" + port1,
+ "jmxremote.port=" + pa.getPort1(),
"jmxremote.authenticate=false",
"jmxremote.ssl=false");
- testConnect(port1, port2);
+ testConnect(pa.getPort1(), pa.getPort2());
final boolean[] checks = new boolean[3];
jcmd(
@@ -550,7 +594,7 @@ static void test_06() throws Exception {
}
},
CMD_START,
- "jmxremote.port=" + port1,
+ "jmxremote.port=" + pa.getPort1(),
"jmxremote.authenticate=false",
"jmxremote.ssl=false");
@@ -561,7 +605,7 @@ static void test_06() throws Exception {
}
},
CMD_START,
- "jmxremote.port=" + port2,
+ "jmxremote.port=" + pa.getPort2(),
"jmxremote.authenticate=false",
"jmxremote.ssl=false");
@@ -578,15 +622,15 @@ static void test_06() throws Exception {
},
CMD_START,
"jmxremote.port=" + ss.getLocalPort(),
- "jmxremote.rmi.port=" + port2,
+ "jmxremote.rmi.port=" + pa.getPort2(),
"jmxremote.authenticate=false",
"jmxremote.ssl=false");
if (!checks[0]) {
- throw new Exception("Starting agent on port " + port1 + " should " +
+ throw new Exception("Starting agent on port " + pa.getPort1() + " should " +
"report an invalid agent state");
}
if (!checks[1]) {
- throw new Exception("Starting agent on poprt " + port2 + " should " +
+ throw new Exception("Starting agent on poprt " + pa.getPort2() + " should " +
"report an invalid agent state");
}
if (!checks[2]) {
@@ -609,16 +653,17 @@ private static void test_07() throws Exception {
"test_07",
"-Dcom.sun.management.jmxremote.authenticate=false",
"-Dcom.sun.management.jmxremote.ssl=true");
+ PortAllocator pa = new PortAllocator();
try {
- testNoConnect(port1);
+ testNoConnect(pa.getPort1());
jcmd(
CMD_START,
- "jmxremote.port=" + port2,
+ "jmxremote.port=" + pa.getPort2(),
"jmxremote.authenticate=false",
"jmxremote.ssl=false"
);
- testConnect(port2);
+ testConnect(pa.getPort2());
} finally {
s.stop();
}
@@ -631,28 +676,29 @@ static void test_08() throws Exception {
// make sure these properties overridden corectly
System.out.println("**** Test eight ****");
+ PortAllocator pa = new PortAllocator();
Something s = doSomething(
"test_08",
- "-Dcom.sun.management.jmxremote.port=" + port1,
+ "-Dcom.sun.management.jmxremote.port=" + pa.getPort1(),
"-Dcom.sun.management.jmxremote.authenticate=false",
"-Dcom.sun.management.jmxremote.ssl=true");
try {
- testNoConnect(port1);
+ testNoConnect(pa.getPort1());
jcmd(CMD_STOP);
- testNoConnect(port1);
+ testNoConnect(pa.getPort1());
jcmd(
CMD_START,
- "jmxremote.port=" + port2,
+ "jmxremote.port=" + pa.getPort2(),
"jmxremote.authenticate=false",
"jmxremote.ssl=false"
);
- testConnect(port2);
+ testConnect(pa.getPort2());
} finally {
s.stop();
}
@@ -673,22 +719,23 @@ static void test_09() throws Exception {
TEST_SRC + File.separator + "management_cl.properties",
"-Dcom.sun.management.jmxremote.authenticate=false"
);
+ PortAllocator pa = new PortAllocator();
try {
- testNoConnect(port1);
+ testNoConnect(pa.getPort1());
jcmd(CMD_STOP);
- testNoConnect(port1);
+ testNoConnect(pa.getPort1());
jcmd(CMD_START,
"config.file=" + TEST_SRC + File.separator +
"management_jcmd.properties",
"jmxremote.authenticate=false",
- "jmxremote.port=" + port2
+ "jmxremote.port=" + pa.getPort2()
);
- testConnect(port2);
+ testConnect(pa.getPort2());
} finally {
s.stop();
}
@@ -702,29 +749,30 @@ static void test_10() throws Exception {
// make sure these properties overridden corectly
System.out.println("**** Test ten ****");
+ PortAllocator pa = new PortAllocator();
Something s = doSomething(
"test_10",
- "-Dcom.sun.management.jmxremote.port=" + port1,
+ "-Dcom.sun.management.jmxremote.port=" + pa.getPort1(),
"-Dcom.sun.management.jmxremote.authenticate=false",
"-Dcom.sun.management.jmxremote.ssl=true");
try {
- testNoConnect(port1);
+ testNoConnect(pa.getPort1());
jcmd(CMD_STOP);
jcmd(CMD_START,
"jmxremote.ssl=false",
- "jmxremote.port=" + port1
+ "jmxremote.port=" + pa.getPort1()
);
testConnect(port1);
jcmd(CMD_STOP);
jcmd(CMD_START,
- "jmxremote.port=" + port1
+ "jmxremote.port=" + pa.getPort1()
);
- testNoConnect(port1);
+ testNoConnect(pa.getPort1());
} finally {
s.stop();
}
@@ -736,14 +784,15 @@ static void test_11() throws Exception {
// make sure local agent is not affected
System.out.println("**** Test eleven ****");
+ PortAllocator pa = new PortAllocator();
Something s = doSomething(
"test_11",
- "-Dcom.sun.management.jmxremote.port=" + port1,
+ "-Dcom.sun.management.jmxremote.port=" + pa.getPort1(),
"-Dcom.sun.management.jmxremote.authenticate=false",
"-Dcom.sun.management.jmxremote.ssl=false");
try {
- testConnect(port1);
+ testConnect(pa.getPort1());
jcmd(CMD_STOP);
testConnectLocal(s.getPid());
} finally {
@@ -758,9 +807,10 @@ static void test_12() throws Exception {
System.out.println("**** Test twelve ****");
Something s = doSomething("test_12");
+ PortAllocator pa = new PortAllocator();
try {
- testNoConnect(port1);
+ testNoConnect(pa.getPort1());
jcmd(CMD_START + "_local");
testConnectLocal(s.getPid());
From b1e2ea81f45d9b144e1de8d16b2b698f1788d4d7 Mon Sep 17 00:00:00 2001
From: Zdenek Zambersky
Date: Mon, 24 Jun 2024 08:03:31 +0000
Subject: [PATCH 11/66] 8279164: Disable TLS_ECDH_* cipher suites
Reviewed-by: sgehwolf, andrew, mbalao
Backport-of: 5dddf69319480251cdc904cf7a1d4fcd81573bb8
---
jdk/src/share/lib/security/java.security-aix | 1 +
.../share/lib/security/java.security-linux | 1 +
.../share/lib/security/java.security-macosx | 1 +
.../share/lib/security/java.security-solaris | 1 +
.../share/lib/security/java.security-windows | 1 +
.../ssl/ciphersuites/DisabledAlgorithms.java | 37 ++++---
.../ciphersuites/CheckCipherSuites.java | 96 ++++---------------
7 files changed, 47 insertions(+), 91 deletions(-)
diff --git a/jdk/src/share/lib/security/java.security-aix b/jdk/src/share/lib/security/java.security-aix
index 88df2b68ea..7845081f15 100644
--- a/jdk/src/share/lib/security/java.security-aix
+++ b/jdk/src/share/lib/security/java.security-aix
@@ -704,6 +704,7 @@ jdk.jar.disabledAlgorithms=MD2, MD5, RSA keySize < 1024, \
# jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
+ ECDH, \
include jdk.disabled.namedCurves
# Legacy algorithms for Secure Socket Layer/Transport Layer Security (SSL/TLS)
diff --git a/jdk/src/share/lib/security/java.security-linux b/jdk/src/share/lib/security/java.security-linux
index cd83750fa0..d9db8de8be 100644
--- a/jdk/src/share/lib/security/java.security-linux
+++ b/jdk/src/share/lib/security/java.security-linux
@@ -704,6 +704,7 @@ jdk.jar.disabledAlgorithms=MD2, MD5, RSA keySize < 1024, \
# jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
+ ECDH, \
include jdk.disabled.namedCurves
# Legacy algorithms for Secure Socket Layer/Transport Layer Security (SSL/TLS)
diff --git a/jdk/src/share/lib/security/java.security-macosx b/jdk/src/share/lib/security/java.security-macosx
index a4d76c1e77..74a1d2892a 100644
--- a/jdk/src/share/lib/security/java.security-macosx
+++ b/jdk/src/share/lib/security/java.security-macosx
@@ -707,6 +707,7 @@ jdk.jar.disabledAlgorithms=MD2, MD5, RSA keySize < 1024, \
# jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
+ ECDH, \
include jdk.disabled.namedCurves
# Legacy algorithms for Secure Socket Layer/Transport Layer Security (SSL/TLS)
diff --git a/jdk/src/share/lib/security/java.security-solaris b/jdk/src/share/lib/security/java.security-solaris
index a5bff6092f..cbca89966f 100644
--- a/jdk/src/share/lib/security/java.security-solaris
+++ b/jdk/src/share/lib/security/java.security-solaris
@@ -705,6 +705,7 @@ jdk.jar.disabledAlgorithms=MD2, MD5, RSA keySize < 1024, \
# jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
+ ECDH, \
include jdk.disabled.namedCurves
# Legacy algorithms for Secure Socket Layer/Transport Layer Security (SSL/TLS)
diff --git a/jdk/src/share/lib/security/java.security-windows b/jdk/src/share/lib/security/java.security-windows
index e9c6e43d17..b1a59c044e 100644
--- a/jdk/src/share/lib/security/java.security-windows
+++ b/jdk/src/share/lib/security/java.security-windows
@@ -707,6 +707,7 @@ jdk.jar.disabledAlgorithms=MD2, MD5, RSA keySize < 1024, \
# jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
+ ECDH, \
include jdk.disabled.namedCurves
# Legacy algorithms for Secure Socket Layer/Transport Layer Security (SSL/TLS)
diff --git a/jdk/test/javax/net/ssl/ciphersuites/DisabledAlgorithms.java b/jdk/test/javax/net/ssl/ciphersuites/DisabledAlgorithms.java
index 1fe76eced1..029c276b34 100644
--- a/jdk/test/javax/net/ssl/ciphersuites/DisabledAlgorithms.java
+++ b/jdk/test/javax/net/ssl/ciphersuites/DisabledAlgorithms.java
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8076221 8211883
+ * @bug 8076221 8211883 8279164
* @summary Check if weak cipher suites are disabled
* @run main/othervm DisabledAlgorithms default
* @run main/othervm DisabledAlgorithms empty
@@ -59,9 +59,9 @@ public class DisabledAlgorithms {
System.getProperty("test.src", "./") + "/" + pathToStores +
"/" + trustStoreFile;
- // supported RC4, NULL, and anon cipher suites
- // it does not contain KRB5 cipher suites because they need a KDC
- private static final String[] rc4_null_anon_ciphersuites = new String[] {
+ // disabled RC4, NULL, anon, and ECDH cipher suites
+ private static final String[] disabled_ciphersuites
+ = new String[] {
"TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",
"TLS_ECDHE_RSA_WITH_RC4_128_SHA",
"SSL_RSA_WITH_RC4_128_SHA",
@@ -93,7 +93,19 @@ public class DisabledAlgorithms {
"TLS_ECDH_anon_WITH_AES_128_CBC_SHA",
"TLS_ECDH_anon_WITH_AES_256_CBC_SHA",
"TLS_ECDH_anon_WITH_NULL_SHA",
- "TLS_ECDH_anon_WITH_RC4_128_SHA"
+ "TLS_ECDH_anon_WITH_RC4_128_SHA",
+ "TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384",
+ "TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384",
+ "TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256",
+ "TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256",
+ "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384",
+ "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384",
+ "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256",
+ "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256",
+ "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA",
+ "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA",
+ "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA",
+ "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA"
};
public static void main(String[] args) throws Exception {
@@ -112,9 +124,8 @@ public static void main(String[] args) throws Exception {
System.out.println("jdk.tls.disabledAlgorithms = "
+ Security.getProperty("jdk.tls.disabledAlgorithms"));
- // check if RC4, NULL, and anon cipher suites
- // can't be used by default
- checkFailure(rc4_null_anon_ciphersuites);
+ // check that disabled cipher suites can't be used by default
+ checkFailure(disabled_ciphersuites);
break;
case "empty":
// reset jdk.tls.disabledAlgorithms
@@ -122,9 +133,9 @@ public static void main(String[] args) throws Exception {
System.out.println("jdk.tls.disabledAlgorithms = "
+ Security.getProperty("jdk.tls.disabledAlgorithms"));
- // check if RC4, NULL, and anon cipher suites can be used
- // if jdk.tls.disabledAlgorithms is empty
- checkSuccess(rc4_null_anon_ciphersuites);
+ // check that disabled cipher suites can be used if
+ // jdk.tls.disabledAlgorithms is empty
+ checkSuccess(disabled_ciphersuites);
break;
default:
throw new RuntimeException("Wrong parameter: " + args[0]);
@@ -150,11 +161,12 @@ private static void checkFailure(String[] ciphersuites) throws Exception {
throw new RuntimeException("Expected SSLHandshakeException "
+ "not thrown");
} catch (SSLHandshakeException e) {
- System.out.println("Expected exception on client side: "
+ System.out.println("Got expected exception on client side: "
+ e);
}
}
+ server.stop();
while (server.isRunning()) {
sleep();
}
@@ -250,7 +262,6 @@ public void run() {
} catch (SSLHandshakeException e) {
System.out.println("Server: run: " + e);
sslError = true;
- stopped = true;
} catch (IOException e) {
if (!stopped) {
System.out.println("Server: run: unexpected exception: "
diff --git a/jdk/test/javax/net/ssl/sanity/ciphersuites/CheckCipherSuites.java b/jdk/test/javax/net/ssl/sanity/ciphersuites/CheckCipherSuites.java
index c2358c8721..38c8269830 100644
--- a/jdk/test/javax/net/ssl/sanity/ciphersuites/CheckCipherSuites.java
+++ b/jdk/test/javax/net/ssl/sanity/ciphersuites/CheckCipherSuites.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4750141 4895631 8217579 8163326
+ * @bug 4750141 4895631 8217579 8163326 8279164
* @summary Check enabled and supported ciphersuites are correct
* @run main/othervm CheckCipherSuites default
* @run main/othervm CheckCipherSuites limited
@@ -46,52 +46,36 @@ public class CheckCipherSuites {
"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
- // AES_256(GCM) - ECDHE - forward screcy
+ // AES_256(GCM) - ECDHE - forward secrecy
"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
- // AES_128(GCM) - ECDHE - forward screcy
+ // AES_128(GCM) - ECDHE - forward secrecy
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
- // AES_256(GCM) - DHE - forward screcy
+ // AES_256(GCM) - DHE - forward secrecy
"TLS_DHE_RSA_WITH_AES_256_GCM_SHA384",
"TLS_DHE_DSS_WITH_AES_256_GCM_SHA384",
- // AES_128(GCM) - DHE - forward screcy
+ // AES_128(GCM) - DHE - forward secrecy
"TLS_DHE_RSA_WITH_AES_128_GCM_SHA256",
"TLS_DHE_DSS_WITH_AES_128_GCM_SHA256",
- // AES_256(CBC) - ECDHE - forward screcy
+ // AES_256(CBC) - ECDHE - forward secrecy
"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384",
"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384",
- // AES_256(CBC) - ECDHE - forward screcy
+ // AES_256(CBC) - ECDHE - forward secrecy
"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256",
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",
- // AES_256(CBC) - DHE - forward screcy
+ // AES_256(CBC) - DHE - forward secrecy
"TLS_DHE_RSA_WITH_AES_256_CBC_SHA256",
"TLS_DHE_DSS_WITH_AES_256_CBC_SHA256",
- // AES_128(CBC) - DHE - forward screcy
+ // AES_128(CBC) - DHE - forward secrecy
"TLS_DHE_RSA_WITH_AES_128_CBC_SHA256",
"TLS_DHE_DSS_WITH_AES_128_CBC_SHA256",
- // AES_256(GCM) - not forward screcy
- "TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384",
- "TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384",
-
- // AES_128(GCM) - not forward screcy
- "TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256",
- "TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256",
-
- // AES_256(CBC) - not forward screcy
- "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384",
- "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384",
-
- // AES_128(CBC) - not forward screcy
- "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256",
- "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256",
-
// AES_256(CBC) - ECDHE - using SHA
"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
@@ -108,14 +92,6 @@ public class CheckCipherSuites {
"TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
"TLS_DHE_DSS_WITH_AES_128_CBC_SHA",
- // AES_256(CBC) - using SHA, not forward screcy
- "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA",
- "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA",
-
- // AES_128(CBC) - using SHA, not forward screcy
- "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA",
- "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA",
-
// deprecated
"TLS_RSA_WITH_AES_256_GCM_SHA384",
"TLS_RSA_WITH_AES_128_GCM_SHA256",
@@ -138,16 +114,10 @@ public class CheckCipherSuites {
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",
"TLS_DHE_RSA_WITH_AES_128_CBC_SHA256",
"TLS_DHE_DSS_WITH_AES_128_CBC_SHA256",
- "TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256",
- "TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256",
- "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256",
- "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256",
"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
"TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
"TLS_DHE_DSS_WITH_AES_128_CBC_SHA",
- "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA",
- "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA",
"TLS_RSA_WITH_AES_128_GCM_SHA256",
"TLS_RSA_WITH_AES_128_CBC_SHA256",
"TLS_RSA_WITH_AES_128_CBC_SHA",
@@ -165,52 +135,36 @@ public class CheckCipherSuites {
"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
- // AES_256(GCM) - ECDHE - forward screcy
+ // AES_256(GCM) - ECDHE - forward secrecy
"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
- // AES_128(GCM) - ECDHE - forward screcy
+ // AES_128(GCM) - ECDHE - forward secrecy
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
- // AES_256(GCM) - DHE - forward screcy
+ // AES_256(GCM) - DHE - forward secrecy
"TLS_DHE_RSA_WITH_AES_256_GCM_SHA384",
"TLS_DHE_DSS_WITH_AES_256_GCM_SHA384",
- // AES_128(GCM) - DHE - forward screcy
+ // AES_128(GCM) - DHE - forward secrecy
"TLS_DHE_RSA_WITH_AES_128_GCM_SHA256",
"TLS_DHE_DSS_WITH_AES_128_GCM_SHA256",
- // AES_256(CBC) - ECDHE - forward screcy
+ // AES_256(CBC) - ECDHE - forward secrecy
"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384",
"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384",
- // AES_256(CBC) - ECDHE - forward screcy
+ // AES_256(CBC) - ECDHE - forward secrecy
"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256",
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",
- // AES_256(CBC) - DHE - forward screcy
+ // AES_256(CBC) - DHE - forward secrecy
"TLS_DHE_RSA_WITH_AES_256_CBC_SHA256",
"TLS_DHE_DSS_WITH_AES_256_CBC_SHA256",
- // AES_128(CBC) - DHE - forward screcy
+ // AES_128(CBC) - DHE - forward secrecy
"TLS_DHE_RSA_WITH_AES_128_CBC_SHA256",
"TLS_DHE_DSS_WITH_AES_128_CBC_SHA256",
- // AES_256(GCM) - not forward screcy
- "TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384",
- "TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384",
-
- // AES_128(GCM) - not forward screcy
- "TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256",
- "TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256",
-
- // AES_256(CBC) - not forward screcy
- "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384",
- "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384",
-
- // AES_128(CBC) - not forward screcy
- "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256",
- "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256",
-
// AES_256(CBC) - ECDHE - using SHA
"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
@@ -227,14 +181,6 @@ public class CheckCipherSuites {
"TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
"TLS_DHE_DSS_WITH_AES_128_CBC_SHA",
- // AES_256(CBC) - using SHA, not forward screcy
- "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA",
- "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA",
-
- // AES_128(CBC) - using SHA, not forward screcy
- "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA",
- "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA",
-
// deprecated
"TLS_RSA_WITH_AES_256_GCM_SHA384",
"TLS_RSA_WITH_AES_128_GCM_SHA256",
@@ -257,16 +203,10 @@ public class CheckCipherSuites {
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",
"TLS_DHE_RSA_WITH_AES_128_CBC_SHA256",
"TLS_DHE_DSS_WITH_AES_128_CBC_SHA256",
- "TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256",
- "TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256",
- "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256",
- "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256",
"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
"TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
"TLS_DHE_DSS_WITH_AES_128_CBC_SHA",
- "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA",
- "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA",
"TLS_RSA_WITH_AES_128_GCM_SHA256",
"TLS_RSA_WITH_AES_128_CBC_SHA256",
"TLS_RSA_WITH_AES_128_CBC_SHA",
From b499ea7ec2ffb2211a67d38b3bd689a77866cb0d Mon Sep 17 00:00:00 2001
From: Kazuhisa Takakuri
Date: Tue, 25 Jun 2024 11:05:35 +0000
Subject: [PATCH 12/66] 8030204: com/sun/jdi/JdbExprTest.sh: Required output
"Can\\'t convert 2147483648 to int" not found
Reviewed-by: andrew, zzambers
Backport-of: 4799040e87ad97963e8d089d4338d429b1f7b0d1
---
jdk/test/com/sun/jdi/JdbExprTest.sh | 134 ++++++++++++++--------------
1 file changed, 67 insertions(+), 67 deletions(-)
diff --git a/jdk/test/com/sun/jdi/JdbExprTest.sh b/jdk/test/com/sun/jdi/JdbExprTest.sh
index e60b51b7ac..9645714dc0 100644
--- a/jdk/test/com/sun/jdi/JdbExprTest.sh
+++ b/jdk/test/com/sun/jdi/JdbExprTest.sh
@@ -45,9 +45,9 @@ import java.net.URL;
class $classname {
- static long aLong;
- static int anInt;
- static boolean aBoolean;
+ static long aLong;
+ static int anInt;
+ static boolean aBoolean;
public static void bkpt() {
int i = 0; //@1 breakpoint
@@ -67,70 +67,70 @@ dojdbCmds()
setBkpts @1
runToBkpt @1
- cmd print java.lang.Long.MAX_VALUE
- jdbFailIfNotPresent " \= 9223372036854775807" 3
-
- cmd print java.lang.Long.MIN_VALUE
- jdbFailIfNotPresent " \= \-9223372036854775808" 3
-
- cmd print 9223372036854775807L
- jdbFailIfNotPresent "9223372036854775807L = 9223372036854775807" 3
- cmd print 9223372036854775807
- jdbFailIfNotPresent "9223372036854775807 = 9223372036854775807" 3
-
- cmd print -9223372036854775807L
- jdbFailIfNotPresent "\-9223372036854775807L = \-9223372036854775807" 3
- cmd print -9223372036854775807
- jdbFailIfNotPresent "\-9223372036854775807 = \-9223372036854775807" 3
-
- cmd print -1
- jdbFailIfNotPresent "\-1 = \-1" 3
- cmd print 1L
- jdbFailIfNotPresent "1L = 1" 3
- cmd print -1L
- jdbFailIfNotPresent "\-1L = \-1" 3
- cmd print 0x1
- jdbFailIfNotPresent "0x1 = 1" 3
-
- cmd set $classname.aLong = 9223372036854775807L
- cmd print $classname.aLong
- jdbFailIfNotPresent "$classname.aLong = 9223372036854775807" 3
-
- cmd set $classname.anInt = java.lang.Integer.MAX_VALUE + 1
- cmd print $classname.anInt
- jdbFailIfNotPresent "$classname.anInt = \-2147483648" 3
-
- cmd set $classname.aLong = java.lang.Integer.MAX_VALUE + 1L
- cmd print $classname.aLong
- jdbFailIfNotPresent "$classname.aLong = 2147483648" 3
-
- cmd set $classname.anInt = 0x80000000
- jdbFailIfNotPresent "Can\'t convert 2147483648 to int" 3
- cmd set $classname.anInt = 0x8000000000000000L
- jdbFailIfNotPresent "java.lang.NumberFormatException: For input string: \"8000000000000000\"" 3
-
- cmd set $classname.anInt = 0x7fffffff
- jdbFailIfNotPresent "0x7fffffff = 2147483647" 3
- cmd set $classname.aLong = 0x7fffffffffffffff
- jdbFailIfNotPresent "0x7fffffffffffffff = 9223372036854775807" 3
-
- cmd print 3.1415
- jdbFailIfNotPresent "3.1415 = 3.1415" 3
- cmd print -3.1415
- jdbFailIfNotPresent "\-3.1415 = \-3.1415" 3
- cmd print 011
- jdbFailIfNotPresent "011 = 9" 3
-
- cmd set $classname.aBoolean = false
- jdbFailIfNotPresent "JdbExprTest.aBoolean = false = false" 3
- cmd print $classname.aBoolean
- jdbFailIfNotPresent "JdbExprTest.aBoolean = false" 3
- cmd print !$classname.aBoolean
- jdbFailIfNotPresent "JdbExprTest.aBoolean = true" 3
-
- cmd print ~1
- jdbFailIfNotPresent "~1 = -2" 3
-
+ cmd print java.lang.Long.MAX_VALUE
+ jdbFailIfNotPresent " \= 9223372036854775807" 3
+
+ cmd print java.lang.Long.MIN_VALUE
+ jdbFailIfNotPresent " \= \-9223372036854775808" 3
+
+ cmd print 9223372036854775807L
+ jdbFailIfNotPresent "9223372036854775807L = 9223372036854775807" 3
+ cmd print 9223372036854775807
+ jdbFailIfNotPresent "9223372036854775807 = 9223372036854775807" 3
+
+ cmd print -9223372036854775807L
+ jdbFailIfNotPresent "\-9223372036854775807L = \-9223372036854775807" 3
+ cmd print -9223372036854775807
+ jdbFailIfNotPresent "\-9223372036854775807 = \-9223372036854775807" 3
+
+ cmd print -1
+ jdbFailIfNotPresent "\-1 = \-1" 3
+ cmd print 1L
+ jdbFailIfNotPresent "1L = 1" 3
+ cmd print -1L
+ jdbFailIfNotPresent "\-1L = \-1" 3
+ cmd print 0x1
+ jdbFailIfNotPresent "0x1 = 1" 3
+
+ cmd set $classname.aLong = 9223372036854775807L
+ cmd print $classname.aLong
+ jdbFailIfNotPresent "$classname.aLong = 9223372036854775807" 3
+
+ cmd set $classname.anInt = java.lang.Integer.MAX_VALUE + 1
+ cmd print $classname.anInt
+ jdbFailIfNotPresent "$classname.anInt = \-2147483648" 3
+
+ cmd set $classname.aLong = java.lang.Integer.MAX_VALUE + 1L
+ cmd print $classname.aLong
+ jdbFailIfNotPresent "$classname.aLong = 2147483648" 3
+
+ cmd set $classname.anInt = 0x80000000
+ jdbFailIfNotPresent "InvalidTypeException: .* convert 2147483648 to int" 3
+ cmd set $classname.anInt = 0x8000000000000000L
+ jdbFailIfNotPresent "java.lang.NumberFormatException: For input string: \"8000000000000000\"" 3
+
+ cmd set $classname.anInt = 0x7fffffff
+ jdbFailIfNotPresent "0x7fffffff = 2147483647" 3
+ cmd set $classname.aLong = 0x7fffffffffffffff
+ jdbFailIfNotPresent "0x7fffffffffffffff = 9223372036854775807" 3
+
+ cmd print 3.1415
+ jdbFailIfNotPresent "3.1415 = 3.1415" 3
+ cmd print -3.1415
+ jdbFailIfNotPresent "\-3.1415 = \-3.1415" 3
+ cmd print 011
+ jdbFailIfNotPresent "011 = 9" 3
+
+ cmd set $classname.aBoolean = false
+ jdbFailIfNotPresent "JdbExprTest.aBoolean = false = false" 3
+ cmd print $classname.aBoolean
+ jdbFailIfNotPresent "JdbExprTest.aBoolean = false" 3
+ cmd print !$classname.aBoolean
+ jdbFailIfNotPresent "JdbExprTest.aBoolean = true" 3
+
+ cmd print ~1
+ jdbFailIfNotPresent "~1 = -2" 3
+
cmd quit
}
From a0715ab4bc71642203324a2c06774aacee35fda7 Mon Sep 17 00:00:00 2001
From: Kazuhisa Takakuri
Date: Thu, 27 Jun 2024 13:52:33 +0000
Subject: [PATCH 13/66] 8238274: (sctp) JDK-7118373 is not fixed for
SctpChannel
Reviewed-by: phh, andrew
Backport-of: d91e227abb94953129adc297fbd456c55bb2ae10
---
.../sun/nio/ch/sctp/SctpChannelImpl.java | 3 +-
.../sun/nio/ch/sctp/SctpMultiChannelImpl.java | 3 +-
.../nio/ch/sctp/SctpServerChannelImpl.java | 3 +-
.../sctp/SctpChannel/CloseDescriptors.java | 212 ++++++++++++++++++
4 files changed, 218 insertions(+), 3 deletions(-)
create mode 100644 jdk/test/com/sun/nio/sctp/SctpChannel/CloseDescriptors.java
diff --git a/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpChannelImpl.java b/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpChannelImpl.java
index 246d9dea3b..4961e5a29a 100644
--- a/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpChannelImpl.java
+++ b/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpChannelImpl.java
@@ -562,7 +562,8 @@ protected void implConfigureBlocking(boolean block) throws IOException {
@Override
public void implCloseSelectableChannel() throws IOException {
synchronized (stateLock) {
- SctpNet.preClose(fdVal);
+ if (state != ChannelState.KILLED)
+ SctpNet.preClose(fdVal);
if (receiverThread != 0)
NativeThread.signal(receiverThread);
diff --git a/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpMultiChannelImpl.java b/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpMultiChannelImpl.java
index db08f342aa..629c1ca1e5 100644
--- a/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpMultiChannelImpl.java
+++ b/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpMultiChannelImpl.java
@@ -289,7 +289,8 @@ protected void implConfigureBlocking(boolean block) throws IOException {
@Override
public void implCloseSelectableChannel() throws IOException {
synchronized (stateLock) {
- SctpNet.preClose(fdVal);
+ if (state != ChannelState.KILLED)
+ SctpNet.preClose(fdVal);
if (receiverThread != 0)
NativeThread.signal(receiverThread);
diff --git a/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpServerChannelImpl.java b/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpServerChannelImpl.java
index ee9d7f85ea..ba7051c117 100644
--- a/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpServerChannelImpl.java
+++ b/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpServerChannelImpl.java
@@ -266,7 +266,8 @@ protected void implConfigureBlocking(boolean block) throws IOException {
@Override
public void implCloseSelectableChannel() throws IOException {
synchronized (stateLock) {
- SctpNet.preClose(fdVal);
+ if (state != ChannelState.KILLED)
+ SctpNet.preClose(fdVal);
if (thread != 0)
NativeThread.signal(thread);
if (!isRegistered())
diff --git a/jdk/test/com/sun/nio/sctp/SctpChannel/CloseDescriptors.java b/jdk/test/com/sun/nio/sctp/SctpChannel/CloseDescriptors.java
new file mode 100644
index 0000000000..dd54d08d91
--- /dev/null
+++ b/jdk/test/com/sun/nio/sctp/SctpChannel/CloseDescriptors.java
@@ -0,0 +1,212 @@
+/*
+ * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8238274
+ * @summary Potential leak file descriptor for SCTP
+ * @library /lib/testlibrary
+ * @requires (os.family == "linux")
+ * @run main/othervm/timeout=250 CloseDescriptors
+ */
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.lang.management.ManagementFactory;
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.ServerSocket;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.Selector;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+import java.util.Optional;
+import com.sun.nio.sctp.SctpChannel;
+import com.sun.nio.sctp.SctpServerChannel;
+
+import jdk.testlibrary.Utils;
+
+public class CloseDescriptors {
+ private static Selector selector;
+ private static final int LOOP = 10;
+ private static final int LIMIT_LINES = 3;
+ private static SelectorThread selThread;
+ private static boolean finished = false;
+
+ public static void main(String[] args) throws Exception {
+ if (!Util.isSCTPSupported()) {
+ System.out.println("SCTP protocol is not supported");
+ System.out.println("Test cannot be run");
+ return;
+ }
+
+ List lsofDirs = Utils.listOf("/usr/bin", "/usr/sbin");
+
+ Optional lsof = lsofDirs.stream()
+ .map(s -> Paths.get(s, "lsof"))
+ .filter(f -> Files.isExecutable(f))
+ .findFirst();
+ if (!lsof.isPresent()) {
+ System.out.println("Cannot locate lsof in " + lsofDirs);
+ System.out.println("Test cannot be run");
+ return;
+ }
+
+ try (ServerSocket ss = new ServerSocket(0)) {
+ int port = ss.getLocalPort();
+
+ Server server = new Server(port);
+ server.start();
+
+ selector = Selector.open();
+
+ selThread = new SelectorThread();
+ selThread.start();
+
+ // give time for the server and selector to start
+ Thread.sleep(100);
+ for (int i = 0 ; i < 100 ; ++i) {
+ System.out.println(i);
+ doIt(port);
+ Thread.sleep(100);
+ }
+ System.out.println("end");
+ if (!check()) {
+ cleanup(port);
+ throw new RuntimeException("Failed: detected unclosed FD.");
+ }
+ cleanup(port);
+ server.join();
+ selThread.join();
+ }
+ }
+
+ private static void doIt(int port) throws Exception {
+ InetSocketAddress sa = new InetSocketAddress("localhost", port);
+
+ for (int i = 0 ; i < LOOP ; ++i) {
+ System.out.println(" " + i);
+ try (SctpChannel channel = SctpChannel.open(sa, 1, 1)) {
+ channel.configureBlocking(false);
+
+ SelectionKey key = selThread.regChannel(channel);
+
+ key.cancel();
+ selector.wakeup();
+ }
+ catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ Thread.sleep(200);
+ }
+ }
+
+ private static boolean check() throws Exception {
+ String vmName = ManagementFactory.getRuntimeMXBean().getName();
+ long myPid = Long.parseLong(vmName.split("@")[0]);
+ ProcessBuilder pb = new ProcessBuilder(
+ "lsof", "-U", "-a", "-p", Long.toString(myPid));
+ pb.redirectErrorStream(true);
+ Process p = pb.start();
+ p.waitFor();
+ if (p.exitValue() != 0) {
+ return false;
+ }
+
+ boolean result = true;
+ try (BufferedReader br = new BufferedReader(new InputStreamReader(
+ p.getInputStream()))) {
+ int count = 0;
+ String line = br.readLine();
+ while (line != null) {
+ System.out.println(line);
+ count++;
+ if (count > LIMIT_LINES) {
+ result = false;
+ }
+ line = br.readLine();
+ }
+ }
+ return result;
+ }
+
+ private static void cleanup(int port) throws IOException {
+ finished = true;
+ InetSocketAddress sa = new InetSocketAddress("localhost", port);
+ SctpChannel channel = SctpChannel.open(sa, 1, 1);
+ channel.close();
+ }
+
+ private static class SelectorThread extends Thread {
+ private Object lock = new Object();
+ private SctpChannel channel;
+ private SelectionKey key;
+
+ public SelectionKey regChannel(SctpChannel ch) throws Exception {
+ synchronized (lock) {
+ channel = ch;
+ selector.wakeup();
+ lock.wait();
+ }
+ return key;
+ }
+
+ public void run() {
+ try {
+ while (!finished) {
+ selector.select(1000);
+ synchronized (lock) {
+ if (channel != null) {
+ key = channel.register(selector, SelectionKey.OP_READ);
+ channel = null;
+ lock.notify();
+ }
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private static class Server extends Thread {
+ private int port;
+
+ public Server(int port) { this.port = port; }
+
+ public void run() {
+ try {
+ SctpServerChannel ss = SctpServerChannel.open();
+ InetSocketAddress sa = new InetSocketAddress("localhost", port);
+ ss.bind(sa);
+ while (!finished) {
+ SctpChannel soc = ss.accept();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
From 44eac48705dd89f20cda5c4384cbecf417555eb1 Mon Sep 17 00:00:00 2001
From: Kazuhisa Takakuri
Date: Thu, 27 Jun 2024 17:44:26 +0000
Subject: [PATCH 14/66] 8137329: [windows] Build broken on VS2010 after
"8046148: JEP 158: Unified JVM Logging"
Reviewed-by: stuefe, andrew
Backport-of: 6c113577e63d359a78ed72e5f37919da26b2f20d
---
hotspot/src/share/vm/utilities/globalDefinitions_visCPP.hpp | 2 ++
1 file changed, 2 insertions(+)
diff --git a/hotspot/src/share/vm/utilities/globalDefinitions_visCPP.hpp b/hotspot/src/share/vm/utilities/globalDefinitions_visCPP.hpp
index 2ecf968734..70f9b2eccd 100644
--- a/hotspot/src/share/vm/utilities/globalDefinitions_visCPP.hpp
+++ b/hotspot/src/share/vm/utilities/globalDefinitions_visCPP.hpp
@@ -151,6 +151,8 @@ const jlong max_jlong = CONST64(0x7fffffffffffffff);
#endif
#if _MSC_VER < 1800
+// Visual Studio 2013 introduced strtoull(); before, one has to use _strtoui64() instead.
+#define strtoull _strtoui64
// Fixes some wrong warnings about 'this' : used in base member initializer list
#pragma warning( disable : 4355 )
#endif
From 385e34d860965a77df355edfd8c1d99af5afe38c Mon Sep 17 00:00:00 2001
From: Francisco Ferrari Bihurriet
Date: Fri, 28 Jun 2024 16:03:10 +0000
Subject: [PATCH 15/66] 8262017: C2: assert(n != __null) failed: Bad immediate
dominator info. 8205407: [windows, vs<2017] C4800 after 8203197
Reviewed-by: mbalao, roland
Backport-of: 2db9005c07585b580b3ec0889b8b5e3ed0d0ca6a
---
hotspot/make/windows/makefiles/compile.make | 2 +-
hotspot/src/share/vm/opto/addnode.cpp | 89 ++++++++++
hotspot/src/share/vm/opto/addnode.hpp | 30 ++++
hotspot/src/share/vm/opto/loopTransform.cpp | 42 +++--
.../rangechecks/TestRangeCheckLimits.java | 158 ++++++++++++++++++
5 files changed, 308 insertions(+), 13 deletions(-)
create mode 100644 hotspot/test/compiler/rangechecks/TestRangeCheckLimits.java
diff --git a/hotspot/make/windows/makefiles/compile.make b/hotspot/make/windows/makefiles/compile.make
index b4f0d39e50..26c215f8d0 100644
--- a/hotspot/make/windows/makefiles/compile.make
+++ b/hotspot/make/windows/makefiles/compile.make
@@ -53,7 +53,7 @@ CXX=cl.exe
# improving the quality of crash log stack traces involving jvm.dll.
# These are always used in all compiles
-CXX_FLAGS=$(EXTRA_CFLAGS) /nologo /W3 /WX
+CXX_FLAGS=$(EXTRA_CFLAGS) /nologo /W3 /WX /wd4800
# Let's add debug information when Full Debug Symbols is enabled
!if "$(ENABLE_FULL_DEBUG_SYMBOLS)" == "1"
diff --git a/hotspot/src/share/vm/opto/addnode.cpp b/hotspot/src/share/vm/opto/addnode.cpp
index e56cfa9b5e..29e6cdb940 100644
--- a/hotspot/src/share/vm/opto/addnode.cpp
+++ b/hotspot/src/share/vm/opto/addnode.cpp
@@ -833,6 +833,95 @@ const Type *XorLNode::add_ring( const Type *t0, const Type *t1 ) const {
return TypeLong::make( r0->get_con() ^ r1->get_con() );
}
+
+Node* MaxNode::build_min_max(Node* a, Node* b, bool is_max, bool is_unsigned, const Type* t, PhaseGVN& gvn) {
+ bool is_int = gvn.type(a)->isa_int();
+ assert(is_int || gvn.type(a)->isa_long(), "int or long inputs");
+ assert(is_int == (gvn.type(b)->isa_int() != NULL), "inconsistent inputs");
+ if (!is_unsigned) {
+ if (is_max) {
+ if (is_int) {
+ Node* res = gvn.transform(new (gvn.C) MaxINode(a, b));
+ assert(gvn.type(res)->is_int()->_lo >= t->is_int()->_lo && gvn.type(res)->is_int()->_hi <= t->is_int()->_hi, "type doesn't match");
+ return res;
+ } else {
+ Node* cmp = gvn.transform(new (gvn.C) CmpLNode(a, b));
+ Node* bol = gvn.transform(new (gvn.C) BoolNode(cmp, BoolTest::lt));
+ return gvn.transform(new (gvn.C) CMoveLNode(bol, a, b, t->is_long()));
+ }
+ } else {
+ if (is_int) {
+ Node* res = gvn.transform(new (gvn.C) MinINode(a, b));
+ assert(gvn.type(res)->is_int()->_lo >= t->is_int()->_lo && gvn.type(res)->is_int()->_hi <= t->is_int()->_hi, "type doesn't match");
+ return res;
+ } else {
+ Node* cmp = gvn.transform(new (gvn.C) CmpLNode(b, a));
+ Node* bol = gvn.transform(new (gvn.C) BoolNode(cmp, BoolTest::lt));
+ return gvn.transform(new (gvn.C) CMoveLNode(bol, a, b, t->is_long()));
+ }
+ }
+ } else {
+ if (is_max) {
+ if (is_int) {
+ Node* cmp = gvn.transform(new (gvn.C) CmpUNode(a, b));
+ Node* bol = gvn.transform(new (gvn.C) BoolNode(cmp, BoolTest::lt));
+ return gvn.transform(new (gvn.C) CMoveINode(bol, a, b, t->is_int()));
+ } else {
+ Node* cmp = gvn.transform(new (gvn.C) CmpULNode(a, b));
+ Node* bol = gvn.transform(new (gvn.C) BoolNode(cmp, BoolTest::lt));
+ return gvn.transform(new (gvn.C) CMoveLNode(bol, a, b, t->is_long()));
+ }
+ } else {
+ if (is_int) {
+ Node* cmp = gvn.transform(new (gvn.C) CmpUNode(b, a));
+ Node* bol = gvn.transform(new (gvn.C) BoolNode(cmp, BoolTest::lt));
+ return gvn.transform(new (gvn.C) CMoveINode(bol, a, b, t->is_int()));
+ } else {
+ Node* cmp = gvn.transform(new (gvn.C) CmpULNode(b, a));
+ Node* bol = gvn.transform(new (gvn.C) BoolNode(cmp, BoolTest::lt));
+ return gvn.transform(new (gvn.C) CMoveLNode(bol, a, b, t->is_long()));
+ }
+ }
+ }
+}
+
+Node* MaxNode::build_min_max_diff_with_zero(Node* a, Node* b, bool is_max, const Type* t, PhaseGVN& gvn) {
+ bool is_int = gvn.type(a)->isa_int();
+ assert(is_int || gvn.type(a)->isa_long(), "int or long inputs");
+ assert(is_int == (gvn.type(b)->isa_int() != NULL), "inconsistent inputs");
+ Node* zero = NULL;
+ if (is_int) {
+ zero = gvn.intcon(0);
+ } else {
+ zero = gvn.longcon(0);
+ }
+ if (is_max) {
+ if (is_int) {
+ Node* cmp = gvn.transform(new (gvn.C) CmpINode(a, b));
+ Node* sub = gvn.transform(new (gvn.C) SubINode(a, b));
+ Node* bol = gvn.transform(new (gvn.C) BoolNode(cmp, BoolTest::lt));
+ return gvn.transform(new (gvn.C) CMoveINode(bol, sub, zero, t->is_int()));
+ } else {
+ Node* cmp = gvn.transform(new (gvn.C) CmpLNode(a, b));
+ Node* sub = gvn.transform(new (gvn.C) SubLNode(a, b));
+ Node* bol = gvn.transform(new (gvn.C) BoolNode(cmp, BoolTest::lt));
+ return gvn.transform(new (gvn.C) CMoveLNode(bol, sub, zero, t->is_long()));
+ }
+ } else {
+ if (is_int) {
+ Node* cmp = gvn.transform(new (gvn.C) CmpINode(b, a));
+ Node* sub = gvn.transform(new (gvn.C) SubINode(a, b));
+ Node* bol = gvn.transform(new (gvn.C) BoolNode(cmp, BoolTest::lt));
+ return gvn.transform(new (gvn.C) CMoveINode(bol, sub, zero, t->is_int()));
+ } else {
+ Node* cmp = gvn.transform(new (gvn.C) CmpLNode(b, a));
+ Node* sub = gvn.transform(new (gvn.C) SubLNode(a, b));
+ Node* bol = gvn.transform(new (gvn.C) BoolNode(cmp, BoolTest::lt));
+ return gvn.transform(new (gvn.C) CMoveLNode(bol, sub, zero, t->is_long()));
+ }
+ }
+}
+
//=============================================================================
//------------------------------add_ring---------------------------------------
// Supplied function returns the sum of the inputs.
diff --git a/hotspot/src/share/vm/opto/addnode.hpp b/hotspot/src/share/vm/opto/addnode.hpp
index 31aed490e7..24eb62e1df 100644
--- a/hotspot/src/share/vm/opto/addnode.hpp
+++ b/hotspot/src/share/vm/opto/addnode.hpp
@@ -217,9 +217,39 @@ class XorLNode : public AddNode {
// all the behavior of addition on a ring. Only new thing is that we allow
// 2 equal inputs to be equal.
class MaxNode : public AddNode {
+private:
+ static Node* build_min_max(Node* a, Node* b, bool is_max, bool is_unsigned, const Type* t, PhaseGVN& gvn);
+ static Node* build_min_max_diff_with_zero(Node* a, Node* b, bool is_max, const Type* t, PhaseGVN& gvn);
+
public:
MaxNode( Node *in1, Node *in2 ) : AddNode(in1,in2) {}
virtual int Opcode() const = 0;
+
+ static Node* unsigned_max(Node* a, Node* b, const Type* t, PhaseGVN& gvn) {
+ return build_min_max(a, b, true, true, t, gvn);
+ }
+
+ static Node* unsigned_min(Node* a, Node* b, const Type* t, PhaseGVN& gvn) {
+ return build_min_max(a, b, false, true, t, gvn);
+ }
+
+ static Node* signed_max(Node* a, Node* b, const Type* t, PhaseGVN& gvn) {
+ return build_min_max(a, b, true, false, t, gvn);
+ }
+
+ static Node* signed_min(Node* a, Node* b, const Type* t, PhaseGVN& gvn) {
+ return build_min_max(a, b, false, false, t, gvn);
+ }
+
+ // max(a-b, 0)
+ static Node* max_diff_with_zero(Node* a, Node* b, const Type* t, PhaseGVN& gvn) {
+ return build_min_max_diff_with_zero(a, b, true, t, gvn);
+ }
+
+ // min(a-b, 0)
+ static Node* min_diff_with_zero(Node* a, Node* b, const Type* t, PhaseGVN& gvn) {
+ return build_min_max_diff_with_zero(a, b, false, t, gvn);
+ }
};
//------------------------------MaxINode---------------------------------------
diff --git a/hotspot/src/share/vm/opto/loopTransform.cpp b/hotspot/src/share/vm/opto/loopTransform.cpp
index 7b3f3abe81..02229555e4 100644
--- a/hotspot/src/share/vm/opto/loopTransform.cpp
+++ b/hotspot/src/share/vm/opto/loopTransform.cpp
@@ -1544,22 +1544,40 @@ Node* PhaseIdealLoop::adjust_limit(bool is_positive_stride, Node* scale, Node* o
register_new_node(limit, pre_ctrl);
}
- // Clamp the limit to handle integer under-/overflows.
+ // Clamp the limit to handle integer under-/overflows by using long values.
+ // We only convert the limit back to int when we handled under-/overflows.
+ // Note that all values are longs in the following computations.
// When reducing the limit, clamp to [min_jint, old_limit]:
- // MIN(old_limit, MAX(limit, min_jint))
+ // INT(MINL(old_limit, MAXL(limit, min_jint)))
+ // - integer underflow of limit: MAXL chooses min_jint.
+ // - integer overflow of limit: MINL chooses old_limit (<= MAX_INT < limit)
// When increasing the limit, clamp to [old_limit, max_jint]:
- // MAX(old_limit, MIN(limit, max_jint))
- Node* cmp = new (C) CmpLNode(limit, _igvn.longcon(is_positive_stride ? min_jint : max_jint));
+ // INT(MAXL(old_limit, MINL(limit, max_jint)))
+ // - integer overflow of limit: MINL chooses max_jint.
+ // - integer underflow of limit: MAXL chooses old_limit (>= MIN_INT > limit)
+ // INT() is finally converting the limit back to an integer value.
+
+ // We use CMove nodes to implement long versions of min/max (MINL/MAXL).
+ // We use helper methods for inner MINL/MAXL which return CMoveL nodes to keep a long value for the outer MINL/MAXL comparison:
+ Node* inner_result_long;
+ if (is_positive_stride) {
+ inner_result_long = MaxNode::signed_max(limit, _igvn.longcon(min_jint), TypeLong::LONG, _igvn);
+ } else {
+ inner_result_long = MaxNode::signed_min(limit, _igvn.longcon(max_jint), TypeLong::LONG, _igvn);
+ }
+ set_subtree_ctrl(inner_result_long);
+
+ // Outer MINL/MAXL:
+ // The comparison is done with long values but the result is the converted back to int by using CmovI.
+ Node* old_limit_long = new (C) ConvI2LNode(old_limit);
+ register_new_node(old_limit_long, pre_ctrl);
+ Node* cmp = new (C) CmpLNode(old_limit_long, limit);
register_new_node(cmp, pre_ctrl);
- Node* bol = new (C) BoolNode(cmp, is_positive_stride ? BoolTest::lt : BoolTest::gt);
+ Node* bol = new (C) BoolNode(cmp, is_positive_stride ? BoolTest::gt : BoolTest::lt);
register_new_node(bol, pre_ctrl);
- limit = new (C) ConvL2INode(limit);
- register_new_node(limit, pre_ctrl);
- limit = new (C) CMoveINode(bol, limit, _igvn.intcon(is_positive_stride ? min_jint : max_jint), TypeInt::INT);
- register_new_node(limit, pre_ctrl);
-
- limit = is_positive_stride ? (Node*)(new (C) MinINode(old_limit, limit))
- : (Node*)(new (C) MaxINode(old_limit, limit));
+ Node* inner_result_int = new (C) ConvL2INode(inner_result_long); // Could under-/overflow but that's fine as comparison was done with CmpL
+ register_new_node(inner_result_int, pre_ctrl);
+ limit = new (C) CMoveINode(bol, old_limit, inner_result_int, TypeInt::INT);
register_new_node(limit, pre_ctrl);
return limit;
}
diff --git a/hotspot/test/compiler/rangechecks/TestRangeCheckLimits.java b/hotspot/test/compiler/rangechecks/TestRangeCheckLimits.java
new file mode 100644
index 0000000000..ba8af6b210
--- /dev/null
+++ b/hotspot/test/compiler/rangechecks/TestRangeCheckLimits.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8262017
+ * @summary Dominator failure because ConvL2I node becomes TOP due to missing overflow/underflow handling in range check elimination
+ * in PhaseIdealLoop::add_constraint().
+ * @run main/othervm -Xcomp -XX:-TieredCompilation -XX:CompileCommand=compileonly,compiler.rangechecks.TestRangeCheckLimits::*
+ * compiler.rangechecks.TestRangeCheckLimits
+ */
+
+ package compiler.rangechecks;
+
+ public class TestRangeCheckLimits {
+ static int a = 400;
+ static volatile int b;
+ static long lFld;
+ static int iFld;
+
+ public static void main(String[] k) {
+ // Test all cases in PhaseIdealLoop::add_constraint().
+ testPositiveCaseMainLoop();
+ testNegativeCaseMainLoop();
+ testPositiveCasePreLoop();
+ testNegativeCasePreLoop();
+ }
+
+ public static void testPositiveCaseMainLoop() {
+ int e, f, g = 0, h[] = new int[a];
+ double i[] = new double[a];
+ long j = 9;
+ Helper.init(h, 3);
+ for (e = 5; e < 154; e++) {
+ for (f = 1; f < 169; f += 2) {
+ b = e;
+ }
+ i[1] = b;
+ for (g = 8; g < 168; g += 2) {
+ j = g - 5;
+ if (j > Integer.MAX_VALUE - 1) {
+ switch (3) {
+ case 3:
+ }
+ }
+ }
+ }
+ if (g != 168) {
+ throw new RuntimeException("fail");
+ }
+ lFld = j;
+ }
+
+
+ public static void testPositiveCasePreLoop() {
+ int e, f, g = 0, h[] = new int[a];
+ double i[] = new double[a];
+ long j = 9;
+ Helper.init(h, 3);
+ for (e = 5; e < 154; e++) {
+ for (f = 1; f < 169; f += 2) {
+ b = e;
+ }
+ i[1] = b;
+ for (g = 8; g < 168; g += 2) {
+ j = g + 5;
+ if (j > 180) {
+ switch (3) {
+ case 3:
+ }
+ }
+ }
+ }
+ if (g != 168) {
+ throw new RuntimeException("fail");
+ }
+ lFld = j;
+ }
+
+ public static void testNegativeCaseMainLoop() {
+ int e, f, g = 0, h[] = new int[a];
+ double i[] = new double[a];
+ long j = 9;
+ Helper.init(h, 3);
+ for (e = 5; e < 154; e++) {
+ for (f = 1; f < 169; f += 2) {
+ b = e;
+ }
+ i[1] = b;
+ for (g = 8; g < 168; g += 2) {
+ j = g;
+ if (j < 5) {
+ switch (3) {
+ case 3:
+ }
+ }
+ }
+ }
+ if (g != 168) {
+ throw new RuntimeException("fail");
+ }
+ lFld = j;
+ }
+
+
+ public static void testNegativeCasePreLoop() {
+ int e, f, g = 0, h[] = new int[a];
+ double i[] = new double[a];
+ long j = 9;
+ Helper.init(h, 3);
+ for (e = 5; e < 154; e++) {
+ for (f = 1; f < 169; f += 2) {
+ b = e;
+ }
+ i[1] = b;
+ for (g = 168; g > 8; g -= 2) {
+ j = g - 5;
+ if (j > Integer.MAX_VALUE - 1) {
+ switch (3) {
+ case 3:
+ }
+ }
+ }
+ }
+ if (g != 8) {
+ throw new RuntimeException("fail");
+ }
+ lFld = j;
+ }
+}
+
+class Helper {
+ public static void init(int[] a, int seed) {
+ for (int j = 0; j < a.length; j++) {
+ a[j] = (j % 2 == 0) ? seed + j : seed - j;
+ }
+ }
+}
From 54f7734c7cea3a20d49103c4387ed9023992e5a6 Mon Sep 17 00:00:00 2001
From: Martin Balao
Date: Mon, 1 Jul 2024 19:07:08 +0000
Subject: [PATCH 16/66] 8303466: C2: failed: malformed control flow. Limit type
made precise with MaxL/MinL
Reviewed-by: andrew, roland
Backport-of: cc894d849aa5f730d5a806acfc7a237cf5170af1
---
hotspot/src/share/vm/opto/addnode.cpp | 134 ++++++++++++++++++
hotspot/src/share/vm/opto/addnode.hpp | 34 +++++
hotspot/src/share/vm/opto/classes.hpp | 2 +
hotspot/src/share/vm/opto/connode.cpp | 14 ++
hotspot/src/share/vm/opto/connode.hpp | 1 +
hotspot/src/share/vm/opto/loopTransform.cpp | 103 ++++++--------
hotspot/src/share/vm/opto/macro.cpp | 16 ++-
hotspot/src/share/vm/opto/node.hpp | 1 +
hotspot/src/share/vm/opto/phaseX.cpp | 9 ++
hotspot/src/share/vm/runtime/vmStructs.cpp | 2 +
.../loopopts/TestUnrollLimitPreciseType.java | 90 ++++++++++++
11 files changed, 343 insertions(+), 63 deletions(-)
create mode 100644 hotspot/test/compiler/loopopts/TestUnrollLimitPreciseType.java
diff --git a/hotspot/src/share/vm/opto/addnode.cpp b/hotspot/src/share/vm/opto/addnode.cpp
index 29e6cdb940..a9282758e3 100644
--- a/hotspot/src/share/vm/opto/addnode.cpp
+++ b/hotspot/src/share/vm/opto/addnode.cpp
@@ -1024,6 +1024,140 @@ Node *MinINode::Ideal(PhaseGVN *phase, bool can_reshape) {
return NULL;
}
+// Collapse the "addition with overflow-protection" pattern, and the symmetrical
+// "subtraction with underflow-protection" pattern. These are created during the
+// unrolling, when we have to adjust the limit by subtracting the stride, but want
+// to protect against underflow: MaxL(SubL(limit, stride), min_jint).
+// If we have more than one of those in a sequence:
+//
+// x con2
+// | |
+// AddL clamp2
+// | |
+// Max/MinL con1
+// | |
+// AddL clamp1
+// | |
+// Max/MinL (n)
+//
+// We want to collapse it to:
+//
+// x con1 con2
+// | | |
+// | AddLNode (new_con)
+// | |
+// AddLNode clamp1
+// | |
+// Max/MinL (n)
+//
+// Note: we assume that SubL was already replaced by an AddL, and that the stride
+// has its sign flipped: SubL(limit, stride) -> AddL(limit, -stride).
+static bool is_clamp(PhaseGVN* phase, Node* n, Node* c) {
+ // Check that the two clamps have the correct values.
+ jlong clamp = (n->Opcode() == Op_MaxL) ? min_jint : max_jint;
+ const TypeLong* t = phase->type(c)->isa_long();
+ return t != NULL && t->is_con() &&
+ t->get_con() == clamp;
+}
+
+static bool is_sub_con(PhaseGVN* phase, Node* n, Node* c) {
+ // Check that the constants are negative if MaxL, and positive if MinL.
+ const TypeLong* t = phase->type(c)->isa_long();
+ return t != NULL && t->is_con() &&
+ t->get_con() < max_jint && t->get_con() > min_jint &&
+ (t->get_con() < 0) == (n->Opcode() == Op_MaxL);
+}
+
+Node* fold_subI_no_underflow_pattern(Node* n, PhaseGVN* phase) {
+ assert(n->Opcode() == Op_MaxL || n->Opcode() == Op_MinL, "sanity");
+ // Verify the graph level by level:
+ Node* add1 = n->in(1);
+ Node* clamp1 = n->in(2);
+ if (add1->Opcode() == Op_AddL && is_clamp(phase, n, clamp1)) {
+ Node* max2 = add1->in(1);
+ Node* con1 = add1->in(2);
+ if (max2->Opcode() == n->Opcode() && is_sub_con(phase, n, con1)) {
+ Node* add2 = max2->in(1);
+ Node* clamp2 = max2->in(2);
+ if (add2->Opcode() == Op_AddL && is_clamp(phase, n, clamp2)) {
+ Node* x = add2->in(1);
+ Node* con2 = add2->in(2);
+ if (is_sub_con(phase, n, con2)) {
+ Node* new_con = phase->transform(new (phase->C) AddLNode(con1, con2));
+ Node* new_sub = phase->transform(new (phase->C) AddLNode(x, new_con));
+ n->set_req_X(1, new_sub, phase);
+ return n;
+ }
+ }
+ }
+ }
+ return NULL;
+}
+
+const Type* MaxLNode::add_ring(const Type* t0, const Type* t1) const {
+ const TypeLong* r0 = t0->is_long();
+ const TypeLong* r1 = t1->is_long();
+
+ return TypeLong::make(MAX2(r0->_lo, r1->_lo), MAX2(r0->_hi, r1->_hi), MAX2(r0->_widen, r1->_widen));
+}
+
+Node* MaxLNode::Identity(PhaseGVN* phase) {
+ const TypeLong* t1 = phase->type(in(1))->is_long();
+ const TypeLong* t2 = phase->type(in(2))->is_long();
+
+ // Can we determine maximum statically?
+ if (t1->_lo >= t2->_hi) {
+ return in(1);
+ } else if (t2->_lo >= t1->_hi) {
+ return in(2);
+ }
+
+ return MaxNode::Identity(phase);
+}
+
+Node* MaxLNode::Ideal(PhaseGVN* phase, bool can_reshape) {
+ Node* n = AddNode::Ideal(phase, can_reshape);
+ if (n != NULL) {
+ return n;
+ }
+ if (can_reshape) {
+ return fold_subI_no_underflow_pattern(this, phase);
+ }
+ return NULL;
+}
+
+const Type* MinLNode::add_ring(const Type* t0, const Type* t1) const {
+ const TypeLong* r0 = t0->is_long();
+ const TypeLong* r1 = t1->is_long();
+
+ return TypeLong::make(MIN2(r0->_lo, r1->_lo), MIN2(r0->_hi, r1->_hi), MIN2(r0->_widen, r1->_widen));
+}
+
+Node* MinLNode::Identity(PhaseGVN* phase) {
+ const TypeLong* t1 = phase->type(in(1))->is_long();
+ const TypeLong* t2 = phase->type(in(2))->is_long();
+
+ // Can we determine minimum statically?
+ if (t1->_lo >= t2->_hi) {
+ return in(2);
+ } else if (t2->_lo >= t1->_hi) {
+ return in(1);
+ }
+
+ return MaxNode::Identity(phase);
+}
+
+Node* MinLNode::Ideal(PhaseGVN* phase, bool can_reshape) {
+ Node* n = AddNode::Ideal(phase, can_reshape);
+ if (n != NULL) {
+ return n;
+ }
+ if (can_reshape) {
+ return fold_subI_no_underflow_pattern(this, phase);
+ }
+ return NULL;
+}
+
//------------------------------add_ring---------------------------------------
// Supplied function returns the sum of the inputs.
const Type *MinINode::add_ring( const Type *t0, const Type *t1 ) const {
diff --git a/hotspot/src/share/vm/opto/addnode.hpp b/hotspot/src/share/vm/opto/addnode.hpp
index 24eb62e1df..d61f010bf5 100644
--- a/hotspot/src/share/vm/opto/addnode.hpp
+++ b/hotspot/src/share/vm/opto/addnode.hpp
@@ -279,4 +279,38 @@ class MinINode : public MaxNode {
virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
};
+//------------------------------MaxLNode---------------------------------------
+// MAXimum of 2 longs.
+class MaxLNode : public MaxNode {
+public:
+ MaxLNode(Compile* C, Node* in1, Node* in2) : MaxNode(in1, in2) {
+ init_flags(Flag_is_macro);
+ C->add_macro_node(this);
+ }
+ virtual int Opcode() const;
+ virtual const Type* add_ring(const Type* t0, const Type* t1) const;
+ virtual const Type* add_id() const { return TypeLong::make(min_jlong); }
+ virtual const Type* bottom_type() const { return TypeLong::LONG; }
+ virtual uint ideal_reg() const { return Op_RegL; }
+ virtual Node* Identity(PhaseGVN* phase);
+ virtual Node* Ideal(PhaseGVN *phase, bool can_reshape);
+};
+
+//------------------------------MinLNode---------------------------------------
+// MINimum of 2 longs.
+class MinLNode : public MaxNode {
+public:
+ MinLNode(Compile* C, Node* in1, Node* in2) : MaxNode(in1, in2) {
+ init_flags(Flag_is_macro);
+ C->add_macro_node(this);
+ }
+ virtual int Opcode() const;
+ virtual const Type* add_ring(const Type* t0, const Type* t1) const;
+ virtual const Type* add_id() const { return TypeLong::make(max_jlong); }
+ virtual const Type* bottom_type() const { return TypeLong::LONG; }
+ virtual uint ideal_reg() const { return Op_RegL; }
+ virtual Node* Identity(PhaseGVN* phase);
+ virtual Node* Ideal(PhaseGVN* phase, bool can_reshape);
+};
+
#endif // SHARE_VM_OPTO_ADDNODE_HPP
diff --git a/hotspot/src/share/vm/opto/classes.hpp b/hotspot/src/share/vm/opto/classes.hpp
index c4a964fd56..7503d81bae 100644
--- a/hotspot/src/share/vm/opto/classes.hpp
+++ b/hotspot/src/share/vm/opto/classes.hpp
@@ -169,6 +169,7 @@ macro(LoopLimit)
macro(Mach)
macro(MachProj)
macro(MaxI)
+macro(MaxL)
macro(MemBarAcquire)
macro(LoadFence)
macro(MemBarAcquireLock)
@@ -180,6 +181,7 @@ macro(MemBarVolatile)
macro(MemBarStoreStore)
macro(MergeMem)
macro(MinI)
+macro(MinL)
macro(ModD)
macro(ModF)
macro(ModI)
diff --git a/hotspot/src/share/vm/opto/connode.cpp b/hotspot/src/share/vm/opto/connode.cpp
index ff56804df3..f733df0a60 100644
--- a/hotspot/src/share/vm/opto/connode.cpp
+++ b/hotspot/src/share/vm/opto/connode.cpp
@@ -942,6 +942,20 @@ const Type *ConvI2LNode::Value( PhaseTransform *phase ) const {
return tl;
}
+Node* ConvI2LNode::Identity(PhaseGVN* phase) {
+ // If type is in "int" sub-range, we can
+ // convert I2L(L2I(x)) => x
+ // since the conversions have no effect.
+ if (in(1)->Opcode() == Op_ConvL2I) {
+ Node* x = in(1)->in(1);
+ const TypeLong* t = phase->type(x)->isa_long();
+ if (t != NULL && t->_lo >= min_jint && t->_hi <= max_jint) {
+ return x;
+ }
+ }
+ return this;
+}
+
#ifdef _LP64
static inline bool long_ranges_overlap(jlong lo1, jlong hi1,
jlong lo2, jlong hi2) {
diff --git a/hotspot/src/share/vm/opto/connode.hpp b/hotspot/src/share/vm/opto/connode.hpp
index 21c22762f8..c7818b6490 100644
--- a/hotspot/src/share/vm/opto/connode.hpp
+++ b/hotspot/src/share/vm/opto/connode.hpp
@@ -513,6 +513,7 @@ class ConvI2LNode : public TypeNode {
virtual int Opcode() const;
virtual const Type *Value( PhaseTransform *phase ) const;
virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
+ virtual Node* Identity(PhaseGVN* phase);
virtual uint ideal_reg() const { return Op_RegL; }
};
diff --git a/hotspot/src/share/vm/opto/loopTransform.cpp b/hotspot/src/share/vm/opto/loopTransform.cpp
index 02229555e4..0ba727ab37 100644
--- a/hotspot/src/share/vm/opto/loopTransform.cpp
+++ b/hotspot/src/share/vm/opto/loopTransform.cpp
@@ -1291,7 +1291,7 @@ void PhaseIdealLoop::do_unroll( IdealLoopTree *loop, Node_List &old_new, bool ad
new_limit = _igvn.intcon(limit->get_int() - stride_con);
set_ctrl(new_limit, C->root());
} else {
- // Limit is not constant.
+ // Limit is not constant. Int subtraction could lead to underflow.
if (loop_head->unrolled_count() == 1) { // only for first unroll
// Separate limit by Opaque node in case it is an incremented
// variable from previous loop to avoid using pre-incremented
@@ -1303,53 +1303,37 @@ void PhaseIdealLoop::do_unroll( IdealLoopTree *loop, Node_List &old_new, bool ad
Node* opaq_ctrl = get_ctrl(opaq);
limit = new (C) Opaque2Node( C, limit );
register_new_node( limit, opaq_ctrl );
+
+ // The Opaque2 node created above (in the case of the first unrolling) hides the type of the loop limit.
+ // Propagate this precise type information.
+ limit = new (C) CastIINode(limit, limit_type);
+ register_new_node(limit, opaq_ctrl);
}
- if (stride_con > 0 && (java_subtract(limit_type->_lo, stride_con) < limit_type->_lo) ||
- stride_con < 0 && (java_subtract(limit_type->_hi, stride_con) > limit_type->_hi)) {
- // No underflow.
- new_limit = new (C) SubINode(limit, stride);
+ // (1) Convert to long.
+ Node* limit_l = new (C) ConvI2LNode(limit);
+ register_new_node(limit_l, get_ctrl(limit));
+ Node* stride_l = _igvn.longcon(stride_con);
+ set_ctrl(stride_l, C->root());
+
+ // (2) Subtract: compute in long, to prevent underflow.
+ Node* new_limit_l = new (C) SubLNode(limit_l, stride_l);
+ register_new_node(new_limit_l, ctrl);
+
+ // (3) Clamp to int range, in case we had subtraction underflow.
+ Node* underflow_clamp_l = _igvn.longcon((stride_con > 0) ? min_jint : max_jint);
+ set_ctrl(underflow_clamp_l, C->root());
+ Node* new_limit_no_underflow_l = NULL;
+ if (stride_con > 0) {
+ // limit = MaxL(limit - stride, min_jint)
+ new_limit_no_underflow_l = new (C) MaxLNode(C, new_limit_l, underflow_clamp_l);
} else {
- // (limit - stride) may underflow.
- // Clamp the adjustment value with MININT or MAXINT:
- //
- // new_limit = limit-stride
- // if (stride > 0)
- // new_limit = (limit < new_limit) ? MININT : new_limit;
- // else
- // new_limit = (limit > new_limit) ? MAXINT : new_limit;
- //
- BoolTest::mask bt = loop_end->test_trip();
- assert(bt == BoolTest::lt || bt == BoolTest::gt, "canonical test is expected");
- Node* adj_max = _igvn.intcon((stride_con > 0) ? min_jint : max_jint);
- set_ctrl(adj_max, C->root());
- Node* old_limit = NULL;
- Node* adj_limit = NULL;
- Node* bol = limit->is_CMove() ? limit->in(CMoveNode::Condition) : NULL;
- if (loop_head->unrolled_count() > 1 &&
- limit->is_CMove() && limit->Opcode() == Op_CMoveI &&
- limit->in(CMoveNode::IfTrue) == adj_max &&
- bol->as_Bool()->_test._test == bt &&
- bol->in(1)->Opcode() == Op_CmpI &&
- bol->in(1)->in(2) == limit->in(CMoveNode::IfFalse)) {
- // Loop was unrolled before.
- // Optimize the limit to avoid nested CMove:
- // use original limit as old limit.
- old_limit = bol->in(1)->in(1);
- // Adjust previous adjusted limit.
- adj_limit = limit->in(CMoveNode::IfFalse);
- adj_limit = new (C) SubINode(adj_limit, stride);
- } else {
- old_limit = limit;
- adj_limit = new (C) SubINode(limit, stride);
- }
- assert(old_limit != NULL && adj_limit != NULL, "");
- register_new_node( adj_limit, ctrl ); // adjust amount
- Node* adj_cmp = new (C) CmpINode(old_limit, adj_limit);
- register_new_node( adj_cmp, ctrl );
- Node* adj_bool = new (C) BoolNode(adj_cmp, bt);
- register_new_node( adj_bool, ctrl );
- new_limit = new (C) CMoveINode(adj_bool, adj_limit, adj_max, TypeInt::INT);
+ // limit = MinL(limit - stride, max_jint)
+ new_limit_no_underflow_l = new (C) MinLNode(C, new_limit_l, underflow_clamp_l);
}
+ register_new_node(new_limit_no_underflow_l, ctrl);
+
+ // (4) Convert back to int.
+ new_limit = new (C) ConvL2INode(new_limit_no_underflow_l);
register_new_node(new_limit, ctrl);
}
assert(new_limit != NULL, "");
@@ -1532,6 +1516,9 @@ bool IdealLoopTree::dominates_backedge(Node* ctrl) {
//------------------------------adjust_limit-----------------------------------
// Helper function that computes new loop limit as (rc_limit-offset)/scale
Node* PhaseIdealLoop::adjust_limit(bool is_positive_stride, Node* scale, Node* offset, Node* rc_limit, Node* old_limit, Node* pre_ctrl, bool round) {
+ Node* old_limit_long = new (C) ConvI2LNode(old_limit);
+ register_new_node(old_limit_long, pre_ctrl);
+
Node* sub = new (C) SubLNode(rc_limit, offset);
register_new_node(sub, pre_ctrl);
Node* limit = new (C) DivLNode(NULL, sub, scale);
@@ -1557,27 +1544,19 @@ Node* PhaseIdealLoop::adjust_limit(bool is_positive_stride, Node* scale, Node* o
// - integer underflow of limit: MAXL chooses old_limit (>= MIN_INT > limit)
// INT() is finally converting the limit back to an integer value.
- // We use CMove nodes to implement long versions of min/max (MINL/MAXL).
- // We use helper methods for inner MINL/MAXL which return CMoveL nodes to keep a long value for the outer MINL/MAXL comparison:
- Node* inner_result_long;
+ Node* inner_result_long = NULL;
+ Node* outer_result_long = NULL;
if (is_positive_stride) {
- inner_result_long = MaxNode::signed_max(limit, _igvn.longcon(min_jint), TypeLong::LONG, _igvn);
+ inner_result_long = new (C) MaxLNode(C, limit, _igvn.longcon(min_jint));
+ outer_result_long = new (C) MinLNode(C, inner_result_long, old_limit_long);
} else {
- inner_result_long = MaxNode::signed_min(limit, _igvn.longcon(max_jint), TypeLong::LONG, _igvn);
+ inner_result_long = new (C) MinLNode(C, limit, _igvn.longcon(max_jint));
+ outer_result_long = new (C) MaxLNode(C, inner_result_long, old_limit_long);
}
- set_subtree_ctrl(inner_result_long);
+ register_new_node(inner_result_long, pre_ctrl);
+ register_new_node(outer_result_long, pre_ctrl);
- // Outer MINL/MAXL:
- // The comparison is done with long values but the result is the converted back to int by using CmovI.
- Node* old_limit_long = new (C) ConvI2LNode(old_limit);
- register_new_node(old_limit_long, pre_ctrl);
- Node* cmp = new (C) CmpLNode(old_limit_long, limit);
- register_new_node(cmp, pre_ctrl);
- Node* bol = new (C) BoolNode(cmp, is_positive_stride ? BoolTest::gt : BoolTest::lt);
- register_new_node(bol, pre_ctrl);
- Node* inner_result_int = new (C) ConvL2INode(inner_result_long); // Could under-/overflow but that's fine as comparison was done with CmpL
- register_new_node(inner_result_int, pre_ctrl);
- limit = new (C) CMoveINode(bol, old_limit, inner_result_int, TypeInt::INT);
+ limit = new (C) ConvL2INode(outer_result_long);
register_new_node(limit, pre_ctrl);
return limit;
}
diff --git a/hotspot/src/share/vm/opto/macro.cpp b/hotspot/src/share/vm/opto/macro.cpp
index 737cbcb9ff..ae3755c636 100644
--- a/hotspot/src/share/vm/opto/macro.cpp
+++ b/hotspot/src/share/vm/opto/macro.cpp
@@ -2487,7 +2487,9 @@ void PhaseMacroExpand::eliminate_macro_nodes() {
assert(n->Opcode() == Op_LoopLimit ||
n->Opcode() == Op_Opaque1 ||
n->Opcode() == Op_Opaque2 ||
- n->Opcode() == Op_Opaque3, "unknown node type in macro list");
+ n->Opcode() == Op_Opaque3 ||
+ n->Opcode() == Op_MaxL ||
+ n->Opcode() == Op_MinL, "unknown node type in macro list");
}
assert(success == (C->macro_count() < old_macro_count), "elimination reduces macro count");
progress = progress || success;
@@ -2552,6 +2554,18 @@ bool PhaseMacroExpand::expand_macro_nodes() {
_igvn.replace_node(n, repl);
success = true;
#endif
+ } else if (n->Opcode() == Op_MaxL) {
+ // Since MaxL and MinL are not implemented in the backend, we expand them to
+ // a CMoveL construct now. At least until here, the type could be computed
+ // precisely. CMoveL is not so smart, but we can give it at least the best
+ // type we know abouot n now.
+ Node* repl = MaxNode::signed_max(n->in(1), n->in(2), _igvn.type(n), _igvn);
+ _igvn.replace_node(n, repl);
+ success = true;
+ } else if (n->Opcode() == Op_MinL) {
+ Node* repl = MaxNode::signed_min(n->in(1), n->in(2), _igvn.type(n), _igvn);
+ _igvn.replace_node(n, repl);
+ success = true;
}
assert(success == (C->macro_count() < old_macro_count), "elimination reduces macro count");
progress = progress || success;
diff --git a/hotspot/src/share/vm/opto/node.hpp b/hotspot/src/share/vm/opto/node.hpp
index 270b96623c..feb8ad3e7d 100644
--- a/hotspot/src/share/vm/opto/node.hpp
+++ b/hotspot/src/share/vm/opto/node.hpp
@@ -506,6 +506,7 @@ class Node {
disconnect_inputs(NULL, c);
}
void set_req_X( uint i, Node *n, PhaseIterGVN *igvn );
+ void set_req_X(uint i, Node *n, PhaseGVN *gvn);
// Find the one non-null required input. RegionNode only
Node *nonnull_req() const;
// Add or remove precedence edges
diff --git a/hotspot/src/share/vm/opto/phaseX.cpp b/hotspot/src/share/vm/opto/phaseX.cpp
index 9c4a7056dd..0cd51708c4 100644
--- a/hotspot/src/share/vm/opto/phaseX.cpp
+++ b/hotspot/src/share/vm/opto/phaseX.cpp
@@ -1957,6 +1957,15 @@ void Node::set_req_X( uint i, Node *n, PhaseIterGVN *igvn ) {
}
+void Node::set_req_X(uint i, Node *n, PhaseGVN *gvn) {
+ PhaseIterGVN* igvn = gvn->is_IterGVN();
+ if (igvn == NULL) {
+ set_req(i, n);
+ return;
+ }
+ set_req_X(i, n, igvn);
+}
+
//-------------------------------replace_by-----------------------------------
// Using def-use info, replace one node for another. Follow the def-use info
// to all users of the OLD node. Then make all uses point to the NEW node.
diff --git a/hotspot/src/share/vm/runtime/vmStructs.cpp b/hotspot/src/share/vm/runtime/vmStructs.cpp
index 32e3921b2b..e0e9bcf7e9 100644
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp
@@ -1747,6 +1747,8 @@ typedef TwoOopHashtable SymbolTwoOopHashtable;
declare_c2_type(MaxNode, AddNode) \
declare_c2_type(MaxINode, MaxNode) \
declare_c2_type(MinINode, MaxNode) \
+ declare_c2_type(MaxLNode, MaxNode) \
+ declare_c2_type(MinLNode, MaxNode) \
declare_c2_type(StartNode, MultiNode) \
declare_c2_type(StartOSRNode, StartNode) \
declare_c2_type(ParmNode, ProjNode) \
diff --git a/hotspot/test/compiler/loopopts/TestUnrollLimitPreciseType.java b/hotspot/test/compiler/loopopts/TestUnrollLimitPreciseType.java
new file mode 100644
index 0000000000..8a4b7626ba
--- /dev/null
+++ b/hotspot/test/compiler/loopopts/TestUnrollLimitPreciseType.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test id=test1
+ * @bug 8298935
+ * @summary CMoveI for underflow protection of the limit did not compute a type that was precise enough.
+ * This lead to dead data but zero-trip-guard control did not die -> "malformed control flow".
+ * @run main/othervm
+ * -XX:CompileCommand=compileonly,compiler.loopopts.TestUnrollLimitPreciseType::test1
+ * -XX:CompileCommand=dontinline,compiler.loopopts.TestUnrollLimitPreciseType::*
+ * -XX:MaxVectorSize=64
+ * -Xcomp
+ * -XX:+UnlockExperimentalVMOptions -XX:PerMethodSpecTrapLimit=0 -XX:PerMethodTrapLimit=0
+ * compiler.loopopts.TestUnrollLimitPreciseType test1
+ */
+
+/*
+ * @test id=test2
+ * @bug 8298935
+ * @summary CMoveI for underflow protection of the limit did not compute a type that was precise enough.
+ * This lead to dead data but zero-trip-guard control did not die -> "malformed control flow".
+ * @run main/othervm
+ * -XX:CompileCommand=compileonly,compiler.loopopts.TestUnrollLimitPreciseType::*
+ * -Xcomp
+ * compiler.loopopts.TestUnrollLimitPreciseType test2
+ */
+
+
+package compiler.loopopts;
+
+public class TestUnrollLimitPreciseType {
+ static final int RANGE = 512;
+
+ public static void main(String args[]) {
+ if (args.length != 1) {
+ throw new RuntimeException("Need exactly one argument.");
+ }
+ if (args[0].equals("test1")) {
+ byte[] data = new byte[RANGE];
+ test1(data);
+ } else if (args[0].equals("test2")) {
+ test2();
+ } else {
+ throw new RuntimeException("Do not have: " + args[0]);
+ }
+ }
+
+ public static void test1(byte[] data) {
+ // Did not fully analyze this. But it is also unrolled, SuperWorded,
+ // and further unrolled with vectorlized post loop.
+ // Only seems to reproduce with avx512, and not with avx2.
+ for (int j = 192; j < RANGE; j++) {
+ data[j - 192] = (byte)(data[j] * 11);
+ }
+ }
+
+ static void test2() {
+ // Loop is SuperWord'ed.
+ // We unroll more afterwards, and so add vectorized post loop.
+ // But it turns out that the vectorized post loop is never entered.
+ // This lead to assert, because the zero-trip-guard did not collaspse,
+ // but the CastII with the trip count did die.
+ // Only seems to reproduce with avx512, and not with avx2.
+ double dArr[][] = new double[100][100];
+ for (int i = 2, j = 2; j < 68; j++) {
+ dArr[i][j] = 8;
+ }
+ }
+}
From 16ea85b54115073c6c22377b817878fe112b2100 Mon Sep 17 00:00:00 2001
From: Francisco Ferrari Bihurriet
Date: Wed, 3 Jul 2024 23:36:15 +0000
Subject: [PATCH 17/66] 8335552: [8u] JDK-8303466 backport to 8u requires 3
::Identity signature fixes
Reviewed-by: mbalao, roland, andrew
Backport-of: 8efb3ab7c1cf0164237c50d60c4cd564b3d6a897
---
hotspot/src/share/vm/opto/addnode.cpp | 4 ++--
hotspot/src/share/vm/opto/addnode.hpp | 4 ++--
hotspot/src/share/vm/opto/connode.cpp | 2 +-
hotspot/src/share/vm/opto/connode.hpp | 2 +-
4 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/hotspot/src/share/vm/opto/addnode.cpp b/hotspot/src/share/vm/opto/addnode.cpp
index a9282758e3..22bfcfdeee 100644
--- a/hotspot/src/share/vm/opto/addnode.cpp
+++ b/hotspot/src/share/vm/opto/addnode.cpp
@@ -1101,7 +1101,7 @@ const Type* MaxLNode::add_ring(const Type* t0, const Type* t1) const {
return TypeLong::make(MAX2(r0->_lo, r1->_lo), MAX2(r0->_hi, r1->_hi), MAX2(r0->_widen, r1->_widen));
}
-Node* MaxLNode::Identity(PhaseGVN* phase) {
+Node* MaxLNode::Identity(PhaseTransform* phase) {
const TypeLong* t1 = phase->type(in(1))->is_long();
const TypeLong* t2 = phase->type(in(2))->is_long();
@@ -1133,7 +1133,7 @@ const Type* MinLNode::add_ring(const Type* t0, const Type* t1) const {
return TypeLong::make(MIN2(r0->_lo, r1->_lo), MIN2(r0->_hi, r1->_hi), MIN2(r0->_widen, r1->_widen));
}
-Node* MinLNode::Identity(PhaseGVN* phase) {
+Node* MinLNode::Identity(PhaseTransform* phase) {
const TypeLong* t1 = phase->type(in(1))->is_long();
const TypeLong* t2 = phase->type(in(2))->is_long();
diff --git a/hotspot/src/share/vm/opto/addnode.hpp b/hotspot/src/share/vm/opto/addnode.hpp
index d61f010bf5..73234caa3c 100644
--- a/hotspot/src/share/vm/opto/addnode.hpp
+++ b/hotspot/src/share/vm/opto/addnode.hpp
@@ -292,7 +292,7 @@ class MaxLNode : public MaxNode {
virtual const Type* add_id() const { return TypeLong::make(min_jlong); }
virtual const Type* bottom_type() const { return TypeLong::LONG; }
virtual uint ideal_reg() const { return Op_RegL; }
- virtual Node* Identity(PhaseGVN* phase);
+ virtual Node* Identity(PhaseTransform* phase);
virtual Node* Ideal(PhaseGVN *phase, bool can_reshape);
};
@@ -309,7 +309,7 @@ class MinLNode : public MaxNode {
virtual const Type* add_id() const { return TypeLong::make(max_jlong); }
virtual const Type* bottom_type() const { return TypeLong::LONG; }
virtual uint ideal_reg() const { return Op_RegL; }
- virtual Node* Identity(PhaseGVN* phase);
+ virtual Node* Identity(PhaseTransform* phase);
virtual Node* Ideal(PhaseGVN* phase, bool can_reshape);
};
diff --git a/hotspot/src/share/vm/opto/connode.cpp b/hotspot/src/share/vm/opto/connode.cpp
index f733df0a60..6c0b68a825 100644
--- a/hotspot/src/share/vm/opto/connode.cpp
+++ b/hotspot/src/share/vm/opto/connode.cpp
@@ -942,7 +942,7 @@ const Type *ConvI2LNode::Value( PhaseTransform *phase ) const {
return tl;
}
-Node* ConvI2LNode::Identity(PhaseGVN* phase) {
+Node* ConvI2LNode::Identity(PhaseTransform* phase) {
// If type is in "int" sub-range, we can
// convert I2L(L2I(x)) => x
// since the conversions have no effect.
diff --git a/hotspot/src/share/vm/opto/connode.hpp b/hotspot/src/share/vm/opto/connode.hpp
index c7818b6490..a24c13590a 100644
--- a/hotspot/src/share/vm/opto/connode.hpp
+++ b/hotspot/src/share/vm/opto/connode.hpp
@@ -513,7 +513,7 @@ class ConvI2LNode : public TypeNode {
virtual int Opcode() const;
virtual const Type *Value( PhaseTransform *phase ) const;
virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
- virtual Node* Identity(PhaseGVN* phase);
+ virtual Node* Identity(PhaseTransform* phase);
virtual uint ideal_reg() const { return Op_RegL; }
};
From c8eb027b59dbb12150a1edd926b14fc2f6753bbd Mon Sep 17 00:00:00 2001
From: Francisco Ferrari Bihurriet
Date: Fri, 5 Jul 2024 14:39:35 +0000
Subject: [PATCH 18/66] 8075511: Enable -Woverloaded-virtual C++ warning for
HotSpot build
Reviewed-by: andrew
Backport-of: 8efb3ab7c1cf0164237c50d60c4cd564b3d6a897
---
hotspot/make/linux/makefiles/gcc.make | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hotspot/make/linux/makefiles/gcc.make b/hotspot/make/linux/makefiles/gcc.make
index 7dde7f0963..70b130b203 100644
--- a/hotspot/make/linux/makefiles/gcc.make
+++ b/hotspot/make/linux/makefiles/gcc.make
@@ -212,7 +212,7 @@ ifeq ($(USE_CLANG), true)
WARNINGS_ARE_ERRORS += -Wno-return-type -Wno-empty-body
endif
-WARNING_FLAGS = -Wpointer-arith -Wsign-compare -Wundef -Wunused-function -Wunused-value -Wformat=2 -Wreturn-type
+WARNING_FLAGS = -Wpointer-arith -Wsign-compare -Wundef -Wunused-function -Wunused-value -Wformat=2 -Wreturn-type -Woverloaded-virtual
ifeq ($(USE_CLANG),)
# Since GCC 4.3, -Wconversion has changed its meanings to warn these implicit
From ddce2b5d39cb780c84d0c4d3bf01df2fe5d3d989 Mon Sep 17 00:00:00 2001
From: Chad Rakoczy
Date: Mon, 8 Jul 2024 19:19:20 +0000
Subject: [PATCH 19/66] 8299677: Formatter.format might take a long time to
format an integer or floating-point
Reviewed-by: shade, phh, andrew
Backport-of: 33412c102ce799ff2de3512df77e6e07d76acd36
---
.../share/classes/java/util/Formatter.java | 10 +-
jdk/test/java/util/Formatter/Padding.java | 316 ++++++++++++++++++
2 files changed, 322 insertions(+), 4 deletions(-)
create mode 100644 jdk/test/java/util/Formatter/Padding.java
diff --git a/jdk/src/share/classes/java/util/Formatter.java b/jdk/src/share/classes/java/util/Formatter.java
index 7b6e1d1de1..850b760d9a 100644
--- a/jdk/src/share/classes/java/util/Formatter.java
+++ b/jdk/src/share/classes/java/util/Formatter.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -4380,9 +4380,11 @@ private char getZero(Locale l) {
// apply zero padding
len = sb.length();
- if (width != -1 && f.contains(Flags.ZERO_PAD))
- for (int k = 0; k < width - len; k++)
- sb.insert(begin, zero);
+ if (width > len && f.contains(Flags.ZERO_PAD)) {
+ char[] zeros = new char[width - len];
+ Arrays.fill(zeros, zero);
+ sb.insert(begin, zeros);
+ }
return sb;
}
diff --git a/jdk/test/java/util/Formatter/Padding.java b/jdk/test/java/util/Formatter/Padding.java
new file mode 100644
index 0000000000..5c8ea401c0
--- /dev/null
+++ b/jdk/test/java/util/Formatter/Padding.java
@@ -0,0 +1,316 @@
+/*
+ * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 4906370
+ * @summary Tests to excercise padding on int and double values,
+ * with various flag combinations.
+ */
+
+public class Padding {
+
+ private static class Argument {
+ final String expected;
+ final String format;
+ final Object value;
+
+ Argument(String expected, String format, Object value) {
+ this.expected = expected;
+ this.format = format;
+ this.value = value;
+ }
+ }
+
+ static Argument[] arguments = {
+ /* blank padding, right adjusted, optional plus sign */
+ new Argument("12", "%1d", 12),
+ new Argument("12", "%2d", 12),
+ new Argument(" 12", "%3d", 12),
+ new Argument(" 12", "%4d", 12),
+ new Argument(" 12", "%5d", 12),
+ new Argument(" 12", "%10d", 12),
+
+ new Argument("-12", "%1d", -12),
+ new Argument("-12", "%2d", -12),
+ new Argument("-12", "%3d", -12),
+ new Argument(" -12", "%4d", -12),
+ new Argument(" -12", "%5d", -12),
+ new Argument(" -12", "%10d", -12),
+
+ new Argument("1.2", "%1.1f", 1.2),
+ new Argument("1.2", "%2.1f", 1.2),
+ new Argument("1.2", "%3.1f", 1.2),
+ new Argument(" 1.2", "%4.1f", 1.2),
+ new Argument(" 1.2", "%5.1f", 1.2),
+ new Argument(" 1.2", "%10.1f", 1.2),
+
+ new Argument("-1.2", "%1.1f", -1.2),
+ new Argument("-1.2", "%2.1f", -1.2),
+ new Argument("-1.2", "%3.1f", -1.2),
+ new Argument("-1.2", "%4.1f", -1.2),
+ new Argument(" -1.2", "%5.1f", -1.2),
+ new Argument(" -1.2", "%10.1f", -1.2),
+
+ /* blank padding, right adjusted, mandatory plus sign */
+ new Argument("+12", "%+1d", 12),
+ new Argument("+12", "%+2d", 12),
+ new Argument("+12", "%+3d", 12),
+ new Argument(" +12", "%+4d", 12),
+ new Argument(" +12", "%+5d", 12),
+ new Argument(" +12", "%+10d", 12),
+
+ new Argument("-12", "%+1d", -12),
+ new Argument("-12", "%+2d", -12),
+ new Argument("-12", "%+3d", -12),
+ new Argument(" -12", "%+4d", -12),
+ new Argument(" -12", "%+5d", -12),
+ new Argument(" -12", "%+10d", -12),
+
+ new Argument("+1.2", "%+1.1f", 1.2),
+ new Argument("+1.2", "%+2.1f", 1.2),
+ new Argument("+1.2", "%+3.1f", 1.2),
+ new Argument("+1.2", "%+4.1f", 1.2),
+ new Argument(" +1.2", "%+5.1f", 1.2),
+ new Argument(" +1.2", "%+10.1f", 1.2),
+
+ new Argument("-1.2", "%+1.1f", -1.2),
+ new Argument("-1.2", "%+2.1f", -1.2),
+ new Argument("-1.2", "%+3.1f", -1.2),
+ new Argument("-1.2", "%+4.1f", -1.2),
+ new Argument(" -1.2", "%+5.1f", -1.2),
+ new Argument(" -1.2", "%+10.1f", -1.2),
+
+ /* blank padding, right adjusted, mandatory blank sign */
+ new Argument(" 12", "% 1d", 12),
+ new Argument(" 12", "% 2d", 12),
+ new Argument(" 12", "% 3d", 12),
+ new Argument(" 12", "% 4d", 12),
+ new Argument(" 12", "% 5d", 12),
+ new Argument(" 12", "% 10d", 12),
+
+ new Argument("-12", "% 1d", -12),
+ new Argument("-12", "% 2d", -12),
+ new Argument("-12", "% 3d", -12),
+ new Argument(" -12", "% 4d", -12),
+ new Argument(" -12", "% 5d", -12),
+ new Argument(" -12", "% 10d", -12),
+
+ new Argument(" 1.2", "% 1.1f", 1.2),
+ new Argument(" 1.2", "% 2.1f", 1.2),
+ new Argument(" 1.2", "% 3.1f", 1.2),
+ new Argument(" 1.2", "% 4.1f", 1.2),
+ new Argument(" 1.2", "% 5.1f", 1.2),
+ new Argument(" 1.2", "% 10.1f", 1.2),
+
+ new Argument("-1.2", "% 1.1f", -1.2),
+ new Argument("-1.2", "% 2.1f", -1.2),
+ new Argument("-1.2", "% 3.1f", -1.2),
+ new Argument("-1.2", "% 4.1f", -1.2),
+ new Argument(" -1.2", "% 5.1f", -1.2),
+ new Argument(" -1.2", "% 10.1f", -1.2),
+
+ /* blank padding, left adjusted, optional sign */
+ new Argument("12", "%-1d", 12),
+ new Argument("12", "%-2d", 12),
+ new Argument("12 ", "%-3d", 12),
+ new Argument("12 ", "%-4d", 12),
+ new Argument("12 ", "%-5d", 12),
+ new Argument("12 ", "%-10d", 12),
+
+ new Argument("-12", "%-1d", -12),
+ new Argument("-12", "%-2d", -12),
+ new Argument("-12", "%-3d", -12),
+ new Argument("-12 ", "%-4d", -12),
+ new Argument("-12 ", "%-5d", -12),
+ new Argument("-12 ", "%-10d", -12),
+
+ new Argument("1.2", "%-1.1f", 1.2),
+ new Argument("1.2", "%-2.1f", 1.2),
+ new Argument("1.2", "%-3.1f", 1.2),
+ new Argument("1.2 ", "%-4.1f", 1.2),
+ new Argument("1.2 ", "%-5.1f", 1.2),
+ new Argument("1.2 ", "%-10.1f", 1.2),
+
+ new Argument("-1.2", "%-1.1f", -1.2),
+ new Argument("-1.2", "%-2.1f", -1.2),
+ new Argument("-1.2", "%-3.1f", -1.2),
+ new Argument("-1.2", "%-4.1f", -1.2),
+ new Argument("-1.2 ", "%-5.1f", -1.2),
+ new Argument("-1.2 ", "%-10.1f", -1.2),
+
+ /* blank padding, left adjusted, mandatory plus sign */
+ new Argument("+12", "%-+1d", 12),
+ new Argument("+12", "%-+2d", 12),
+ new Argument("+12", "%-+3d", 12),
+ new Argument("+12 ", "%-+4d", 12),
+ new Argument("+12 ", "%-+5d", 12),
+ new Argument("+12 ", "%-+10d", 12),
+
+ new Argument("-12", "%-+1d", -12),
+ new Argument("-12", "%-+2d", -12),
+ new Argument("-12", "%-+3d", -12),
+ new Argument("-12 ", "%-+4d", -12),
+ new Argument("-12 ", "%-+5d", -12),
+ new Argument("-12 ", "%-+10d", -12),
+
+ new Argument("+1.2", "%-+1.1f", 1.2),
+ new Argument("+1.2", "%-+2.1f", 1.2),
+ new Argument("+1.2", "%-+3.1f", 1.2),
+ new Argument("+1.2", "%-+4.1f", 1.2),
+ new Argument("+1.2 ", "%-+5.1f", 1.2),
+ new Argument("+1.2 ", "%-+10.1f", 1.2),
+
+ new Argument("-1.2", "%-+1.1f", -1.2),
+ new Argument("-1.2", "%-+2.1f", -1.2),
+ new Argument("-1.2", "%-+3.1f", -1.2),
+ new Argument("-1.2", "%-+4.1f", -1.2),
+ new Argument("-1.2 ", "%-+5.1f", -1.2),
+ new Argument("-1.2 ", "%-+10.1f", -1.2),
+
+ /* blank padding, left adjusted, mandatory blank sign */
+ new Argument(" 12", "%- 1d", 12),
+ new Argument(" 12", "%- 2d", 12),
+ new Argument(" 12", "%- 3d", 12),
+ new Argument(" 12 ", "%- 4d", 12),
+ new Argument(" 12 ", "%- 5d", 12),
+ new Argument(" 12 ", "%- 10d", 12),
+
+ new Argument("-12", "%- 1d", -12),
+ new Argument("-12", "%- 2d", -12),
+ new Argument("-12", "%- 3d", -12),
+ new Argument("-12 ", "%- 4d", -12),
+ new Argument("-12 ", "%- 5d", -12),
+ new Argument("-12 ", "%- 10d", -12),
+
+ new Argument(" 1.2", "%- 1.1f", 1.2),
+ new Argument(" 1.2", "%- 2.1f", 1.2),
+ new Argument(" 1.2", "%- 3.1f", 1.2),
+ new Argument(" 1.2", "%- 4.1f", 1.2),
+ new Argument(" 1.2 ", "%- 5.1f", 1.2),
+ new Argument(" 1.2 ", "%- 10.1f", 1.2),
+
+ new Argument("-1.2", "%- 1.1f", -1.2),
+ new Argument("-1.2", "%- 2.1f", -1.2),
+ new Argument("-1.2", "%- 3.1f", -1.2),
+ new Argument("-1.2", "%- 4.1f", -1.2),
+ new Argument("-1.2 ", "%- 5.1f", -1.2),
+ new Argument("-1.2 ", "%- 10.1f", -1.2),
+
+ /* zero padding, right adjusted, optional sign */
+ new Argument("12", "%01d", 12),
+ new Argument("12", "%02d", 12),
+ new Argument("012", "%03d", 12),
+ new Argument("0012", "%04d", 12),
+ new Argument("00012", "%05d", 12),
+ new Argument("0000000012", "%010d", 12),
+
+ new Argument("-12", "%01d", -12),
+ new Argument("-12", "%02d", -12),
+ new Argument("-12", "%03d", -12),
+ new Argument("-012", "%04d", -12),
+ new Argument("-0012", "%05d", -12),
+ new Argument("-000000012", "%010d", -12),
+
+ new Argument("1.2", "%01.1f", 1.2),
+ new Argument("1.2", "%02.1f", 1.2),
+ new Argument("1.2", "%03.1f", 1.2),
+ new Argument("01.2", "%04.1f", 1.2),
+ new Argument("001.2", "%05.1f", 1.2),
+ new Argument("00000001.2", "%010.1f", 1.2),
+
+ new Argument("-1.2", "%01.1f", -1.2),
+ new Argument("-1.2", "%02.1f", -1.2),
+ new Argument("-1.2", "%03.1f", -1.2),
+ new Argument("-1.2", "%04.1f", -1.2),
+ new Argument("-01.2", "%05.1f", -1.2),
+ new Argument("-0000001.2", "%010.1f", -1.2),
+
+ /* zero padding, right adjusted, mandatory plus sign */
+ new Argument("+12", "%+01d", 12),
+ new Argument("+12", "%+02d", 12),
+ new Argument("+12", "%+03d", 12),
+ new Argument("+012", "%+04d", 12),
+ new Argument("+0012", "%+05d", 12),
+ new Argument("+000000012", "%+010d", 12),
+
+ new Argument("-12", "%+01d", -12),
+ new Argument("-12", "%+02d", -12),
+ new Argument("-12", "%+03d", -12),
+ new Argument("-012", "%+04d", -12),
+ new Argument("-0012", "%+05d", -12),
+ new Argument("-000000012", "%+010d", -12),
+
+ new Argument("+1.2", "%+01.1f", 1.2),
+ new Argument("+1.2", "%+02.1f", 1.2),
+ new Argument("+1.2", "%+03.1f", 1.2),
+ new Argument("+1.2", "%+04.1f", 1.2),
+ new Argument("+01.2", "%+05.1f", 1.2),
+ new Argument("+0000001.2", "%+010.1f", 1.2),
+
+ new Argument("-1.2", "%+01.1f", -1.2),
+ new Argument("-1.2", "%+02.1f", -1.2),
+ new Argument("-1.2", "%+03.1f", -1.2),
+ new Argument("-1.2", "%+04.1f", -1.2),
+ new Argument("-01.2", "%+05.1f", -1.2),
+ new Argument("-0000001.2", "%+010.1f", -1.2),
+
+ /* zero padding, right adjusted, mandatory blank sign */
+ new Argument(" 12", "% 01d", 12),
+ new Argument(" 12", "% 02d", 12),
+ new Argument(" 12", "% 03d", 12),
+ new Argument(" 012", "% 04d", 12),
+ new Argument(" 0012", "% 05d", 12),
+ new Argument(" 000000012", "% 010d", 12),
+
+ new Argument("-12", "% 01d", -12),
+ new Argument("-12", "% 02d", -12),
+ new Argument("-12", "% 03d", -12),
+ new Argument("-012", "% 04d", -12),
+ new Argument("-0012", "% 05d", -12),
+ new Argument("-000000012", "% 010d", -12),
+
+ new Argument(" 1.2", "% 01.1f", 1.2),
+ new Argument(" 1.2", "% 02.1f", 1.2),
+ new Argument(" 1.2", "% 03.1f", 1.2),
+ new Argument(" 1.2", "% 04.1f", 1.2),
+ new Argument(" 01.2", "% 05.1f", 1.2),
+ new Argument(" 0000001.2", "% 010.1f", 1.2),
+
+ new Argument("-1.2", "% 01.1f", -1.2),
+ new Argument("-1.2", "% 02.1f", -1.2),
+ new Argument("-1.2", "% 03.1f", -1.2),
+ new Argument("-1.2", "% 04.1f", -1.2),
+ new Argument("-01.2", "% 05.1f", -1.2),
+ new Argument("-0000001.2", "% 010.1f", -1.2),
+ };
+
+ public static void main(String [] args) {
+ for (Argument arg : arguments) {
+ if (!arg.expected.equals(String.format(arg.format, arg.value))) {
+ throw new RuntimeException("Expected value " + arg.expected +
+ " not returned from String.format(" + arg.format + ", " + arg.value + ")");
+ }
+ }
+ }
+}
From fc15e99a3218a88434c27da1d7d09a01c592d8f9 Mon Sep 17 00:00:00 2001
From: Robert Toyonaga
Date: Tue, 9 Jul 2024 15:51:44 +0000
Subject: [PATCH 20/66] 8305931: jdk/jfr/jcmd/TestJcmdDumpPathToGCRoots.java
failed with "Expected chains but found none"
Reviewed-by: stuefe
Backport-of: 65be5e0c547d74ca7de288b164aa9bd6d6855685
---
.../jfr/jcmd/TestJcmdDumpPathToGCRoots.java | 71 ++++++++++---------
1 file changed, 39 insertions(+), 32 deletions(-)
diff --git a/jdk/test/jdk/jfr/jcmd/TestJcmdDumpPathToGCRoots.java b/jdk/test/jdk/jfr/jcmd/TestJcmdDumpPathToGCRoots.java
index cec76c04b8..4c13dcca3b 100644
--- a/jdk/test/jdk/jfr/jcmd/TestJcmdDumpPathToGCRoots.java
+++ b/jdk/test/jdk/jfr/jcmd/TestJcmdDumpPathToGCRoots.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -76,43 +76,50 @@ public static void main(String[] args) throws Exception {
}
private static void testDump(String pathToGcRoots, Map settings, boolean expectedChains) throws Exception {
- try (Recording r = new Recording()) {
- Map p = new HashMap<>(settings);
- p.put(EventNames.OldObjectSample + "#" + Enabled.NAME, "true");
- r.setName("dodo");
- r.setSettings(p);
- r.setToDisk(true);
- r.start();
- clearLeak();
- System.out.println("Recording id: " + r.getId());
- System.out.println("Settings: " + settings.toString());
- System.out.println("Command: JFR.dump " + pathToGcRoots);
- System.out.println("Chains expected: " + expectedChains);
- buildLeak();
- System.gc();
- System.gc();
- File recording = new File("TestJcmdDumpPathToGCRoots" + r.getId() + ".jfr");
- recording.delete();
- JcmdHelper.jcmd("JFR.dump", "name=dodo", pathToGcRoots, "filename=" + recording.getAbsolutePath());
- r.setSettings(Collections.emptyMap());
- List events = RecordingFile.readAllEvents(recording.toPath());
- if (events.isEmpty()) {
- throw new Exception("No events found in recoding");
- }
- boolean chains = hasChains(events);
- if (expectedChains && !chains) {
- System.out.println(events);
- throw new Exception("Expected chains but found none");
- }
- if (!expectedChains && chains) {
- System.out.println(events);
- throw new Exception("Didn't expect chains but found some");
+ while (true) {
+ try (Recording r = new Recording()) {
+ Map p = new HashMap<>(settings);
+ p.put(EventNames.OldObjectSample + "#" + Enabled.NAME, "true");
+ r.setName("dodo");
+ r.setSettings(p);
+ r.setToDisk(true);
+ r.start();
+ clearLeak();
+ System.out.println("Recording id: " + r.getId());
+ System.out.println("Settings: " + settings.toString());
+ System.out.println("Command: JFR.dump " + pathToGcRoots);
+ System.out.println("Chains expected: " + expectedChains);
+ buildLeak();
+ System.gc();
+ System.gc();
+ File recording = new File("TestJcmdDumpPathToGCRoots" + r.getId() + ".jfr");
+ recording.delete();
+ JcmdHelper.jcmd("JFR.dump", "name=dodo", pathToGcRoots, "filename=" + recording.getAbsolutePath());
+ r.setSettings(Collections.emptyMap());
+ List events = RecordingFile.readAllEvents(recording.toPath());
+ if (events.isEmpty()) {
+ System.out.println("No events found in recording. Retrying.");
+ continue;
+ }
+ boolean chains = hasChains(events);
+ if (expectedChains && !chains) {
+ System.out.println(events);
+ System.out.println("Expected chains but found none. Retrying.");
+ continue;
+ }
+ if (!expectedChains && chains) {
+ System.out.println(events);
+ System.out.println("Didn't expect chains but found some. Retrying.");
+ continue;
+ }
+ return; // Success
}
}
}
private static void clearLeak() {
leak.clear();
+ System.gc();
}
private static boolean hasChains(List events) throws IOException {
From 21e4278aeed3db5eec63679ee1417c3407daf8e7 Mon Sep 17 00:00:00 2001
From: Kazuhisa Takakuri
Date: Thu, 18 Jul 2024 17:31:13 +0000
Subject: [PATCH 21/66] 8320964: sun/tools/native2ascii/Native2AsciiTests.sh
fails on Japanese
Reviewed-by: phh, andrew
---
jdk/test/sun/tools/native2ascii/Native2AsciiTests.sh | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/jdk/test/sun/tools/native2ascii/Native2AsciiTests.sh b/jdk/test/sun/tools/native2ascii/Native2AsciiTests.sh
index 5c886c2100..543343a76c 100644
--- a/jdk/test/sun/tools/native2ascii/Native2AsciiTests.sh
+++ b/jdk/test/sun/tools/native2ascii/Native2AsciiTests.sh
@@ -1,7 +1,7 @@
#! /bin/sh -e
#
-# Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,7 @@
# @test
# @bug 4630463 4630971 4636448 4701617 4721296 4710890 6247817 7021987 8067964
+# 8320964
# @summary Tests miscellaneous native2ascii bugfixes and regressions
@@ -46,8 +47,8 @@ check() {
# Strip carriage returns from output when comparing with n2a test output
# on win32 systems
if [ ${OS} = Windows ]; then
- sed -e 's@\\r@@g' $out >$out.1
- sed -e 's@\\r@@g' $expected >$out.expected
+ sed -e 's@\r@@g' $out >$out.1
+ sed -e 's@\r@@g' $expected >$out.expected
else
cp $out $out.1
cp $expected $out.expected
From f231e27d90dd282355b5776653af20ca04f75591 Mon Sep 17 00:00:00 2001
From: Justin Lu
Date: Thu, 18 Jul 2024 20:01:43 +0000
Subject: [PATCH 22/66] 8330415: Update system property for Java SE
specification maintenance version
Reviewed-by: lancea, iris
Backport-of: bda97a28e0d0830b3c07b33482c4d6a99524af99
---
jdk/src/share/native/java/lang/System.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/jdk/src/share/native/java/lang/System.c b/jdk/src/share/native/java/lang/System.c
index 7501a7ed9c..04ef657465 100644
--- a/jdk/src/share/native/java/lang/System.c
+++ b/jdk/src/share/native/java/lang/System.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1994, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -215,7 +215,7 @@ Java_java_lang_System_initProperties(JNIEnv *env, jclass cla, jobject props)
PUTPROP(props, "java.specification.version",
JDK_MAJOR_VERSION "." JDK_MINOR_VERSION);
PUTPROP(props, "java.specification.maintenance.version",
- "5");
+ "6");
PUTPROP(props, "java.specification.name",
"Java Platform API Specification");
PUTPROP(props, "java.specification.vendor",
From 765bd89b6c3dd12f9248d8626884103f58cbaa5a Mon Sep 17 00:00:00 2001
From: Zdenek Zambersky
Date: Mon, 22 Jul 2024 21:51:08 +0000
Subject: [PATCH 23/66] 8318039: GHA: Bump macOS and Xcode versions
Reviewed-by: sgehwolf, andrew
Backport-of: 605c9767291ddf1c409c3e805ffb3182899d06c2
---
.github/workflows/submit.yml | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/.github/workflows/submit.yml b/.github/workflows/submit.yml
index 4d2c1d1f15..71cbd228ad 100644
--- a/.github/workflows/submit.yml
+++ b/.github/workflows/submit.yml
@@ -1331,7 +1331,7 @@ jobs:
macos_x64_build:
name: macOS x64
- runs-on: "macos-11"
+ runs-on: "macos-13"
needs: prerequisites
if: needs.prerequisites.outputs.should_run != 'false' && needs.prerequisites.outputs.platform_macos_x64 != 'false'
@@ -1395,10 +1395,10 @@ jobs:
run: chmod -R a+rx ${HOME}/jtreg/
- name: Install dependencies
- run: brew install make
+ run: brew install make gawk
- name: Select Xcode version
- run: sudo xcode-select --switch /Applications/Xcode_11.7.app/Contents/Developer
+ run: sudo xcode-select --switch /Applications/Xcode_14.3.1.app/Contents/Developer
- name: Configure
run: >
@@ -1429,7 +1429,7 @@ jobs:
macos_x64_test:
name: macOS x64
- runs-on: "macos-11"
+ runs-on: "macos-13"
needs:
- prerequisites
- macos_x64_build
@@ -1512,10 +1512,10 @@ jobs:
tar -xzf "${HOME}/jdk-macos-x64${{ matrix.artifact }}/jdk-${{ env.JDK_VERSION }}-internal+0_osx-x64_bin${{ matrix.artifact }}.tar.gz" -C "${HOME}/jdk-macos-x64${{ matrix.artifact }}/jdk-${{ env.JDK_VERSION }}-internal+0_osx-x64_bin${{ matrix.artifact }}"
- name: Install dependencies
- run: brew install make
+ run: brew install make gawk
- name: Select Xcode version
- run: sudo xcode-select --switch /Applications/Xcode_11.7.app/Contents/Developer
+ run: sudo xcode-select --switch /Applications/Xcode_14.3.1.app/Contents/Developer
- name: Run tests
run: >
From c8d52b07e18552105d653667e003c566db33e5dc Mon Sep 17 00:00:00 2001
From: Alexander Zvegintsev
Date: Tue, 23 Jul 2024 11:41:05 +0000
Subject: [PATCH 24/66] 8307779: Relax the java.awt.Robot specification
Reviewed-by: prr
Backport-of: c0a876a5c06e54e2c4c7df8c44ebd9e6151e7dac
---
jdk/src/share/classes/java/awt/Robot.java | 79 +++++++++++++++++++++--
1 file changed, 74 insertions(+), 5 deletions(-)
diff --git a/jdk/src/share/classes/java/awt/Robot.java b/jdk/src/share/classes/java/awt/Robot.java
index 0047819338..600d2b0613 100644
--- a/jdk/src/share/classes/java/awt/Robot.java
+++ b/jdk/src/share/classes/java/awt/Robot.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved.
* 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,43 @@
*
* Applications that use Robot for purposes other than self-testing should
* handle these error conditions gracefully.
+ *
+ * Platforms and desktop environments may impose restrictions or limitations
+ * on the access required to implement all functionality in the Robot class.
+ * For example:
+ *
+ *
preventing access to the contents of any part of a desktop
+ * or Window on the desktop that is not owned by the running application.
+ *
treating window decorations as non-owned content.
+ *
ignoring or limiting specific requests to manipulate windows.
+ *
ignoring or limiting specific requests for Robot generated (synthesized)
+ * events related to keyboard and mouse etc.
+ *
requiring specific or global permissions to any access to window
+ * contents, even application owned content,or to perform even limited
+ * synthesizing of events.
+ *
+ *
+ * The Robot API specification requires that approvals for these be granted
+ * for full operation.
+ * If they are not granted, the API will be degraded as discussed here.
+ * Relevant specific API methods may document more specific limitations
+ * and requirements.
+ * Depending on the policies of the desktop environment,
+ * the approvals mentioned above may:
+ *
+ *
be required every time
+ *
or persistent for the lifetime of an application,
+ *
or persistent across multiple user desktop sessions
+ *
be fine-grained permissions
+ *
be associated with a specific binary application,
+ * or a class of binary applications.
+ *
+ *
+ * When such approvals need to given interactively, it may impede the normal
+ * operation of the application until approved, and if approval is denied
+ * or not possible, or cannot be made persistent then it will degrade
+ * the functionality of this class and in turn any part of the operation
+ * of the application which is dependent on it.
*
* @author Robi Khan
* @since 1.3
@@ -192,6 +229,11 @@ public void dispose() {
/**
* Moves mouse pointer to given screen coordinates.
+ *
+ * The mouse pointer may not visually move on some platforms,
+ * while the subsequent mousePress and mouseRelease can be
+ * delivered to the correct location
+ *
* @param x X position
* @param y Y position
*/
@@ -386,8 +428,22 @@ private void checkKeycodeArgument(int keycode) {
/**
* Returns the color of a pixel at the given screen coordinates.
+ *
+ * If the desktop environment requires that permissions be granted
+ * to capture screen content, and the required permissions are not granted,
+ * then a {@code SecurityException} may be thrown,
+ * or the content of the returned {@code Color} is undefined.
+ *
+ * @apiNote It is recommended to avoid calling this method on
+ * the AWT Event Dispatch Thread since screen capture may be a lengthy
+ * operation, particularly if acquiring permissions is needed and involves
+ * user interaction.
+ *
* @param x X position of pixel
* @param y Y position of pixel
+ * @throws SecurityException if {@code readDisplayPixels} permission
+ * is not granted, or access to the screen is denied
+ * by the desktop environment
* @return Color of the pixel
*/
public synchronized Color getPixelColor(int x, int y) {
@@ -397,12 +453,25 @@ public synchronized Color getPixelColor(int x, int y) {
}
/**
- * Creates an image containing pixels read from the screen. This image does
- * not include the mouse cursor.
+ * Creates an image containing pixels read from the screen.
+ *
+ * If the desktop environment requires that permissions be granted
+ * to capture screen content, and the required permissions are not granted,
+ * then a {@code SecurityException} may be thrown,
+ * or the contents of the returned {@code BufferedImage} are undefined.
+ *
{@systemProperty jdk.http.maxHeaderSize} (default: 393216 or 384kB)
+ This is the maximum header field section size that a client is prepared to accept.
+ This is computed as the sum of the size of the uncompressed header name, plus
+ the size of the uncompressed header value, plus an overhead of 32 bytes for
+ each field section line. If a peer sends a field section that exceeds this
+ size a {@link java.net.ProtocolException ProtocolException} will be raised.
+ This applies to all versions of the HTTP protocol. A value of zero or a negative
+ value means no limit. If left unspecified, the default value is 393216 bytes.
All these properties are checked only once at startup.
diff --git a/jdk/src/share/classes/sun/net/www/MessageHeader.java b/jdk/src/share/classes/sun/net/www/MessageHeader.java
index 6ab2008dd4..335ec49d3f 100644
--- a/jdk/src/share/classes/sun/net/www/MessageHeader.java
+++ b/jdk/src/share/classes/sun/net/www/MessageHeader.java
@@ -30,6 +30,8 @@
package sun.net.www;
import java.io.*;
+import java.lang.reflect.Array;
+import java.net.ProtocolException;
import java.util.Collections;
import java.util.*;
@@ -46,11 +48,32 @@ class MessageHeader {
private String values[];
private int nkeys;
+ // max number of bytes for headers, <=0 means unlimited;
+ // this corresponds to the length of the names, plus the length
+ // of the values, plus an overhead of 32 bytes per name: value
+ // pair.
+ // Note: we use the same definition as HTTP/2 SETTINGS_MAX_HEADER_LIST_SIZE
+ // see RFC 9113, section 6.5.2.
+ // https://www.rfc-editor.org/rfc/rfc9113.html#SETTINGS_MAX_HEADER_LIST_SIZE
+ private final int maxHeaderSize;
+
+ // Aggregate size of the field lines (name + value + 32) x N
+ // that have been parsed and accepted so far.
+ // This is defined as a long to force promotion to long
+ // and avoid overflows; see checkNewSize;
+ private long size;
+
public MessageHeader () {
+ this(0);
+ }
+
+ public MessageHeader (int maxHeaderSize) {
+ this.maxHeaderSize = maxHeaderSize;
grow();
}
public MessageHeader (InputStream is) throws java.io.IOException {
+ maxHeaderSize = 0;
parseHeader(is);
}
@@ -466,10 +489,28 @@ public static String canonicalID(String id) {
public void parseHeader(InputStream is) throws java.io.IOException {
synchronized (this) {
nkeys = 0;
+ size = 0;
}
mergeHeader(is);
}
+ private void checkMaxHeaderSize(int sz) throws ProtocolException {
+ if (maxHeaderSize > 0) checkNewSize(size, sz, 0);
+ }
+
+ private long checkNewSize(long size, int name, int value) throws ProtocolException {
+ // See SETTINGS_MAX_HEADER_LIST_SIZE, RFC 9113, section 6.5.2.
+ long newSize = size + name + value + 32;
+ if (maxHeaderSize > 0 && newSize > maxHeaderSize) {
+ Arrays.fill(keys, 0, nkeys, null);
+ Arrays.fill(values,0, nkeys, null);
+ nkeys = 0;
+ throw new ProtocolException(String.format("Header size too big: %s > %s",
+ newSize, maxHeaderSize));
+ }
+ return newSize;
+ }
+
/** Parse and merge a MIME header from an input stream. */
@SuppressWarnings("fallthrough")
public void mergeHeader(InputStream is) throws java.io.IOException {
@@ -483,7 +524,15 @@ public void mergeHeader(InputStream is) throws java.io.IOException {
int c;
boolean inKey = firstc > ' ';
s[len++] = (char) firstc;
+ checkMaxHeaderSize(len);
parseloop:{
+ // We start parsing for a new name value pair here.
+ // The max header size includes an overhead of 32 bytes per
+ // name value pair.
+ // See SETTINGS_MAX_HEADER_LIST_SIZE, RFC 9113, section 6.5.2.
+ long maxRemaining = maxHeaderSize > 0
+ ? maxHeaderSize - size - 32
+ : Long.MAX_VALUE;
while ((c = is.read()) >= 0) {
switch (c) {
case ':':
@@ -517,6 +566,9 @@ public void mergeHeader(InputStream is) throws java.io.IOException {
s = ns;
}
s[len++] = (char) c;
+ if (maxHeaderSize > 0 && len > maxRemaining) {
+ checkMaxHeaderSize(len);
+ }
}
firstc = -1;
}
@@ -538,6 +590,9 @@ public void mergeHeader(InputStream is) throws java.io.IOException {
v = new String();
else
v = String.copyValueOf(s, keyend, len - keyend);
+ int klen = k == null ? 0 : k.length();
+
+ size = checkNewSize(size, klen, v.length());
add(k, v);
}
}
diff --git a/jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java b/jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java
index f64db254e5..e3419c535e 100644
--- a/jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java
+++ b/jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java
@@ -163,6 +163,8 @@ public class HttpURLConnection extends java.net.HttpURLConnection {
*/
private static int bufSize4ES = 0;
+ private static final int maxHeaderSize;
+
/*
* Restrict setting of request headers through the public api
* consistent with JavaScript XMLHttpRequest2 with a few
@@ -284,6 +286,19 @@ private static Set schemesListToSet(String list) {
} else {
restrictedHeaderSet = null;
}
+
+ int defMaxHeaderSize = 384 * 1024;
+ String maxHeaderSizeStr = getNetProperty("jdk.http.maxHeaderSize");
+ int maxHeaderSizeVal = defMaxHeaderSize;
+ if (maxHeaderSizeStr != null) {
+ try {
+ maxHeaderSizeVal = Integer.parseInt(maxHeaderSizeStr);
+ } catch (NumberFormatException n) {
+ maxHeaderSizeVal = defMaxHeaderSize;
+ }
+ }
+ if (maxHeaderSizeVal < 0) maxHeaderSizeVal = 0;
+ maxHeaderSize = maxHeaderSizeVal;
}
static final String httpVersion = "HTTP/1.1";
@@ -707,7 +722,7 @@ private void writeRequests() throws IOException {
}
ps = (PrintStream) http.getOutputStream();
connected=true;
- responses = new MessageHeader();
+ responses = new MessageHeader(maxHeaderSize);
setRequests=false;
writeRequests();
}
@@ -862,7 +877,7 @@ protected HttpURLConnection(URL u, Proxy p, Handler handler)
throws IOException {
super(checkURL(u));
requests = new MessageHeader();
- responses = new MessageHeader();
+ responses = new MessageHeader(maxHeaderSize);
userHeaders = new MessageHeader();
this.handler = handler;
instProxy = p;
@@ -2675,7 +2690,7 @@ private boolean followRedirect0(String loc, int stat, URL locUrl)
}
// clear out old response headers!!!!
- responses = new MessageHeader();
+ responses = new MessageHeader(maxHeaderSize);
if (stat == HTTP_USE_PROXY) {
/* This means we must re-request the resource through the
* proxy denoted in the "Location:" field of the response.
@@ -2864,7 +2879,7 @@ private void reset() throws IOException {
} catch (IOException e) { }
}
responseCode = -1;
- responses = new MessageHeader();
+ responses = new MessageHeader(maxHeaderSize);
connected = false;
}
diff --git a/jdk/src/share/lib/net.properties b/jdk/src/share/lib/net.properties
index a541eef9e6..35306567d9 100644
--- a/jdk/src/share/lib/net.properties
+++ b/jdk/src/share/lib/net.properties
@@ -119,3 +119,20 @@ jdk.http.auth.tunneling.disabledSchemes=Basic
#jdk.http.ntlm.transparentAuth=trustedHosts
#
jdk.http.ntlm.transparentAuth=disabled
+
+#
+# Maximum HTTP field section size that a client is prepared to accept
+#
+# jdk.http.maxHeaderSize=393216
+#
+# This is the maximum header field section size that a client is prepared to accept.
+# This is computed as the sum of the size of the uncompressed header name, plus
+# the size of the uncompressed header value, plus an overhead of 32 bytes for
+# each field section line. If a peer sends a field section that exceeds this
+# size a {@link java.net.ProtocolException ProtocolException} will be raised.
+# This applies to all versions of the HTTP protocol. A value of zero or a negative
+# value means no limit. If left unspecified, the default value is 393216 bytes
+# or 384kB.
+#
+# Note: This property is currently used by the JDK Reference implementation. It
+# is not guaranteed to be examined and used by other implementations.
From 0405894d5183be14e2563617446e90192eced09d Mon Sep 17 00:00:00 2001
From: Martin Balao
Date: Wed, 14 Aug 2024 21:12:00 +0000
Subject: [PATCH 59/66] 8328544: Improve handling of vectorization
Co-authored-by: Francisco Ferrari Bihurriet
Reviewed-by: yan, roland, andrew
Backport-of: b5174c9159fbffdf335ee6835267ba0e674cf432
---
hotspot/src/share/vm/opto/superword.cpp | 472 +++++++++++++++++++++++-
hotspot/src/share/vm/opto/superword.hpp | 90 ++++-
2 files changed, 548 insertions(+), 14 deletions(-)
diff --git a/hotspot/src/share/vm/opto/superword.cpp b/hotspot/src/share/vm/opto/superword.cpp
index 63baac179f..38e8c20241 100644
--- a/hotspot/src/share/vm/opto/superword.cpp
+++ b/hotspot/src/share/vm/opto/superword.cpp
@@ -2317,7 +2317,11 @@ char* SuperWord::blank(uint depth) {
//----------------------------SWPointer------------------------
SWPointer::SWPointer(MemNode* mem, SuperWord* slp) :
_mem(mem), _slp(slp), _base(NULL), _adr(NULL),
- _scale(0), _offset(0), _invar(NULL), _negate_invar(false) {
+ _scale(0), _offset(0), _invar(NULL), _negate_invar(false),
+ _has_int_index_after_convI2L(false),
+ _int_index_after_convI2L_offset(0),
+ _int_index_after_convI2L_invar(NULL),
+ _int_index_after_convI2L_scale(0) {
Node* adr = mem->in(MemNode::Address);
if (!adr->is_AddP()) {
@@ -2346,6 +2350,12 @@ SWPointer::SWPointer(MemNode* mem, SuperWord* slp) :
break; // stop looking at addp's
}
}
+
+ if (!is_safe_to_use_as_simple_form(base, adr)) {
+ assert(!valid(), "does not have simple form");
+ return;
+ }
+
_base = base;
_adr = adr;
assert(valid(), "Usable");
@@ -2355,7 +2365,354 @@ SWPointer::SWPointer(MemNode* mem, SuperWord* slp) :
// the pattern match of an address expression.
SWPointer::SWPointer(SWPointer* p) :
_mem(p->_mem), _slp(p->_slp), _base(NULL), _adr(NULL),
- _scale(0), _offset(0), _invar(NULL), _negate_invar(false) {}
+ _scale(0), _offset(0), _invar(NULL), _negate_invar(false),
+ _has_int_index_after_convI2L(false),
+ _int_index_after_convI2L_offset(0),
+ _int_index_after_convI2L_invar(NULL),
+ _int_index_after_convI2L_scale(0) {}
+
+// We would like to make decisions about aliasing (i.e. removing memory edges) and adjacency
+// (i.e. which loads/stores can be packed) based on the simple form:
+//
+// s_pointer = adr + offset + invar + scale * ConvI2L(iv)
+//
+// However, we parse the compound-long-int form:
+//
+// c_pointer = adr + long_offset + long_invar + long_scale * ConvI2L(int_index)
+// int_index = int_offset + int_invar + int_scale * iv
+//
+// In general, the simple and the compound-long-int form do not always compute the same pointer
+// at runtime. For example, the simple form would give a different result due to an overflow
+// in the int_index.
+//
+// Example:
+// For both forms, we have:
+// iv = 0
+// scale = 1
+//
+// We now account the offset and invar once to the long part and once to the int part:
+// Pointer 1 (long offset and long invar):
+// long_offset = min_int
+// long_invar = min_int
+// int_offset = 0
+// int_invar = 0
+//
+// Pointer 2 (int offset and int invar):
+// long_offset = 0
+// long_invar = 0
+// int_offset = min_int
+// int_invar = min_int
+//
+// This gives us the following pointers:
+// Compound-long-int form pointers:
+// Form:
+// c_pointer = adr + long_offset + long_invar + long_scale * ConvI2L(int_offset + int_invar + int_scale * iv)
+//
+// Pointers:
+// c_pointer1 = adr + min_int + min_int + 1 * ConvI2L(0 + 0 + 1 * 0)
+// = adr + min_int + min_int
+// = adr - 2^32
+//
+// c_pointer2 = adr + 0 + 0 + 1 * ConvI2L(min_int + min_int + 1 * 0)
+// = adr + ConvI2L(min_int + min_int)
+// = adr + 0
+// = adr
+//
+// Simple form pointers:
+// Form:
+// s_pointer = adr + offset + invar + scale * ConvI2L(iv)
+// s_pointer = adr + (long_offset + int_offset) + (long_invar + int_invar) + (long_scale * int_scale) * ConvI2L(iv)
+//
+// Pointers:
+// s_pointer1 = adr + (min_int + 0 ) + (min_int + 0 ) + 1 * 0
+// = adr + min_int + min_int
+// = adr - 2^32
+// s_pointer2 = adr + (0 + min_int ) + (0 + min_int ) + 1 * 0
+// = adr + min_int + min_int
+// = adr - 2^32
+//
+// We see that the two addresses are actually 2^32 bytes apart (derived from the c_pointers), but their simple form look identical.
+//
+// Hence, we need to determine in which cases it is safe to make decisions based on the simple
+// form, rather than the compound-long-int form. If we cannot prove that using the simple form
+// is safe (i.e. equivalent to the compound-long-int form), then we do not get a valid SWPointer,
+// and the associated memop cannot be vectorized.
+bool SWPointer::is_safe_to_use_as_simple_form(Node* base, Node* adr) const {
+#ifndef _LP64
+ // On 32-bit platforms, there is never an explicit int_index with ConvI2L for the iv. Thus, the
+ // parsed pointer form is always the simple form, with int operations:
+ //
+ // pointer = adr + offset + invar + scale * iv
+ //
+ assert(!_has_int_index_after_convI2L, "32-bit never has an int_index with ConvI2L for the iv");
+ return true;
+#else
+
+ // Array accesses that are not Unsafe always have a RangeCheck which ensures that there is no
+ // int_index overflow. This implies that the conversion to long can be done separately:
+ //
+ // ConvI2L(int_index) = ConvI2L(int_offset) + ConvI2L(int_invar) + ConvI2L(scale) * ConvI2L(iv)
+ //
+ // And hence, the simple form is guaranteed to be identical to the compound-long-int form at
+ // runtime and the SWPointer is safe/valid to be used.
+ const TypeAryPtr* ary_ptr_t = _mem->adr_type()->isa_aryptr();
+
+ // We did not find the int_index. Just to be safe, reject this SWPointer.
+ if (!_has_int_index_after_convI2L) {
+ return false;
+ }
+
+ int int_offset = _int_index_after_convI2L_offset;
+ Node* int_invar = _int_index_after_convI2L_invar;
+ int int_scale = _int_index_after_convI2L_scale;
+ int long_scale = _scale / int_scale;
+
+ // If "int_index = iv", then the simple form is identical to the compound-long-int form.
+ //
+ // int_index = int_offset + int_invar + int_scale * iv
+ // = 0 0 1 * iv
+ // = iv
+ if (int_offset == 0 && int_invar == NULL && int_scale == 1) {
+ return true;
+ }
+
+ // Intuition: What happens if the int_index overflows? Let us look at two pointers on the "overflow edge":
+ //
+ // pointer1 = adr + ConvI2L(int_index1)
+ // pointer2 = adr + ConvI2L(int_index2)
+ //
+ // int_index1 = max_int + 0 = max_int -> very close to but before the overflow
+ // int_index2 = max_int + 1 = min_int -> just enough to get the overflow
+ //
+ // When looking at the difference of pointer1 and pointer2, we notice that it is very large
+ // (almost 2^32). Since arrays have at most 2^31 elements, chances are high that pointer2 is
+ // an actual out-of-bounds access at runtime. These would normally be prevented by range checks
+ // at runtime. However, if the access was done by using Unsafe, where range checks are omitted,
+ // then an out-of-bounds access constitutes undefined behavior. This means that we are allowed to
+ // do anything, including changing the behavior.
+ //
+ // If we can set the right conditions, we have a guarantee that an overflow is either impossible
+ // (no overflow or range checks preventing that) or undefined behavior. In both cases, we are
+ // safe to do a vectorization.
+ //
+ // Approach: We want to prove a lower bound for the distance between these two pointers, and an
+ // upper bound for the size of a memory object. We can derive such an upper bound for
+ // arrays. We know they have at most 2^31 elements. If we know the size of the elements
+ // in bytes, we have:
+ //
+ // array_element_size_in_bytes * 2^31 >= max_possible_array_size_in_bytes
+ // >= array_size_in_bytes (ARR)
+ //
+ // If some small difference "delta" leads to an int_index overflow, we know that the
+ // int_index1 before overflow must have been close to max_int, and the int_index2 after
+ // the overflow must be close to min_int:
+ //
+ // pointer1 = adr + long_offset + long_invar + long_scale * ConvI2L(int_index1)
+ // =approx adr + long_offset + long_invar + long_scale * max_int
+ //
+ // pointer2 = adr + long_offset + long_invar + long_scale * ConvI2L(int_index2)
+ // =approx adr + long_offset + long_invar + long_scale * min_int
+ //
+ // We realize that the pointer difference is very large:
+ //
+ // difference =approx long_scale * 2^32
+ //
+ // Hence, if we set the right condition for long_scale and array_element_size_in_bytes,
+ // we can prove that an overflow is impossible (or would imply undefined behaviour).
+ //
+ // We must now take this intuition, and develop a rigorous proof. We start by stating the problem
+ // more precisely, with the help of some definitions and the Statement we are going to prove.
+ //
+ // Definition:
+ // Two SWPointers are "comparable" (i.e. SWPointer::comparable is true, set with SWPointer::cmp()),
+ // iff all of these conditions apply for the simple form:
+ // 1) Both SWPointers are valid.
+ // 2) The adr are identical, or both are array bases of different arrays.
+ // 3) They have identical scale.
+ // 4) They have identical invar.
+ // 5) The difference in offsets is limited: abs(offset1 - offset2) < 2^31. (DIFF)
+ //
+ // For the Vectorization Optimization, we pair-wise compare SWPointers and determine if they are:
+ // 1) "not comparable":
+ // We do not optimize them (assume they alias, not assume adjacency).
+ //
+ // Whenever we chose this option based on the simple form, it is also correct based on the
+ // compound-long-int form, since we make no optimizations based on it.
+ //
+ // 2) "comparable" with different array bases at runtime:
+ // We assume they do not alias (remove memory edges), but not assume adjacency.
+ //
+ // Whenever we have two different array bases for the simple form, we also have different
+ // array bases for the compound-long-form. Since SWPointers provably point to different
+ // memory objects, they can never alias.
+ //
+ // 3) "comparable" with the same base address:
+ // We compute the relative pointer difference, and based on the load/store size we can
+ // compute aliasing and adjacency.
+ //
+ // We must find a condition under which the pointer difference of the simple form is
+ // identical to the pointer difference of the compound-long-form. We do this with the
+ // Statement below, which we then proceed to prove.
+ //
+ // Statement:
+ // If two SWPointers satisfy these 3 conditions:
+ // 1) They are "comparable".
+ // 2) They have the same base address.
+ // 3) Their long_scale is a multiple of the array element size in bytes:
+ //
+ // abs(long_scale) % array_element_size_in_bytes = 0 (A)
+ //
+ // Then their pointer difference of the simple form is identical to the pointer difference
+ // of the compound-long-int form.
+ //
+ // More precisely:
+ // Such two SWPointers by definition have identical adr, invar, and scale.
+ // Their simple form is:
+ //
+ // s_pointer1 = adr + offset1 + invar + scale * ConvI2L(iv) (B1)
+ // s_pointer2 = adr + offset2 + invar + scale * ConvI2L(iv) (B2)
+ //
+ // Thus, the pointer difference of the simple forms collapses to the difference in offsets:
+ //
+ // s_difference = s_pointer1 - s_pointer2 = offset1 - offset2 (C)
+ //
+ // Their compound-long-int form for these SWPointer is:
+ //
+ // c_pointer1 = adr + long_offset1 + long_invar1 + long_scale1 * ConvI2L(int_index1) (D1)
+ // int_index1 = int_offset1 + int_invar1 + int_scale1 * iv (D2)
+ //
+ // c_pointer2 = adr + long_offset2 + long_invar2 + long_scale2 * ConvI2L(int_index2) (D3)
+ // int_index2 = int_offset2 + int_invar2 + int_scale2 * iv (D4)
+ //
+ // And these are the offset1, offset2, invar and scale from the simple form (B1) and (B2):
+ //
+ // offset1 = long_offset1 + long_scale1 * ConvI2L(int_offset1) (D5)
+ // offset2 = long_offset2 + long_scale2 * ConvI2L(int_offset2) (D6)
+ //
+ // invar = long_invar1 + long_scale1 * ConvI2L(int_invar1)
+ // = long_invar2 + long_scale2 * ConvI2L(int_invar2) (D7)
+ //
+ // scale = long_scale1 * ConvI2L(int_scale1)
+ // = long_scale2 * ConvI2L(int_scale2) (D8)
+ //
+ // The pointer difference of the compound-long-int form is defined as:
+ //
+ // c_difference = c_pointer1 - c_pointer2
+ //
+ // Thus, the statement claims that for the two SWPointer we have:
+ //
+ // s_difference = c_difference (Statement)
+ //
+ // We prove the Statement with the help of a Lemma:
+ //
+ // Lemma:
+ // There is some integer x, such that:
+ //
+ // c_difference = s_difference + array_element_size_in_bytes * x * 2^32 (Lemma)
+ //
+ // From condition (DIFF), we can derive:
+ //
+ // abs(s_difference) < 2^31 (E)
+ //
+ // Assuming the Lemma, we prove the Statement:
+ // If "x = 0" (intuitively: the int_index does not overflow), then:
+ // c_difference = s_difference
+ // and hence the simple form computes the same pointer difference as the compound-long-int form.
+ // If "x != 0" (intuitively: the int_index overflows), then:
+ // abs(c_difference) >= abs(s_difference + array_element_size_in_bytes * x * 2^32)
+ // >= array_element_size_in_bytes * 2^32 - abs(s_difference)
+ // -- apply (E) --
+ // > array_element_size_in_bytes * 2^32 - 2^31
+ // >= array_element_size_in_bytes * 2^31
+ // -- apply (ARR) --
+ // >= max_possible_array_size_in_bytes
+ // >= array_size_in_bytes
+ //
+ // This shows that c_pointer1 and c_pointer2 have a distance that exceeds the maximum array size.
+ // Thus, at least one of the two pointers must be outside of the array bounds. But we can assume
+ // that out-of-bounds accesses do not happen. If they still do, it is undefined behavior. Hence,
+ // we are allowed to do anything. We can also "safely" use the simple form in this case even though
+ // it might not match the compound-long-int form at runtime.
+ // QED Statement.
+ //
+ // We must now prove the Lemma.
+ //
+ // ConvI2L always truncates by some power of 2^32, i.e. there is some integer y such that:
+ //
+ // ConvI2L(y1 + y2) = ConvI2L(y1) + ConvI2L(y2) + 2^32 * y (F)
+ //
+ // It follows, that there is an integer y1 such that:
+ //
+ // ConvI2L(int_index1) = ConvI2L(int_offset1 + int_invar1 + int_scale1 * iv)
+ // -- apply (F) --
+ // = ConvI2L(int_offset1)
+ // + ConvI2L(int_invar1)
+ // + ConvI2L(int_scale1) * ConvI2L(iv)
+ // + y1 * 2^32 (G)
+ //
+ // Thus, we can write the compound-long-int form (D1) as:
+ //
+ // c_pointer1 = adr + long_offset1 + long_invar1 + long_scale1 * ConvI2L(int_index1)
+ // -- apply (G) --
+ // = adr
+ // + long_offset1
+ // + long_invar1
+ // + long_scale1 * ConvI2L(int_offset1)
+ // + long_scale1 * ConvI2L(int_invar1)
+ // + long_scale1 * ConvI2L(int_scale1) * ConvI2L(iv)
+ // + long_scale1 * y1 * 2^32 (H)
+ //
+ // And we can write the simple form as:
+ //
+ // s_pointer1 = adr + offset1 + invar + scale * ConvI2L(iv)
+ // -- apply (D5, D7, D8) --
+ // = adr
+ // + long_offset1
+ // + long_scale1 * ConvI2L(int_offset1)
+ // + long_invar1
+ // + long_scale1 * ConvI2L(int_invar1)
+ // + long_scale1 * ConvI2L(int_scale1) * ConvI2L(iv) (K)
+ //
+ // We now compute the pointer difference between the simple (K) and compound-long-int form (H).
+ // Most terms cancel out immediately:
+ //
+ // sc_difference1 = c_pointer1 - s_pointer1 = long_scale1 * y1 * 2^32 (L)
+ //
+ // Rearranging the equation (L), we get:
+ //
+ // c_pointer1 = s_pointer1 + long_scale1 * y1 * 2^32 (M)
+ //
+ // And since long_scale1 is a multiple of array_element_size_in_bytes, there is some integer
+ // x1, such that (M) implies:
+ //
+ // c_pointer1 = s_pointer1 + array_element_size_in_bytes * x1 * 2^32 (N)
+ //
+ // With an analogue equation for c_pointer2, we can now compute the pointer difference for
+ // the compound-long-int form:
+ //
+ // c_difference = c_pointer1 - c_pointer2
+ // -- apply (N) --
+ // = s_pointer1 + array_element_size_in_bytes * x1 * 2^32
+ // -(s_pointer2 + array_element_size_in_bytes * x2 * 2^32)
+ // -- where "x = x1 - x2" --
+ // = s_pointer1 - s_pointer2 + array_element_size_in_bytes * x * 2^32
+ // -- apply (C) --
+ // = s_difference + array_element_size_in_bytes * x * 2^32
+ // QED Lemma.
+ if (ary_ptr_t != NULL) {
+ BasicType array_element_bt = ary_ptr_t->elem()->array_element_basic_type();
+ if (is_java_primitive(array_element_bt)) {
+ int array_element_size_in_bytes = type2aelembytes(array_element_bt);
+ if (abs(long_scale) % array_element_size_in_bytes == 0) {
+ return true;
+ }
+ }
+ }
+
+ // General case: we do not know if it is safe to use the simple form.
+ return false;
+#endif
+}
//------------------------scaled_iv_plus_offset--------------------
// Match: k*iv + offset
@@ -2412,12 +2769,37 @@ bool SWPointer::scaled_iv(Node* n) {
_scale = 1 << n->in(2)->get_int();
return true;
}
- } else if (opc == Op_ConvI2L) {
+ } else if (opc == Op_ConvI2L && !has_iv()) {
if (n->in(1)->Opcode() == Op_CastII &&
n->in(1)->as_CastII()->has_range_check()) {
// Skip range check dependent CastII nodes
n = n->in(1);
}
+
+ // So far we have not found the iv yet, and are about to enter a ConvI2L subgraph,
+ // which may be the int index (that might overflow) for the memory access, of the form:
+ //
+ // int_index = int_offset + int_invar + int_scale * iv
+ //
+ // If we simply continue parsing with the current SWPointer, then the int_offset and
+ // int_invar simply get added to the long offset and invar. But for the checks in
+ // SWPointer::is_safe_to_use_as_simple_form() we need to have explicit access to the
+ // int_index. Thus, we must parse it explicitly here. For this, we use a temporary
+ // SWPointer, to pattern match the int_index sub-expression of the address.
+
+ SWPointer tmp(this);
+
+ if (tmp.scaled_iv_plus_offset(n->in(1)) && tmp.has_iv()) {
+ // We successfully matched an integer index, of the form:
+ // int_index = int_offset + int_invar + int_scale * iv
+ _has_int_index_after_convI2L = true;
+ _int_index_after_convI2L_offset = tmp._offset;
+ _int_index_after_convI2L_invar = tmp._invar;
+ _int_index_after_convI2L_scale = tmp._scale;
+ }
+
+ // Now parse it again for the real SWPointer. This makes sure that the int_offset, int_invar,
+ // and int_scale are properly added to the final SWPointer's offset, invar, and scale.
if (scaled_iv_plus_offset(n->in(1))) {
return true;
}
@@ -2429,9 +2811,25 @@ bool SWPointer::scaled_iv(Node* n) {
SWPointer tmp(this);
if (tmp.scaled_iv_plus_offset(n->in(1))) {
if (tmp._invar == NULL) {
- int mult = 1 << n->in(2)->get_int();
- _scale = tmp._scale * mult;
- _offset += tmp._offset * mult;
+ int scale = (int)(n->in(2)->get_int());
+ int mult = 1 << scale;
+ // Accumulate scale.
+ _scale = tmp._scale * ((jint)mult);
+ // Accumulate offset.
+ jint shifted_offset = 0;
+ if (!try_LShiftI_no_overflow(tmp._offset, scale, shifted_offset)) {
+ return false; // shift overflow.
+ }
+ if (!try_AddI_no_overflow(_offset, shifted_offset, _offset)) {
+ return false; // add overflow.
+ }
+
+ // Forward info about the int_index:
+ _has_int_index_after_convI2L = tmp._has_int_index_after_convI2L;
+ _int_index_after_convI2L_offset = tmp._int_index_after_convI2L_offset;
+ _int_index_after_convI2L_invar = tmp._int_index_after_convI2L_invar;
+ _int_index_after_convI2L_scale = tmp._int_index_after_convI2L_scale;
+
return true;
}
}
@@ -2446,7 +2844,9 @@ bool SWPointer::scaled_iv(Node* n) {
bool SWPointer::offset_plus_k(Node* n, bool negate) {
int opc = n->Opcode();
if (opc == Op_ConI) {
- _offset += negate ? -(n->get_int()) : n->get_int();
+ if (!try_AddSubI_no_overflow(_offset, n->get_int(), negate, _offset)) {
+ return false; // add/sub overflow.
+ }
return true;
} else if (opc == Op_ConL) {
// Okay if value fits into an int
@@ -2454,7 +2854,9 @@ bool SWPointer::offset_plus_k(Node* n, bool negate) {
if (t->higher_equal(TypeLong::INT)) {
jlong loff = n->get_long();
jint off = (jint)loff;
- _offset += negate ? -off : loff;
+ if (!try_AddSubI_no_overflow(_offset, off, negate, _offset)) {
+ return false; // add/sub overflow.
+ }
return true;
}
return false;
@@ -2464,10 +2866,14 @@ bool SWPointer::offset_plus_k(Node* n, bool negate) {
if (n->in(2)->is_Con() && invariant(n->in(1))) {
_negate_invar = negate;
_invar = n->in(1);
- _offset += negate ? -(n->in(2)->get_int()) : n->in(2)->get_int();
+ if (!try_AddSubI_no_overflow(_offset, n->in(2)->get_int(), negate, _offset)) {
+ return false; // add/sub overflow.
+ }
return true;
} else if (n->in(1)->is_Con() && invariant(n->in(2))) {
- _offset += negate ? -(n->in(1)->get_int()) : n->in(1)->get_int();
+ if (!try_AddSubI_no_overflow(_offset, n->in(1)->get_int(), negate, _offset)) {
+ return false; // add/sub overflow.
+ }
_negate_invar = negate;
_invar = n->in(2);
return true;
@@ -2477,10 +2883,14 @@ bool SWPointer::offset_plus_k(Node* n, bool negate) {
if (n->in(2)->is_Con() && invariant(n->in(1))) {
_negate_invar = negate;
_invar = n->in(1);
- _offset += !negate ? -(n->in(2)->get_int()) : n->in(2)->get_int();
+ if (!try_AddSubI_no_overflow(_offset, n->in(2)->get_int(), !negate, _offset)) {
+ return false; // add/sub overflow.
+ }
return true;
} else if (n->in(1)->is_Con() && invariant(n->in(2))) {
- _offset += negate ? -(n->in(1)->get_int()) : n->in(1)->get_int();
+ if (!try_AddSubI_no_overflow(_offset, n->in(1)->get_int(), negate, _offset)) {
+ return false; // add/sub overflow.
+ }
_negate_invar = !negate;
_invar = n->in(2);
return true;
@@ -2494,6 +2904,44 @@ bool SWPointer::offset_plus_k(Node* n, bool negate) {
return false;
}
+bool SWPointer::try_AddI_no_overflow(jint offset1, jint offset2, jint& result) {
+ jlong long_offset = java_add((jlong)(offset1), (jlong)(offset2));
+ jint int_offset = java_add( offset1, offset2);
+ if (long_offset != int_offset) {
+ return false;
+ }
+ result = int_offset;
+ return true;
+}
+
+bool SWPointer::try_SubI_no_overflow(jint offset1, jint offset2, jint& result) {
+ jlong long_offset = java_subtract((jlong)(offset1), (jlong)(offset2));
+ jint int_offset = java_subtract( offset1, offset2);
+ if (long_offset != int_offset) {
+ return false;
+ }
+ result = int_offset;
+ return true;
+}
+
+bool SWPointer::try_AddSubI_no_overflow(jint offset1, jint offset2, bool is_sub, jint& result) {
+ if (is_sub) {
+ return try_SubI_no_overflow(offset1, offset2, result);
+ } else {
+ return try_AddI_no_overflow(offset1, offset2, result);
+ }
+}
+
+bool SWPointer::try_LShiftI_no_overflow(jint offset, int shift, jint& result) {
+ jlong long_offset = java_shift_left((jlong)(offset), (julong)((jlong)(shift)));
+ jint int_offset = java_shift_left( offset, (juint)((jint)(shift)));
+ if (long_offset != int_offset) {
+ return false;
+ }
+ result = int_offset;
+ return true;
+}
+
//----------------------------print------------------------
void SWPointer::print() {
#ifndef PRODUCT
diff --git a/hotspot/src/share/vm/opto/superword.hpp b/hotspot/src/share/vm/opto/superword.hpp
index 13fd2bf9de..e65f2d6002 100644
--- a/hotspot/src/share/vm/opto/superword.hpp
+++ b/hotspot/src/share/vm/opto/superword.hpp
@@ -452,18 +452,63 @@ class SuperWord : public ResourceObj {
//------------------------------SWPointer---------------------------
// Information about an address for dependence checking and vector alignment
+//
+// We parse and represent pointers of the simple form:
+//
+// pointer = adr + offset + invar + scale * ConvI2L(iv)
+//
+// Where:
+//
+// adr: the base address of an array (base = adr)
+// OR
+// some address to off-heap memory (base = TOP)
+//
+// offset: a constant offset
+// invar: a runtime variable, which is invariant during the loop
+// scale: scaling factor
+// iv: loop induction variable
+//
+// But more precisely, we parse the composite-long-int form:
+//
+// pointer = adr + long_offset + long_invar + long_scale * ConvI2L(int_offset + inv_invar + int_scale * iv)
+//
+// pointer = adr + long_offset + long_invar + long_scale * ConvI2L(int_index)
+// int_index = int_offset + int_invar + int_scale * iv
+//
+// However, for aliasing and adjacency checks (e.g. SWPointer::cmp()) we always use the simple form to make
+// decisions. Hence, we must make sure to only create a "valid" SWPointer if the optimisations based on the
+// simple form produce the same result as the compound-long-int form would. Intuitively, this depends on
+// if the int_index overflows, but the precise conditions are given in SWPointer::is_safe_to_use_as_simple_form().
+//
+// ConvI2L(int_index) = ConvI2L(int_offset + int_invar + int_scale * iv)
+// = Convi2L(int_offset) + ConvI2L(int_invar) + ConvI2L(int_scale) * ConvI2L(iv)
+//
+// scale = long_scale * ConvI2L(int_scale)
+// offset = long_offset + long_scale * ConvI2L(int_offset)
+// invar = long_invar + long_scale * ConvI2L(int_invar)
+//
+// pointer = adr + offset + invar + scale * ConvI2L(iv)
+//
class SWPointer VALUE_OBJ_CLASS_SPEC {
protected:
MemNode* _mem; // My memory reference node
SuperWord* _slp; // SuperWord class
- Node* _base; // NULL if unsafe nonheap reference
- Node* _adr; // address pointer
+ // Components of the simple form:
+ Node* _base; // Base address of an array OR NULL if some off-heap memory.
+ Node* _adr; // Same as _base if an array pointer OR some off-heap memory pointer.
jint _scale; // multiplier for iv (in bytes), 0 if no loop iv
jint _offset; // constant offset (in bytes)
Node* _invar; // invariant offset (in bytes), NULL if none
bool _negate_invar; // if true then use: (0 - _invar)
+ // The int_index components of the compound-long-int form. Used to decide if it is safe to use the
+ // simple form rather than the compound-long-int form that was parsed.
+ bool _has_int_index_after_convI2L;
+ int _int_index_after_convI2L_offset;
+ Node* _int_index_after_convI2L_invar;
+ int _int_index_after_convI2L_scale;
+
PhaseIdealLoop* phase() { return _slp->phase(); }
IdealLoopTree* lpt() { return _slp->lpt(); }
PhiNode* iv() { return _slp->iv(); } // Induction var
@@ -480,6 +525,8 @@ class SWPointer VALUE_OBJ_CLASS_SPEC {
// Match: offset is (k [+/- invariant])
bool offset_plus_k(Node* n, bool negate = false);
+ bool is_safe_to_use_as_simple_form(Node* base, Node* adr) const;
+
public:
enum CMP {
Less = 1,
@@ -507,12 +554,45 @@ class SWPointer VALUE_OBJ_CLASS_SPEC {
int memory_size() { return _mem->memory_size(); }
// Comparable?
+ // We compute if and how two SWPointers can alias at runtime, i.e. if the two addressed regions of memory can
+ // ever overlap. There are essentially 3 relevant return states:
+ // - NotComparable: Synonymous to "unknown aliasing".
+ // We have no information about how the two SWPointers can alias. They could overlap, refer
+ // to another location in the same memory object, or point to a completely different object.
+ // -> Memory edge required. Aliasing unlikely but possible.
+ //
+ // - Less / Greater: Synonymous to "never aliasing".
+ // The two SWPointers may point into the same memory object, but be non-aliasing (i.e. we
+ // know both address regions inside the same memory object, but these regions are non-
+ // overlapping), or the SWPointers point to entirely different objects.
+ // -> No memory edge required. Aliasing impossible.
+ //
+ // - Equal: Synonymous to "overlap, or point to different memory objects".
+ // The two SWPointers either overlap on the same memory object, or point to two different
+ // memory objects.
+ // -> Memory edge required. Aliasing likely.
+ //
+ // In a future refactoring, we can simplify to two states:
+ // - NeverAlias: instead of Less / Greater
+ // - MayAlias: instead of Equal / NotComparable
+ //
+ // Two SWPointer are "comparable" (Less / Greater / Equal), iff all of these conditions apply:
+ // 1) Both are valid, i.e. expressible in the compound-long-int or simple form.
+ // 2) The adr are identical, or both are array bases of different arrays.
+ // 3) They have identical scale.
+ // 4) They have identical invar.
+ // 5) The difference in offsets is limited: abs(offset0 - offset1) < 2^31.
int cmp(SWPointer& q) {
if (valid() && q.valid() &&
(_adr == q._adr || _base == _adr && q._base == q._adr) &&
_scale == q._scale &&
_invar == q._invar &&
_negate_invar == q._negate_invar) {
+ jlong difference = abs(java_subtract((jlong)_offset, (jlong)q._offset));
+ jlong max_diff = (jlong)1 << 31;
+ if (difference >= max_diff) {
+ return NotComparable;
+ }
bool overlap = q._offset < _offset + memory_size() &&
_offset < q._offset + q.memory_size();
return overlap ? Equal : (_offset < q._offset ? Less : Greater);
@@ -529,6 +609,12 @@ class SWPointer VALUE_OBJ_CLASS_SPEC {
static bool comparable(int cmp) { return cmp < NotComparable; }
void print();
+
+ static bool try_AddI_no_overflow(jint offset1, jint offset2, jint& result);
+ static bool try_SubI_no_overflow(jint offset1, jint offset2, jint& result);
+ static bool try_AddSubI_no_overflow(jint offset1, jint offset2, bool is_sub, jint& result);
+ static bool try_LShiftI_no_overflow(jint offset1, int offset2, jint& result);
+
};
#endif // SHARE_VM_OPTO_SUPERWORD_HPP
From 165022181994b20d50e8631f88182f11d95e1ccb Mon Sep 17 00:00:00 2001
From: Alexey Bakhtin
Date: Fri, 10 May 2024 15:36:27 -0700
Subject: [PATCH 60/66] 8328726: Better Kerberos support
Reviewed-by: mbalao, andrew
Backport-of: 7325899a11f17bf4516d39495a12796385e459ed
---
.../security/auth/module/Krb5LoginModule.java | 9 ++------
.../security/auth/kerberos/KerberosKey.java | 8 +++----
.../javax/security/auth/kerberos/KeyImpl.java | 16 +++++---------
.../sun/security/jgss/krb5/Krb5Context.java | 22 +++++--------------
.../sun/security/jgss/krb5/Krb5Util.java | 15 +++++++++++++
.../sun/security/krb5/EncryptionKey.java | 8 ++-----
.../sun/security/krb5/internal/Krb5.java | 2 --
.../pkcs11/wrapper/CK_PBE_PARAMS.java | 5 -----
.../security/krb5/internal/tools/Kinit.java | 4 ----
9 files changed, 34 insertions(+), 55 deletions(-)
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 13822df62a..e6cab7bd68 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
@@ -41,7 +41,6 @@
import sun.security.krb5.*;
import sun.security.jgss.krb5.Krb5Util;
import sun.security.krb5.Credentials;
-import sun.misc.HexDumpEncoder;
/**
*
This LoginModule authenticates users using
@@ -786,15 +785,11 @@ private void attemptAuthentication(boolean getPasswdFromSharedState)
if (debug) {
System.out.println("principal is " + principal);
- HexDumpEncoder hd = new HexDumpEncoder();
if (ktab != null) {
System.out.println("Will use keytab");
} else if (storeKey) {
for (int i = 0; i < encKeys.length; i++) {
- System.out.println("EncryptionKey: keyType=" +
- encKeys[i].getEType() +
- " keyBytes (hex dump)=" +
- hd.encodeBuffer(encKeys[i].getBytes()));
+ System.out.println(encKeys[i].toString());
}
}
}
@@ -895,7 +890,7 @@ private void promptForPass(boolean getPasswdFromSharedState)
}
if (debug) {
System.out.println
- ("password is " + new String(password));
+ ("Get password from shared state");
}
return;
}
diff --git a/jdk/src/share/classes/javax/security/auth/kerberos/KerberosKey.java b/jdk/src/share/classes/javax/security/auth/kerberos/KerberosKey.java
index 5c8b65f270..70ba1676f7 100644
--- a/jdk/src/share/classes/javax/security/auth/kerberos/KerberosKey.java
+++ b/jdk/src/share/classes/javax/security/auth/kerberos/KerberosKey.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved.
* 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,9 +233,9 @@ public String toString() {
if (destroyed) {
return "Destroyed Principal";
}
- return "Kerberos Principal " + principal.toString() +
- "Key Version " + versionNum +
- "key " + key.toString();
+ return "KerberosKey: principal " + principal +
+ ", version " + versionNum +
+ ", key " + key.toString();
}
/**
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 f4ee947212..0455d218b0 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 (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved.
* 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,8 @@
import javax.crypto.SecretKey;
import javax.security.auth.Destroyable;
import javax.security.auth.DestroyFailedException;
-import sun.misc.HexDumpEncoder;
+
+import sun.security.jgss.krb5.Krb5Util;
import sun.security.krb5.Asn1Exception;
import sun.security.krb5.PrincipalName;
import sun.security.krb5.EncryptionKey;
@@ -200,15 +201,8 @@ private void readObject(ObjectInputStream ois)
}
public String toString() {
- HexDumpEncoder hd = new HexDumpEncoder();
- return "EncryptionKey: keyType=" + keyType
- + " keyBytes (hex dump)="
- + (keyBytes == null || keyBytes.length == 0 ?
- " Empty Key" :
- '\n' + hd.encodeBuffer(keyBytes)
- + '\n');
-
-
+ return "keyType=" + keyType
+ + ", " + Krb5Util.keyInfo(keyBytes);
}
public int hashCode() {
diff --git a/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Context.java b/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Context.java
index e9ee13d442..184cf5bb50 100644
--- a/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Context.java
+++ b/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Context.java
@@ -908,15 +908,11 @@ public final int getWrapSizeLimit(int qop, boolean confReq,
public final byte[] wrap(byte inBuf[], int offset, int len,
MessageProp msgProp) throws GSSException {
- if (DEBUG) {
- System.out.println("Krb5Context.wrap: data=["
- + getHexBytes(inBuf, offset, len)
- + "]");
- }
- if (state != STATE_DONE)
- throw new GSSException(GSSException.NO_CONTEXT, -1,
- "Wrap called in invalid state!");
+ if (state != STATE_DONE) {
+ throw new GSSException(GSSException.NO_CONTEXT, -1,
+ "Wrap called in invalid state!");
+ }
byte[] encToken = null;
try {
@@ -1061,12 +1057,6 @@ public final byte[] unwrap(byte inBuf[], int offset, int len,
setSequencingAndReplayProps(token, msgProp);
}
- if (DEBUG) {
- System.out.println("Krb5Context.unwrap: data=["
- + getHexBytes(data, 0, data.length)
- + "]");
- }
-
return data;
}
@@ -1412,8 +1402,8 @@ public byte[] getEncoded() {
@Override
public String toString() {
- return "Kerberos session key: etype: " + key.getEType() + "\n" +
- new sun.misc.HexDumpEncoder().encodeBuffer(key.getBytes());
+ return "Kerberos session key: etype=" + key.getEType()
+ + ", " + Krb5Util.keyInfo(key.getBytes());
}
}
diff --git a/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Util.java b/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Util.java
index 387edd7669..86fdaefbb3 100644
--- a/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Util.java
+++ b/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Util.java
@@ -301,4 +301,19 @@ public static EncryptionKey[] keysFromJavaxKeyTab(
KeyTab ktab, PrincipalName cname) {
return snapshotFromJavaxKeyTab(ktab).readServiceKeys(cname);
}
+
+ public static String keyInfo(byte[] data) {
+ if (data == null) {
+ return "null key";
+ } else if (data.length == 0) {
+ return "empty key";
+ } else {
+ for (byte b : data) {
+ if (b != 0) {
+ return data.length + "-byte key";
+ }
+ }
+ return data.length + "-byte zero key";
+ }
+ }
}
diff --git a/jdk/src/share/classes/sun/security/krb5/EncryptionKey.java b/jdk/src/share/classes/sun/security/krb5/EncryptionKey.java
index 4823b2525b..235bfc21d2 100644
--- a/jdk/src/share/classes/sun/security/krb5/EncryptionKey.java
+++ b/jdk/src/share/classes/sun/security/krb5/EncryptionKey.java
@@ -31,6 +31,7 @@
package sun.security.krb5;
+import sun.security.jgss.krb5.Krb5Util;
import sun.security.util.*;
import sun.security.krb5.internal.*;
import sun.security.krb5.internal.crypto.*;
@@ -476,12 +477,7 @@ public synchronized void writeKey(CCacheOutputStream cos)
public String toString() {
return new String("EncryptionKey: keyType=" + keyType
- + " kvno=" + kvno
- + " keyValue (hex dump)="
- + (keyValue == null || keyValue.length == 0 ?
- " Empty Key" : '\n'
- + Krb5.hexDumper.encodeBuffer(keyValue)
- + '\n'));
+ + ", kvno=" + kvno + ", " + Krb5Util.keyInfo(keyValue));
}
/**
diff --git a/jdk/src/share/classes/sun/security/krb5/internal/Krb5.java b/jdk/src/share/classes/sun/security/krb5/internal/Krb5.java
index 0df61a6179..9730bf2c85 100644
--- a/jdk/src/share/classes/sun/security/krb5/internal/Krb5.java
+++ b/jdk/src/share/classes/sun/security/krb5/internal/Krb5.java
@@ -312,8 +312,6 @@ public static String getErrorMessage(int i) {
public static final boolean DEBUG =
java.security.AccessController.doPrivileged(
new sun.security.action.GetBooleanAction("sun.security.krb5.debug"));
- public static final sun.misc.HexDumpEncoder hexDumper =
- new sun.misc.HexDumpEncoder();
static {
errMsgList = new Hashtable ();
diff --git a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_PBE_PARAMS.java b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_PBE_PARAMS.java
index c58b486bf3..116735c7da 100644
--- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_PBE_PARAMS.java
+++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_PBE_PARAMS.java
@@ -121,11 +121,6 @@ public String toString() {
buffer.append(pPassword.length);
buffer.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pPassword: ");
- buffer.append(pPassword);
- buffer.append(Constants.NEWLINE);
-
buffer.append(Constants.INDENT);
buffer.append("ulSaltLen: ");
buffer.append(pSalt.length);
diff --git a/jdk/src/windows/classes/sun/security/krb5/internal/tools/Kinit.java b/jdk/src/windows/classes/sun/security/krb5/internal/tools/Kinit.java
index 066728647c..6420618621 100644
--- a/jdk/src/windows/classes/sun/security/krb5/internal/tools/Kinit.java
+++ b/jdk/src/windows/classes/sun/security/krb5/internal/tools/Kinit.java
@@ -192,10 +192,6 @@ private void acquire()
System.out.print("Password for " + princName + ":");
System.out.flush();
psswd = Password.readPassword(System.in);
- if (DEBUG) {
- System.out.println(">>> Kinit console input " +
- new String(psswd));
- }
}
builder = new KrbAsReqBuilder(principal, psswd);
} else {
From 3b077b8a7cf07e2c06064efbddbc5488cdf710bb Mon Sep 17 00:00:00 2001
From: Alexei Voitylov
Date: Tue, 13 Aug 2024 10:30:49 +0200
Subject: [PATCH 61/66] 8331446: Improve deserialization support
Reviewed-by: mbalao, andrew
Backport-of: 8e4a392832f83e16d521024505b52c96d0a993f2
---
.../classes/java/text/MessageFormat.java | 59 +++++++++--
.../MessageFormat/MaxArgumentIndexTest.java | 94 ++++++++++++++++
.../MessageFormat/SerializationTest.java | 100 ++++++++++++++++++
3 files changed, 243 insertions(+), 10 deletions(-)
create mode 100644 jdk/test/java/text/Format/MessageFormat/MaxArgumentIndexTest.java
create mode 100644 jdk/test/java/text/Format/MessageFormat/SerializationTest.java
diff --git a/jdk/src/share/classes/java/text/MessageFormat.java b/jdk/src/share/classes/java/text/MessageFormat.java
index 2497a490eb..ec47fbfa36 100644
--- a/jdk/src/share/classes/java/text/MessageFormat.java
+++ b/jdk/src/share/classes/java/text/MessageFormat.java
@@ -41,6 +41,7 @@
import java.io.InvalidObjectException;
import java.io.IOException;
import java.io.ObjectInputStream;
+import java.io.ObjectStreamException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
@@ -960,6 +961,8 @@ public Object[] parse(String source, ParsePosition pos) {
maximumArgumentNumber = argumentNumbers[i];
}
}
+
+ // Constructors/applyPattern ensure that resultArray.length < MAX_ARGUMENT_INDEX
Object[] resultArray = new Object[maximumArgumentNumber + 1];
int patternOffset = 0;
@@ -1210,6 +1213,9 @@ protected Object readResolve() throws InvalidObjectException {
* @serial
*/
private int[] argumentNumbers = new int[INITIAL_FORMATS];
+ // Implementation limit for ArgumentIndex pattern element. Valid indices must
+ // be less than this value
+ private static final int MAX_ARGUMENT_INDEX = 10000;
/**
* One less than the number of entries in offsets. Can also be thought of
@@ -1434,6 +1440,11 @@ private void makeFormat(int position, int offsetNumber,
+ argumentNumber);
}
+ if (argumentNumber >= MAX_ARGUMENT_INDEX) {
+ throw new IllegalArgumentException(
+ argumentNumber + " exceeds the ArgumentIndex implementation limit");
+ }
+
// resize format information arrays if necessary
if (offsetNumber >= formats.length) {
int newLength = formats.length * 2;
@@ -1580,24 +1591,52 @@ private static final void copyAndFixQuotes(String source, int start, int end,
* @throws InvalidObjectException if the objects read from the stream is invalid.
*/
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
- in.defaultReadObject();
- boolean isValid = maxOffset >= -1
- && formats.length > maxOffset
- && offsets.length > maxOffset
- && argumentNumbers.length > maxOffset;
+ ObjectInputStream.GetField fields = in.readFields();
+ if (fields.defaulted("argumentNumbers") || fields.defaulted("offsets")
+ || fields.defaulted("formats") || fields.defaulted("locale")
+ || fields.defaulted("pattern") || fields.defaulted("maxOffset")){
+ throw new InvalidObjectException("Stream has missing data");
+ }
+
+ locale = (Locale) fields.get("locale", null);
+ String patt = (String) fields.get("pattern", null);
+ int maxOff = fields.get("maxOffset", -2);
+ int[] argNums = ((int[]) fields.get("argumentNumbers", null)).clone();
+ int[] offs = ((int[]) fields.get("offsets", null)).clone();
+ Format[] fmts = ((Format[]) fields.get("formats", null)).clone();
+
+ // Check arrays/maxOffset have correct value/length
+ boolean isValid = maxOff >= -1 && argNums.length > maxOff
+ && offs.length > maxOff && fmts.length > maxOff;
+
+ // Check the correctness of arguments and offsets
if (isValid) {
- int lastOffset = pattern.length() + 1;
- for (int i = maxOffset; i >= 0; --i) {
- if ((offsets[i] < 0) || (offsets[i] > lastOffset)) {
+ int lastOffset = patt.length() + 1;
+ for (int i = maxOff; i >= 0; --i) {
+ if (argNums[i] < 0 || argNums[i] >= MAX_ARGUMENT_INDEX
+ || offs[i] < 0 || offs[i] > lastOffset) {
isValid = false;
break;
} else {
- lastOffset = offsets[i];
+ lastOffset = offs[i];
}
}
}
+
if (!isValid) {
- throw new InvalidObjectException("Could not reconstruct MessageFormat from corrupt stream.");
+ throw new InvalidObjectException("Stream has invalid data");
}
+ maxOffset = maxOff;
+ pattern = patt;
+ offsets = offs;
+ formats = fmts;
+ argumentNumbers = argNums;
+ }
+
+ /**
+ * Serialization without data not supported for this class.
+ */
+ private void readObjectNoData() throws ObjectStreamException {
+ throw new InvalidObjectException("Deserialized MessageFormat objects need data");
}
}
diff --git a/jdk/test/java/text/Format/MessageFormat/MaxArgumentIndexTest.java b/jdk/test/java/text/Format/MessageFormat/MaxArgumentIndexTest.java
new file mode 100644
index 0000000000..aa6c60b7c2
--- /dev/null
+++ b/jdk/test/java/text/Format/MessageFormat/MaxArgumentIndexTest.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8331446
+ * @summary Enforce the MAX_ARGUMENT_INDEX(10,000) implementation limit for the
+ * ArgumentIndex element in the MessageFormat pattern syntax. This
+ * should be checked during construction/applyPattern/readObject and should effectively
+ * prevent parse/format from being invoked with values over the limit.
+ * @run testng MaxArgumentIndexTest
+ */
+
+import org.testng.annotations.Test;
+
+import java.text.MessageFormat;
+import java.util.Locale;
+import java.util.stream.Stream;
+
+import static org.testng.Assert.assertThrows;
+
+public class MaxArgumentIndexTest {
+
+ // A MessageFormat pattern that contains an ArgumentIndex value
+ // which violates this implementation's limit: MAX_ARGUMENT_INDEX(10,000)
+ // As this check is exclusive, 10,000 will violate the limit
+ private static final String VIOLATES_MAX_ARGUMENT_INDEX = "{10000}";
+
+ // Check String constructor enforces the limit
+ @Test
+ public void constructorTest() {
+ assertThrows(IllegalArgumentException.class,
+ () -> new MessageFormat(VIOLATES_MAX_ARGUMENT_INDEX));
+ }
+
+ // Check String, Locale constructor enforces the limit
+ public static void constructorWithLocaleTest(Locale locale) {
+ assertThrows(IllegalArgumentException.class,
+ () -> new MessageFormat(VIOLATES_MAX_ARGUMENT_INDEX, locale));
+ }
+
+ // Provide some basic common locale values
+ @Test
+ public static void constructorWithLocaleTest() {
+ Stream.of(null, Locale.US, Locale.ROOT).forEach(MaxArgumentIndexTest::constructorWithLocaleTest);
+ }
+
+ // Edge case: Test a locale dependent subformat (with null locale) with a
+ // violating ArgumentIndex. In this instance, the violating ArgumentIndex
+ // will be caught and IAE thrown instead of the NPE
+ @Test
+ public void localeDependentSubFormatTest() {
+ assertThrows(IllegalArgumentException.class,
+ () -> new MessageFormat("{10000,number,short}", null));
+ // For reference
+ assertThrows(NullPointerException.class,
+ () -> new MessageFormat("{999,number,short}", null));
+ }
+
+ // Check that the static format method enforces the limit
+ @Test
+ public void staticFormatTest() {
+ assertThrows(IllegalArgumentException.class,
+ () -> MessageFormat.format(VIOLATES_MAX_ARGUMENT_INDEX, new Object[]{1}));
+ }
+
+ // Check that applyPattern(String) enforces the limit
+ @Test
+ public void applyPatternTest() {
+ MessageFormat mf = new MessageFormat("");
+ assertThrows(IllegalArgumentException.class,
+ () -> mf.applyPattern(VIOLATES_MAX_ARGUMENT_INDEX));
+ }
+}
diff --git a/jdk/test/java/text/Format/MessageFormat/SerializationTest.java b/jdk/test/java/text/Format/MessageFormat/SerializationTest.java
new file mode 100644
index 0000000000..e08a28c091
--- /dev/null
+++ b/jdk/test/java/text/Format/MessageFormat/SerializationTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8331446
+ * @summary Check correctness of deserialization
+ * @run testng SerializationTest
+ */
+
+import org.testng.annotations.Test;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.text.MessageFormat;
+import java.util.Locale;
+import java.util.stream.Stream;
+
+import static org.testng.Assert.assertEquals;
+
+public class SerializationTest {
+
+ // Ensure basic correctness of serialization round trip
+ public void serializationRoundTrip(MessageFormat expectedMf)
+ throws IOException, ClassNotFoundException {
+ byte[] bytes = ser(expectedMf);
+ MessageFormat actualMf = (MessageFormat) deSer(bytes);
+ assertEquals(expectedMf, actualMf);
+ }
+
+ // Various valid MessageFormats
+ @Test
+ public void serializationRoundTrip() {
+ Stream.of(
+ // basic pattern
+ new MessageFormat("{0} foo"),
+ // Multiple arguments
+ new MessageFormat("{0} {1} foo"),
+ // duplicate arguments
+ new MessageFormat("{0} {0} {1} foo"),
+ // Non-ascending arguments
+ new MessageFormat("{1} {0} foo"),
+ // With locale
+ new MessageFormat("{1} {0} foo", Locale.UK),
+ // With null locale. (NPE not thrown, if no format defined)
+ new MessageFormat("{1} {0} foo", null),
+ // With formats
+ new MessageFormat("{0,number,short} {0} {1,date,long} foo")
+ ).forEach(format -> {
+ try {
+ serializationRoundTrip(format);
+ } catch (IOException | ClassNotFoundException e) {
+ throw new RuntimeException(e);
+ }
+ });
+ }
+
+ // Utility method to serialize
+ private static byte[] ser(Object obj) throws IOException {
+ ByteArrayOutputStream byteArrayOutputStream = new
+ ByteArrayOutputStream();
+ ObjectOutputStream oos = new
+ ObjectOutputStream(byteArrayOutputStream);
+ oos.writeObject(obj);
+ return byteArrayOutputStream.toByteArray();
+ }
+
+ // Utility method to deserialize
+ private static Object deSer(byte[] bytes) throws
+ IOException, ClassNotFoundException {
+ ByteArrayInputStream byteArrayInputStream = new
+ ByteArrayInputStream(bytes);
+ ObjectInputStream ois = new
+ ObjectInputStream(byteArrayInputStream);
+ return ois.readObject();
+ }
+}
From da6b2652f5afb1270140d1bc680f2ef3d8f9c51a Mon Sep 17 00:00:00 2001
From: Sergey Bylokhov
Date: Fri, 16 Sep 2022 10:04:51 +0000
Subject: [PATCH 62/66] 8290367: Update default value and extend the scope of
com.sun.jndi.ldap.object.trustSerialData system property
Reviewed-by: yan, mbalao, andrew
Backport-of: 7765942aeee25cbeb5fd932a93b3d8f9d4ca3655
---
.../share/classes/com/sun/jndi/ldap/Obj.java | 6 +-
.../com/sun/jndi/ldap/VersionHelper12.java | 15 +-
.../objects/RemoteLocationAttributeTest.java | 128 ++++++++++++++++++
.../objects/RemoteLocationAttributeTest.ldap | 61 +++++++++
4 files changed, 202 insertions(+), 8 deletions(-)
create mode 100644 jdk/test/com/sun/jndi/ldap/objects/RemoteLocationAttributeTest.java
create mode 100644 jdk/test/com/sun/jndi/ldap/objects/RemoteLocationAttributeTest.ldap
diff --git a/jdk/src/share/classes/com/sun/jndi/ldap/Obj.java b/jdk/src/share/classes/com/sun/jndi/ldap/Obj.java
index 35cb9b244d..444be92551 100644
--- a/jdk/src/share/classes/com/sun/jndi/ldap/Obj.java
+++ b/jdk/src/share/classes/com/sun/jndi/ldap/Obj.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -241,6 +241,10 @@ static Object decodeObject(Attributes attrs)
ClassLoader cl = helper.getURLClassLoader(codebases);
return deserializeObject((byte[])attr.get(), cl);
} else if ((attr = attrs.get(JAVA_ATTRIBUTES[REMOTE_LOC])) != null) {
+ // javaRemoteLocation attribute (RMI stub will be created)
+ if (!VersionHelper12.isSerialDataAllowed()) {
+ throw new NamingException("Object deserialization is not allowed");
+ }
// For backward compatibility only
return decodeRmiObject(
(String)attrs.get(JAVA_ATTRIBUTES[CLASSNAME]).get(),
diff --git a/jdk/src/share/classes/com/sun/jndi/ldap/VersionHelper12.java b/jdk/src/share/classes/com/sun/jndi/ldap/VersionHelper12.java
index 596cf1f505..d78a2fa48c 100644
--- a/jdk/src/share/classes/com/sun/jndi/ldap/VersionHelper12.java
+++ b/jdk/src/share/classes/com/sun/jndi/ldap/VersionHelper12.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2022, Oracle and/or its affiliates. All rights reserved.
* 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,13 +40,13 @@ final class VersionHelper12 extends VersionHelper {
"com.sun.jndi.ldap.object.trustURLCodebase";
// System property to control whether classes are allowed to be loaded from
- // 'javaSerializedData' attribute
+ // 'javaSerializedData', 'javaRemoteLocation' or 'javaReferenceAddress' attributes.
private static final String TRUST_SERIAL_DATA_PROPERTY =
"com.sun.jndi.ldap.object.trustSerialData";
/**
- * Determines whether objects may be deserialized from the content of
- * 'javaSerializedData' attribute.
+ * Determines whether objects may be deserialized or reconstructed from a content of
+ * 'javaSerializedData', 'javaRemoteLocation' or 'javaReferenceAddress' LDAP attributes.
*/
private static final boolean trustSerialData;
@@ -56,7 +56,7 @@ final class VersionHelper12 extends VersionHelper {
static {
String trust = getPrivilegedProperty(TRUST_URL_CODEBASE_PROPERTY, "false");
trustURLCodebase = "true".equalsIgnoreCase(trust);
- String trustSDString = getPrivilegedProperty(TRUST_SERIAL_DATA_PROPERTY, "true");
+ String trustSDString = getPrivilegedProperty(TRUST_SERIAL_DATA_PROPERTY, "false");
trustSerialData = "true".equalsIgnoreCase(trustSDString);
}
@@ -72,8 +72,9 @@ private static String getPrivilegedProperty(String propertyName, String defaultV
VersionHelper12() {} // Disallow external from creating one of these.
/**
- * Returns true if deserialization of objects from 'javaSerializedData'
- * and 'javaReferenceAddress' LDAP attributes is allowed.
+ * Returns true if deserialization or reconstruction of objects from
+ * 'javaSerializedData', 'javaRemoteLocation' and 'javaReferenceAddress'
+ * LDAP attributes is allowed.
*
* @return true if deserialization is allowed; false - otherwise
*/
diff --git a/jdk/test/com/sun/jndi/ldap/objects/RemoteLocationAttributeTest.java b/jdk/test/com/sun/jndi/ldap/objects/RemoteLocationAttributeTest.java
new file mode 100644
index 0000000000..8685f16121
--- /dev/null
+++ b/jdk/test/com/sun/jndi/ldap/objects/RemoteLocationAttributeTest.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.ServerSocket;
+import java.net.SocketAddress;
+import java.util.Hashtable;
+import javax.naming.CommunicationException;
+import javax.naming.NamingException;
+import javax.naming.ServiceUnavailableException;
+import javax.naming.directory.DirContext;
+import javax.naming.directory.InitialDirContext;
+
+import jdk.testlibrary.net.URIBuilder;
+
+/**
+ * @test
+ * @bug 8290367
+ * @summary Check if com.sun.jndi.ldap.object.trustSerialData covers the creation
+ * of RMI remote objects from the 'javaRemoteLocation' LDAP attribute.
+ * @modules java.naming/com.sun.jndi.ldap
+ * @library /lib/testlibrary ../lib
+ * @build LDAPServer LDAPTestUtils
+ *
+ * @run main/othervm RemoteLocationAttributeTest
+ * @run main/othervm -Dcom.sun.jndi.ldap.object.trustSerialData
+ * RemoteLocationAttributeTest
+ * @run main/othervm -Dcom.sun.jndi.ldap.object.trustSerialData=false
+ * RemoteLocationAttributeTest
+ * @run main/othervm -Dcom.sun.jndi.ldap.object.trustSerialData=true
+ * RemoteLocationAttributeTest
+ * @run main/othervm -Dcom.sun.jndi.ldap.object.trustSerialData=TrUe
+ * RemoteLocationAttributeTest
+ */
+
+public class RemoteLocationAttributeTest {
+
+ public static void main(String[] args) throws Exception {
+ // Create unbound server socket
+ ServerSocket serverSocket = new ServerSocket();
+
+ // Bind it to the loopback address
+ SocketAddress sockAddr = new InetSocketAddress(
+ InetAddress.getLoopbackAddress(), 0);
+ serverSocket.bind(sockAddr);
+
+ // Construct the provider URL for LDAPTestUtils
+ String providerURL = URIBuilder.newBuilder()
+ .scheme("ldap")
+ .loopback()
+ .port(serverSocket.getLocalPort())
+ .buildUnchecked().toString();
+
+ Hashtable env;
+
+ // Initialize test environment variables
+ env = LDAPTestUtils.initEnv(serverSocket, providerURL,
+ RemoteLocationAttributeTest.class.getName(), args, false);
+
+ DirContext ctx = null;
+ try {
+ try {
+ System.err.println(env);
+ // connect to server
+ ctx = new InitialDirContext(env);
+ Object lookupResult = ctx.lookup("Test");
+ System.err.println("Lookup result:" + lookupResult);
+ // Test doesn't provide RMI registry running at 127.0.0.1:1097, but if
+ // there is one running on test host successful result is valid for
+ // cases when reconstruction allowed.
+ if (!RECONSTRUCTION_ALLOWED) {
+ throw new AssertionError("Unexpected successful lookup");
+ }
+ } finally {
+ serverSocket.close();
+ }
+ } catch (ServiceUnavailableException | CommunicationException connectionException) {
+ // The remote location was properly reconstructed but connection to
+ // RMI endpoint failed:
+ // ServiceUnavailableException - no open socket on 127.0.0.1:1097
+ // CommunicationException - 127.0.0.1:1097 is open, but it is not RMI registry
+ System.err.println("Got one of connection exceptions:" + connectionException);
+ if (!RECONSTRUCTION_ALLOWED) {
+ throw new AssertionError("Reconstruction not blocked, as expected");
+ }
+ } catch (NamingException ne) {
+ String message = ne.getMessage();
+ System.err.printf("Got NamingException with message: '%s'%n", message);
+ if (RECONSTRUCTION_ALLOWED && EXPECTED_NAMING_EXCEPTION_MESSAGE.equals(message)) {
+ throw new AssertionError("Reconstruction unexpectedly blocked");
+ }
+ if (!RECONSTRUCTION_ALLOWED && !EXPECTED_NAMING_EXCEPTION_MESSAGE.equals(message)) {
+ throw new AssertionError("Reconstruction not blocked");
+ }
+ } finally {
+ LDAPTestUtils.cleanup(ctx);
+ }
+ }
+
+ // Reconstruction of RMI remote objects is allowed if 'com.sun.jndi.ldap.object.trustSerialData'
+ // is set to "true". If the system property is not specified it implies default "false" value
+ private static final boolean RECONSTRUCTION_ALLOWED =
+ Boolean.getBoolean("com.sun.jndi.ldap.object.trustSerialData");
+
+ // NamingException message when reconstruction is not allowed
+ private static final String EXPECTED_NAMING_EXCEPTION_MESSAGE = "Object deserialization is not allowed";
+}
diff --git a/jdk/test/com/sun/jndi/ldap/objects/RemoteLocationAttributeTest.ldap b/jdk/test/com/sun/jndi/ldap/objects/RemoteLocationAttributeTest.ldap
new file mode 100644
index 0000000000..88d6922378
--- /dev/null
+++ b/jdk/test/com/sun/jndi/ldap/objects/RemoteLocationAttributeTest.ldap
@@ -0,0 +1,61 @@
+#
+# Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+
+################################################################################
+# Capture file for RemoteLocationAttributeTest.java
+#
+# NOTE: This hexadecimal dump of LDAP protocol messages was generated by
+# running the RemoteLocationAttributeTest application program against
+# a real LDAP server and setting the JNDI/LDAP environment property:
+# com.sun.jndi.ldap.trace.ber to activate LDAP message tracing.
+#
+################################################################################
+
+# LDAP BindRequest
+0000: 30 0C 02 01 01 60 07 02 01 03 04 00 80 00 0....`........
+
+# LDAP BindResponse
+0000: 30 0C 02 01 01 61 07 0A 01 00 04 00 04 00 0....a........
+
+# LDAP SearchRequest
+0000: 30 46 02 01 02 63 24 04 04 54 65 73 74 0A 01 00 0F...c$..Test...
+0010: 0A 01 03 02 01 00 02 01 00 01 01 00 87 0B 6F 62 ..............ob
+0020: 6A 65 63 74 43 6C 61 73 73 30 00 A0 1B 30 19 04 jectClass0...0..
+0030: 17 32 2E 31 36 2E 38 34 30 2E 31 2E 31 31 33 37 .2.16.840.1.1137
+0040: 33 30 2E 33 2E 34 2E 32 30.3.4.2
+
+# LDAP SearchResultEntry
+0000: 30 5E 02 01 02 64 59 04 04 54 65 73 74 30 51 30 0^...dY..Test0Q0
+0010: 16 04 0D 6A 61 76 61 43 6C 61 73 73 4E 61 6D 65 ...javaClassName
+0020: 31 05 04 03 66 6F 6F 30 37 04 12 6A 61 76 61 52 1...foo07..javaR
+0030: 65 6D 6F 74 65 4C 6F 63 61 74 69 6F 6E 31 21 04 emoteLocation1!.
+0040: 1F 72 6D 69 3A 2F 2F 31 32 37 2E 30 2E 30 2E 31 .rmi://127.0.0.1
+0050: 3A 31 30 39 37 2F 54 65 73 74 52 65 6D 6F 74 65 :1097/TestRemote
+
+# LDAP SearchResultDone
+0000: 30 0C 02 01 02 65 07 0A 01 00 04 00 04 00 0....e........
+
+# LDAP UnbindRequest
+0000: 30 22 02 01 03 42 00 A0 1B 30 19 04 17 32 2E 31 0"...B...0...2.1
+0010: 36 2E 38 34 30 2E 31 2E 31 31 33 37 33 30 2E 33 6.840.1.113730.3
+0020: 2E 34 2E 32 .4.2
From c5508ab0a6f565bb774ccf786f3290e59f5ab116 Mon Sep 17 00:00:00 2001
From: Francisco Ferrari Bihurriet
Date: Tue, 17 Sep 2024 18:48:55 +0200
Subject: [PATCH 63/66] 8332644: Improve graph optimizations
Reviewed-by: mbalao, andrew
Backport-of: 7c16d649a8118d2e7ee77cedba87e620c83294b4
---
hotspot/src/share/vm/opto/loopnode.cpp | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/hotspot/src/share/vm/opto/loopnode.cpp b/hotspot/src/share/vm/opto/loopnode.cpp
index 8103d5cd92..8c92ffffee 100644
--- a/hotspot/src/share/vm/opto/loopnode.cpp
+++ b/hotspot/src/share/vm/opto/loopnode.cpp
@@ -1220,7 +1220,7 @@ Node *LoopLimitNode::Ideal(PhaseGVN *phase, bool can_reshape) {
const TypeInt* init_t = phase->type(in(Init) )->is_int();
const TypeInt* limit_t = phase->type(in(Limit))->is_int();
- int stride_p;
+ jlong stride_p;
jlong lim, ini;
julong max;
if (stride_con > 0) {
@@ -1229,10 +1229,10 @@ Node *LoopLimitNode::Ideal(PhaseGVN *phase, bool can_reshape) {
ini = init_t->_lo;
max = (julong)max_jint;
} else {
- stride_p = -stride_con;
+ stride_p = -(jlong)stride_con;
lim = init_t->_hi;
ini = limit_t->_lo;
- max = (julong)min_jint;
+ max = (julong)(juint)min_jint; // double cast to get 0x0000000080000000, not 0xffffffff80000000
}
julong range = lim - ini + stride_p;
if (range <= max) {
From e976b99775c95013431b7119a61dac3409b3bf16 Mon Sep 17 00:00:00 2001
From: Martin Balao
Date: Sat, 14 Sep 2024 00:31:00 +0000
Subject: [PATCH 64/66] 8335713: Enhance vectorization analysis
Reviewed-by: roland, andrew
Backport-of: 3c05ad2290936ec9abc3f271cb6bf89e18c3eea7
---
hotspot/src/share/vm/opto/superword.cpp | 72 +++++++++++++++++++++----
hotspot/src/share/vm/opto/superword.hpp | 1 +
2 files changed, 62 insertions(+), 11 deletions(-)
diff --git a/hotspot/src/share/vm/opto/superword.cpp b/hotspot/src/share/vm/opto/superword.cpp
index 38e8c20241..cf47f3a897 100644
--- a/hotspot/src/share/vm/opto/superword.cpp
+++ b/hotspot/src/share/vm/opto/superword.cpp
@@ -2735,10 +2735,30 @@ bool SWPointer::scaled_iv_plus_offset(Node* n) {
}
} else if (opc == Op_SubI) {
if (scaled_iv(n->in(1)) && offset_plus_k(n->in(2), true)) {
+ // (scale * iv) - (offset1 + invar1)
+ // Subtraction handled via "negate" flag of "offset_plus_k".
return true;
}
- if (scaled_iv(n->in(2)) && offset_plus_k(n->in(1))) {
- _scale *= -1;
+ SWPointer tmp(this);
+ if (tmp.scaled_iv(n->in(2)) && offset_plus_k(n->in(1))) {
+ // (offset1 + invar1) - (scale * iv)
+ // Subtraction handled explicitly below.
+ assert(_scale == 0, "shouldn't be set yet");
+ // _scale = -tmp._scale
+ if (!try_MulI_no_overflow(-1, tmp._scale, _scale)) {
+ return false; // mul overflow.
+ }
+ // _offset -= tmp._offset
+ if (!try_SubI_no_overflow(_offset, tmp._offset, _offset)) {
+ return false; // sub overflow.
+ }
+
+ // SWPointer tmp does not have an integer part to be forwarded
+ // (tmp._has_int_index_after_convI2L is false) because n is a SubI, all
+ // nodes above must also be of integer type (ConvL2I is not handled
+ // to allow a long) and ConvI2L (the only node that can add an integer
+ // part) won't be present.
+
return true;
}
}
@@ -2766,7 +2786,9 @@ bool SWPointer::scaled_iv(Node* n) {
}
} else if (opc == Op_LShiftI) {
if (n->in(1) == iv() && n->in(2)->is_Con()) {
- _scale = 1 << n->in(2)->get_int();
+ if (!try_LShiftI_no_overflow(1, n->in(2)->get_int(), _scale)) {
+ return false; // shift overflow.
+ }
return true;
}
} else if (opc == Op_ConvI2L && !has_iv()) {
@@ -2792,15 +2814,28 @@ bool SWPointer::scaled_iv(Node* n) {
if (tmp.scaled_iv_plus_offset(n->in(1)) && tmp.has_iv()) {
// We successfully matched an integer index, of the form:
// int_index = int_offset + int_invar + int_scale * iv
+ // Forward scale.
+ assert(_scale == 0 && tmp._scale != 0, "iv only found just now");
+ _scale = tmp._scale;
+ // Accumulate offset.
+ if (!try_AddI_no_overflow(_offset, tmp._offset, _offset)) {
+ return false; // add overflow.
+ }
+ // Forward invariant if not already found.
+ if (tmp._invar != NULL) {
+ if (_invar != NULL) {
+ return false;
+ }
+ _invar = tmp._invar;
+ _negate_invar = tmp._negate_invar;
+ }
+ // Set info about the int_index:
+ assert(!_has_int_index_after_convI2L, "no previous int_index discovered");
_has_int_index_after_convI2L = true;
_int_index_after_convI2L_offset = tmp._offset;
_int_index_after_convI2L_invar = tmp._invar;
_int_index_after_convI2L_scale = tmp._scale;
- }
- // Now parse it again for the real SWPointer. This makes sure that the int_offset, int_invar,
- // and int_scale are properly added to the final SWPointer's offset, invar, and scale.
- if (scaled_iv_plus_offset(n->in(1))) {
return true;
}
} else if (opc == Op_LShiftL) {
@@ -2811,13 +2846,14 @@ bool SWPointer::scaled_iv(Node* n) {
SWPointer tmp(this);
if (tmp.scaled_iv_plus_offset(n->in(1))) {
if (tmp._invar == NULL) {
- int scale = (int)(n->in(2)->get_int());
- int mult = 1 << scale;
+ int shift = (int)(n->in(2)->get_int());
// Accumulate scale.
- _scale = tmp._scale * ((jint)mult);
+ if (!try_LShiftI_no_overflow(tmp._scale, shift, _scale)) {
+ return false; // shift overflow.
+ }
// Accumulate offset.
jint shifted_offset = 0;
- if (!try_LShiftI_no_overflow(tmp._offset, scale, shifted_offset)) {
+ if (!try_LShiftI_no_overflow(tmp._offset, shift, shifted_offset)) {
return false; // shift overflow.
}
if (!try_AddI_no_overflow(_offset, shifted_offset, _offset)) {
@@ -2825,6 +2861,7 @@ bool SWPointer::scaled_iv(Node* n) {
}
// Forward info about the int_index:
+ assert(!_has_int_index_after_convI2L, "no previous int_index discovered");
_has_int_index_after_convI2L = tmp._has_int_index_after_convI2L;
_int_index_after_convI2L_offset = tmp._int_index_after_convI2L_offset;
_int_index_after_convI2L_invar = tmp._int_index_after_convI2L_invar;
@@ -2933,6 +2970,9 @@ bool SWPointer::try_AddSubI_no_overflow(jint offset1, jint offset2, bool is_sub,
}
bool SWPointer::try_LShiftI_no_overflow(jint offset, int shift, jint& result) {
+ if (shift < 0 || shift > 31) {
+ return false;
+ }
jlong long_offset = java_shift_left((jlong)(offset), (julong)((jlong)(shift)));
jint int_offset = java_shift_left( offset, (juint)((jint)(shift)));
if (long_offset != int_offset) {
@@ -2942,6 +2982,16 @@ bool SWPointer::try_LShiftI_no_overflow(jint offset, int shift, jint& result) {
return true;
}
+bool SWPointer::try_MulI_no_overflow(jint offset1, jint offset2, jint& result) {
+ jlong long_offset = java_multiply((jlong)(offset1), (jlong)(offset2));
+ jint int_offset = java_multiply( offset1, offset2);
+ if (long_offset != int_offset) {
+ return false;
+ }
+ result = int_offset;
+ return true;
+}
+
//----------------------------print------------------------
void SWPointer::print() {
#ifndef PRODUCT
diff --git a/hotspot/src/share/vm/opto/superword.hpp b/hotspot/src/share/vm/opto/superword.hpp
index e65f2d6002..056baad1f5 100644
--- a/hotspot/src/share/vm/opto/superword.hpp
+++ b/hotspot/src/share/vm/opto/superword.hpp
@@ -614,6 +614,7 @@ class SWPointer VALUE_OBJ_CLASS_SPEC {
static bool try_SubI_no_overflow(jint offset1, jint offset2, jint& result);
static bool try_AddSubI_no_overflow(jint offset1, jint offset2, bool is_sub, jint& result);
static bool try_LShiftI_no_overflow(jint offset1, int offset2, jint& result);
+ static bool try_MulI_no_overflow(jint offset1, jint offset2, jint& result);
};
From 1c1afe3188df5621b5523ae9a06ad39c8a253589 Mon Sep 17 00:00:00 2001
From: Andrew John Hughes
Date: Fri, 4 Oct 2024 11:59:58 +0000
Subject: [PATCH 65/66] 8341057: Add 2 SSL.com TLS roots
Reviewed-by: sgehwolf
Backport-of: 217b9fdf056f4887230f60fdf60b036861699cd8
---
jdk/make/data/cacerts/ssltlsrootecc2022 | 21 ++++++++++
jdk/make/data/cacerts/ssltlsrootrsa2022 | 39 +++++++++++++++++++
.../certification/CAInterop.java | 29 ++++++++++++++
.../security/lib/cacerts/VerifyCACerts.java | 13 ++++---
4 files changed, 97 insertions(+), 5 deletions(-)
create mode 100644 jdk/make/data/cacerts/ssltlsrootecc2022
create mode 100644 jdk/make/data/cacerts/ssltlsrootrsa2022
diff --git a/jdk/make/data/cacerts/ssltlsrootecc2022 b/jdk/make/data/cacerts/ssltlsrootecc2022
new file mode 100644
index 0000000000..706e6aefb4
--- /dev/null
+++ b/jdk/make/data/cacerts/ssltlsrootecc2022
@@ -0,0 +1,21 @@
+Owner: CN=SSL.com TLS ECC Root CA 2022, O=SSL Corporation, C=US
+Issuer: CN=SSL.com TLS ECC Root CA 2022, O=SSL Corporation, C=US
+Serial number: 1403f5abfb378b17405be243b2a5d1c4
+Valid from: Thu Aug 25 16:33:48 GMT 2022 until: Sun Aug 19 16:33:47 GMT 2046
+Signature algorithm name: SHA384withECDSA
+Subject Public Key Algorithm: 384-bit EC (secp384r1) key
+Version: 3
+-----BEGIN CERTIFICATE-----
+MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQsw
+CQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxT
+U0wuY29tIFRMUyBFQ0MgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2
+MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3Jh
+dGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3QgQ0EgMjAyMjB2MBAG
+ByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWyJGYm
+acCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFN
+SeR7T5v15wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME
+GDAWgBSJjy+j6CugFFR781a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NW
+uCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp
+15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w7deedWo1dlJF4AIxAMeN
+b0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5Zn6g6g==
+-----END CERTIFICATE-----
diff --git a/jdk/make/data/cacerts/ssltlsrootrsa2022 b/jdk/make/data/cacerts/ssltlsrootrsa2022
new file mode 100644
index 0000000000..ad456b0b5f
--- /dev/null
+++ b/jdk/make/data/cacerts/ssltlsrootrsa2022
@@ -0,0 +1,39 @@
+Owner: CN=SSL.com TLS RSA Root CA 2022, O=SSL Corporation, C=US
+Issuer: CN=SSL.com TLS RSA Root CA 2022, O=SSL Corporation, C=US
+Serial number: 6fbedaad73bd0840e28b4dbed4f75b91
+Valid from: Thu Aug 25 16:34:22 GMT 2022 until: Sun Aug 19 16:34:21 GMT 2046
+Signature algorithm name: SHA256withRSA
+Subject Public Key Algorithm: 4096-bit RSA key
+Version: 3
+-----BEGIN CERTIFICATE-----
+MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBO
+MQswCQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQD
+DBxTU0wuY29tIFRMUyBSU0EgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloX
+DTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jw
+b3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJvb3QgQ0EgMjAyMjCC
+AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u9nTP
+L3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OY
+t6/wNr/y7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0ins
+S657Lb85/bRi3pZ7QcacoOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3
+PnxEX4MN8/HdIGkWCVDi1FW24IBydm5MR7d1VVm0U3TZlMZBrViKMWYPHqIbKUBO
+L9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDGD6C1vBdOSHtRwvzpXGk3
+R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEWTO6Af77w
+dr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS
++YCk8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYS
+d66UNHsef8JmAOSqg+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoG
+AtUjHBPW6dvbxrB6y3snm/vg1UYk7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2f
+gTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j
+BBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsuN+7jhHonLs0Z
+NbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt
+hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsM
+QtfhWsSWTVTNj8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvf
+R4iyrT7gJ4eLSYwfqUdYe5byiB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJ
+DPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjUo3KUQyxi4U5cMj29TH0ZR6LDSeeW
+P4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqoENjwuSfr98t67wVy
+lrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7EgkaibMOlq
+bLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2w
+AgDHbICivRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3q
+r5nsLFR+jM4uElZI7xc7P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sji
+Mho6/4UIyYOf8kpIEFR3N+2ivEC+5BB09+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU
+98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA=
+-----END CERTIFICATE-----
diff --git a/jdk/test/security/infra/java/security/cert/CertPathValidator/certification/CAInterop.java b/jdk/test/security/infra/java/security/cert/CertPathValidator/certification/CAInterop.java
index c17cff0c4e..96697b4f8e 100644
--- a/jdk/test/security/infra/java/security/cert/CertPathValidator/certification/CAInterop.java
+++ b/jdk/test/security/infra/java/security/cert/CertPathValidator/certification/CAInterop.java
@@ -484,6 +484,28 @@
* @run main/othervm -Djava.security.debug=certpath CAInterop globalsigne46 CRL
*/
+/*
+ * @test id=ssltlsrootecc2022
+ * @bug 8341057
+ * @summary Interoperability tests with SSL TLS 2022 root CAs
+ * @library /test/lib
+ * @build jtreg.SkippedException ValidatePathWithURL CAInterop
+ * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop ssltlsrootecc2022 DEFAULT
+ * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop ssltlsrootecc2022 DEFAULT
+ * @run main/othervm -Djava.security.debug=certpath CAInterop ssltlsrootecc2022 CRL
+ */
+
+/*
+ * @test id=ssltlsrootrsa2022
+ * @bug 8341057
+ * @summary Interoperability tests with SSL TLS 2022 root CAs
+ * @library /test/lib
+ * @build jtreg.SkippedException ValidatePathWithURL CAInterop
+ * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop ssltlsrootrsa2022 DEFAULT
+ * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop ssltlsrootrsa2022 DEFAULT
+ * @run main/othervm -Djava.security.debug=certpath CAInterop ssltlsrootrsa2022 CRL
+ */
+
/**
* Collection of certificate validation tests for interoperability with external CAs
*/
@@ -660,6 +682,13 @@ private CATestURLs getTestURLs(String alias) {
return new CATestURLs("https://valid.e46.roots.globalsign.com",
"https://revoked.e46.roots.globalsign.com");
+ case "ssltlsrootecc2022":
+ return new CATestURLs("https://test-root-2022-ecc.ssl.com",
+ "https://revoked-root-2022-ecc.ssl.com");
+ case "ssltlsrootrsa2022":
+ return new CATestURLs("https://test-root-2022-rsa.ssl.com",
+ "https://revoked-root-2022-rsa.ssl.com");
+
default: throw new RuntimeException("No test setup found for: " + alias);
}
}
diff --git a/jdk/test/sun/security/lib/cacerts/VerifyCACerts.java b/jdk/test/sun/security/lib/cacerts/VerifyCACerts.java
index a28c23eb2e..0ae4d59962 100644
--- a/jdk/test/sun/security/lib/cacerts/VerifyCACerts.java
+++ b/jdk/test/sun/security/lib/cacerts/VerifyCACerts.java
@@ -19,17 +19,16 @@
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
- *
*/
-/**
+/*
* @test
* @bug 8189131 8198240 8191844 8189949 8191031 8196141 8204923 8195774 8199779
* 8209452 8209506 8210432 8195793 8216577 8222089 8222133 8222137 8222136
* 8223499 8225392 8232019 8234245 8233223 8225068 8225069 8243321 8243320
* 8243559 8225072 8258630 8259312 8256421 8225081 8225082 8225083 8245654
* 8305975 8304760 8307134 8295894 8314960 8317373 8317374 8318759 8319187
- * 8321408 8316138
+ * 8321408 8316138 8341057
* @summary Check root CA entries in cacerts file
*/
import java.io.ByteArrayInputStream;
@@ -55,12 +54,12 @@ public class VerifyCACerts {
+ File.separator + "security" + File.separator + "cacerts";
// The numbers of certs now.
- private static final int COUNT = 110;
+ private static final int COUNT = 112;
// SHA-256 of cacerts, can be generated with
// shasum -a 256 cacerts | sed -e 's/../&:/g' | tr '[:lower:]' '[:upper:]' | cut -c1-95
private static final String CHECKSUM
- = "C1:68:B4:AC:51:BF:B5:C6:FD:20:69:17:E1:AF:E4:5B:01:9B:AA:3F:C3:9A:80:A8:51:53:74:2C:A2:04:B0:FF";
+ = "8F:E0:6F:7F:21:59:33:A6:43:F3:48:FD:A3:4A:8E:28:35:AA:DD:6E:A5:43:56:F1:28:34:48:DF:5C:D2:7C:72";
// map of cert alias to SHA-256 fingerprint
@SuppressWarnings("serial")
@@ -287,6 +286,10 @@ public class VerifyCACerts {
"4F:A3:12:6D:8D:3A:11:D1:C4:85:5A:4F:80:7C:BA:D6:CF:91:9D:3A:5A:88:B0:3B:EA:2C:63:72:D9:3C:40:C9");
put("globalsigne46 [jdk]",
"CB:B9:C4:4D:84:B8:04:3E:10:50:EA:31:A6:9F:51:49:55:D7:BF:D2:E2:C6:B4:93:01:01:9A:D6:1D:9F:50:58");
+ put("ssltlsrootecc2022 [jdk]",
+ "C3:2F:FD:9F:46:F9:36:D1:6C:36:73:99:09:59:43:4B:9A:D6:0A:AF:BB:9E:7C:F3:36:54:F1:44:CC:1B:A1:43");
+ put("ssltlsrootrsa2022 [jdk]",
+ "8F:AF:7D:2E:2C:B4:70:9B:B8:E0:B3:36:66:BF:75:A5:DD:45:B5:DE:48:0F:8E:A8:D4:BF:E6:BE:BC:17:F2:ED");
}
};
From 618917eb093243de2c5d7e83d4688bfe9ad04985 Mon Sep 17 00:00:00 2001
From: Andrew John Hughes
Date: Thu, 3 Oct 2024 19:33:45 +0000
Subject: [PATCH 66/66] 8341059: Change Entrust TLS distrust date to November
12, 2024
Reviewed-by: sgehwolf
Backport-of: f554c3ffce7599fdb535b03db4a6ea96870b3c2d
---
.../sun/security/validator/CADistrustPolicy.java | 2 +-
.../sun/security/validator/EntrustTLSPolicy.java | 8 ++++----
jdk/src/share/lib/security/java.security-aix | 2 +-
jdk/src/share/lib/security/java.security-linux | 2 +-
jdk/src/share/lib/security/java.security-macosx | 2 +-
jdk/src/share/lib/security/java.security-solaris | 2 +-
jdk/src/share/lib/security/java.security-windows | 2 +-
.../ssl/X509TrustManagerImpl/Entrust/Distrust.java | 12 ++++++------
8 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/jdk/src/share/classes/sun/security/validator/CADistrustPolicy.java b/jdk/src/share/classes/sun/security/validator/CADistrustPolicy.java
index c8b251bb93..96110d382e 100644
--- a/jdk/src/share/classes/sun/security/validator/CADistrustPolicy.java
+++ b/jdk/src/share/classes/sun/security/validator/CADistrustPolicy.java
@@ -57,7 +57,7 @@ void checkDistrust(String variant, X509Certificate[] chain)
/**
* Distrust TLS Server certificates anchored by an Entrust root CA and
- * issued after October 31, 2024. If enabled, this policy is currently
+ * issued after November 11, 2024. If enabled, this policy is currently
* enforced by the PKIX and SunX509 TrustManager implementations
* of the SunJSSE provider implementation.
*/
diff --git a/jdk/src/share/classes/sun/security/validator/EntrustTLSPolicy.java b/jdk/src/share/classes/sun/security/validator/EntrustTLSPolicy.java
index 4494880703..7a67199a1a 100644
--- a/jdk/src/share/classes/sun/security/validator/EntrustTLSPolicy.java
+++ b/jdk/src/share/classes/sun/security/validator/EntrustTLSPolicy.java
@@ -92,8 +92,8 @@ final class EntrustTLSPolicy {
// Any TLS Server certificate that is anchored by one of the Entrust
// roots above and is issued after this date will be distrusted.
- private static final LocalDate OCTOBER_31_2024 =
- LocalDate.of(2024, Month.OCTOBER, 31);
+ private static final LocalDate NOVEMBER_11_2024 =
+ LocalDate.of(2024, Month.NOVEMBER, 11);
/**
* This method assumes the eeCert is a TLS Server Cert and chains back to
@@ -115,8 +115,8 @@ static void checkDistrust(X509Certificate[] chain)
Date notBefore = chain[0].getNotBefore();
LocalDate ldNotBefore = notBefore.toInstant()
.atZone(ZoneOffset.UTC).toLocalDate();
- // reject if certificate is issued after October 31, 2024
- checkNotBefore(ldNotBefore, OCTOBER_31_2024, anchor);
+ // reject if certificate is issued after November 11, 2024
+ checkNotBefore(ldNotBefore, NOVEMBER_11_2024, anchor);
}
}
diff --git a/jdk/src/share/lib/security/java.security-aix b/jdk/src/share/lib/security/java.security-aix
index 6e0597a198..37bca2df46 100644
--- a/jdk/src/share/lib/security/java.security-aix
+++ b/jdk/src/share/lib/security/java.security-aix
@@ -1213,7 +1213,7 @@ jdk.sasl.disabledMechanisms=
# Distrust after December 31, 2019.
#
# ENTRUST_TLS : Distrust TLS Server certificates anchored by
-# an Entrust root CA and issued after October 31, 2024.
+# an Entrust root CA and issued after November 11, 2024.
#
# Leading and trailing whitespace surrounding each value are ignored.
# Unknown values are ignored. If the property is commented out or set to the
diff --git a/jdk/src/share/lib/security/java.security-linux b/jdk/src/share/lib/security/java.security-linux
index 3b5b614fa0..9bb8e992fb 100644
--- a/jdk/src/share/lib/security/java.security-linux
+++ b/jdk/src/share/lib/security/java.security-linux
@@ -1219,7 +1219,7 @@ jdk.sasl.disabledMechanisms=
# Distrust after December 31, 2019.
#
# ENTRUST_TLS : Distrust TLS Server certificates anchored by
-# an Entrust root CA and issued after October 31, 2024.
+# an Entrust root CA and issued after November 11, 2024.
#
# Leading and trailing whitespace surrounding each value are ignored.
# Unknown values are ignored. If the property is commented out or set to the
diff --git a/jdk/src/share/lib/security/java.security-macosx b/jdk/src/share/lib/security/java.security-macosx
index c2d0ae5cc2..7a765742e6 100644
--- a/jdk/src/share/lib/security/java.security-macosx
+++ b/jdk/src/share/lib/security/java.security-macosx
@@ -1217,7 +1217,7 @@ jdk.sasl.disabledMechanisms=
# Distrust after December 31, 2019.
#
# ENTRUST_TLS : Distrust TLS Server certificates anchored by
-# an Entrust root CA and issued after October 31, 2024.
+# an Entrust root CA and issued after November 11, 2024.
#
# Leading and trailing whitespace surrounding each value are ignored.
# Unknown values are ignored. If the property is commented out or set to the
diff --git a/jdk/src/share/lib/security/java.security-solaris b/jdk/src/share/lib/security/java.security-solaris
index 39869ee182..f0100336f5 100644
--- a/jdk/src/share/lib/security/java.security-solaris
+++ b/jdk/src/share/lib/security/java.security-solaris
@@ -1215,7 +1215,7 @@ jdk.sasl.disabledMechanisms=
# Distrust after December 31, 2019.
#
# ENTRUST_TLS : Distrust TLS Server certificates anchored by
-# an Entrust root CA and issued after October 31, 2024.
+# an Entrust root CA and issued after November 11, 2024.
#
# Leading and trailing whitespace surrounding each value are ignored.
# Unknown values are ignored. If the property is commented out or set to the
diff --git a/jdk/src/share/lib/security/java.security-windows b/jdk/src/share/lib/security/java.security-windows
index 5b539a6bbe..e51bdece13 100644
--- a/jdk/src/share/lib/security/java.security-windows
+++ b/jdk/src/share/lib/security/java.security-windows
@@ -1217,7 +1217,7 @@ jdk.sasl.disabledMechanisms=
# Distrust after December 31, 2019.
#
# ENTRUST_TLS : Distrust TLS Server certificates anchored by
-# an Entrust root CA and issued after October 31, 2024.
+# an Entrust root CA and issued after November 11, 2024.
#
# Leading and trailing whitespace surrounding each value are ignored.
# Unknown values are ignored. If the property is commented out or set to the
diff --git a/jdk/test/sun/security/ssl/X509TrustManagerImpl/Entrust/Distrust.java b/jdk/test/sun/security/ssl/X509TrustManagerImpl/Entrust/Distrust.java
index 8eccccaf2a..99049e51bf 100644
--- a/jdk/test/sun/security/ssl/X509TrustManagerImpl/Entrust/Distrust.java
+++ b/jdk/test/sun/security/ssl/X509TrustManagerImpl/Entrust/Distrust.java
@@ -33,7 +33,7 @@
/**
* @test
- * @bug 8337664
+ * @bug 8337664 8341059
* @summary Check that TLS Server certificates chaining back to distrusted
* Entrust roots are invalid
* @library /lib/security
@@ -56,14 +56,14 @@ public class Distrust {
"affirmtrustpremiumca", "affirmtrustpremiumeccca" };
// A date that is after the restrictions take effect
- private static final Date NOVEMBER_1_2024 =
- Date.from(LocalDate.of(2024, 11, 1)
+ private static final Date NOVEMBER_12_2024 =
+ Date.from(LocalDate.of(2024, 11, 12)
.atStartOfDay(ZoneOffset.UTC)
.toInstant());
// A date that is a second before the restrictions take effect
- private static final Date BEFORE_NOVEMBER_1_2024 =
- Date.from(LocalDate.of(2024, 11, 1)
+ private static final Date BEFORE_NOVEMBER_12_2024 =
+ Date.from(LocalDate.of(2024, 11, 12)
.atStartOfDay(ZoneOffset.UTC)
.minusSeconds(1)
.toInstant());
@@ -81,7 +81,7 @@ public static void main(String[] args) throws Exception {
Security.setProperty("jdk.security.caDistrustPolicies", "");
}
- Date notBefore = before ? BEFORE_NOVEMBER_1_2024 : NOVEMBER_1_2024;
+ Date notBefore = before ? BEFORE_NOVEMBER_12_2024 : NOVEMBER_12_2024;
X509TrustManager pkixTM = getTMF("PKIX", null);
X509TrustManager sunX509TM = getTMF("SunX509", null);