nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/lookup/MethodHandleFactory.java
author attila
Mon, 02 Mar 2015 14:33:55 +0100
changeset 29282 a8523237b66c
parent 27210 a04ede4787ba
child 31279 fef6f6ba3b02
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
16277
fd698c5ee684 8009559: clean up method handle lookup code.
sundar
parents: 16173
diff changeset
    26
package jdk.nashorn.internal.lookup;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    27
29282
a8523237b66c 8074031: Canonicalize is-a-JS-string tests
attila
parents: 27210
diff changeset
    28
import static jdk.nashorn.internal.runtime.JSType.isString;
a8523237b66c 8074031: Canonicalize is-a-JS-string tests
attila
parents: 27210
diff changeset
    29
16155
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16151
diff changeset
    30
import java.io.ByteArrayOutputStream;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    31
import java.io.PrintStream;
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 java.lang.invoke.MethodHandles;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    34
import java.lang.invoke.MethodType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    35
import java.lang.invoke.SwitchPoint;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    36
import java.lang.reflect.Method;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    37
import java.util.ArrayList;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    38
import java.util.Arrays;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    39
import java.util.List;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    40
import java.util.logging.Level;
24745
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24744
diff changeset
    41
import jdk.nashorn.internal.runtime.Context;
16173
c41d062f7d2a 8006293: Reduce ScriptObject.findCallMethodMethod
attila
parents: 16155
diff changeset
    42
import jdk.nashorn.internal.runtime.Debug;
24778
2ff5d7041566 8044638: Tidy up Nashorn codebase for code standards
attila
parents: 24745
diff changeset
    43
import jdk.nashorn.internal.runtime.ScriptObject;
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
    44
import jdk.nashorn.internal.runtime.logging.DebugLogger;
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
    45
import jdk.nashorn.internal.runtime.logging.Loggable;
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
    46
import jdk.nashorn.internal.runtime.logging.Logger;
16173
c41d062f7d2a 8006293: Reduce ScriptObject.findCallMethodMethod
attila
parents: 16155
diff changeset
    47
