mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 15:24:43 +02:00
8259947: (fs) Optimize UnixPath.encode implementation
Reviewed-by: chegar, shade, alanb
This commit is contained in:
parent
69f90b5fd4
commit
5891509d13
6 changed files with 64 additions and 67 deletions
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2008, 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 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
|
||||
|
@ -343,7 +343,7 @@ abstract class UnixFileSystem
|
|||
// Override if the platform uses different Unicode normalization form
|
||||
// for native file path. For example on MacOSX, the native path is stored
|
||||
// in Unicode NFD form.
|
||||
char[] normalizeNativePath(char[] path) {
|
||||
String normalizeNativePath(String path) {
|
||||
return path;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2008, 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 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
|
||||
|
@ -25,26 +25,25 @@
|
|||
|
||||
package sun.nio.fs;
|
||||
|
||||
import java.nio.*;
|
||||
import java.nio.file.*;
|
||||
import java.nio.charset.*;
|
||||
import java.io.*;
|
||||
import java.net.URI;
|
||||
import java.util.*;
|
||||
import java.lang.ref.SoftReference;
|
||||
|
||||
import jdk.internal.access.JavaLangAccess;
|
||||
import jdk.internal.access.SharedSecrets;
|
||||
|
||||
import static sun.nio.fs.UnixNativeDispatcher.*;
|
||||
import static sun.nio.fs.UnixConstants.*;
|
||||
|
||||
/**
|
||||
* Solaris/Linux implementation of java.nio.file.Path
|
||||
* Linux/Mac implementation of java.nio.file.Path
|
||||
*/
|
||||
|
||||
class UnixPath implements Path {
|
||||
private static ThreadLocal<SoftReference<CharsetEncoder>> encoder =
|
||||
new ThreadLocal<SoftReference<CharsetEncoder>>();
|
||||
|
||||
// FIXME - eliminate this reference to reduce space
|
||||
private static final JavaLangAccess JLA = SharedSecrets.getJavaLangAccess();
|
||||
|
||||
private final UnixFileSystem fs;
|
||||
|
||||
// internal representation
|
||||
|
@ -115,43 +114,13 @@ class UnixPath implements Path {
|
|||
|
||||
// encodes the given path-string into a sequence of bytes
|
||||
private static byte[] encode(UnixFileSystem fs, String input) {
|
||||
SoftReference<CharsetEncoder> ref = encoder.get();
|
||||
CharsetEncoder ce = (ref != null) ? ref.get() : null;
|
||||
if (ce == null) {
|
||||
ce = Util.jnuEncoding().newEncoder()
|
||||
.onMalformedInput(CodingErrorAction.REPORT)
|
||||
.onUnmappableCharacter(CodingErrorAction.REPORT);
|
||||
encoder.set(new SoftReference<>(ce));
|
||||
}
|
||||
|
||||
char[] ca = fs.normalizeNativePath(input.toCharArray());
|
||||
|
||||
// size output buffer for worse-case size
|
||||
byte[] ba = new byte[(int)(ca.length * (double)ce.maxBytesPerChar())];
|
||||
|
||||
// encode
|
||||
ByteBuffer bb = ByteBuffer.wrap(ba);
|
||||
CharBuffer cb = CharBuffer.wrap(ca);
|
||||
ce.reset();
|
||||
CoderResult cr = ce.encode(cb, bb, true);
|
||||
boolean error;
|
||||
if (!cr.isUnderflow()) {
|
||||
error = true;
|
||||
} else {
|
||||
cr = ce.flush(bb);
|
||||
error = !cr.isUnderflow();
|
||||
}
|
||||
if (error) {
|
||||
input = fs.normalizeNativePath(input);
|
||||
try {
|
||||
return JLA.getBytesNoRepl(input, Util.jnuEncoding());
|
||||
} catch (CharacterCodingException cce) {
|
||||
throw new InvalidPathException(input,
|
||||
"Malformed input or input contains unmappable characters");
|
||||
}
|
||||
|
||||
// trim result to actual length if required
|
||||
int len = bb.position();
|
||||
if (len != ba.length)
|
||||
ba = Arrays.copyOf(ba, len);
|
||||
|
||||
return ba;
|
||||
}
|
||||
|
||||
// package-private
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue