nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornPrimitiveLinker.java
author attila
Mon, 02 Mar 2015 14:33:55 +0100
changeset 29282 a8523237b66c
parent 25865 d38d876f1654
child 33332 f180be6368d8
permissions -rw-r--r--
8074031: Canonicalize is-a-JS-string tests Reviewed-by: hannesw, lagergren
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     1
/*
16151
97c1e756ae1e 8005663: Update copyright year to 2013
jlaskey
parents: 16147
diff changeset
     2
 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
16147
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
16277
fd698c5ee684 8009559: clean up method handle lookup code.
sundar
parents: 16234
diff changeset
    28
import static jdk.nashorn.internal.lookup.Lookup.MH;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    29
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    30
import java.lang.invoke.MethodHandle;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    31
import java.lang.invoke.MethodHandles;
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents: 16195
diff changeset
    32
import jdk.internal.dynalink.linker.ConversionComparator;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents: 16195
diff changeset
    33
import jdk.internal.dynalink.linker.GuardedInvocation;
22669
75563515567f 8032681: Issues with Nashorn
attila
parents: 16277
diff changeset
    34
import jdk.internal.dynalink.linker.GuardedTypeConversion;
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents: 16195
diff changeset
    35
import jdk.internal.dynalink.linker.GuardingTypeConverterFactory;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents: 16195
diff changeset
    36
import jdk.internal.dynalink.linker.LinkRequest;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents: 16195
diff changeset
    37
import jdk.internal.dynalink.linker.LinkerServices;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents: 16195
diff changeset
    38
import jdk.internal.dynalink.linker.TypeBasedGuardingDynamicLinker;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents: 16195
diff changeset
    39
import jdk.internal.dynalink.support.TypeUtilities;
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 22669
diff changeset
    40
import jdk.nashorn.internal.objects.Global;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    41
import jdk.nashorn.internal.runtime.ConsString;
29282
a8523237b66c 8074031: Canonicalize is-a-JS-string tests
attila
parents: 25865
diff changeset
    42
import jdk.nashorn.internal.runtime.JSType;
24751
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24731
diff changeset
    43
import jdk.nashorn.internal.runtime.ScriptRuntime;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    44
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    45
/**
16184
bea4e75d192c 8006525: Give StaticClass objects their own linker
attila
parents: 16171
diff changeset
    46
 * Internal linker for String, Boolean, and Number objects, only ever used by Nashorn engine and not exposed to other
bea4e75d192c 8006525: Give StaticClass objects their own linker
attila
parents: 16171
diff changeset
    47
 * engines. It is used for treatment of strings, boolean, and numbers as JavaScript primitives. Also provides ECMAScript
bea4e75d192c 8006525: Give StaticClass objects their own linker
attila
parents: 16171
diff changeset
    48
 * primitive type conversions for these types when linking to Java methods.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    49
 */
16277
fd698c5ee684 8009559: clean up method handle lookup code.
sundar
parents: 16234
diff changeset
    50
