Updating existing JDK code to use InputStream.transferTo() (jdk)
Patrick Reinhart
patrick at reini.net
Fri May 8 23:00:15 UTC 2015
Here the first batch of changes
Cheers
Patrick
> Am 07.05.2015 um 20:44 schrieb Pavel Rappo <pavel.rappo at oracle.com>:
>
> Hi Patrick,
>
> That's a good idea! I can sponsor them no problem.
>
> -Pavel
diff -r 7101bcceb43d make/src/classes/build/tools/module/ModuleArchive.java
--- a/make/src/classes/build/tools/module/ModuleArchive.java Thu May 07 10:19:34 2015 -0700
+++ b/make/src/classes/build/tools/module/ModuleArchive.java Sat May 09 00:45:32 2015 +0200
@@ -186,7 +186,7 @@
switch (section) {
case CLASSES:
if (!filename.startsWith("_the.") && !filename.equals("javac_state"))
- writeEntry(in);
+ in.transferTo(out);
break;
case LIBS:
writeEntry(in, destFile(nativeDir(filename), filename));
@@ -218,13 +218,6 @@
Files.copy(in, dstFile);
}
- private void writeEntry(InputStream in) throws IOException {
- byte[] buf = new byte[8192];
- int n;
- while ((n = in.read(buf)) > 0)
- out.write(buf, 0, n);
- }
-
private static String nativeDir(String filename) {
if (System.getProperty("os.name").startsWith("Windows")) {
if (filename.endsWith(".dll") || filename.endsWith(".diz")
diff -r 7101bcceb43d src/java.base/share/classes/java/nio/file/Files.java
--- a/src/java.base/share/classes/java/nio/file/Files.java Thu May 07 10:19:34 2015 -0700
+++ b/src/java.base/share/classes/java/nio/file/Files.java Sat May 09 00:45:32 2015 +0200
@@ -2904,22 +2904,6 @@
}
/**
- * Reads all bytes from an input stream and writes them to an output stream.
- */
- private static long copy(InputStream source, OutputStream sink)
- throws IOException
- {
- long nread = 0L;
- byte[] buf = new byte[BUFFER_SIZE];
- int n;
- while ((n = source.read(buf)) > 0) {
- sink.write(buf, 0, n);
- nread += n;
- }
- return nread;
- }
-
- /**
* Copies all bytes from an input stream to a file. On return, the input
* stream will be at end of stream.
*
@@ -3031,7 +3015,7 @@
// do the copy
try (OutputStream out = ostream) {
- return copy(in, out);
+ return in.transferTo(out);
}
}
@@ -3073,7 +3057,7 @@
Objects.requireNonNull(out);
try (InputStream in = newInputStream(source)) {
- return copy(in, out);
+ return in.transferTo(out);
}
}
diff -r 7101bcceb43d src/java.base/share/classes/java/util/jar/JarInputStream.java
--- a/src/java.base/share/classes/java/util/jar/JarInputStream.java Thu May 07 10:19:34 2015 -0700
+++ b/src/java.base/share/classes/java/util/jar/JarInputStream.java Sat May 09 00:45:32 2015 +0200
@@ -106,12 +106,8 @@
private byte[] getBytes(InputStream is)
throws IOException
{
- byte[] buffer = new byte[8192];
ByteArrayOutputStream baos = new ByteArrayOutputStream(2048);
- int n;
- while ((n = is.read(buffer, 0, buffer.length)) != -1) {
- baos.write(buffer, 0, n);
- }
+ is.transferTo(baos);
return baos.toByteArray();
}
diff -r 7101bcceb43d src/java.base/share/classes/jdk/internal/jrtfs/JrtPath.java
--- a/src/java.base/share/classes/jdk/internal/jrtfs/JrtPath.java Thu May 07 10:19:34 2015 -0700
+++ b/src/java.base/share/classes/jdk/internal/jrtfs/JrtPath.java Sat May 09 00:45:32 2015 +0200
@@ -829,11 +829,7 @@
target.createDirectory();
} else {
try (InputStream is = jrtfs.newInputStream(getResolvedPath()); OutputStream os = target.newOutputStream()) {
- byte[] buf = new byte[8192];
- int n;
- while ((n = is.read(buf)) != -1) {
- os.write(buf, 0, n);
- }
+ is.transferTo(os);
}
}
if (copyAttrs) {
diff -r 7101bcceb43d src/java.base/share/classes/sun/net/www/MimeLauncher.java
--- a/src/java.base/share/classes/sun/net/www/MimeLauncher.java Thu May 07 10:19:34 2015 -0700
+++ b/src/java.base/share/classes/sun/net/www/MimeLauncher.java Sat May 09 00:45:32 2015 +0200
@@ -108,30 +108,20 @@
public void run() {
try {
+ if (is == null) {
+ return;
+ }
+
String ofn = m.getTempFileTemplate();
if (ofn == null) {
ofn = genericTempFileTemplate;
}
ofn = getTempFileName(uc.getURL(), ofn);
- try {
- OutputStream os = new FileOutputStream(ofn);
- byte buf[] = new byte[2048];
- int i = 0;
- try {
- while ((i = is.read(buf)) >= 0) {
- os.write(buf, 0, i);
- }
- } catch(IOException e) {
- //System.err.println("Exception in write loop " + i);
- //e.printStackTrace();
- } finally {
- os.close();
- is.close();
- }
- } catch(IOException e) {
- //System.err.println("Exception in input or output stream");
- //e.printStackTrace();
+ try (OutputStream os = new FileOutputStream(ofn)) {
+ is.transferTo(os);
+ } finally {
+ is.close();
}
int inx = 0;
diff -r 7101bcceb43d src/java.base/share/classes/sun/security/provider/certpath/X509CertPath.java
--- a/src/java.base/share/classes/sun/security/provider/certpath/X509CertPath.java Thu May 07 10:19:34 2015 -0700
+++ b/src/java.base/share/classes/sun/security/provider/certpath/X509CertPath.java Sat May 09 00:45:32 2015 +0200
@@ -256,12 +256,8 @@
* @return the bytes read from the InputStream
*/
private static byte[] readAllBytes(InputStream is) throws IOException {
- byte[] buffer = new byte[8192];
- ByteArrayOutputStream baos = new ByteArrayOutputStream(2048);
- int n;
- while ((n = is.read(buffer)) != -1) {
- baos.write(buffer, 0, n);
- }
+ ByteArrayOutputStream baos = new ByteArrayOutputStream(8192);
+ is.transferTo(baos);
return baos.toByteArray();
}
diff -r 7101bcceb43d src/java.base/share/classes/sun/security/tools/keytool/Main.java
--- a/src/java.base/share/classes/sun/security/tools/keytool/Main.java Thu May 07 10:19:34 2015 -0700
+++ b/src/java.base/share/classes/sun/security/tools/keytool/Main.java Sat May 09 00:45:32 2015 +0200
@@ -2194,12 +2194,7 @@
// might not work properly, since -gencrl is slow
// and there's no data in the pipe at the beginning.
ByteArrayOutputStream bout = new ByteArrayOutputStream();
- byte[] b = new byte[4096];
- while (true) {
- int len = in.read(b);
- if (len < 0) break;
- bout.write(b, 0, len);
- }
+ in.transferTo(bout);
return CertificateFactory.getInstance("X509").generateCRLs(
new ByteArrayInputStream(bout.toByteArray()));
} finally {
diff -r 7101bcceb43d src/java.desktop/share/classes/com/sun/media/sound/DLSSoundbank.java
--- a/src/java.desktop/share/classes/com/sun/media/sound/DLSSoundbank.java Thu May 07 10:19:34 2015 -0700
+++ b/src/java.desktop/share/classes/com/sun/media/sound/DLSSoundbank.java Sat May 09 00:45:32 2015 +0200
@@ -984,11 +984,7 @@
RIFFWriter data_chunk = writer.writeChunk("data");
AudioInputStream stream = AudioSystem.getAudioInputStream(
audioformat, (AudioInputStream)sample.getData());
- byte[] buff = new byte[1024];
- int ret;
- while ((ret = stream.read(buff)) != -1) {
- data_chunk.write(buff, 0, ret);
- }
+ stream.transferTo(data_chunk);
} else {
RIFFWriter data_chunk = writer.writeChunk("data");
ModelByteBuffer databuff = sample.getDataBuffer();
diff -r 7101bcceb43d src/java.desktop/share/classes/com/sun/media/sound/ModelByteBuffer.java
--- a/src/java.desktop/share/classes/com/sun/media/sound/ModelByteBuffer.java Thu May 07 10:19:34 2015 -0700
+++ b/src/java.desktop/share/classes/com/sun/media/sound/ModelByteBuffer.java Sat May 09 00:45:32 2015 +0200
@@ -190,11 +190,7 @@
public void writeTo(OutputStream out) throws IOException {
if (root.file != null && root.buffer == null) {
- InputStream is = getInputStream();
- byte[] buff = new byte[1024];
- int ret;
- while ((ret = is.read(buff)) != -1)
- out.write(buff, 0, ret);
+ getInputStream().transferTo(out);
} else
out.write(array(), (int) arrayOffset(), (int) capacity());
}
diff -r 7101bcceb43d src/java.desktop/share/classes/com/sun/media/sound/StandardMidiFileWriter.java
--- a/src/java.desktop/share/classes/com/sun/media/sound/StandardMidiFileWriter.java Thu May 07 10:19:34 2015 -0700
+++ b/src/java.desktop/share/classes/com/sun/media/sound/StandardMidiFileWriter.java Sat May 09 00:45:32 2015 +0200
@@ -125,11 +125,6 @@
}
public int write(Sequence in, int type, OutputStream out) throws IOException {
- byte [] buffer = null;
-
- int bytesRead = 0;
- long bytesWritten = 0;
-
if( !isFileTypeSupported(type,in) ) {
throw new IllegalArgumentException("Could not write MIDI file");
}
@@ -138,14 +133,8 @@
if (fileStream == null) {
throw new IllegalArgumentException("Could not write MIDI file");
}
- buffer = new byte[bufferSize];
-
- while( (bytesRead = fileStream.read( buffer )) >= 0 ) {
- out.write( buffer, 0, bytesRead );
- bytesWritten += bytesRead;
- }
// Done....return bytesWritten
- return (int) bytesWritten;
+ return (int) fileStream.transferTo(out);
}
public int write(Sequence in, int type, File out) throws IOException {
diff -r 7101bcceb43d src/java.desktop/share/classes/com/sun/media/sound/WaveFloatFileWriter.java
--- a/src/java.desktop/share/classes/com/sun/media/sound/WaveFloatFileWriter.java Thu May 07 10:19:34 2015 -0700
+++ b/src/java.desktop/share/classes/com/sun/media/sound/WaveFloatFileWriter.java Sat May 09 00:45:32 2015 +0200
@@ -66,23 +66,20 @@
public void write(AudioInputStream stream, RIFFWriter writer)
throws IOException {
- RIFFWriter fmt_chunk = writer.writeChunk("fmt ");
+ try (RIFFWriter fmt_chunk = writer.writeChunk("fmt ")) {
+ AudioFormat format = stream.getFormat();
+ fmt_chunk.writeUnsignedShort(3); // WAVE_FORMAT_IEEE_FLOAT
+ fmt_chunk.writeUnsignedShort(format.getChannels());
+ fmt_chunk.writeUnsignedInt((int) format.getSampleRate());
+ fmt_chunk.writeUnsignedInt(((int) format.getFrameRate())
+ * format.getFrameSize());
+ fmt_chunk.writeUnsignedShort(format.getFrameSize());
+ fmt_chunk.writeUnsignedShort(format.getSampleSizeInBits());
+ }
- AudioFormat format = stream.getFormat();
- fmt_chunk.writeUnsignedShort(3); // WAVE_FORMAT_IEEE_FLOAT
- fmt_chunk.writeUnsignedShort(format.getChannels());
- fmt_chunk.writeUnsignedInt((int) format.getSampleRate());
- fmt_chunk.writeUnsignedInt(((int) format.getFrameRate())
- * format.getFrameSize());
- fmt_chunk.writeUnsignedShort(format.getFrameSize());
- fmt_chunk.writeUnsignedShort(format.getSampleSizeInBits());
- fmt_chunk.close();
- RIFFWriter data_chunk = writer.writeChunk("data");
- byte[] buff = new byte[1024];
- int len;
- while ((len = stream.read(buff, 0, buff.length)) != -1)
- data_chunk.write(buff, 0, len);
- data_chunk.close();
+ try (RIFFWriter data_chunk = writer.writeChunk("data")) {
+ stream.transferTo(data_chunk);
+ }
}
private static class NoCloseOutputStream extends OutputStream {
diff -r 7101bcceb43d src/java.desktop/share/classes/javax/swing/plaf/basic/BasicLookAndFeel.java
--- a/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicLookAndFeel.java Thu May 07 10:19:34 2015 -0700
+++ b/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicLookAndFeel.java Sat May 09 00:45:32 2015 +0200
@@ -2073,19 +2073,13 @@
if (resource == null) {
return null;
}
- BufferedInputStream in =
- new BufferedInputStream(resource);
ByteArrayOutputStream out =
new ByteArrayOutputStream(1024);
- byte[] buffer = new byte[1024];
- int n;
- while ((n = in.read(buffer)) > 0) {
- out.write(buffer, 0, n);
+ try (BufferedInputStream in =
+ new BufferedInputStream(resource)) {
+ in.transferTo(out);
}
- in.close();
- out.flush();
- buffer = out.toByteArray();
- return buffer;
+ return out.toByteArray();
} catch (IOException ioe) {
System.err.println(ioe.toString());
return null;
diff -r 7101bcceb43d src/java.desktop/share/classes/javax/swing/text/rtf/AbstractFilter.java
--- a/src/java.desktop/share/classes/javax/swing/text/rtf/AbstractFilter.java Thu May 07 10:19:34 2015 -0700
+++ b/src/java.desktop/share/classes/javax/swing/text/rtf/AbstractFilter.java Sat May 09 00:45:32 2015 +0200
@@ -93,18 +93,7 @@
public void readFromStream(InputStream in)
throws IOException
{
- byte buf[];
- int count;
-
- buf = new byte[16384];
-
- while(true) {
- count = in.read(buf);
- if (count < 0)
- break;
-
- this.write(buf, 0, count);
- }
+ in.transferTo(this);
}
public void readFromReader(Reader in)
diff -r 7101bcceb43d src/java.desktop/share/classes/sun/swing/SwingUtilities2.java
--- a/src/java.desktop/share/classes/sun/swing/SwingUtilities2.java Thu May 07 10:19:34 2015 -0700
+++ b/src/java.desktop/share/classes/sun/swing/SwingUtilities2.java Sat May 09 00:45:32 2015 +0200
@@ -1568,11 +1568,7 @@
= new BufferedInputStream(resource);
ByteArrayOutputStream out
= new ByteArrayOutputStream(1024)) {
- byte[] buffer = new byte[1024];
- int n;
- while ((n = in.read(buffer)) > 0) {
- out.write(buffer, 0, n);
- }
+ in.transferTo(out);
out.flush();
return out.toByteArray();
}
diff -r 7101bcceb43d src/java.desktop/unix/classes/sun/print/UnixPrintJob.java
--- a/src/java.desktop/unix/classes/sun/print/UnixPrintJob.java Thu May 07 10:19:34 2015 -0700
+++ b/src/java.desktop/unix/classes/sun/print/UnixPrintJob.java Sat May 09 00:45:32 2015 +0200
@@ -591,18 +591,10 @@
}
}
} else if (instream != null) {
- BufferedInputStream bin = new BufferedInputStream(instream);
- BufferedOutputStream bout = new BufferedOutputStream(output);
- byte[] buffer = new byte[1024];
- int bread = 0;
-
- try {
- while ((bread = bin.read(buffer)) >= 0) {
- bout.write(buffer, 0, bread);
- }
- bin.close();
+ try (BufferedInputStream bin = new BufferedInputStream(instream);
+ BufferedOutputStream bout = new BufferedOutputStream(output)) {
+ bin.transferTo(bout);
bout.flush();
- bout.close();
} catch (IOException e) {
notifyEvent(PrintJobEvent.JOB_FAILED);
throw new PrintException (e);
diff -r 7101bcceb43d src/java.desktop/windows/classes/sun/print/Win32PrintJob.java
--- a/src/java.desktop/windows/classes/sun/print/Win32PrintJob.java Thu May 07 10:19:34 2015 -0700
+++ b/src/java.desktop/windows/classes/sun/print/Win32PrintJob.java Sat May 09 00:45:32 2015 +0200
@@ -436,16 +436,9 @@
}
if (mDestination != null) { // if destination attribute is set
- try {
- FileOutputStream fos = new FileOutputStream(mDestination);
- byte []buffer = new byte[1024];
- int cread;
-
- while ((cread = instream.read(buffer, 0, buffer.length)) >=0) {
- fos.write(buffer, 0, cread);
- }
+ try (FileOutputStream fos = new FileOutputStream(mDestination)) {
+ instream.transferTo(fos);
fos.flush();
- fos.close();
} catch (FileNotFoundException fnfe) {
notifyEvent(PrintJobEvent.JOB_FAILED);
throw new PrintException(fnfe.toString());
diff -r 7101bcceb43d src/java.management/share/classes/javax/management/loading/MLet.java
--- a/src/java.management/share/classes/javax/management/loading/MLet.java Thu May 07 10:19:34 2015 -0700
+++ b/src/java.management/share/classes/javax/management/loading/MLet.java Sat May 09 00:45:32 2015 +0200
@@ -1158,28 +1158,19 @@
InputStream is = getResourceAsStream(
libname.replace(File.separatorChar,'/'));
if (is != null) {
- try {
+ try (is) {
File directory = new File(libraryDirectory);
directory.mkdirs();
File file = Files.createTempFile(directory.toPath(),
libname + ".", null)
.toFile();
file.deleteOnExit();
- FileOutputStream fileOutput = new FileOutputStream(file);
- try {
- byte[] buf = new byte[4096];
- int n;
- while ((n = is.read(buf)) >= 0) {
- fileOutput.write(buf, 0, n);
- }
- } finally {
- fileOutput.close();
+ try (FileOutputStream fileOutput = new FileOutputStream(file)) {
+ is.transferTo(fileOutput);
}
if (file.exists()) {
return file.getAbsolutePath();
}
- } finally {
- is.close();
}
}
} catch (Exception e) {
diff -r 7101bcceb43d src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/JavaUtils.java
--- a/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/JavaUtils.java Thu May 07 10:19:34 2015 -0700
+++ b/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/JavaUtils.java Sat May 09 00:45:32 2015 +0200
@@ -59,32 +59,11 @@
*/
public static byte[] getBytesFromFile(String fileName)
throws FileNotFoundException, IOException {
-
- byte refBytes[] = null;
-
- FileInputStream fisRef = null;
- UnsyncByteArrayOutputStream baos = null;
- try {
- fisRef = new FileInputStream(fileName);
- baos = new UnsyncByteArrayOutputStream();
- byte buf[] = new byte[1024];
- int len;
-
- while ((len = fisRef.read(buf)) > 0) {
- baos.write(buf, 0, len);
- }
-
- refBytes = baos.toByteArray();
- } finally {
- if (baos != null) {
- baos.close();
- }
- if (fisRef != null) {
- fisRef.close();
- }
+ try (FileInputStream fisRef = new FileInputStream(fileName);
+ UnsyncByteArrayOutputStream baos = new UnsyncByteArrayOutputStream()) {
+ fisRef.transferTo(baos);
+ return baos.toByteArray();
}
-
- return refBytes;
}
/**
@@ -94,30 +73,17 @@
* @param bytes
*/
public static void writeBytesToFilename(String filename, byte[] bytes) {
- FileOutputStream fos = null;
- try {
- if (filename != null && bytes != null) {
- File f = new File(filename);
-
- fos = new FileOutputStream(f);
-
+ if (filename != null && bytes != null) {
+ File f = new File(filename);
+ try (FileOutputStream fos = new FileOutputStream(f)) {
fos.write(bytes);
- fos.close();
- } else {
+ } catch (IOException ex) {
if (log.isLoggable(java.util.logging.Level.FINE)) {
- log.log(java.util.logging.Level.FINE, "writeBytesToFilename got null byte[] pointed");
+ log.log(java.util.logging.Level.FINE, ex.getMessage(), ex);
}
}
- } catch (IOException ex) {
- if (fos != null) {
- try {
- fos.close();
- } catch (IOException ioe) {
- if (log.isLoggable(java.util.logging.Level.FINE)) {
- log.log(java.util.logging.Level.FINE, ioe.getMessage(), ioe);
- }
- }
- }
+ } else if (log.isLoggable(java.util.logging.Level.FINE)) {
+ log.log(java.util.logging.Level.FINE, "writeBytesToFilename got null byte[] pointed");
}
}
@@ -132,22 +98,11 @@
* @throws IOException
*/
public static byte[] getBytesFromStream(InputStream inputStream) throws IOException {
- UnsyncByteArrayOutputStream baos = null;
-
byte[] retBytes = null;
- try {
- baos = new UnsyncByteArrayOutputStream();
- byte buf[] = new byte[4 * 1024];
- int len;
-
- while ((len = inputStream.read(buf)) > 0) {
- baos.write(buf, 0, len);
- }
+ try (UnsyncByteArrayOutputStream baos = new UnsyncByteArrayOutputStream()) {
+ inputStream.transferTo(baos);
retBytes = baos.toByteArray();
- } finally {
- baos.close();
}
-
return retBytes;
}
diff -r 7101bcceb43d src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/resolver/implementations/ResolverDirectHTTP.java
--- a/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/resolver/implementations/ResolverDirectHTTP.java Thu May 07 10:19:34 2015 -0700
+++ b/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/resolver/implementations/ResolverDirectHTTP.java Sat May 09 00:45:32 2015 +0200
@@ -142,14 +142,7 @@
String mimeType = urlConnection.getHeaderField("Content-Type");
inputStream = urlConnection.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
- byte buf[] = new byte[4096];
- int read = 0;
- int summarized = 0;
-
- while ((read = inputStream.read(buf)) >= 0) {
- baos.write(buf, 0, read);
- summarized += read;
- }
+ long summarized = inputStream.transferTo(baos);
if (log.isLoggable(java.util.logging.Level.FINE)) {
log.log(java.util.logging.Level.FINE, "Fetched " + summarized + " bytes from URI " + uriNew.toString());
diff -r 7101bcceb43d src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/Utils.java
--- a/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/Utils.java Thu May 07 10:19:34 2015 -0700
+++ b/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/Utils.java Sat May 09 00:45:32 2015 +0200
@@ -49,17 +49,7 @@
throws IOException
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
- byte[] buf = new byte[1024];
- while (true) {
- int read = is.read(buf);
- if (read == -1) { // EOF
- break;
- }
- baos.write(buf, 0, read);
- if (read < 1024) {
- break;
- }
- }
+ is.transferTo(baos);
return baos.toByteArray();
}
diff -r 7101bcceb43d src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipPath.java
--- a/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipPath.java Thu May 07 10:19:34 2015 -0700
+++ b/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipPath.java Sat May 09 00:45:32 2015 +0200
@@ -834,20 +834,9 @@
// create directory or file
target.createDirectory();
} else {
- InputStream is = zfs.newInputStream(getResolvedPath());
- try {
- OutputStream os = target.newOutputStream();
- try {
- byte[] buf = new byte[8192];
- int n = 0;
- while ((n = is.read(buf)) != -1) {
- os.write(buf, 0, n);
- }
- } finally {
- os.close();
- }
- } finally {
- is.close();
+ try (InputStream is = zfs.newInputStream(getResolvedPath());
+ OutputStream os = target.newOutputStream()) {
+ is.transferTo(os);
}
}
if (copyAttrs) {
More information about the core-libs-dev
mailing list