nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornBeansLinker.java
author attila
Tue, 13 Jan 2015 16:38:29 +0100
changeset 28437 b9b1042592e6
parent 27367 47c1c541f45d
child 28440 a3649e11ca41
permissions -rw-r--r--
8068889: Calling a @FunctionalInterface from JS leaks internal objects Reviewed-by: jlaskey, sundar
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
28437
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
    28
import static jdk.nashorn.internal.lookup.Lookup.MH;
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
    29
import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
    30
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    31
import java.lang.invoke.MethodHandle;
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    32
import java.lang.invoke.MethodHandles;
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    33
import java.lang.invoke.MethodType;
28437
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
    34
import java.lang.reflect.Method;
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
    35
import java.lang.reflect.Modifier;
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
    36
import jdk.internal.dynalink.CallSiteDescriptor;
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    37
import jdk.internal.dynalink.beans.BeansLinker;
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    38
import jdk.internal.dynalink.linker.ConversionComparator.Comparison;
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    39
import jdk.internal.dynalink.linker.GuardedInvocation;
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    40
import jdk.internal.dynalink.linker.GuardingDynamicLinker;
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    41
import jdk.internal.dynalink.linker.LinkRequest;
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    42
import jdk.internal.dynalink.linker.LinkerServices;
28437
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
    43
import jdk.internal.dynalink.support.Guards;
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    44
import jdk.internal.dynalink.support.Lookup;
27099
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    45
import jdk.nashorn.api.scripting.ScriptUtils;
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    46
import jdk.nashorn.internal.objects.NativeArray;
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    47
import jdk.nashorn.internal.runtime.ConsString;
28437
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
    48
import jdk.nashorn.internal.runtime.Context;
27099
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    49
import jdk.nashorn.internal.runtime.ScriptObject;
28437
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
    50