final class NashornPrimitiveLinker implements TypeBasedGuardingDynamicLinker, GuardingTypeConverterFactory, ConversionComparator {
24751
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24731
diff changeset
    51
    private static final GuardedTypeConversion VOID_TO_OBJECT = new GuardedTypeConversion(
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24731
diff changeset
    52
            new GuardedInvocation(MethodHandles.constant(Object.class, ScriptRuntime.UNDEFINED)), true);
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24731
diff changeset
    53
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    54
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    55
    public boolean canLinkType(final Class<?> type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    56
        return canLinkTypeStatic(type);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    57
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    58
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    59
    private static boolean canLinkTypeStatic(final Class<?> type) {
16184
bea4e75d192c 8006525: Give StaticClass objects their own linker
attila
parents: 16171
diff changeset
    60
        return type == String.class || type == Boolean.class || type == ConsString.class || Number.class.isAssignableFrom(type);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    61
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    62
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    63
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    64
    public GuardedInvocation getGuardedInvocation(final LinkRequest origRequest, final LinkerServices linkerServices)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    65
            throws Exception {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    66
        final LinkRequest request = origRequest.withoutRuntimeContext(); // Nashorn has no runtime context
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    67
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    68
        final Object self = request.getReceiver();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    69
        final NashornCallSiteDescriptor desc = (NashornCallSiteDescriptor) request.getCallSiteDescriptor();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    70
24731
ab0c8fc915ae 8038406: Testability: as a first step of moving loggers away from the process global space, the Debug object now supports logging POJOs from log entries as an event queue, which can be introspected from test scripts. This is way better than screen scraping brittle and subject-to-change log output.
lagergren
parents: 24727
diff changeset
    71
        return Bootstrap.asTypeSafeReturn(Global.primitiveLookup(request, self), linkerServices, desc);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    72
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    73
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    74
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    75
     * This implementation of type converter factory will pretty much allow implicit conversions of anything to anything
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    76
     * else that's allowed among JavaScript primitive types (string to number, boolean to string, etc.)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    77
     * @param sourceType the type to convert from
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    78
     * @param targetType the type to convert to
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    79
     * @return a conditional converter from source to target type
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    80
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    81
    @Override
22669
75563515567f 8032681: Issues with Nashorn
attila
parents: 16277
diff changeset
    82
    public GuardedTypeConversion convertToType(final Class<?> sourceType, final Class<?> targetType) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    83
        final MethodHandle mh = JavaArgumentConverters.getConverter(targetType);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    84
        if (mh == null) {
24751
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24731
diff changeset
    85
            if(targetType == Object.class && sourceType == void.class) {
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24731
diff changeset
    86
                return VOID_TO_OBJECT;
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24731
diff changeset
    87
            }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    88
            return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    89
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    90
22669
75563515567f 8032681: Issues with Nashorn
attila
parents: 16277
diff changeset
    91
        return new GuardedTypeConversion(new GuardedInvocation(mh, canLinkTypeStatic(sourceType) ? null : GUARD_PRIMITIVE).asType(mh.type().changeParameterType(0, sourceType)), true);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    92
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    93
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    94
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    95
     * Implements the somewhat involved prioritization of JavaScript primitive types conversions. Instead of explaining
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    96
     * it here in prose, just follow the source code comments.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    97
     * @param sourceType the source type to convert from
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    98
     * @param targetType1 one candidate target type
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    99
     * @param targetType2 another candidate target type
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents: 16195
diff changeset
   100
     * @return one of {@link jdk.internal.dynalink.linker.ConversionComparator.Comparison} values signifying which
16184
bea4e75d192c 8006525: Give StaticClass objects their own linker
attila
parents: 16171
diff changeset
   101
     * target type should be favored for conversion.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   102
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   103
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   104
    public Comparison compareConversion(final Class<?> sourceType, final Class<?> targetType1, final Class<?> targetType2) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   105
        final Class<?> wrapper1 = getWrapperTypeOrSelf(targetType1);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   106
        if (sourceType == wrapper1) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   107
            // Source type exactly matches target 1
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   108
            return Comparison.TYPE_1_BETTER;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   109
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   110
        final Class<?> wrapper2 = getWrapperTypeOrSelf(targetType2);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   111
        if (sourceType == wrapper2) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   112
            // Source type exactly matches target 2
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   113
            return Comparison.TYPE_2_BETTER;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   114
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   115
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   116
        if (Number.class.isAssignableFrom(sourceType)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   117
            // If exactly one of the targets is a number, pick it.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   118
            if (Number.class.isAssignableFrom(wrapper1)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   119
                if (!Number.class.isAssignableFrom(wrapper2)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   120
                    return Comparison.TYPE_1_BETTER;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   121
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   122
            } else if (Number.class.isAssignableFrom(wrapper2)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   123
                return Comparison.TYPE_2_BETTER;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   124
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   125
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   126
            // If exactly one of the targets is a character, pick it. Numbers can be reasonably converted to chars using
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   127
            // the UTF-16 values.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   128
            if (Character.class == wrapper1) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   129
                return Comparison.TYPE_1_BETTER;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   130
            } else if (Character.class == wrapper2) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   131
                return Comparison.TYPE_2_BETTER;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   132
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   133
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   134
            // For all other cases, we fall through to the next if statement - not that we repeat the condition in it
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   135
            // too so if we entered this branch, we'll enter the below if statement too.
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
        if (sourceType == String.class || sourceType == Boolean.class || Number.class.isAssignableFrom(sourceType)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   139
            // Treat wrappers as primitives.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   140
            final Class<?> primitiveType1 = getPrimitiveTypeOrSelf(targetType1);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   141
            final Class<?> primitiveType2 = getPrimitiveTypeOrSelf(targetType2);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   142
            // Basically, choose the widest possible primitive type. (First "if" returning TYPE_2_BETTER is correct;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   143
            // when faced with a choice between double and int, choose double).
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   144
            if (TypeUtilities.isMethodInvocationConvertible(primitiveType1, primitiveType2)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   145
                return Comparison.TYPE_2_BETTER;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   146
            } else if (TypeUtilities.isMethodInvocationConvertible(primitiveType2, primitiveType1)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   147
                return Comparison.TYPE_1_BETTER;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   148
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   149
            // Ok, at this point we're out of possible number conversions, so try strings. A String can represent any
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   150
            // value without loss, so if one of the potential targets is string, go for it.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   151
            if (targetType1 == String.class) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   152
                return Comparison.TYPE_1_BETTER;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   153
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   154
            if (targetType2 == String.class) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   155
                return Comparison.TYPE_2_BETTER;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   156
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   157
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   158
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   159
        return Comparison.INDETERMINATE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   160
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   161
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   162
    private static Class<?> getPrimitiveTypeOrSelf(final Class<?> type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   163
        final Class<?> primitive = TypeUtilities.getPrimitiveType(type);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   164
        return primitive == null ? type : primitive;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   165
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   166
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   167
    private static Class<?> getWrapperTypeOrSelf(final Class<?> type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   168
        final Class<?> wrapper = TypeUtilities.getWrapperType(type);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   169
        return wrapper == null ? type : wrapper;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   170
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   171
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   172
    @SuppressWarnings("unused")
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   173
    private static boolean isJavaScriptPrimitive(final Object o) {
29282
a8523237b66c 8074031: Canonicalize is-a-JS-string tests
attila
parents: 25865
diff changeset
   174
        return JSType.isString(o) || o instanceof Boolean || o instanceof Number || o == null;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   175
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   176
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   177
    private static final MethodHandle GUARD_PRIMITIVE = findOwnMH("isJavaScriptPrimitive", boolean.class, Object.class);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   178
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   179
    private static MethodHandle findOwnMH(final String name, final Class<?> rtype, final Class<?>... types) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   180
        return MH.findStatic(MethodHandles.lookup(), NashornPrimitiveLinker.class, name, MH.type(rtype, types));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   181
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   182
}