nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornBeansLinker.java
author sundar
Mon, 13 Oct 2014 23:38:49 +0530
changeset 27099 eceb216332cb
parent 26651 c04136234037
child 27367 47c1c541f45d
permissions -rw-r--r--
8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn Reviewed-by: attila, lagergren, hannesw
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
     1
/*
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
     2
 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
     4
 *
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    10
 *
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    15
 * accompanied this code).
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    16
 *
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    20
 *
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    23
 * questions.
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    24
 */
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    25
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    26
package jdk.nashorn.internal.runtime.linker;
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    27
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    28
import java.lang.invoke.MethodHandle;
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    29
import java.lang.invoke.MethodHandles;
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    30
import java.lang.invoke.MethodType;
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    31
import jdk.internal.dynalink.beans.BeansLinker;
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    32
import jdk.internal.dynalink.linker.ConversionComparator.Comparison;
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    33
import jdk.internal.dynalink.linker.GuardedInvocation;
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    34
import jdk.internal.dynalink.linker.GuardingDynamicLinker;
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    35
import jdk.internal.dynalink.linker.LinkRequest;
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    36
import jdk.internal.dynalink.linker.LinkerServices;
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    37
import jdk.internal.dynalink.support.Lookup;
27099
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    38
import jdk.nashorn.api.scripting.ScriptUtils;
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    39
import jdk.nashorn.internal.objects.NativeArray;
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    40
import jdk.nashorn.internal.runtime.ConsString;
27099
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    41
import jdk.nashorn.internal.runtime.ScriptObject;
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    42
import jdk.nashorn.internal.runtime.options.Options;
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    43
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    44
/**
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    45
 * This linker delegates to a {@code BeansLinker} but passes it a special linker services object that has a modified
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    46
 * {@code asType} method that will ensure that we never pass internal engine objects that should not be externally
27099
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    47
 * observable (currently ConsString and ScriptObject) to Java APIs, but rather that we flatten it into a String. We can't just add
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    48
 * this functionality as custom converters via {@code GuaardingTypeConverterFactory}, since they are not consulted when
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    49
 * the target method handle parameter signature is {@code Object}.
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    50
 */
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    51
public class NashornBeansLinker implements GuardingDynamicLinker {
27099
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    52
    // System property to control whether to wrap ScriptObject->ScriptObjectMirror for
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    53
    // Object type arguments of Java method calls, field set and array set.
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    54
    private static final boolean MIRROR_ALWAYS = Options.getBooleanProperty("nashorn.mirror.always", true);
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    55
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    56
    private static final MethodHandle EXPORT_ARGUMENT = new Lookup(MethodHandles.lookup()).findOwnStatic("exportArgument", Object.class, Object.class);
27099
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    57
    private static final MethodHandle EXPORT_NATIVE_ARRAY = new Lookup(MethodHandles.lookup()).findOwnStatic("exportNativeArray", Object.class, NativeArray.class);
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    58
    private static final MethodHandle EXPORT_SCRIPT_OBJECT = new Lookup(MethodHandles.lookup()).findOwnStatic("exportScriptObject", Object.class, ScriptObject.class);
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    59
    private static final MethodHandle IMPORT_RESULT = new Lookup(MethodHandles.lookup()).findOwnStatic("importResult", Object.class, Object.class);
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    60
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    61
    private final BeansLinker beansLinker = new BeansLinker();
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    62
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    63
    @Override
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    64
    public GuardedInvocation getGuardedInvocation(final LinkRequest linkRequest, final LinkerServices linkerServices) throws Exception {
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    65
        return getGuardedInvocation(beansLinker, linkRequest, linkerServices);
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    66
    }
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    67
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    68
    /**
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    69
     * Delegates to the specified linker but injects its linker services wrapper so that it will apply all special
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    70
     * conversions that this class does.
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    71
     * @param delegateLinker the linker to which the actual work is delegated to.
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    72
     * @param linkRequest the delegated link request
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    73
     * @param linkerServices the original link services that will be augmented with special conversions
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    74
     * @return the guarded invocation from the delegate, possibly augmented with special conversions
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    75
     * @throws Exception if the delegate throws an exception
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    76
     */
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    77
    public static GuardedInvocation getGuardedInvocation(final GuardingDynamicLinker delegateLinker, final LinkRequest linkRequest, final LinkerServices linkerServices) throws Exception {
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    78
        return delegateLinker.getGuardedInvocation(linkRequest, new NashornBeansLinkerServices(linkerServices));
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    79
    }
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    80
27099
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    81
    @SuppressWarnings("unused")
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    82
    private static Object exportArgument(final Object arg) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    83
        return exportArgument(arg, MIRROR_ALWAYS);
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    84
    }
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    85
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    86
    @SuppressWarnings("unused")
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    87
    private static Object exportNativeArray(final NativeArray arg) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    88
        return exportArgument(arg, MIRROR_ALWAYS);
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    89
    }
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    90
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    91
    @SuppressWarnings("unused")
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    92
    private static Object exportScriptObject(final ScriptObject arg) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    93
        return exportArgument(arg, MIRROR_ALWAYS);
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    94
    }
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    95
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    96
    @SuppressWarnings("unused")
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    97
    private static Object exportScriptArray(final NativeArray arg) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    98
        return exportArgument(arg, MIRROR_ALWAYS);
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    99
    }
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   100
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   101
    static Object exportArgument(final Object arg, final boolean mirrorAlways) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   102
        if (arg instanceof ConsString) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   103
            return arg.toString();
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   104
        } else if (mirrorAlways && arg instanceof ScriptObject) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   105
            return ScriptUtils.wrap((ScriptObject)arg);
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   106
        } else {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   107
            return arg;
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   108
        }
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   109
    }
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   110
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   111
    @SuppressWarnings("unused")
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   112
    private static Object importResult(final Object arg) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   113
        return ScriptUtils.unwrap(arg);
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   114
    }
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   115
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   116
    private static class NashornBeansLinkerServices implements LinkerServices {
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   117
        private final LinkerServices linkerServices;
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   118
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   119
        NashornBeansLinkerServices(final LinkerServices linkerServices) {
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   120
            this.linkerServices = linkerServices;
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   121
        }
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   122
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   123
        @Override
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   124
        public MethodHandle asType(final MethodHandle handle, final MethodType fromType) {
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   125
            final MethodType handleType = handle.type();
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   126
            final int paramCount = handleType.parameterCount();
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   127
            assert fromType.parameterCount() == handleType.parameterCount();
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   128
27099
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   129
            MethodType newFromType = fromType;
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   130
            MethodHandle[] filters = null;
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   131
            for(int i = 0; i < paramCount; ++i) {
27099
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   132
                final MethodHandle filter = argConversionFilter(handleType.parameterType(i), fromType.parameterType(i));
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   133
                if (filter != null) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   134
                    if (filters == null) {
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   135
                        filters = new MethodHandle[paramCount];
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   136
                    }
27099
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   137
                    // "erase" specific type with Object type or else we'll get filter mismatch
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   138
                    newFromType = newFromType.changeParameterType(i, Object.class);
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   139
                    filters[i] = filter;
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   140
                }
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   141
            }
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   142
27099
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   143
            final MethodHandle typed = linkerServices.asType(handle, newFromType);
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   144
            MethodHandle result = filters != null ? MethodHandles.filterArguments(typed, 0, filters) : typed;
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   145
            // Filter Object typed return value for possible ScriptObjectMirror. We convert
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   146
            // ScriptObjectMirror as ScriptObject (if it is mirror from current global).
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   147
            if (MIRROR_ALWAYS && areBothObjects(handleType.returnType(), fromType.returnType())) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   148
                result = MethodHandles.filterReturnValue(result, IMPORT_RESULT);
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   149
            }
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   150
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   151
            return result;
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   152
        }
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   153
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   154
        private static MethodHandle argConversionFilter(final Class<?> handleType, final Class<?> fromType) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   155
            if (handleType == Object.class) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   156
                if (fromType == Object.class) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   157
                    return EXPORT_ARGUMENT;
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   158
                } else if (fromType == NativeArray.class) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   159
                    return EXPORT_NATIVE_ARRAY;
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   160
                } else if (fromType == ScriptObject.class) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   161
                    return EXPORT_SCRIPT_OBJECT;
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   162
                }
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   163
            }
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   164
            return null;
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   165
        }
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   166
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   167
        private static boolean areBothObjects(final Class<?> handleType, final Class<?> fromType) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   168
            return handleType == Object.class && fromType == Object.class;
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   169
        }
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   170
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21686
diff changeset
   171
        @Override
