diff --git a/.hgtags b/.hgtags index 2daca9bca34cbe4bf1a20f69dd6bc76f2e6a7de1..94953656ef1f360436e3fccbcc81179ae9e74cbd 100644 --- a/.hgtags +++ b/.hgtags @@ -856,5 +856,6 @@ c9254e01820639526f803dbe05080fce0d33db98 jdk8u162-b08 1d2ee5e60df1c3bc889c92154d839bfe73077f66 jdk8u162-b10 95df717479b19f5ea244afc67434827f2f851287 jdk8u162-b11 ddae5cb11d6c04130b8002b852bc7f80e0c8bcd2 jdk8u162-b12 +8e40acfcc41a631f5922824712d4336742652eac jdk8u162-b31 b6195815c4bbbf275f1aefd337d805eb66f2b5b8 jdk8u171-b00 f1792a59f1fa20e47fe5d4561754012440564bec jdk8u171-b01 diff --git a/src/share/classes/sun/reflect/generics/reflectiveObjects/ParameterizedTypeImpl.java b/src/share/classes/sun/reflect/generics/reflectiveObjects/ParameterizedTypeImpl.java index 1addbcc9c17f9e468a5089a28e64d010d0a1dbf9..f943cb0347f8e63fb6685720f772cdf69fa16f04 100644 --- a/src/share/classes/sun/reflect/generics/reflectiveObjects/ParameterizedTypeImpl.java +++ b/src/share/classes/sun/reflect/generics/reflectiveObjects/ParameterizedTypeImpl.java @@ -212,7 +212,7 @@ public class ParameterizedTypeImpl implements ParameterizedType { else sb.append(ownerType.toString()); - sb.append("."); + sb.append("$"); if (ownerType instanceof ParameterizedTypeImpl) { // Find simple name of nested type by removing the @@ -220,7 +220,7 @@ public class ParameterizedTypeImpl implements ParameterizedType { sb.append(rawType.getName().replace( ((ParameterizedTypeImpl)ownerType).rawType.getName() + "$", "")); } else - sb.append(rawType.getName()); + sb.append(rawType.getSimpleName()); } else sb.append(rawType.getName()); diff --git a/src/share/native/java/util/zip/Deflater.c b/src/share/native/java/util/zip/Deflater.c index 7492a082170e7d4cfdd503adc4e554244c04c9d4..c1bd346675975bece99cbd0612ee3b526edd2585 100644 --- a/src/share/native/java/util/zip/Deflater.c +++ b/src/share/native/java/util/zip/Deflater.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -164,17 +164,14 @@ Java_java_util_zip_Deflater_deflateBytes(JNIEnv *env, jobject this, jlong addr, res = deflateParams(strm, level, strategy); (*env)->ReleasePrimitiveArrayCritical(env, b, out_buf, 0); (*env)->ReleasePrimitiveArrayCritical(env, this_buf, in_buf, 0); - switch (res) { case Z_OK: (*env)->SetBooleanField(env, this, setParamsID, JNI_FALSE); + case Z_BUF_ERROR: this_off += this_len - strm->avail_in; (*env)->SetIntField(env, this, offID, this_off); (*env)->SetIntField(env, this, lenID, strm->avail_in); return (jint) (len - strm->avail_out); - case Z_BUF_ERROR: - (*env)->SetBooleanField(env, this, setParamsID, JNI_FALSE); - return 0; default: JNU_ThrowInternalError(env, strm->msg); return 0; @@ -203,18 +200,16 @@ Java_java_util_zip_Deflater_deflateBytes(JNIEnv *env, jobject this, jlong addr, res = deflate(strm, finish ? Z_FINISH : flush); (*env)->ReleasePrimitiveArrayCritical(env, b, out_buf, 0); (*env)->ReleasePrimitiveArrayCritical(env, this_buf, in_buf, 0); - switch (res) { case Z_STREAM_END: (*env)->SetBooleanField(env, this, finishedID, JNI_TRUE); /* fall through */ case Z_OK: + case Z_BUF_ERROR: this_off += this_len - strm->avail_in; (*env)->SetIntField(env, this, offID, this_off); (*env)->SetIntField(env, this, lenID, strm->avail_in); return len - strm->avail_out; - case Z_BUF_ERROR: - return 0; default: JNU_ThrowInternalError(env, strm->msg); return 0; diff --git a/src/share/native/java/util/zip/zlib/deflate.c b/src/share/native/java/util/zip/zlib/deflate.c index 305364b883abe9760828e98af4256acb8d88d165..f30f71bdd799deb31c34aea462e1ab83b35e9236 100644 --- a/src/share/native/java/util/zip/zlib/deflate.c +++ b/src/share/native/java/util/zip/zlib/deflate.c @@ -505,8 +505,6 @@ int ZEXPORT deflateResetKeep (strm) s->pending = 0; s->pending_out = s->pending_buf; - s->high_water = 0; /* reset to its inital value 0 */ - if (s->wrap < 0) { s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ } @@ -520,7 +518,7 @@ int ZEXPORT deflateResetKeep (strm) s->wrap == 2 ? crc32(0L, Z_NULL, 0) : #endif adler32(0L, Z_NULL, 0); - s->last_flush = Z_NO_FLUSH; + s->last_flush = -2; _tr_init(s); @@ -613,7 +611,7 @@ int ZEXPORT deflateParams(strm, level, strategy) func = configuration_table[s->level].func; if ((strategy != s->strategy || func != configuration_table[level].func) && - s->high_water) { + s->last_flush != -2) { /* Flush the last buffer: */ int err = deflate(strm, Z_BLOCK); if (err == Z_STREAM_ERROR) diff --git a/src/share/native/java/util/zip/zlib/patches/ChangeLog_java b/src/share/native/java/util/zip/zlib/patches/ChangeLog_java index 4a99a0b177cfa6903c9d3f4f1048f985ca6eb7dd..3deeeeb89446d2f12f6fd7b6a3c019058c6e8233 100644 --- a/src/share/native/java/util/zip/zlib/patches/ChangeLog_java +++ b/src/share/native/java/util/zip/zlib/patches/ChangeLog_java @@ -78,6 +78,8 @@ (6) deflate.c #8184306 +(7) deflate.c undo (6), replaced withe the official zlib repo fix see#305/#f969409 + *** 503,512 **** --- 503,514 ---- diff --git a/test/java/lang/reflect/Generics/TestGenericReturnTypeToString.java b/test/java/lang/reflect/Generics/TestGenericReturnTypeToString.java new file mode 100644 index 0000000000000000000000000000000000000000..e41f1bdaf1cdb2014b1086a8cae8ac2dd966e65c --- /dev/null +++ b/test/java/lang/reflect/Generics/TestGenericReturnTypeToString.java @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute 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. + */ + +/* + * @test + * @bug 8054213 + * @summary Check that toString method works properly for generic return type + * obtained via reflection + * @run main TestGenericReturnTypeToString + */ + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.Method; +import java.util.List; + +public class TestGenericReturnTypeToString { + + public static void main(String[] args) { + boolean hasFailures = false; + for (Method method : TestGenericReturnTypeToString.class.getMethods()) { + if (method.isAnnotationPresent(ExpectedGenericString.class)) { + ExpectedGenericString es = method.getAnnotation + (ExpectedGenericString.class); + String result = method.getGenericReturnType().toString(); + if (!es.value().equals(result)) { + hasFailures = true; + System.err.println("Unexpected result of " + + "getGenericReturnType().toString() " + + " for " + method.getName() + + " expected: " + es.value() + " actual: " + result); + } + } + if (hasFailures) { + throw new RuntimeException("Test failed"); + } + } + } + + @ExpectedGenericString("TestGenericReturnTypeToString$" + + "FirstInnerClassGeneric$SecondInnerClassGeneric") + public FirstInnerClassGeneric.SecondInnerClassGeneric foo1() { + return null; + } + + @ExpectedGenericString("TestGenericReturnTypeToString$" + + "FirstInnerClassGeneric$SecondInnerClass") + public FirstInnerClassGeneric.SecondInnerClass foo2() { + return null; + } + + @ExpectedGenericString("TestGenericReturnTypeToString$" + + "FirstInnerClass$SecondInnerClassGeneric") + public FirstInnerClass.SecondInnerClassGeneric foo3() { + return null; + } + + @ExpectedGenericString("class TestGenericReturnTypeToString$" + + "FirstInnerClass$SecondInnerClass") + public FirstInnerClass.SecondInnerClass foo4() { + return null; + } + + @ExpectedGenericString( + "java.util.List") + public java.util.List foo5() { + return null; + } + + @ExpectedGenericString("interface TestGenericReturnTypeToString$" + + "FirstInnerClass$Interface") + public FirstInnerClass.Interface foo6() { + return null; + } + + @ExpectedGenericString("TestGenericReturnTypeToString$" + + "FirstInnerClass$InterfaceGeneric") + public FirstInnerClass.InterfaceGeneric foo7() { + return null; + } + + public static class FirstInnerClass { + + public class SecondInnerClassGeneric { + } + + public class SecondInnerClass { + } + + interface Interface { + } + + interface InterfaceGeneric { + } + } + + public class FirstInnerClassGeneric { + + public class SecondInnerClassGeneric { + } + + public class SecondInnerClass { + } + } +} + +@Retention(RetentionPolicy.RUNTIME) +@interface ExpectedGenericString { + String value(); +} + +class Dummy { +} diff --git a/test/java/util/zip/InflateIn_DeflateOut.java b/test/java/util/zip/InflateIn_DeflateOut.java index 1e4ef2bd073744bcd1a2aa86640fd23c12242edd..2c9adab06c97ff219c85f4eef84c369c6109b6b5 100644 --- a/test/java/util/zip/InflateIn_DeflateOut.java +++ b/test/java/util/zip/InflateIn_DeflateOut.java @@ -23,7 +23,7 @@ /** * @test - * @bug 4206909 4813885 + * @bug 4206909 4813885 8189789 * @summary Test basic functionality of DeflaterOutputStream/InflaterInputStream and GZIPOutputStream/GZIPInputStream, including flush */ @@ -146,6 +146,47 @@ public class InflateIn_DeflateOut { check(Arrays.equals(data, buf)); } + private static void TestFlushableGZIPOutputStream() throws Throwable { + Random random = new Random(new Date().getTime()); + + ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream(); + OutputStream output = new FlushableGZIPOutputStream(byteOutStream); + + byte[] data = new byte[random.nextInt(1024 * 1024)]; + byte[] buf = new byte[data.length]; + random.nextBytes(data); + + output.write(data); + for (int i=0; i= 0) { + baos.write(b, 0, numRead); + } + } finally { + baos.close(); + } + + byte[] decompressedBytes = baos.toByteArray(); + + check(decompressedBytes.length == data.length * 4); + } + private static void check(InputStream is, OutputStream os) throws Throwable { @@ -267,6 +308,7 @@ public class InflateIn_DeflateOut { LineOrientedProtocol(); GZWriteFlushRead(); GZLineOrientedProtocol(); + TestFlushableGZIPOutputStream(); } //--------------------- Infrastructure --------------------------- @@ -284,3 +326,80 @@ public class InflateIn_DeflateOut { System.out.println("\nPassed = " + passed + " failed = " + failed); if (failed > 0) throw new AssertionError("Some tests failed");} } + +class FlushableGZIPOutputStream extends GZIPOutputStream { + public FlushableGZIPOutputStream(OutputStream os) throws IOException { + super(os); + } + + private static final byte[] EMPTYBYTEARRAY = new byte[0]; + private boolean hasData = false; + + /** + * Here we make sure we have received data, so that the header has been for + * sure written to the output stream already. + */ + @Override + public synchronized void write(byte[] bytes, int i, int i1) + throws IOException { + super.write(bytes, i, i1); + hasData = true; + } + + @Override + public synchronized void write(int i) throws IOException { + super.write(i); + hasData = true; + } + + @Override + public synchronized void write(byte[] bytes) throws IOException { + super.write(bytes); + hasData = true; + } + + @Override + public synchronized void flush() throws IOException { + if (!hasData) { + return; // do not allow the gzip header to be flushed on its own + } + + // trick the deflater to flush + /** + * Now this is tricky: We force the Deflater to flush its data by + * switching compression level. As yet, a perplexingly simple workaround + * for + * http://developer.java.sun.com/developer/bugParade/bugs/4255743.html + */ + if (!def.finished()) { + def.setInput(EMPTYBYTEARRAY, 0, 0); + + def.setLevel(Deflater.NO_COMPRESSION); + deflate(); + + def.setLevel(Deflater.DEFAULT_COMPRESSION); + deflate(); + + out.flush(); + } + + hasData = false; // no more data to flush + } + + /* + * Keep on calling deflate until it runs dry. The default implementation + * only does it once and can therefore hold onto data when they need to be + * flushed out. + */ + @Override + protected void deflate() throws IOException { + int len; + do { + len = def.deflate(buf, 0, buf.length); + if (len > 0) { + out.write(buf, 0, len); + } + } while (len != 0); + } + +}