import jdk.nashorn.internal.runtime.ScriptRuntime;
27099
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    51
import jdk.nashorn.internal.runtime.options.Options;
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    52
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    53
/**
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    54
 * 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
    55
 * {@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
    56
 * 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
    57
 * 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
    58
 * the target method handle parameter signature is {@code Object}.
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    59
 */
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    60
public class NashornBeansLinker implements GuardingDynamicLinker {
27099
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
    61
    // 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
    62
    // 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
    63
    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
    64
27367
47c1c541f45d 8062624: java.lang.String methods not available on concatenated strings
hannesw
parents: 27099
diff changeset
    65
    private static final MethodHandle EXPORT_ARGUMENT;
47c1c541f45d 8062624: java.lang.String methods not available on concatenated strings
hannesw
parents: 27099
diff changeset
    66
    private static final MethodHandle EXPORT_NATIVE_ARRAY;
47c1c541f45d 8062624: java.lang.String methods not available on concatenated strings
hannesw
parents: 27099
diff changeset
    67
    private static final MethodHandle EXPORT_SCRIPT_OBJECT;
47c1c541f45d 8062624: java.lang.String methods not available on concatenated strings
hannesw
parents: 27099
diff changeset
    68
    private static final MethodHandle IMPORT_RESULT;
47c1c541f45d 8062624: java.lang.String methods not available on concatenated strings
hannesw
parents: 27099
diff changeset
    69
    private static final MethodHandle FILTER_CONSSTRING;
47c1c541f45d 8062624: java.lang.String methods not available on concatenated strings
hannesw
parents: 27099
diff changeset
    70
47c1c541f45d 8062624: java.lang.String methods not available on concatenated strings
hannesw
parents: 27099
diff changeset
    71
    static {
47c1c541f45d 8062624: java.lang.String methods not available on concatenated strings
hannesw
parents: 27099
diff changeset
    72
        final Lookup lookup  = new Lookup(MethodHandles.lookup());
47c1c541f45d 8062624: java.lang.String methods not available on concatenated strings
hannesw
parents: 27099
diff changeset
    73
        EXPORT_ARGUMENT      = lookup.findOwnStatic("exportArgument", Object.class, Object.class);
47c1c541f45d 8062624: java.lang.String methods not available on concatenated strings
hannesw
parents: 27099
diff changeset
    74
        EXPORT_NATIVE_ARRAY  = lookup.findOwnStatic("exportNativeArray", Object.class, NativeArray.class);
47c1c541f45d 8062624: java.lang.String methods not available on concatenated strings
hannesw
parents: 27099
diff changeset
    75
        EXPORT_SCRIPT_OBJECT = lookup.findOwnStatic("exportScriptObject", Object.class, ScriptObject.class);
47c1c541f45d 8062624: java.lang.String methods not available on concatenated strings
hannesw
parents: 27099
diff changeset
    76
        IMPORT_RESULT        = lookup.findOwnStatic("importResult", Object.class, Object.class);
47c1c541f45d 8062624: java.lang.String methods not available on concatenated strings
hannesw
parents: 27099
diff changeset
    77
        FILTER_CONSSTRING    = lookup.findOwnStatic("consStringFilter", Object.class, Object.class);
47c1c541f45d 8062624: java.lang.String methods not available on concatenated strings
hannesw
parents: 27099
diff changeset
    78
    }
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    79
28437
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
    80
    // cache of @FunctionalInterface method of implementor classes
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
    81
    private static final ClassValue<Method> FUNCTIONAL_IFACE_METHOD = new ClassValue<Method>() {
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
    82
        @Override
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
    83
        protected Method computeValue(final Class<?> type) {
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
    84
            return findFunctionalInterfaceMethod(type);
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
    85
        }
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
    86
    };
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
    87
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    88
    private final BeansLinker beansLinker = new BeansLinker();
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    89
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    90
    @Override
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
    91
    public GuardedInvocation getGuardedInvocation(final LinkRequest linkRequest, final LinkerServices linkerServices) throws Exception {
28437
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
    92
        final Object self = linkRequest.getReceiver();
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
    93
        final CallSiteDescriptor desc = linkRequest.getCallSiteDescriptor();
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
    94
        if (self instanceof ConsString) {
27367
47c1c541f45d 8062624: java.lang.String methods not available on concatenated strings
hannesw
parents: 27099
diff changeset
    95
            // In order to treat ConsString like a java.lang.String we need a link request with a string receiver.
47c1c541f45d 8062624: java.lang.String methods not available on concatenated strings
hannesw
parents: 27099
diff changeset
    96
            final Object[] arguments = linkRequest.getArguments();
47c1c541f45d 8062624: java.lang.String methods not available on concatenated strings
hannesw
parents: 27099
diff changeset
    97
            arguments[0] = "";
28437
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
    98
            final LinkRequest forgedLinkRequest = linkRequest.replaceArguments(desc, arguments);
27367
47c1c541f45d 8062624: java.lang.String methods not available on concatenated strings
hannesw
parents: 27099
diff changeset
    99
            final GuardedInvocation invocation = getGuardedInvocation(beansLinker, forgedLinkRequest, linkerServices);
47c1c541f45d 8062624: java.lang.String methods not available on concatenated strings
hannesw
parents: 27099
diff changeset
   100
            // If an invocation is found we add a filter that makes it work for both Strings and ConsStrings.
47c1c541f45d 8062624: java.lang.String methods not available on concatenated strings
hannesw
parents: 27099
diff changeset
   101
            return invocation == null ? null : invocation.filterArguments(0, FILTER_CONSSTRING);
47c1c541f45d 8062624: java.lang.String methods not available on concatenated strings
hannesw
parents: 27099
diff changeset
   102
        }
28437
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   103
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   104
        if ("call".equals(desc.getNameToken(CallSiteDescriptor.OPERATOR))) {
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   105
            // Support dyn:call on any object that supports some @FunctionalInterface
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   106
            // annotated interface. This way Java method, constructor references or
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   107
            // implementations of java.util.function.* interfaces can be called as though
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   108
            // those are script functions.
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   109
            final Method m = getFunctionalInterfaceMethod(self.getClass());
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   110
            if (m != null) {
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   111
                final MethodType callType = desc.getMethodType();
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   112
                // 'callee' and 'thiz' passed from script + actual arguments
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   113
                if (callType.parameterCount() != m.getParameterCount() + 2) {
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   114
                    throw typeError("no.method.matches.args", ScriptRuntime.safeToString(self));
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   115
                }
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   116
                return new GuardedInvocation(
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   117
                        // drop 'thiz' passed from the script.
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   118
                        MH.dropArguments(desc.getLookup().unreflect(m), 1, callType.parameterType(1)),
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   119
                        Guards.getInstanceOfGuard(m.getDeclaringClass())).asTypeSafeReturn(
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   120
                                new NashornBeansLinkerServices(linkerServices), callType);
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   121
            }
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   122
        }
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   123
        return getGuardedInvocation(beansLinker, linkRequest, linkerServices);
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   124
    }
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   125
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   126
    /**
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   127
     * 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
   128
     * conversions that this class does.
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   129
     * @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
   130
     * @param linkRequest the delegated link request
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   131
     * @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
   132
     * @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
   133
     * @throws Exception if the delegate throws an exception
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   134
     */
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   135
    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
   136
        return delegateLinker.getGuardedInvocation(linkRequest, new NashornBeansLinkerServices(linkerServices));
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   137
    }
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   138
27099
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   139
    @SuppressWarnings("unused")
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   140
    private static Object exportArgument(final Object arg) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   141
        return exportArgument(arg, MIRROR_ALWAYS);
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   142
    }
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   143
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   144
    @SuppressWarnings("unused")
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   145
    private static Object exportNativeArray(final NativeArray arg) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   146
        return exportArgument(arg, MIRROR_ALWAYS);
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   147
    }
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   148
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   149
    @SuppressWarnings("unused")
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   150
    private static Object exportScriptObject(final ScriptObject arg) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   151
        return exportArgument(arg, MIRROR_ALWAYS);
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
    @SuppressWarnings("unused")
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   155
    private static Object exportScriptArray(final NativeArray arg) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   156
        return exportArgument(arg, MIRROR_ALWAYS);
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   157
    }
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   158
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   159
    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
   160
        if (arg instanceof ConsString) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   161
            return arg.toString();
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   162
        } else if (mirrorAlways && arg instanceof ScriptObject) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   163
            return ScriptUtils.wrap((ScriptObject)arg);
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   164
        } else {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   165
            return arg;
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
    }
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   168
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   169
    @SuppressWarnings("unused")
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   170
    private static Object importResult(final Object arg) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   171
        return ScriptUtils.unwrap(arg);
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   172
    }
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   173
27367
47c1c541f45d 8062624: java.lang.String methods not available on concatenated strings
hannesw
parents: 27099
diff changeset
   174
    @SuppressWarnings("unused")