24778
2ff5d7041566 8044638: Tidy up Nashorn codebase for code standards
attila
parents: 24754
diff changeset
   172
        public MethodHandle asTypeLosslessReturn(final MethodHandle handle, final MethodType fromType) {
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21686
diff changeset
   173
            return Implementation.asTypeLosslessReturn(this, handle, fromType);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21686
diff changeset
   174
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21686
diff changeset
   175
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   176
        @Override
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   177
        public MethodHandle getTypeConverter(final Class<?> sourceType, final Class<?> targetType) {
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   178
            return linkerServices.getTypeConverter(sourceType, targetType);
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   179
        }
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   180
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   181
        @Override
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   182
        public boolean canConvert(final Class<?> from, final Class<?> to) {
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   183
            return linkerServices.canConvert(from, to);
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   184
        }
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   185
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   186
        @Override
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   187
        public GuardedInvocation getGuardedInvocation(final LinkRequest linkRequest) throws Exception {
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   188
            return linkerServices.getGuardedInvocation(linkRequest);
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   189
        }
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   190
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   191
        @Override
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   192
        public Comparison compareConversion(final Class<?> sourceType, final Class<?> targetType1, final Class<?> targetType2) {
26651
c04136234037 8058615: Overload resolution ambiguity involving ConsString
sundar
parents: 25865
diff changeset
   193
            if (sourceType == ConsString.class) {
c04136234037 8058615: Overload resolution ambiguity involving ConsString
sundar
parents: 25865
diff changeset
   194
                if (String.class == targetType1 || CharSequence.class == targetType1) {
c04136234037 8058615: Overload resolution ambiguity involving ConsString
sundar
parents: 25865
diff changeset
   195
                    return Comparison.TYPE_1_BETTER;
c04136234037 8058615: Overload resolution ambiguity involving ConsString
sundar
parents: 25865
diff changeset
   196
                }
c04136234037 8058615: Overload resolution ambiguity involving ConsString
sundar
parents: 25865
diff changeset
   197
c04136234037 8058615: Overload resolution ambiguity involving ConsString
sundar
parents: 25865
diff changeset
   198
                if (String.class == targetType2 || CharSequence.class == targetType2) {
c04136234037 8058615: Overload resolution ambiguity involving ConsString
sundar
parents: 25865
diff changeset
   199
                    return Comparison.TYPE_2_BETTER;
c04136234037 8058615: Overload resolution ambiguity involving ConsString
sundar
parents: 25865
diff changeset
   200
                }
c04136234037 8058615: Overload resolution ambiguity involving ConsString
sundar
parents: 25865
diff changeset
   201
            }
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   202
            return linkerServices.compareConversion(sourceType, targetType1, targetType2);
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   203
        }
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   204
    }
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   205
}