nashorn/src/jdk/nashorn/internal/runtime/linker/NashornBottomLinker.java
author jlaskey
Fri, 21 Dec 2012 16:36:24 -0400
changeset 16147 e63b63819133
child 16151 97c1e756ae1e
permissions -rw-r--r--
8005403: Open-source Nashorn Reviewed-by: attila, hannesw, lagergren, sundar Contributed-by: james.laskey@oracle.com, akhil.arora@oracle.com, andreas.woess@jku.at, attila.szegedi@oracle.com, hannes.wallnoefer@oracle.com, henry.jen@oracle.com, marcus.lagergren@oracle.com, pavel.semenov@oracle.com, pavel.stepanov@oracle.com, petr.hejl@oracle.com, petr.pisl@oracle.com, sundararajan.athijegannathan@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     1
/*
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     2
 * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     4
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    10
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    15
 * accompanied this code).
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    16
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    20
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    23
 * questions.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    24
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    25
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    26
package jdk.nashorn.internal.runtime.linker;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    27
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    28
import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    29
import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    30
import static jdk.nashorn.internal.runtime.linker.Lookup.MH;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    31
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    32
import java.lang.invoke.MethodHandle;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    33
import jdk.nashorn.internal.runtime.Context;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    34
import jdk.nashorn.internal.runtime.ScriptObject;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    35
import jdk.nashorn.internal.runtime.ScriptRuntime;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    36
import org.dynalang.dynalink.CallSiteDescriptor;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    37
import org.dynalang.dynalink.linker.GuardedInvocation;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    38
import org.dynalang.dynalink.linker.GuardingDynamicLinker;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    39
import org.dynalang.dynalink.linker.LinkRequest;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    40
import org.dynalang.dynalink.linker.LinkerServices;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    41
import org.dynalang.dynalink.support.Guards;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    42
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    43
/**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    44
 * Nashorn bottom linker; used as a last-resort catch-all linker for all linking requests that fall through all other
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    45
 * linkers (see how {@link Bootstrap} class configures the dynamic linker in its static initializer). It will throw
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    46
 * appropriate ECMAScript errors for attempts to invoke operations on {@code null}, link no-op property getters and
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    47
 * setters for Java objects that couldn't be linked by any other linker, and throw appropriate ECMAScript errors for
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    48
 * attempts to invoke arbitrary Java objects as functions or constructors.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    49
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    50
class NashornBottomLinker implements GuardingDynamicLinker {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    51
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    52
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    53
    public GuardedInvocation getGuardedInvocation(final LinkRequest linkRequest, final LinkerServices linkerServices)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    54
            throws Exception {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    55
        final Object self = linkRequest.getReceiver();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    56
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    57
        if (self == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    58
            return linkNull(linkRequest);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    59
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    60
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    61
        // None of the objects that can be linked by NashornLinker should ever reach here. Basically, anything below
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    62
        // this point is a generic Java bean. Therefore, reaching here with a ScriptObject is a Nashorn bug.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    63
        assert isExpectedObject(self) : "Couldn't link " + linkRequest.getCallSiteDescriptor() + " for " + self.getClass().getName();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    64
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    65
        return linkBean(linkRequest, linkerServices);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    66
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    67
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    68
    private static final MethodHandle EMPTY_PROP_GETTER =
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    69
            MH.dropArguments(MH.constant(Object.class, UNDEFINED), 0, Object.class);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    70
    private static final MethodHandle EMPTY_ELEM_GETTER =
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    71
            MH.dropArguments(EMPTY_PROP_GETTER, 0, Object.class);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    72
    private static final MethodHandle EMPTY_PROP_SETTER =
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    73
            MH.asType(EMPTY_ELEM_GETTER, EMPTY_ELEM_GETTER.type().changeReturnType(void.class));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    74
    private static final MethodHandle EMPTY_ELEM_SETTER =
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    75
            MH.dropArguments(EMPTY_PROP_SETTER, 0, Object.class);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    76
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    77
    private static GuardedInvocation linkBean(final LinkRequest linkRequest, final LinkerServices linkerServices) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    78
        final NashornCallSiteDescriptor desc = (NashornCallSiteDescriptor)linkRequest.getCallSiteDescriptor();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    79
        final Object self = linkRequest.getReceiver();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    80
        final String operator = desc.getFirstOperator();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    81
        switch (operator) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    82
        case "new":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    83
            if(isJavaDynamicMethod(self)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    84
                typeError(Context.getGlobal(), "method.not.constructor", ScriptRuntime.safeToString(self));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    85
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    86
                typeError(Context.getGlobal(), "not.a.function", ScriptRuntime.safeToString(self));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    87
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    88
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    89
        case "call":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    90
            if(isJavaDynamicMethod(self)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    91
                typeError(Context.getGlobal(), "no.method.matches.args", ScriptRuntime.safeToString(self));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    92
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    93
                typeError(Context.getGlobal(), "not.a.function", ScriptRuntime.safeToString(self));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    94
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    95
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    96
        case "callMethod":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    97
        case "getMethod":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    98
            typeError(Context.getGlobal(), "no.such.function", getArgument(linkRequest), ScriptRuntime.safeToString(self));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    99
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   100
        case "getProp":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   101
        case "getElem":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   102
            if (desc.getOperand() != null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   103
                return getInvocation(EMPTY_PROP_GETTER, self, linkerServices, desc);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   104
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   105
            return getInvocation(EMPTY_ELEM_GETTER, self, linkerServices, desc);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   106
        case "setProp":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   107
        case "setElem":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   108
            if (desc.getOperand() != null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   109
                return getInvocation(EMPTY_PROP_SETTER, self, linkerServices, desc);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   110
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   111
            return getInvocation(EMPTY_ELEM_SETTER, self, linkerServices, desc);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   112
        default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   113
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   114
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   115
        throw new AssertionError("unknown call type " + desc);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   116
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   117
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   118
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   119
     * Returns true if the object is a Dynalink dynamic method. Unfortunately, the dynamic method classes are package
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   120
     * private in Dynalink, so this is the closest we can get to determining it.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   121
     * @param obj the object we want to test for being a dynamic method
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   122
     * @return true if it is a dynamic method, false otherwise.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   123
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   124
    private static boolean isJavaDynamicMethod(Object obj) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   125
        return obj.getClass().getName().endsWith("DynamicMethod");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   126
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   127
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   128
    private static GuardedInvocation getInvocation(final MethodHandle handle, final Object self, final LinkerServices linkerServices, final CallSiteDescriptor desc) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   129
        return Bootstrap.asType(new GuardedInvocation(handle, Guards.getClassGuard(self.getClass())), linkerServices, desc);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   130
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   131
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   132
    // Used solely in an assertion to figure out if the object we get here is something we in fact expect. Objects
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   133
    // linked by NashornLinker should never reach here.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   134
    private static boolean isExpectedObject(final Object obj) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   135
        return !(NashornLinker.canLinkTypeStatic(obj.getClass()));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   136
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   137
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   138
    private static GuardedInvocation linkNull(final LinkRequest linkRequest) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   139
        final ScriptObject global = Context.getGlobal();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   140
        final NashornCallSiteDescriptor desc = (NashornCallSiteDescriptor)linkRequest.getCallSiteDescriptor();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   141
        final String operator = desc.getFirstOperator();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   142
        switch (operator) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   143
        case "new":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   144
        case "call":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   145
            typeError(global, "not.a.function", "null");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   146
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   147
        case "callMethod":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   148
        case "getMethod":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   149
            typeError(global, "no.such.function", getArgument(linkRequest), "null");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   150
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   151
        case "getProp":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   152
        case "getElem":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   153
            typeError(global, "cant.get.property", getArgument(linkRequest), "null");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   154
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   155
        case "setProp":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   156
        case "setElem":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   157
            typeError(global, "cant.set.property", getArgument(linkRequest), "null");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   158
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   159
        default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   160
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   161
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   162
        throw new AssertionError("unknown call type " + desc);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   163
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   164
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   165
    private static String getArgument(final LinkRequest linkRequest) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   166
        final CallSiteDescriptor desc = linkRequest.getCallSiteDescriptor();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   167
        if (desc.getNameTokenCount() > 2) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   168
            return desc.getNameToken(2);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   169
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   170
        return ScriptRuntime.safeToString(linkRequest.getArguments()[1]);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   171
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   172
}