47c1c541f45d 8062624: java.lang.String methods not available on concatenated strings
hannesw
parents: 27099
diff changeset
   175
    private static Object consStringFilter(final Object arg) {
47c1c541f45d 8062624: java.lang.String methods not available on concatenated strings
hannesw
parents: 27099
diff changeset
   176
        return arg instanceof ConsString ? arg.toString() : arg;
47c1c541f45d 8062624: java.lang.String methods not available on concatenated strings
hannesw
parents: 27099
diff changeset
   177
    }
47c1c541f45d 8062624: java.lang.String methods not available on concatenated strings
hannesw
parents: 27099
diff changeset
   178
28437
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   179
    private static Method findFunctionalInterfaceMethod(final Class<?> clazz) {
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   180
        if (clazz == null) {
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   181
            return null;
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   182
        }
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   183
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   184
        for (final Class<?> iface : clazz.getInterfaces()) {
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   185
            // check accessiblity up-front
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   186
            if (! Context.isAccessibleClass(iface)) {
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   187
                continue;
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   188
            }
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   189
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   190
            // check for @FunctionalInterface
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   191
            if (iface.isAnnotationPresent(FunctionalInterface.class)) {
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   192
                // return the first abstract method
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   193
                for (final Method m : iface.getMethods()) {
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   194
                    if (Modifier.isAbstract(m.getModifiers())) {
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   195
                        return m;
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   196
                    }
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   197
                }
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   198
            }
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   199
        }
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   200
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   201
        // did not find here, try super class
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   202
        return findFunctionalInterfaceMethod(clazz.getSuperclass());
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   203
    }
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   204
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   205
    // Returns @FunctionalInterface annotated interface's single abstract
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   206
    // method. If not found, returns null.
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   207
    static Method getFunctionalInterfaceMethod(final Class<?> clazz) {
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   208
        return FUNCTIONAL_IFACE_METHOD.get(clazz);
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   209
    }
