# HG changeset patch # User attila # Date 1446485213 -3600 # Node ID 43400f0f2b4731c6b13cf12b624f5b729572b134 # Parent 909918accebfad84675511fd47ee6244736d8d99 8141144: Move NameCodec to jdk.nashorn.internal space Reviewed-by: hannesw, sundar diff -r 909918accebf -r 43400f0f2b47 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/support/NameCodec.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/support/NameCodec.java Thu Oct 29 12:39:57 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,207 +0,0 @@ -/* - * Copyright (c) 2010, 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. - */ - -/* - * This file is available under and governed by the GNU General Public - * License version 2 only, as published by the Free Software Foundation. - * However, the following notice accompanied the original version of this - * file, and Oracle licenses the original version of this file under the BSD - * license: - */ -/* - Copyright 2009-2013 Attila Szegedi - - Licensed under both the Apache License, Version 2.0 (the "Apache License") - and the BSD License (the "BSD License"), with licensee being free to - choose either of the two at their discretion. - - You may not use this file except in compliance with either the Apache - License or the BSD License. - - If you choose to use this file in compliance with the Apache License, the - following notice applies to you: - - You may obtain a copy of the Apache License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied. See the License for the specific language governing - permissions and limitations under the License. - - If you choose to use this file in compliance with the BSD License, the - following notice applies to you: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jdk.internal.dynalink.support; - - -/** - * Implements the name mangling and demangling as specified by John Rose's - * "Symbolic Freedom in the VM" article. Normally, you would - * mangle the names in the call sites as you're generating bytecode, and then - * demangle them when you receive them in bootstrap methods. - */ -public final class NameCodec { - private static final char ESCAPE_CHAR = '\\'; - private static final char EMPTY_ESCAPE = '='; - private static final String EMPTY_NAME = new String(new char[] { ESCAPE_CHAR, EMPTY_ESCAPE }); - private static final char EMPTY_CHAR = 0xFEFF; - - private static final int MIN_ENCODING = '$'; - private static final int MAX_ENCODING = ']'; - private static final char[] ENCODING = new char[MAX_ENCODING - MIN_ENCODING + 1]; - private static final int MIN_DECODING = '!'; - private static final int MAX_DECODING = '}'; - private static final char[] DECODING = new char[MAX_DECODING - MIN_DECODING + 1]; - - static { - addEncoding('/', '|'); - addEncoding('.', ','); - addEncoding(';', '?'); - addEncoding('$', '%'); - addEncoding('<', '^'); - addEncoding('>', '_'); - addEncoding('[', '{'); - addEncoding(']', '}'); - addEncoding(':', '!'); - addEncoding('\\', '-'); - DECODING[EMPTY_ESCAPE - MIN_DECODING] = EMPTY_CHAR; - } - - private NameCodec() { - } - - /** - * Encodes ("mangles") an unencoded symbolic name. - * @param name the symbolic name to mangle - * @return the mangled form of the symbolic name. - */ - public static String encode(final String name) { - final int l = name.length(); - if(l == 0) { - return EMPTY_NAME; - } - StringBuilder b = null; - int lastEscape = -1; - for(int i = 0; i < l; ++i) { - final int encodeIndex = name.charAt(i) - MIN_ENCODING; - if(encodeIndex >= 0 && encodeIndex < ENCODING.length) { - final char e = ENCODING[encodeIndex]; - if(e != 0) { - if(b == null) { - b = new StringBuilder(name.length() + 3); - if(name.charAt(0) != ESCAPE_CHAR && i > 0) { - b.append(EMPTY_NAME); - } - b.append(name, 0, i); - } else { - b.append(name, lastEscape + 1, i); - } - b.append(ESCAPE_CHAR).append(e); - lastEscape = i; - } - } - } - if(b == null) { - return name; - } - assert lastEscape != -1; - b.append(name, lastEscape + 1, l); - return b.toString(); - } - - /** - * Decodes ("demangles") an encoded symbolic name. - * @param name the symbolic name to demangle - * @return the demangled form of the symbolic name. - */ - public static String decode(final String name) { - if(name.isEmpty() || name.charAt(0) != ESCAPE_CHAR) { - return name; - } - final int l = name.length(); - if(l == 2 && name.charAt(1) == EMPTY_CHAR) { - return ""; - } - final StringBuilder b = new StringBuilder(name.length()); - int lastEscape = -2; - int lastBackslash = -1; - for(;;) { - final int nextBackslash = name.indexOf(ESCAPE_CHAR, lastBackslash + 1); - if(nextBackslash == -1 || nextBackslash == l - 1) { - break; - } - final int decodeIndex = name.charAt(nextBackslash + 1) - MIN_DECODING; - if(decodeIndex >= 0 && decodeIndex < DECODING.length) { - final char d = DECODING[decodeIndex]; - if(d == EMPTY_CHAR) { - // "\=" is only valid at the beginning of a mangled string - if(nextBackslash == 0) { - lastEscape = 0; - } - } else if(d != 0) { - b.append(name, lastEscape + 2, nextBackslash).append(d); - lastEscape = nextBackslash; - } - } - lastBackslash = nextBackslash; - } - b.append(name, lastEscape + 2, l); - return b.toString(); - } - - private static void addEncoding(final char from, final char to) { - ENCODING[from - MIN_ENCODING] = to; - DECODING[to - MIN_DECODING] = from; - } -} diff -r 909918accebf -r 43400f0f2b47 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Compiler.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Compiler.java Thu Oct 29 12:39:57 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Compiler.java Mon Nov 02 18:26:53 2015 +0100 @@ -49,7 +49,6 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; import java.util.logging.Level; -import jdk.internal.dynalink.support.NameCodec; import jdk.nashorn.internal.codegen.types.Type; import jdk.nashorn.internal.ir.Expression; import jdk.nashorn.internal.ir.FunctionNode; @@ -66,6 +65,7 @@ import jdk.nashorn.internal.runtime.ScriptObject; import jdk.nashorn.internal.runtime.ScriptRuntime; import jdk.nashorn.internal.runtime.Source; +import jdk.nashorn.internal.runtime.linker.NameCodec; import jdk.nashorn.internal.runtime.logging.DebugLogger; import jdk.nashorn.internal.runtime.logging.Loggable; import jdk.nashorn.internal.runtime.logging.Logger; diff -r 909918accebf -r 43400f0f2b47 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/MethodEmitter.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/MethodEmitter.java Thu Oct 29 12:39:57 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/MethodEmitter.java Mon Nov 02 18:26:53 2015 +0100 @@ -69,6 +69,7 @@ import static jdk.nashorn.internal.codegen.CompilerConstants.staticField; import static jdk.nashorn.internal.codegen.CompilerConstants.virtualCallNoLookup; import static jdk.nashorn.internal.codegen.ObjectClassGenerator.PRIMITIVE_FIELD_TYPE; +import static jdk.nashorn.internal.runtime.linker.NameCodec.EMPTY_NAME; import static jdk.nashorn.internal.runtime.linker.NashornCallSiteDescriptor.CALLSITE_OPTIMISTIC; import static jdk.nashorn.internal.runtime.linker.NashornCallSiteDescriptor.CALLSITE_PROGRAM_POINT_SHIFT; @@ -79,7 +80,6 @@ import java.util.IdentityHashMap; import java.util.List; import java.util.Map; -import jdk.internal.dynalink.support.NameCodec; import jdk.internal.org.objectweb.asm.Handle; import jdk.internal.org.objectweb.asm.MethodVisitor; import jdk.nashorn.internal.codegen.ClassEmitter.Flag; @@ -107,6 +107,7 @@ import jdk.nashorn.internal.runtime.ScriptRuntime; import jdk.nashorn.internal.runtime.UnwarrantedOptimismException; import jdk.nashorn.internal.runtime.linker.Bootstrap; +import jdk.nashorn.internal.runtime.linker.NameCodec; import jdk.nashorn.internal.runtime.linker.NashornCallSiteDescriptor; import jdk.nashorn.internal.runtime.logging.DebugLogger; import jdk.nashorn.internal.runtime.options.Options; @@ -125,8 +126,6 @@ * including bytecode stack contents */ public class MethodEmitter { - private static final String EMPTY_NAME = NameCodec.encode(""); - /** The ASM MethodVisitor we are plugged into */ private final MethodVisitor method; diff -r 909918accebf -r 43400f0f2b47 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/NashornTextifier.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/NashornTextifier.java Thu Oct 29 12:39:57 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/NashornTextifier.java Mon Nov 02 18:26:53 2015 +0100 @@ -39,7 +39,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import jdk.internal.dynalink.support.NameCodec; import jdk.internal.org.objectweb.asm.Attribute; import jdk.internal.org.objectweb.asm.Handle; import jdk.internal.org.objectweb.asm.Label; @@ -50,6 +49,7 @@ import jdk.internal.org.objectweb.asm.util.TraceSignatureVisitor; import jdk.nashorn.internal.runtime.ScriptEnvironment; import jdk.nashorn.internal.runtime.linker.Bootstrap; +import jdk.nashorn.internal.runtime.linker.NameCodec; import jdk.nashorn.internal.runtime.linker.NashornCallSiteDescriptor; /** diff -r 909918accebf -r 43400f0f2b47 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java Thu Oct 29 12:39:57 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java Mon Nov 02 18:26:53 2015 +0100 @@ -68,8 +68,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; - -import jdk.internal.dynalink.support.NameCodec; import jdk.nashorn.internal.codegen.CompilerConstants; import jdk.nashorn.internal.codegen.Namespace; import jdk.nashorn.internal.ir.AccessNode; @@ -121,6 +119,7 @@ import jdk.nashorn.internal.runtime.ScriptingFunctions; import jdk.nashorn.internal.runtime.Source; import jdk.nashorn.internal.runtime.Timing; +import jdk.nashorn.internal.runtime.linker.NameCodec; import jdk.nashorn.internal.runtime.logging.DebugLogger; import jdk.nashorn.internal.runtime.logging.Loggable; import jdk.nashorn.internal.runtime.logging.Logger; diff -r 909918accebf -r 43400f0f2b47 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java Thu Oct 29 12:39:57 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java Mon Nov 02 18:26:53 2015 +0100 @@ -44,7 +44,6 @@ import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import jdk.internal.dynalink.support.NameCodec; import jdk.nashorn.internal.codegen.Compiler; import jdk.nashorn.internal.codegen.Compiler.CompilationPhases; import jdk.nashorn.internal.codegen.CompilerConstants; @@ -67,6 +66,7 @@ import jdk.nashorn.internal.parser.Parser; import jdk.nashorn.internal.parser.Token; import jdk.nashorn.internal.parser.TokenType; +import jdk.nashorn.internal.runtime.linker.NameCodec; import jdk.nashorn.internal.runtime.logging.DebugLogger; import jdk.nashorn.internal.runtime.logging.Loggable; import jdk.nashorn.internal.runtime.logging.Logger; diff -r 909918accebf -r 43400f0f2b47 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/Bootstrap.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/Bootstrap.java Thu Oct 29 12:39:57 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/Bootstrap.java Mon Nov 02 18:26:53 2015 +0100 @@ -45,7 +45,6 @@ import jdk.internal.dynalink.linker.LinkerServices; import jdk.internal.dynalink.linker.MethodTypeConversionStrategy; import jdk.internal.dynalink.linker.support.TypeUtilities; -import jdk.internal.dynalink.support.NameCodec; import jdk.nashorn.api.scripting.JSObject; import jdk.nashorn.internal.codegen.CompilerConstants.Call; import jdk.nashorn.internal.lookup.MethodHandleFactory; diff -r 909918accebf -r 43400f0f2b47 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NameCodec.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NameCodec.java Mon Nov 02 18:26:53 2015 +0100 @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2010, 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. + */ + +package jdk.nashorn.internal.runtime.linker; + +/** + * Implements the name mangling and demangling as specified by John Rose's + * "Symbolic Freedom in the VM" article. Normally, you would + * mangle the names in the call sites as you're generating bytecode, and then + * demangle them when you receive them in bootstrap methods. + */ +public final class NameCodec { + private static final char ESCAPE_CHAR = '\\'; + private static final char EMPTY_ESCAPE = '='; + /** + * Canonical encoding for the empty name. + */ + public static final String EMPTY_NAME = new String(new char[] { ESCAPE_CHAR, EMPTY_ESCAPE }); + private static final char EMPTY_CHAR = 0xFEFF; + + private static final int MIN_ENCODING = '$'; + private static final int MAX_ENCODING = ']'; + private static final char[] ENCODING = new char[MAX_ENCODING - MIN_ENCODING + 1]; + private static final int MIN_DECODING = '!'; + private static final int MAX_DECODING = '}'; + private static final char[] DECODING = new char[MAX_DECODING - MIN_DECODING + 1]; + + static { + addEncoding('/', '|'); + addEncoding('.', ','); + addEncoding(';', '?'); + addEncoding('$', '%'); + addEncoding('<', '^'); + addEncoding('>', '_'); + addEncoding('[', '{'); + addEncoding(']', '}'); + addEncoding(':', '!'); + addEncoding('\\', '-'); + DECODING[EMPTY_ESCAPE - MIN_DECODING] = EMPTY_CHAR; + } + + private NameCodec() { + } + + /** + * Encodes ("mangles") an unencoded symbolic name. + * @param name the symbolic name to mangle + * @return the mangled form of the symbolic name. + */ + public static String encode(final String name) { + final int l = name.length(); + if(l == 0) { + return EMPTY_NAME; + } + StringBuilder b = null; + int lastEscape = -1; + for(int i = 0; i < l; ++i) { + final int encodeIndex = name.charAt(i) - MIN_ENCODING; + if(encodeIndex >= 0 && encodeIndex < ENCODING.length) { + final char e = ENCODING[encodeIndex]; + if(e != 0) { + if(b == null) { + b = new StringBuilder(name.length() + 3); + if(name.charAt(0) != ESCAPE_CHAR && i > 0) { + b.append(EMPTY_NAME); + } + b.append(name, 0, i); + } else { + b.append(name, lastEscape + 1, i); + } + b.append(ESCAPE_CHAR).append(e); + lastEscape = i; + } + } + } + if(b == null) { + return name; + } + assert lastEscape != -1; + b.append(name, lastEscape + 1, l); + return b.toString(); + } + + /** + * Decodes ("demangles") an encoded symbolic name. + * @param name the symbolic name to demangle + * @return the demangled form of the symbolic name. + */ + public static String decode(final String name) { + if(name.isEmpty() || name.charAt(0) != ESCAPE_CHAR) { + return name; + } + final int l = name.length(); + if(l == 2 && name.charAt(1) == EMPTY_CHAR) { + return ""; + } + final StringBuilder b = new StringBuilder(name.length()); + int lastEscape = -2; + int lastBackslash = -1; + for(;;) { + final int nextBackslash = name.indexOf(ESCAPE_CHAR, lastBackslash + 1); + if(nextBackslash == -1 || nextBackslash == l - 1) { + break; + } + final int decodeIndex = name.charAt(nextBackslash + 1) - MIN_DECODING; + if(decodeIndex >= 0 && decodeIndex < DECODING.length) { + final char d = DECODING[decodeIndex]; + if(d == EMPTY_CHAR) { + // "\=" is only valid at the beginning of a mangled string + if(nextBackslash == 0) { + lastEscape = 0; + } + } else if(d != 0) { + b.append(name, lastEscape + 2, nextBackslash).append(d); + lastEscape = nextBackslash; + } + } + lastBackslash = nextBackslash; + } + b.append(name, lastEscape + 2, l); + return b.toString(); + } + + private static void addEncoding(final char from, final char to) { + ENCODING[from - MIN_ENCODING] = to; + DECODING[to - MIN_DECODING] = from; + } +} diff -r 909918accebf -r 43400f0f2b47 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornCallSiteDescriptor.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornCallSiteDescriptor.java Thu Oct 29 12:39:57 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornCallSiteDescriptor.java Mon Nov 02 18:26:53 2015 +0100 @@ -38,7 +38,6 @@ import jdk.internal.dynalink.NamedOperation; import jdk.internal.dynalink.Operation; import jdk.internal.dynalink.StandardOperation; -import jdk.internal.dynalink.support.NameCodec; import jdk.nashorn.internal.ir.debug.NashornTextifier; import jdk.nashorn.internal.runtime.AccessControlContextFactory; import jdk.nashorn.internal.runtime.ScriptRuntime;