import jdk.nashorn.internal.runtime.options.Options;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    48
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    49
/**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    50
 * This class is abstraction for all method handle, switchpoint and method type
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    51
 * operations. This enables the functionality interface to be subclassed and
27210
a04ede4787ba 8059813: Type Info Cache flag must must be documented
hannesw
parents: 26768
diff changeset
    52
 * instrumented, as it has been proven vital to keep the number of method
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    53
 * handles in the system down.
16155
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16151
diff changeset
    54
 *
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    55
 * All operations of the above type should go through this class, and not
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    56
 * directly into java.lang.invoke
16155
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16151
diff changeset
    57
 *
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    58
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    59
public final class MethodHandleFactory {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    60
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    61
    private static final MethodHandles.Lookup PUBLIC_LOOKUP = MethodHandles.publicLookup();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    62
    private static final MethodHandles.Lookup LOOKUP        = MethodHandles.lookup();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    63
16155
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16151
diff changeset
    64
    private static final Level TRACE_LEVEL = Level.INFO;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    65
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    66
    private MethodHandleFactory() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    67
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    68
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    69
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    70
     * Runtime exception that collects every reason that a method handle lookup operation can go wrong
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    71
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    72
    @SuppressWarnings("serial")
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    73
    public static class LookupException extends RuntimeException {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    74
        /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    75
         * Constructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    76
         * @param e causing exception
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    77
         */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    78
        public LookupException(final Exception e) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    79
            super(e);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    80
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    81
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    82
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    83
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    84
     * Helper function that takes a class or an object with a toString override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    85
     * and shortens it to notation after last dot. This is used to facilitiate
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    86
     * pretty printouts in various debug loggers - internal only
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    87
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    88
     * @param obj class or object
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    89
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    90
     * @return pretty version of object as string
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    91
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    92
    public static String stripName(final Object obj) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    93
        if (obj == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    94
            return "null";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    95
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    96
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    97
        if (obj instanceof Class) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    98
            return ((Class<?>)obj).getSimpleName();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    99
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   100
        return obj.toString();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   101
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   102
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   103
    private static final MethodHandleFunctionality FUNC = new StandardMethodHandleFunctionality();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   104
    private static final boolean PRINT_STACKTRACE = Options.getBooleanProperty("nashorn.methodhandles.debug.stacktrace");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   105
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   106
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   107
     * Return the method handle functionality used for all method handle operations
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   108
     * @return a method handle functionality implementation
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   109
     */
24745
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24744
diff changeset
   110
    public static MethodHandleFunctionality getFunctionality() {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   111
        return FUNC;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   112
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   113
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   114
    private static final MethodHandle TRACE             = FUNC.findStatic(LOOKUP, MethodHandleFactory.class, "traceArgs",   MethodType.methodType(void.class, DebugLogger.class, String.class, int.class, Object[].class));
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   115
    private static final MethodHandle TRACE_RETURN      = FUNC.findStatic(LOOKUP, MethodHandleFactory.class, "traceReturn", MethodType.methodType(Object.class, DebugLogger.class, Object.class));
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   116
    private static final MethodHandle TRACE_RETURN_VOID = FUNC.findStatic(LOOKUP, MethodHandleFactory.class, "traceReturnVoid", MethodType.methodType(void.class, DebugLogger.class));
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19889
diff changeset
   117
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19889
diff changeset
   118
    private static final String VOID_TAG = "[VOID]";
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   119
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   120
    private static void err(final String str) {
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   121
        Context.getContext().getErr().println(str);
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   122
    }
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   123
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   124
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   125
     * Tracer that is applied before a value is returned from the traced function. It will output the return
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   126
     * value and its class
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   127
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   128
     * @param value return value for filter
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   129
     * @return return value unmodified
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   130
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   131
    static Object traceReturn(final DebugLogger logger, final Object value) {
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   132
        final String str = "    return" +
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   133
                (VOID_TAG.equals(value) ?
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   134
                    ";" :
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   135
                    " " + stripName(value) + "; // [type=" + (value == null ? "null]" : stripName(value.getClass()) + ']'));
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   136
        if (logger == null) {
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   137
            err(str);
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   138
        } else if (logger.isEnabled()) {
25821
fbb51e67d2a7 8048869: Reduce compile time by about 5% by removing the Class.casts from the AST nodes
lagergren
parents: 24778
diff changeset
   139
            logger.log(TRACE_LEVEL, str);
fbb51e67d2a7 8048869: Reduce compile time by about 5% by removing the Class.casts from the AST nodes
lagergren
parents: 24778
diff changeset
   140
        }
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   141
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   142
        return value;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   143
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   144
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19889
diff changeset
   145
    static void traceReturnVoid(final DebugLogger logger) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19889
diff changeset
   146
        traceReturn(logger, VOID_TAG);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19889
diff changeset
   147
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19889
diff changeset
   148
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   149
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   150
     * Tracer that is applied before a function is called, printing the arguments
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   151
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   152
     * @param tag  tag to start the debug printout string
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   153
     * @param paramStart param index to start outputting from
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   154
     * @param args arguments to the function
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   155
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   156
    static void traceArgs(final DebugLogger logger, final String tag, final int paramStart, final Object... args) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   157
        final StringBuilder sb = new StringBuilder();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   158
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   159
        sb.append(tag);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   160
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   161
        for (int i = paramStart; i < args.length; i++) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   162
            if (i == paramStart) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   163
                sb.append(" => args: ");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   164
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   165
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   166
            sb.append('\'').
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   167
                append(stripName(argString(args[i]))).
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   168
                append('\'').
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   169
                append(' ').
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   170
                append('[').
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   171
                append("type=").
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   172
                append(args[i] == null ? "null" : stripName(args[i].getClass())).
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   173
                append(']');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   174
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   175
            if (i + 1 < args.length) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   176
                sb.append(", ");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   177
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   178
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   179
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   180
        if (logger == null) {
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   181
            err(sb.toString());
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   182
        } else {
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   183
            logger.log(TRACE_LEVEL, sb);
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   184
        }
16155
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16151
diff changeset
   185
        stacktrace(logger);
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16151
diff changeset
   186
    }
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16151
diff changeset
   187
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16151
diff changeset
   188
    private static void stacktrace(final DebugLogger logger) {
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16151
diff changeset
   189
        if (!PRINT_STACKTRACE) {
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16151
diff changeset
   190
            return;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   191
        }
16155
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16151
diff changeset
   192
        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16151
diff changeset
   193
        final PrintStream ps = new PrintStream(baos);
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16151
diff changeset
   194
        new Throwable().printStackTrace(ps);
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   195
        final String st = baos.toString();
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   196
        if (logger == null) {
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   197
            err(st);
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   198
        } else {
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   199
            logger.log(TRACE_LEVEL, st);
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   200
        }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   201
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   202
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   203
    private static String argString(final Object arg) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   204
        if (arg == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   205
            return "null";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   206
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   207
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   208
        if (arg.getClass().isArray()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   209
            final List<Object> list = new ArrayList<>();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   210
            for (final Object elem : (Object[])arg) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   211
                list.add('\'' + argString(elem) + '\'');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   212
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   213
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   214
            return list.toString();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   215
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   216
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   217
        if (arg instanceof ScriptObject) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   218
            return arg.toString() +
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 24719
diff changeset
   219
                " (map=" + Debug.id(((ScriptObject)arg).getMap()) +
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   220
                ')';
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   221
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   222
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   223
        return arg.toString();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   224
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   225
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   226
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   227
     * Add a debug printout to a method handle, tracing parameters and return values
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   228
     * Output will be unconditional to stderr
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   229
     *
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   230
     * @param mh  method handle to trace
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   231
     * @param tag start of trace message
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   232
     * @return traced method handle
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   233
     */
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   234
    public static MethodHandle addDebugPrintout(final MethodHandle mh, final Object tag) {
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   235
        return addDebugPrintout(null, Level.OFF, mh, 0, true, tag);
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   236
    }
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   237
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   238
    /**
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   239
     * Add a debug printout to a method handle, tracing parameters and return values
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   240
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   241
     * @param logger a specific logger to which to write the output
24733
1e825be55fd1 8027043: Turn global accesses into MethodHandle.constant, with one chance of reassignment, e.g. x = value occuring once in the global scope is ok, twice is not.
lagergren
parents: 24720
diff changeset
   242
     * @param level level over which to print
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   243
     * @param mh  method handle to trace
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   244
     * @param tag start of trace message
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   245
     * @return traced method handle
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   246
     */
24733
1e825be55fd1 8027043: Turn global accesses into MethodHandle.constant, with one chance of reassignment, e.g. x = value occuring once in the global scope is ok, twice is not.
lagergren
parents: 24720
diff changeset
   247
    public static MethodHandle addDebugPrintout(final DebugLogger logger, final Level level, final MethodHandle mh, final Object tag) {
1e825be55fd1 8027043: Turn global accesses into MethodHandle.constant, with one chance of reassignment, e.g. x = value occuring once in the global scope is ok, twice is not.
lagergren
parents: 24720
diff changeset
   248
        return addDebugPrintout(logger, level, mh, 0, true, tag);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   249
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   250
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   251
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   252
     * Add a debug printout to a method handle, tracing parameters and return values
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   253
     * Output will be unconditional to stderr
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   254
     *
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   255
     * @param mh  method handle to trace
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   256
     * @param paramStart first param to print/trace
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   257
     * @param printReturnValue should we print/trace return value if available?
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   258
     * @param tag start of trace message
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   259
     * @return  traced method handle
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   260
     */
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   261
    public static MethodHandle addDebugPrintout(final MethodHandle mh, final int paramStart, final boolean printReturnValue, final Object tag) {
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   262
        return addDebugPrintout(null, Level.OFF, mh, paramStart, printReturnValue, tag);
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   263
    }
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   264
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   265
     /**
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   266
     * Add a debug printout to a method handle, tracing parameters and return values
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   267
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   268
     * @param logger a specific logger to which to write the output
24733
1e825be55fd1 8027043: Turn global accesses into MethodHandle.constant, with one chance of reassignment, e.g. x = value occuring once in the global scope is ok, twice is not.
lagergren
parents: 24720
diff changeset
   269
     * @param level level over which to print
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   270
     * @param mh  method handle to trace
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   271
     * @param paramStart first param to print/trace
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   272
     * @param printReturnValue should we print/trace return value if available?
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   273
     * @param tag start of trace message
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   274
     * @return  traced method handle
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   275
     */
24733
1e825be55fd1 8027043: Turn global accesses into MethodHandle.constant, with one chance of reassignment, e.g. x = value occuring once in the global scope is ok, twice is not.
lagergren
parents: 24720
diff changeset
   276
    public static MethodHandle addDebugPrintout(final DebugLogger logger, final Level level, final MethodHandle mh, final int paramStart, final boolean printReturnValue, final Object tag) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   277
        final MethodType type = mh.type();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   278
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19889
diff changeset
   279
        //if there is no logger, or if it's set to log only coarser events
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19889
diff changeset
   280
        //than the trace level, skip and return
24733
1e825be55fd1 8027043: Turn global accesses into MethodHandle.constant, with one chance of reassignment, e.g. x = value occuring once in the global scope is ok, twice is not.
lagergren
parents: 24720
diff changeset
   281
        if (logger != null && logger.levelCoarserThan(level)) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   282
            return mh;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   283
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   284
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   285
        assert TRACE != null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   286
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   287
        MethodHandle trace = MethodHandles.insertArguments(TRACE, 0, logger, tag, paramStart);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   288
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   289
        trace = MethodHandles.foldArguments(
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   290
                mh,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   291
                trace.asCollector(
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   292
                    Object[].class,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   293
                    type.parameterCount()).
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   294
                asType(type.changeReturnType(void.class)));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   295
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   296
        final Class<?> retType = type.returnType();
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19889
diff changeset
   297
        if (printReturnValue) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19889
diff changeset
   298
            if (retType != void.class) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19889
diff changeset
   299
                final MethodHandle traceReturn = MethodHandles.insertArguments(TRACE_RETURN, 0, logger);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19889
diff changeset
   300
                trace = MethodHandles.filterReturnValue(trace,
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19889
diff changeset
   301
                        traceReturn.asType(
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19889
diff changeset
   302
                            traceReturn.type().changeParameterType(0, retType).changeReturnType(retType)));
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19889
diff changeset
   303
            } else {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19889
diff changeset
   304
                trace = MethodHandles.filterReturnValue(trace, MethodHandles.insertArguments(TRACE_RETURN_VOID, 0, logger));
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19889
diff changeset
   305
            }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   306
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   307
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   308
        return trace;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   309
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   310
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   311
    /**
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   312
     * Class that marshalls all method handle operations to the java.lang.invoke
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   313
     * package. This exists only so that it can be subclassed and method handles created from
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   314
     * Nashorn made possible to instrument.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   315
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   316
     * All Nashorn classes should use the MethodHandleFactory for their method handle operations
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   317
     */
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   318
    @Logger(name="methodhandles")
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   319
    private static class StandardMethodHandleFunctionality implements MethodHandleFunctionality, Loggable {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   320
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   321
        // for bootstrapping reasons, because a lot of static fields use MH for lookups, we
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   322
        // need to set the logger when the Global object is finished. This means that we don't
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   323
        // get instrumentation for public static final MethodHandle SOMETHING = MH... in the builtin
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   324
        // classes, but that doesn't matter, because this is usually not where we want it
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   325
        private DebugLogger log = DebugLogger.DISABLED_LOGGER;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   326
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   327
        public StandardMethodHandleFunctionality() {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   328
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   329
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   330
        @Override
24745
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24744
diff changeset
   331
        public DebugLogger initLogger(final Context context) {
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24744
diff changeset
   332
            return this.log = context.getLogger(this.getClass());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   333
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   334
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   335
        @Override
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   336
        public DebugLogger getLogger() {
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   337
            return log;
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 24719
diff changeset
   338
        }
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 24719
diff changeset
   339
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   340
        protected static String describe(final Object... data) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   341
            final StringBuilder sb = new StringBuilder();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   342
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   343
            for (int i = 0; i < data.length; i++) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   344
                final Object d = data[i];
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   345
                if (d == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   346
                    sb.append("<null> ");
29282
a8523237b66c 8074031: Canonicalize is-a-JS-string tests
attila
parents: 27210
diff changeset
   347
                } else if (isString(d)) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   348
                    sb.append(d.toString());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   349
                    sb.append(' ');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   350
                } else if (d.getClass().isArray()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   351
                    sb.append("[ ");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   352
                    for (final Object da : (Object[])d) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   353
                        sb.append(describe(new Object[]{ da })).append(' ');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   354
                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   355
                    sb.append("] ");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   356
                } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   357
                    sb.append(d)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   358
                        .append('{')
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   359
                        .append(Integer.toHexString(System.identityHashCode(d)))
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   360
                        .append('}');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   361
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   362
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   363
                if (i + 1 < data.length) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   364
                    sb.append(", ");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   365
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   366
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   367
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   368
            return sb.toString();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   369
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   370
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   371
        public MethodHandle debug(final MethodHandle master, final String str, final Object... args) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   372
            if (log.isEnabled()) {
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   373
                if (PRINT_STACKTRACE) {
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   374
                    stacktrace(log);
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   375
                }
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   376
                return addDebugPrintout(log, Level.INFO, master, Integer.MAX_VALUE, false, str + ' ' + describe(args));
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   377
            }
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   378
            return master;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   379
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   380
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   381
        @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   382
        public MethodHandle filterArguments(final MethodHandle target, final int pos, final MethodHandle... filters) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   383
            final MethodHandle mh = MethodHandles.filterArguments(target, pos, filters);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   384
            return debug(mh, "filterArguments", target, pos, filters);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   385
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   386
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   387
        @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   388
        public MethodHandle filterReturnValue(final MethodHandle target, final MethodHandle filter) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   389
            final MethodHandle mh = MethodHandles.filterReturnValue(target, filter);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   390
            return debug(mh, "filterReturnValue", target, filter);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   391
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   392
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   393
        @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   394
        public MethodHandle guardWithTest(final MethodHandle test, final MethodHandle target, final MethodHandle fallback) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   395
            final MethodHandle mh = MethodHandles.guardWithTest(test, target, fallback);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   396
            return debug(mh, "guardWithTest", test, target, fallback);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   397
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   398
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   399
        @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   400
        public MethodHandle insertArguments(final MethodHandle target, final int pos, final Object... values) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   401
            final MethodHandle mh = MethodHandles.insertArguments(target, pos, values);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   402
            return debug(mh, "insertArguments", target, pos, values);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   403
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   404
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   405
        @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   406
        public MethodHandle dropArguments(final MethodHandle target, final int pos, final Class<?>... values) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   407
            final MethodHandle mh = MethodHandles.dropArguments(target, pos, values);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   408
            return debug(mh, "dropArguments", target, pos, values);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   409
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   410
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   411
        @Override
16173
c41d062f7d2a 8006293: Reduce ScriptObject.findCallMethodMethod
attila
parents: 16155
diff changeset
   412
        public MethodHandle dropArguments(final MethodHandle target, final int pos, final List<Class<?>> values) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   413
            final MethodHandle mh = MethodHandles.dropArguments(target, pos, values);
16173
c41d062f7d2a 8006293: Reduce ScriptObject.findCallMethodMethod
attila
parents: 16155
diff changeset
   414
            return debug(mh, "dropArguments", target, pos, values);
c41d062f7d2a 8006293: Reduce ScriptObject.findCallMethodMethod
attila
parents: 16155
diff changeset
   415
        }
c41d062f7d2a 8006293: Reduce ScriptObject.findCallMethodMethod
attila
parents: 16155
diff changeset
   416
c41d062f7d2a 8006293: Reduce ScriptObject.findCallMethodMethod
attila
parents: 16155
diff changeset
   417
        @Override
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   418
        public MethodHandle asType(final MethodHandle handle, final MethodType type) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   419
            final MethodHandle mh = handle.asType(type);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   420
            return debug(mh, "asType", handle, type);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   421
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   422
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   423
        @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   424
        public MethodHandle bindTo(final MethodHandle handle, final Object x) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   425
            final MethodHandle mh = handle.bindTo(x);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   426
            return debug(mh, "bindTo", handle, x);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   427
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   428
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   429
        @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   430
        public MethodHandle foldArguments(final MethodHandle target, final MethodHandle combiner) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   431
            final MethodHandle mh = MethodHandles.foldArguments(target, combiner);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   432
            return debug(mh, "foldArguments", target, combiner);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   433
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   434
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   435
        @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   436
        public MethodHandle explicitCastArguments(final MethodHandle target, final MethodType type) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   437
            final MethodHandle mh = MethodHandles.explicitCastArguments(target, type);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   438
            return debug(mh, "explicitCastArguments", target, type);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   439
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   440
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   441
        @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   442
        public MethodHandle arrayElementGetter(final Class<?> type) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   443
            final MethodHandle mh = MethodHandles.arrayElementGetter(type);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   444
            return debug(mh, "arrayElementGetter", type);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   445
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   446
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   447
        @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   448
        public MethodHandle arrayElementSetter(final Class<?> type) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   449
            final MethodHandle mh = MethodHandles.arrayElementSetter(type);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   450
            return debug(mh, "arrayElementSetter", type);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   451
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   452
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   453
        @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   454
        public MethodHandle throwException(final Class<?> returnType, final Class<? extends Throwable> exType) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   455
            final MethodHandle mh = MethodHandles.throwException(returnType, exType);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   456
            return debug(mh, "throwException", returnType, exType);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   457
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   458
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   459
        @Override
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19889
diff changeset
   460
        public MethodHandle catchException(final MethodHandle target, final Class<? extends Throwable> exType, final MethodHandle handler) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   461
            final MethodHandle mh = MethodHandles.catchException(target, exType, handler);
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19889
diff changeset
   462
            return debug(mh, "catchException", exType);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19889
diff changeset
   463
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19889
diff changeset
   464
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19889
diff changeset
   465
        @Override
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   466
        public MethodHandle constant(final Class<?> type, final Object value) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   467
            final MethodHandle mh = MethodHandles.constant(type, value);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   468
            return debug(mh, "constant", type, value);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   469
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   470
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   471
        @Override
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   472
        public MethodHandle identity(final Class<?> type) {
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   473
            final MethodHandle mh = MethodHandles.identity(type);
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   474
            return debug(mh, "identity", type);
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   475
        }
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   476
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   477
        @Override
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   478
        public MethodHandle asCollector(final MethodHandle handle, final Class<?> arrayType, final int arrayLength) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   479
            final MethodHandle mh = handle.asCollector(arrayType, arrayLength);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   480
            return debug(mh, "asCollector", handle, arrayType, arrayLength);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   481
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   482
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   483
        @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   484
        public MethodHandle asSpreader(final MethodHandle handle, final Class<?> arrayType, final int arrayLength) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   485
            final MethodHandle mh = handle.asSpreader(arrayType, arrayLength);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   486
            return debug(mh, "asSpreader", handle, arrayType, arrayLength);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   487
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   488
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   489
        @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   490
        public MethodHandle getter(final MethodHandles.Lookup explicitLookup, final Class<?> clazz, final String name, final Class<?> type) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   491
            try {
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   492
                final MethodHandle mh = explicitLookup.findGetter(clazz, name, type);
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   493
                return debug(mh, "getter", explicitLookup, clazz, name, type);
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   494
            } catch (final NoSuchFieldException | IllegalAccessException e) {
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   495
                throw new LookupException(e);
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   496
            }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   497
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   498
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   499
        @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   500
        public MethodHandle staticGetter(final MethodHandles.Lookup explicitLookup, final Class<?> clazz, final String name, final Class<?> type) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   501
            try {
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   502
                final MethodHandle mh = explicitLookup.findStaticGetter(clazz, name, type);
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   503
                return debug(mh, "static getter", explicitLookup, clazz, name, type);
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   504
            } catch (final NoSuchFieldException | IllegalAccessException e) {
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   505
                throw new LookupException(e);
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   506
            }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   507
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   508
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   509
        @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   510
        public MethodHandle setter(final MethodHandles.Lookup explicitLookup, final Class<?> clazz, final String name, final Class<?> type) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   511
            try {
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   512
                final MethodHandle mh = explicitLookup.findSetter(clazz, name, type);
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   513
                return debug(mh, "setter", explicitLookup, clazz, name, type);
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   514
            } catch (final NoSuchFieldException | IllegalAccessException e) {
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   515
                throw new LookupException(e);
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   516
            }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   517
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   518
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   519
        @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   520
        public MethodHandle staticSetter(final MethodHandles.Lookup explicitLookup, final Class<?> clazz, final String name, final Class<?> type) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   521
            try {
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   522
                final MethodHandle mh = explicitLookup.findStaticSetter(clazz, name, type);
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   523
                return debug(mh, "static setter", explicitLookup, clazz, name, type);
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   524
            } catch (final NoSuchFieldException | IllegalAccessException e) {
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   525
                throw new LookupException(e);
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   526
            }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   527
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   528
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   529
        @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   530
        public MethodHandle find(final Method method) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   531
            try {
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   532
                final MethodHandle mh = PUBLIC_LOOKUP.unreflect(method);
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   533
                return debug(mh, "find", method);
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   534
            } catch (final IllegalAccessException e) {
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   535
                throw new LookupException(e);
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   536
            }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   537
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   538
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   539
        @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   540
        public MethodHandle findStatic(final MethodHandles.Lookup explicitLookup, final Class<?> clazz, final String name, final MethodType type) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   541
            try {
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   542
                final MethodHandle mh = explicitLookup.findStatic(clazz, name, type);
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   543
                return debug(mh, "findStatic", explicitLookup, clazz, name, type);
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   544
            } catch (final NoSuchMethodException | IllegalAccessException e) {
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   545
                throw new LookupException(e);
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   546
            }
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   547
        }
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   548
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   549
        @Override
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   550
        public MethodHandle findSpecial(final MethodHandles.Lookup explicitLookup, final Class<?> clazz, final String name, final MethodType type, final Class<?> thisClass) {
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   551
            try {
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   552
                final MethodHandle mh = explicitLookup.findSpecial(clazz, name, type, thisClass);
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   553
                return debug(mh, "findSpecial", explicitLookup, clazz, name, type);
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   554
            } catch (final NoSuchMethodException | IllegalAccessException e) {
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   555
                throw new LookupException(e);
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   556
            }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   557
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   558
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   559
        @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   560
        public MethodHandle findVirtual(final MethodHandles.Lookup explicitLookup, final Class<?> clazz, final String name, final MethodType type) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   561
            try {
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   562
                final MethodHandle mh = explicitLookup.findVirtual(clazz, name, type);
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   563
                return debug(mh, "findVirtual", explicitLookup, clazz, name, type);
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   564
            } catch (final NoSuchMethodException | IllegalAccessException e) {
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   565
                throw new LookupException(e);
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   566
            }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   567
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   568
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   569
        @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   570
        public SwitchPoint createSwitchPoint() {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   571
            final SwitchPoint sp = new SwitchPoint();
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   572
            log.log(TRACE_LEVEL, "createSwitchPoint ", sp);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   573
            return sp;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   574
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   575
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   576
        @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   577
        public MethodHandle guardWithTest(final SwitchPoint sp, final MethodHandle before, final MethodHandle after) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   578
            final MethodHandle mh = sp.guardWithTest(before, after);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   579
            return debug(mh, "guardWithTest", sp, before, after);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   580
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   581
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   582
        @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   583
        public MethodType type(final Class<?> returnType, final Class<?>... paramTypes) {
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   584
            final MethodType mt = MethodType.methodType(returnType, paramTypes);
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24743
diff changeset
   585
            log.log(TRACE_LEVEL, "methodType ", returnType, " ", Arrays.toString(paramTypes), " ", mt);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   586
            return mt;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   587
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   588
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   589
}