b9b1042592e6 8068889: Calling a @FunctionalInterface from JS leaks internal objects
attila
parents: 27367
diff changeset
   210
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   211
    private static class NashornBeansLinkerServices implements LinkerServices {
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   212
        private final LinkerServices linkerServices;
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   213
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   214
        NashornBeansLinkerServices(final LinkerServices linkerServices) {
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   215
            this.linkerServices = linkerServices;
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   216
        }
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   217
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   218
        @Override
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   219
        public MethodHandle asType(final MethodHandle handle, final MethodType fromType) {
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   220
            final MethodType handleType = handle.type();
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   221
            final int paramCount = handleType.parameterCount();
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   222
            assert fromType.parameterCount() == handleType.parameterCount();
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   223
27099
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   224
            MethodType newFromType = fromType;
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   225
            MethodHandle[] filters = null;
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   226
            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
   227
                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
   228
                if (filter != null) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   229
                    if (filters == null) {
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   230
                        filters = new MethodHandle[paramCount];
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   231
                    }
27099
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   232
                    // "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
   233
                    newFromType = newFromType.changeParameterType(i, Object.class);
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   234
                    filters[i] = filter;
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   235
                }
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   236
            }
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   237
27099
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   238
            final MethodHandle typed = linkerServices.asType(handle, newFromType);
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   239
            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
   240
            // 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
   241
            // 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
   242
            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
   243
                result = MethodHandles.filterReturnValue(result, IMPORT_RESULT);
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   244
            }
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   245
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   246
            return result;
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   247
        }
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   248
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   249
        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
   250
            if (handleType == Object.class) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   251
                if (fromType == Object.class) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   252
                    return EXPORT_ARGUMENT;
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   253
                } else if (fromType == NativeArray.class) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   254
                    return EXPORT_NATIVE_ARRAY;
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   255
                } else if (fromType == ScriptObject.class) {
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   256
                    return EXPORT_SCRIPT_OBJECT;
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   257
                }
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   258
            }
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   259
            return null;
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   260
        }
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   261
eceb216332cb 8050977: Java8 Javascript Nashorn exception: no current Global instance for nashorn
sundar
parents: 26651
diff changeset
   262
        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
   263
            return handleType == Object.class && fromType == Object.class;
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   264
        }
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   265
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21686
diff changeset
   266
        @Override
24778
2ff5d7041566 8044638: Tidy up Nashorn codebase for code standards
attila
parents: 24754
diff changeset
   267
        public MethodHandle asTypeLosslessReturn(final MethodHandle handle, final MethodType fromType) {
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21686
diff changeset
   268
            return Implementation.asTypeLosslessReturn(this, handle, fromType);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21686
diff changeset
   269
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21686
diff changeset
   270
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   271
        @Override
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   272
        public MethodHandle getTypeConverter(final Class<?> sourceType, final Class<?> targetType) {
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   273
            return linkerServices.getTypeConverter(sourceType, targetType);
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   274
        }
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   275
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   276
        @Override
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   277
        public boolean canConvert(final Class<?> from, final Class<?> to) {
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   278
            return linkerServices.canConvert(from, to);
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   279
        }
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   280
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   281
        @Override
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   282
        public GuardedInvocation getGuardedInvocation(final LinkRequest linkRequest) throws Exception {
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   283
            return linkerServices.getGuardedInvocation(linkRequest);
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   284
        }
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   285
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   286
        @Override
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   287
        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
   288
            if (sourceType == ConsString.class) {
c04136234037 8058615: Overload resolution ambiguity involving ConsString
sundar
parents: 25865
diff changeset
   289
                if (String.class == targetType1 || CharSequence.class == targetType1) {
c04136234037 8058615: Overload resolution ambiguity involving ConsString
sundar
parents: 25865
diff changeset
   290
                    return Comparison.TYPE_1_BETTER;
c04136234037 8058615: Overload resolution ambiguity involving ConsString
sundar
parents: 25865
diff changeset
   291
                }
c04136234037 8058615: Overload resolution ambiguity involving ConsString
sundar
parents: 25865
diff changeset
   292
c04136234037 8058615: Overload resolution ambiguity involving ConsString
sundar
parents: 25865
diff changeset
   293
                if (String.class == targetType2 || CharSequence.class == targetType2) {
c04136234037 8058615: Overload resolution ambiguity involving ConsString
sundar
parents: 25865
diff changeset
   294
                    return Comparison.TYPE_2_BETTER;
c04136234037 8058615: Overload resolution ambiguity involving ConsString
sundar
parents: 25865
diff changeset
   295
                }
c04136234037 8058615: Overload resolution ambiguity involving ConsString
sundar
parents: 25865
diff changeset
   296
            }
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   297
            return linkerServices.compareConversion(sourceType, targetType1, targetType2);
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   298
        }
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   299
    }
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents:
diff changeset
   300
}