src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugContext.java
author iveresov
Fri, 02 Feb 2018 17:28:17 -0800
changeset 48861 47f19ff9903c
parent 48190 25cfedf27edc
child 49873 26ebfe8ce852
permissions -rw-r--r--
8194819: Update Graal Reviewed-by: kvn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
     1
/*
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
     2
 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
     4
 *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
     7
 * published by the Free Software Foundation.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
     8
 *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    13
 * accompanied this code).
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    14
 *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    18
 *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    21
 * questions.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    22
 */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    23
package org.graalvm.compiler.debug;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    24
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    25
import static java.util.FormattableFlags.LEFT_JUSTIFY;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    26
import static java.util.FormattableFlags.UPPERCASE;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    27
import static org.graalvm.compiler.debug.DebugOptions.Count;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    28
import static org.graalvm.compiler.debug.DebugOptions.Counters;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    29
import static org.graalvm.compiler.debug.DebugOptions.Dump;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    30
import static org.graalvm.compiler.debug.DebugOptions.DumpOnError;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    31
import static org.graalvm.compiler.debug.DebugOptions.DumpOnPhaseChange;
47798
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
    32
import static org.graalvm.compiler.debug.DebugOptions.DumpPath;
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    33
import static org.graalvm.compiler.debug.DebugOptions.ListMetrics;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    34
import static org.graalvm.compiler.debug.DebugOptions.Log;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    35
import static org.graalvm.compiler.debug.DebugOptions.MemUseTrackers;
47798
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
    36
import static org.graalvm.compiler.debug.DebugOptions.ShowDumpFiles;
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    37
import static org.graalvm.compiler.debug.DebugOptions.Time;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    38
import static org.graalvm.compiler.debug.DebugOptions.Timers;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    39
import static org.graalvm.compiler.debug.DebugOptions.TrackMemUse;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    40
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    41
import java.io.ByteArrayOutputStream;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    42
import java.io.File;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    43
import java.io.IOException;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    44
import java.io.PrintStream;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    45
import java.nio.file.Files;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    46
import java.nio.file.Path;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    47
import java.nio.file.Paths;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    48
import java.nio.file.StandardOpenOption;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    49
import java.util.ArrayList;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    50
import java.util.Arrays;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    51
import java.util.Collection;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    52
import java.util.Collections;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    53
import java.util.Formatter;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    54
import java.util.List;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    55
import java.util.Map;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    56
import java.util.SortedMap;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    57
import java.util.TreeMap;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    58
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 48190
diff changeset
    59
import org.graalvm.collections.EconomicMap;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 48190
diff changeset
    60
import org.graalvm.collections.EconomicSet;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 48190
diff changeset
    61
import org.graalvm.collections.Pair;
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    62
import org.graalvm.compiler.options.OptionKey;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    63
import org.graalvm.compiler.options.OptionValues;
47798
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
    64
import org.graalvm.graphio.GraphOutput;
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    65
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    66
import jdk.vm.ci.meta.JavaMethod;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    67
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    68
/**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    69
 * A facility for logging and dumping as well as a container for values associated with
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    70
 * {@link MetricKey}s.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    71
 *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    72
 * A {@code DebugContext} object must only be used on the thread that created it. This means it
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    73
 * needs to be passed around as a parameter. For convenience, it can be encapsulated in a widely
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    74
 * used object that is in scope wherever a {@code DebugContext} is needed. However, care must be
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    75
 * taken when such objects can be exposed to multiple threads (e.g., they are in a non-thread-local
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    76
 * cache).
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    77
 */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    78
public final class DebugContext implements AutoCloseable {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    79
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    80
    public static final Description NO_DESCRIPTION = null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    81
    public static final GlobalMetrics NO_GLOBAL_METRIC_VALUES = null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    82
    public static final Iterable<DebugHandlersFactory> NO_CONFIG_CUSTOMIZERS = Collections.emptyList();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    83
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    84
    public static final PrintStream DEFAULT_LOG_STREAM = TTY.out;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    85
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    86
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    87
     * Contains the immutable parts of a debug context. This separation allows the immutable parts
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    88
     * to be shared and reduces the overhead of initialization since most immutable fields are
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    89
     * configured by parsing options.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    90
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    91
    final Immutable immutable;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    92
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    93
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    94
     * Determines whether metrics are enabled.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    95
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    96
    boolean metricsEnabled;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    97
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    98
    DebugConfig currentConfig;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
    99
    ScopeImpl currentScope;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   100
    CloseableCounter currentTimer;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   101
    CloseableCounter currentMemUseTracker;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   102
    Scope lastClosedScope;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   103
    Throwable lastExceptionThrown;
47798
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   104
    private IgvDumpChannel sharedChannel;
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   105
    private GraphOutput<?, ?> parentOutput;
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   106
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   107
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   108
     * Stores the {@link MetricKey} values.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   109
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   110
    private long[] metricValues;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   111
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   112
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   113
     * Determines if dynamic scopes are enabled.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   114
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   115
    public boolean areScopesEnabled() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   116
        return immutable.scopesEnabled;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   117
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   118
47798
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   119
    public <G, N, M> GraphOutput<G, M> buildOutput(GraphOutput.Builder<G, N, M> builder) throws IOException {
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   120
        if (parentOutput != null) {
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   121
            return builder.build(parentOutput);
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   122
        } else {
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   123
            if (sharedChannel == null) {
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   124
                sharedChannel = new IgvDumpChannel(() -> getDumpPath(".bgv", false), immutable.options);
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   125
            }
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   126
            final GraphOutput<G, M> output = builder.build(sharedChannel);
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   127
            parentOutput = output;
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   128
            return output;
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   129
        }
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   130
    }
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   131
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   132
    /**
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   133
     * Adds version properties to the provided map. The version properties are read at a start of
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   134
     * the JVM from a JVM specific location. Each property identifiers a commit of a certain
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   135
     * component in the system. The properties added to the {@code properties} map are prefixed with
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   136
     * {@code "version."} prefix.
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   137
     *
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   138
     * @param properties map to add the version properties to or {@code null}
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   139
     * @return {@code properties} with version properties added or an unmodifiable map containing
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   140
     *         the version properties if {@code properties == null}
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   141
     */
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   142
    public static Map<Object, Object> addVersionProperties(Map<Object, Object> properties) {
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   143
        return Versions.VERSIONS.withVersions(properties);
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   144
    }
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   145
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   146
    /**
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   147
     * The immutable configuration that can be shared between {@link DebugContext} objects.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   148
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   149
    static final class Immutable {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   150
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   151
        private static final Immutable[] CACHE = new Immutable[5];
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   152
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   153
        /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   154
         * The options from which this object was configured.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   155
         */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   156
        final OptionValues options;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   157
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   158
        /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   159
         * Specifies if dynamic scopes are enabled.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   160
         */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   161
        final boolean scopesEnabled;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   162
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   163
        final boolean listMetrics;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   164
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   165
        /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   166
         * Names of unscoped counters. A counter is unscoped if this set is empty or contains the
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   167
         * counter's name.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   168
         */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   169
        final EconomicSet<String> unscopedCounters;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   170
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   171
        /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   172
         * Names of unscoped timers. A timer is unscoped if this set is empty or contains the
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   173
         * timer's name.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   174
         */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   175
        final EconomicSet<String> unscopedTimers;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   176
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   177
        /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   178
         * Names of unscoped memory usage trackers. A memory usage tracker is unscoped if this set
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   179
         * is empty or contains the memory usage tracker's name.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   180
         */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   181
        final EconomicSet<String> unscopedMemUseTrackers;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   182
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   183
        private static EconomicSet<String> parseUnscopedMetricSpec(String spec, boolean unconditional, boolean accumulatedKey) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   184
            EconomicSet<String> res;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   185
            if (spec == null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   186
                if (!unconditional) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   187
                    res = null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   188
                } else {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   189
                    res = EconomicSet.create();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   190
                }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   191
            } else {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   192
                res = EconomicSet.create();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   193
                if (!spec.isEmpty()) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   194
                    if (!accumulatedKey) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   195
                        res.addAll(Arrays.asList(spec.split(",")));
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   196
                    } else {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   197
                        for (String n : spec.split(",")) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   198
                            res.add(n + AccumulatedKey.ACCUMULATED_KEY_SUFFIX);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   199
                            res.add(n + AccumulatedKey.FLAT_KEY_SUFFIX);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   200
                        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   201
                    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   202
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   203
                }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   204
            }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   205
            return res;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   206
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   207
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   208
        static Immutable create(OptionValues options) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   209
            int i = 0;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   210
            while (i < CACHE.length) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   211
                Immutable immutable = CACHE[i];
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   212
                if (immutable == null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   213
                    break;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   214
                }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   215
                if (immutable.options == options) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   216
                    return immutable;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   217
                }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   218
                i++;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   219
            }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   220
            Immutable immutable = new Immutable(options);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   221
            if (i < CACHE.length) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   222
                CACHE[i] = immutable;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   223
            }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   224
            return immutable;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   225
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   226
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   227
        private static boolean isNotEmpty(OptionKey<String> option, OptionValues options) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   228
            return option.getValue(options) != null && !option.getValue(options).isEmpty();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   229
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   230
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   231
        private Immutable(OptionValues options) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   232
            this.options = options;
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 46762
diff changeset
   233
            String timeValue = Time.getValue(options);
089674d9949b 8186681: Update Graal
iveresov
parents: 46762
diff changeset
   234
            String trackMemUseValue = TrackMemUse.getValue(options);
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   235
            this.unscopedCounters = parseUnscopedMetricSpec(Counters.getValue(options), "".equals(Count.getValue(options)), false);
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 46762
diff changeset
   236
            this.unscopedTimers = parseUnscopedMetricSpec(Timers.getValue(options), "".equals(timeValue), true);
089674d9949b 8186681: Update Graal
iveresov
parents: 46762
diff changeset
   237
            this.unscopedMemUseTrackers = parseUnscopedMetricSpec(MemUseTrackers.getValue(options), "".equals(trackMemUseValue), true);
089674d9949b 8186681: Update Graal
iveresov
parents: 46762
diff changeset
   238
089674d9949b 8186681: Update Graal
iveresov
parents: 46762
diff changeset
   239
            if (unscopedTimers != null ||
089674d9949b 8186681: Update Graal
iveresov
parents: 46762
diff changeset
   240
                            unscopedMemUseTrackers != null ||
089674d9949b 8186681: Update Graal
iveresov
parents: 46762
diff changeset
   241
                            timeValue != null ||
089674d9949b 8186681: Update Graal
iveresov
parents: 46762
diff changeset
   242
                            trackMemUseValue != null) {
089674d9949b 8186681: Update Graal
iveresov
parents: 46762
diff changeset
   243
                try {
089674d9949b 8186681: Update Graal
iveresov
parents: 46762
diff changeset
   244
                    Class.forName("java.lang.management.ManagementFactory");
089674d9949b 8186681: Update Graal
iveresov
parents: 46762
diff changeset
   245
                } catch (ClassNotFoundException ex) {
089674d9949b 8186681: Update Graal
iveresov
parents: 46762
diff changeset
   246
                    throw new IllegalArgumentException("Time, Timers, MemUseTrackers and TrackMemUse options require java.management module");
089674d9949b 8186681: Update Graal
iveresov
parents: 46762
diff changeset
   247
                }
089674d9949b 8186681: Update Graal
iveresov
parents: 46762
diff changeset
   248
            }
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   249
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   250
            this.scopesEnabled = DumpOnError.getValue(options) ||
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   251
                            Dump.getValue(options) != null ||
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   252
                            Log.getValue(options) != null ||
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   253
                            isNotEmpty(DebugOptions.Count, options) ||
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   254
                            isNotEmpty(DebugOptions.Time, options) ||
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   255
                            isNotEmpty(DebugOptions.TrackMemUse, options) ||
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   256
                            DumpOnPhaseChange.getValue(options) != null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   257
            this.listMetrics = ListMetrics.getValue(options);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   258
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   259
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   260
        private Immutable() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   261
            this.options = new OptionValues(EconomicMap.create());
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   262
            this.unscopedCounters = null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   263
            this.unscopedTimers = null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   264
            this.unscopedMemUseTrackers = null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   265
            this.scopesEnabled = false;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   266
            this.listMetrics = false;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   267
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   268
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   269
        public boolean hasUnscopedMetrics() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   270
            return unscopedCounters != null || unscopedTimers != null || unscopedMemUseTrackers != null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   271
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   272
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   273
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   274
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   275
     * Gets the options this debug context was constructed with.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   276
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   277
    public OptionValues getOptions() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   278
        return immutable.options;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   279
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   280
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   281
    static class Activated extends ThreadLocal<DebugContext> {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   282
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   283
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   284
    private static final Activated activated = new Activated();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   285
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   286
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   287
     * An object used to undo the changes made by DebugContext#activate().
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   288
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   289
    public static class Activation implements AutoCloseable {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   290
        private final DebugContext parent;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   291
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   292
        Activation(DebugContext parent) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   293
            this.parent = parent;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   294
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   295
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   296
        @Override
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   297
        public void close() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   298
            activated.set(parent);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   299
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   300
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   301
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   302
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   303
     * Activates this object as the debug context {@linkplain DebugContext#forCurrentThread for the
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   304
     * current thread}. This method should be used in a try-with-resources statement.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   305
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   306
     * @return an object that will deactivate the debug context for the current thread when
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   307
     *         {@link Activation#close()} is called on it
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   308
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   309
    public Activation activate() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   310
        Activation res = new Activation(activated.get());
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   311
        activated.set(this);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   312
        return res;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   313
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   314
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   315
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   316
     * Shared object used to represent a disabled debug context.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   317
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   318
    public static final DebugContext DISABLED = new DebugContext(NO_DESCRIPTION, NO_GLOBAL_METRIC_VALUES, DEFAULT_LOG_STREAM, new Immutable(), NO_CONFIG_CUSTOMIZERS);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   319
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   320
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   321
     * Gets the debug context for the current thread. This should only be used when there is no
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   322
     * other reasonable means to get a hold of a debug context.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   323
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   324
    public static DebugContext forCurrentThread() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   325
        DebugContext current = activated.get();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   326
        if (current == null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   327
            return DISABLED;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   328
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   329
        return current;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   330
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   331
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   332
    private final GlobalMetrics globalMetrics;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   333
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   334
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   335
     * Describes the computation associated with a {@link DebugContext}.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   336
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   337
    public static class Description {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   338
        /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   339
         * The primary input to the computation.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   340
         */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   341
        final Object compilable;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   342
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   343
        /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   344
         * A runtime based identifier that is most likely to be unique.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   345
         */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   346
        final String identifier;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   347
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   348
        public Description(Object compilable, String identifier) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   349
            this.compilable = compilable;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   350
            this.identifier = identifier;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   351
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   352
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   353
        @Override
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   354
        public String toString() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   355
            String compilableName = compilable instanceof JavaMethod ? ((JavaMethod) compilable).format("%H.%n(%p)%R") : String.valueOf(compilable);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   356
            return identifier + ":" + compilableName;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   357
        }
47798
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   358
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   359
        final String getLabel() {
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   360
            if (compilable instanceof JavaMethod) {
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   361
                JavaMethod method = (JavaMethod) compilable;
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   362
                return method.format("%h.%n(%p)%r");
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   363
            }
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   364
            return String.valueOf(compilable);
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   365
        }
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   366
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   367
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   368
    private final Description description;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   369
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   370
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   371
     * Gets a description of the computation associated with this debug context.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   372
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   373
     * @return {@code null} if no description is available
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   374
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   375
    public Description getDescription() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   376
        return description;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   377
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   378
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   379
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   380
     * Gets the global metrics associated with this debug context.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   381
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   382
     * @return {@code null} if no global metrics are available
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   383
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   384
    public GlobalMetrics getGlobalMetrics() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   385
        return globalMetrics;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   386
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   387
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   388
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   389
     * Creates a {@link DebugContext} based on a given set of option values and {@code factory}.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   390
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   391
    public static DebugContext create(OptionValues options, DebugHandlersFactory factory) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   392
        return new DebugContext(NO_DESCRIPTION, NO_GLOBAL_METRIC_VALUES, DEFAULT_LOG_STREAM, Immutable.create(options), Collections.singletonList(factory));
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   393
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   394
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   395
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   396
     * Creates a {@link DebugContext} based on a given set of option values and {@code factories}.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   397
     * The {@link DebugHandlersFactory#LOADER} can be used for the latter.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   398
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   399
    public static DebugContext create(OptionValues options, Iterable<DebugHandlersFactory> factories) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   400
        return new DebugContext(NO_DESCRIPTION, NO_GLOBAL_METRIC_VALUES, DEFAULT_LOG_STREAM, Immutable.create(options), factories);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   401
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   402
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   403
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   404
     * Creates a {@link DebugContext}.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   405
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   406
    public static DebugContext create(OptionValues options, Description description, GlobalMetrics globalMetrics, PrintStream logStream, Iterable<DebugHandlersFactory> factories) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   407
        return new DebugContext(description, globalMetrics, logStream, Immutable.create(options), factories);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   408
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   409
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   410
    private DebugContext(Description description, GlobalMetrics globalMetrics, PrintStream logStream, Immutable immutable, Iterable<DebugHandlersFactory> factories) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   411
        this.immutable = immutable;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   412
        this.description = description;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   413
        this.globalMetrics = globalMetrics;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   414
        if (immutable.scopesEnabled) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   415
            OptionValues options = immutable.options;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   416
            List<DebugDumpHandler> dumpHandlers = new ArrayList<>();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   417
            List<DebugVerifyHandler> verifyHandlers = new ArrayList<>();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   418
            for (DebugHandlersFactory factory : factories) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   419
                for (DebugHandler handler : factory.createHandlers(options)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   420
                    if (handler instanceof DebugDumpHandler) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   421
                        dumpHandlers.add((DebugDumpHandler) handler);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   422
                    } else {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   423
                        assert handler instanceof DebugVerifyHandler;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   424
                        verifyHandlers.add((DebugVerifyHandler) handler);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   425
                    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   426
                }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   427
            }
46762
f7defa99f173 8185829: Update Graal
dlong
parents: 46680
diff changeset
   428
            currentConfig = new DebugConfigImpl(options, logStream, dumpHandlers, verifyHandlers);
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   429
            currentScope = new ScopeImpl(this, Thread.currentThread());
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   430
            currentScope.updateFlags(currentConfig);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   431
            metricsEnabled = true;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   432
        } else {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   433
            metricsEnabled = immutable.hasUnscopedMetrics() || immutable.listMetrics;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   434
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   435
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   436
47798
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   437
    public Path getDumpPath(String extension, boolean directory) {
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   438
        try {
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   439
            String id = description == null ? null : description.identifier;
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   440
            String label = description == null ? null : description.getLabel();
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   441
            Path result = PathUtilities.createUnique(immutable.options, DumpPath, id, label, extension, directory);
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   442
            if (ShowDumpFiles.getValue(immutable.options)) {
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   443
                TTY.println("Dumping debug output to %s", result.toAbsolutePath().toString());
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   444
            }
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   445
            return result;
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   446
        } catch (IOException ex) {
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   447
            throw rethrowSilently(RuntimeException.class, ex);
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   448
        }
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   449
    }
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   450
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   451
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   452
     * A special dump level that indicates the dumping machinery is enabled but no dumps will be
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   453
     * produced except through other options.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   454
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   455
    public static final int ENABLED_LEVEL = 0;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   456
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   457
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   458
     * Basic debug level.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   459
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   460
     * For HIR dumping, only ~5 graphs per method: after parsing, after inlining, after high tier,
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   461
     * after mid tier, after low tier.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   462
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   463
     * LIR dumping: After LIR generation, after each pre-allocation, allocation and post allocation
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   464
     * stage, and after code installation.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   465
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   466
    public static final int BASIC_LEVEL = 1;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   467
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   468
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   469
     * Informational debug level.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   470
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   471
     * HIR dumping: One graph after each applied top-level phase.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   472
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   473
     * LIR dumping: After each applied phase.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   474
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   475
    public static final int INFO_LEVEL = 2;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   476
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   477
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   478
     * Verbose debug level.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   479
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   480
     * HIR dumping: One graph after each phase (including sub phases).
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   481
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   482
     * LIR dumping: After each phase including sub phases.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   483
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   484
    public static final int VERBOSE_LEVEL = 3;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   485
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   486
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   487
     * Detailed debug level.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   488
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   489
     * HIR dumping: Graphs within phases where interesting for a phase, max ~5 per phase.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   490
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   491
     * LIR dumping: Dump CFG within phases where interesting.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   492
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   493
    public static final int DETAILED_LEVEL = 4;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   494
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   495
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   496
     * Very detailed debug level.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   497
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   498
     * HIR dumping: Graphs per node granularity graph change (before/after change).
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   499
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   500
     * LIR dumping: Intermediate CFGs of phases where interesting.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   501
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   502
    public static final int VERY_DETAILED_LEVEL = 5;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   503
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   504
    public boolean isDumpEnabled(int dumpLevel) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   505
        return currentScope != null && currentScope.isDumpEnabled(dumpLevel);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   506
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   507
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   508
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   509
     * Determines if verification is enabled for any {@link JavaMethod} in the current scope.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   510
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   511
     * @see DebugContext#verify(Object, String)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   512
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   513
    public boolean isVerifyEnabledForMethod() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   514
        if (currentScope == null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   515
            return false;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   516
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   517
        if (currentConfig == null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   518
            return false;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   519
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   520
        return currentConfig.isVerifyEnabledForMethod(currentScope);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   521
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   522
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   523
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   524
     * Determines if verification is enabled in the current scope.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   525
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   526
     * @see DebugContext#verify(Object, String)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   527
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   528
    public boolean isVerifyEnabled() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   529
        return currentScope != null && currentScope.isVerifyEnabled();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   530
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   531
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   532
    public boolean isCountEnabled() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   533
        return currentScope != null && currentScope.isCountEnabled();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   534
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   535
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   536
    public boolean isTimeEnabled() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   537
        return currentScope != null && currentScope.isTimeEnabled();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   538
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   539
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   540
    public boolean isMemUseTrackingEnabled() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   541
        return currentScope != null && currentScope.isMemUseTrackingEnabled();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   542
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   543
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   544
    public boolean isDumpEnabledForMethod() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   545
        if (currentConfig == null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   546
            return false;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   547
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   548
        return currentConfig.isDumpEnabledForMethod(currentScope);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   549
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   550
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   551
    public boolean isLogEnabledForMethod() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   552
        if (currentScope == null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   553
            return false;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   554
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   555
        if (currentConfig == null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   556
            return false;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   557
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   558
        return currentConfig.isLogEnabledForMethod(currentScope);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   559
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   560
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   561
    public boolean isLogEnabled() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   562
        return currentScope != null && isLogEnabled(BASIC_LEVEL);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   563
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   564
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   565
    public boolean isLogEnabled(int logLevel) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   566
        return currentScope != null && currentScope.isLogEnabled(logLevel);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   567
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   568
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   569
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   570
     * Gets a string composed of the names in the current nesting of debug
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   571
     * {@linkplain #scope(Object) scopes} separated by {@code '.'}.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   572
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   573
    public String getCurrentScopeName() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   574
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   575
            return currentScope.getQualifiedName();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   576
        } else {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   577
            return "";
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   578
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   579
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   580
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   581
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   582
     * Creates and enters a new debug scope which will be a child of the current debug scope.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   583
     * <p>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   584
     * It is recommended to use the try-with-resource statement for managing entering and leaving
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   585
     * debug scopes. For example:
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   586
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   587
     * <pre>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   588
     * try (Scope s = Debug.scope(&quot;InliningGraph&quot;, inlineeGraph)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   589
     *     ...
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   590
     * } catch (Throwable e) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   591
     *     throw Debug.handle(e);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   592
     * }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   593
     * </pre>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   594
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   595
     * The {@code name} argument is subject to the following type based conversion before having
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   596
     * {@link Object#toString()} called on it:
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   597
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   598
     * <pre>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   599
     *     Type          | Conversion
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   600
     * ------------------+-----------------
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   601
     *  java.lang.Class  | arg.getSimpleName()
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   602
     *                   |
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   603
     * </pre>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   604
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   605
     * @param name the name of the new scope
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   606
     * @param contextObjects an array of object to be appended to the {@linkplain #context()
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   607
     *            current} debug context
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   608
     * @throws Throwable used to enforce a catch block.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   609
     * @return the scope entered by this method which will be exited when its {@link Scope#close()}
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   610
     *         method is called
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   611
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   612
    public DebugContext.Scope scope(Object name, Object[] contextObjects) throws Throwable {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   613
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   614
            return enterScope(convertFormatArg(name).toString(), null, contextObjects);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   615
        } else {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   616
            return null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   617
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   618
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   619
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   620
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   621
     * Similar to {@link #scope(Object, Object[])} but without context objects. Therefore the catch
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   622
     * block can be omitted.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   623
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   624
     * @see #scope(Object, Object[])
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   625
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   626
    public DebugContext.Scope scope(Object name) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   627
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   628
            return enterScope(convertFormatArg(name).toString(), null);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   629
        } else {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   630
            return null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   631
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   632
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   633
46762
f7defa99f173 8185829: Update Graal
dlong
parents: 46680
diff changeset
   634
    private final Invariants invariants = Assertions.assertionsEnabled() ? new Invariants() : null;
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   635
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   636
    static StackTraceElement[] getStackTrace(Thread thread) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   637
        return thread.getStackTrace();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   638
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   639
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   640
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   641
     * Utility for enforcing {@link DebugContext} invariants via assertions.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   642
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   643
    static class Invariants {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   644
        private final Thread thread;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   645
        private final StackTraceElement[] origin;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   646
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   647
        Invariants() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   648
            thread = Thread.currentThread();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   649
            origin = getStackTrace(thread);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   650
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   651
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   652
        boolean checkNoConcurrentAccess() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   653
            Thread currentThread = Thread.currentThread();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   654
            if (currentThread != thread) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   655
                Formatter buf = new Formatter();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   656
                buf.format("Thread local %s object was created on thread %s but is being accessed by thread %s. The most likely cause is " +
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   657
                                "that the object is being retrieved from a non-thread-local cache.",
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   658
                                DebugContext.class.getName(), thread, currentThread);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   659
                int debugContextConstructors = 0;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   660
                boolean addedHeader = false;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   661
                for (StackTraceElement e : origin) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   662
                    if (e.getMethodName().equals("<init>") && e.getClassName().equals(DebugContext.class.getName())) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   663
                        debugContextConstructors++;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   664
                    } else if (debugContextConstructors != 0) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   665
                        if (!addedHeader) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   666
                            addedHeader = true;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   667
                            buf.format(" The object was instantiated here:");
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   668
                        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   669
                        // Distinguish from assertion stack trace by using double indent and
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   670
                        // "in" instead of "at" prefix.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   671
                        buf.format("%n\t\tin %s", e);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   672
                    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   673
                }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   674
                if (addedHeader) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   675
                    buf.format("%n");
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   676
                }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   677
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   678
                throw new AssertionError(buf.toString());
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   679
            }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   680
            return true;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   681
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   682
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   683
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   684
    boolean checkNoConcurrentAccess() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   685
        assert invariants == null || invariants.checkNoConcurrentAccess();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   686
        return true;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   687
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   688
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   689
    private DebugContext.Scope enterScope(CharSequence name, DebugConfig sandboxConfig, Object... newContextObjects) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   690
        assert checkNoConcurrentAccess();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   691
        currentScope = currentScope.scope(name, sandboxConfig, newContextObjects);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   692
        return currentScope;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   693
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   694
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   695
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   696
     * @see #scope(Object, Object[])
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   697
     * @param context an object to be appended to the {@linkplain #context() current} debug context
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   698
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   699
    public DebugContext.Scope scope(Object name, Object context) throws Throwable {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   700
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   701
            return enterScope(convertFormatArg(name).toString(), null, context);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   702
        } else {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   703
            return null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   704
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   705
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   706
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   707
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   708
     * @see #scope(Object, Object[])
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   709
     * @param context1 first object to be appended to the {@linkplain #context() current} debug
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   710
     *            context
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   711
     * @param context2 second object to be appended to the {@linkplain #context() current} debug
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   712
     *            context
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   713
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   714
    public DebugContext.Scope scope(Object name, Object context1, Object context2) throws Throwable {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   715
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   716
            return enterScope(convertFormatArg(name).toString(), null, context1, context2);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   717
        } else {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   718
            return null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   719
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   720
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   721
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   722
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   723
     * @see #scope(Object, Object[])
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   724
     * @param context1 first object to be appended to the {@linkplain #context() current} debug
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   725
     *            context
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   726
     * @param context2 second object to be appended to the {@linkplain #context() current} debug
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   727
     *            context
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   728
     * @param context3 third object to be appended to the {@linkplain #context() current} debug
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   729
     *            context
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   730
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   731
    public DebugContext.Scope scope(Object name, Object context1, Object context2, Object context3) throws Throwable {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   732
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   733
            return enterScope(convertFormatArg(name).toString(), null, context1, context2, context3);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   734
        } else {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   735
            return null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   736
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   737
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   738
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   739
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   740
     * Creates and enters a new debug scope which will be disjoint from the current debug scope.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   741
     * <p>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   742
     * It is recommended to use the try-with-resource statement for managing entering and leaving
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   743
     * debug scopes. For example:
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   744
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   745
     * <pre>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   746
     * try (Scope s = Debug.sandbox(&quot;CompilingStub&quot;, null, stubGraph)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   747
     *     ...
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   748
     * } catch (Throwable e) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   749
     *     throw Debug.handle(e);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   750
     * }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   751
     * </pre>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   752
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   753
     * @param name the name of the new scope
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   754
     * @param config the debug configuration to use for the new scope or {@code null} to disable the
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   755
     *            scoping mechanism within the sandbox scope
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   756
     * @param context objects to be appended to the {@linkplain #context() current} debug context
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   757
     * @return the scope entered by this method which will be exited when its {@link Scope#close()}
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   758
     *         method is called
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   759
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   760
    public DebugContext.Scope sandbox(CharSequence name, DebugConfig config, Object... context) throws Throwable {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   761
        if (config == null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   762
            return disable();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   763
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   764
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   765
            return enterScope(name, config, context);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   766
        } else {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   767
            return null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   768
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   769
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   770
46680
2894e4262fd6 8184768: Update Graal
iveresov
parents: 46640
diff changeset
   771
    /**
2894e4262fd6 8184768: Update Graal
iveresov
parents: 46640
diff changeset
   772
     * Determines if scopes are enabled and this context is in a non-top-level scope.
2894e4262fd6 8184768: Update Graal
iveresov
parents: 46640
diff changeset
   773
     */
2894e4262fd6 8184768: Update Graal
iveresov
parents: 46640
diff changeset
   774
    public boolean inNestedScope() {
2894e4262fd6 8184768: Update Graal
iveresov
parents: 46640
diff changeset
   775
        if (immutable.scopesEnabled) {
2894e4262fd6 8184768: Update Graal
iveresov
parents: 46640
diff changeset
   776
            if (currentScope == null) {
2894e4262fd6 8184768: Update Graal
iveresov
parents: 46640
diff changeset
   777
                // In an active DisabledScope
2894e4262fd6 8184768: Update Graal
iveresov
parents: 46640
diff changeset
   778
                return true;
2894e4262fd6 8184768: Update Graal
iveresov
parents: 46640
diff changeset
   779
            }
2894e4262fd6 8184768: Update Graal
iveresov
parents: 46640
diff changeset
   780
            return !currentScope.isTopLevel();
2894e4262fd6 8184768: Update Graal
iveresov
parents: 46640
diff changeset
   781
        }
2894e4262fd6 8184768: Update Graal
iveresov
parents: 46640
diff changeset
   782
        return immutable.scopesEnabled && currentScope == null;
2894e4262fd6 8184768: Update Graal
iveresov
parents: 46640
diff changeset
   783
    }
2894e4262fd6 8184768: Update Graal
iveresov
parents: 46640
diff changeset
   784
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   785
    class DisabledScope implements DebugContext.Scope {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   786
        final boolean savedMetricsEnabled;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   787
        final ScopeImpl savedScope;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   788
        final DebugConfig savedConfig;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   789
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   790
        DisabledScope() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   791
            this.savedMetricsEnabled = metricsEnabled;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   792
            this.savedScope = currentScope;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   793
            this.savedConfig = currentConfig;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   794
            metricsEnabled = false;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   795
            currentScope = null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   796
            currentConfig = null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   797
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   798
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   799
        @Override
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   800
        public String getQualifiedName() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   801
            return "";
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   802
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   803
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   804
        @Override
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   805
        public Iterable<Object> getCurrentContext() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   806
            return Collections.emptyList();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   807
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   808
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   809
        @Override
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   810
        public void close() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   811
            metricsEnabled = savedMetricsEnabled;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   812
            currentScope = savedScope;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   813
            currentConfig = savedConfig;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   814
            lastClosedScope = this;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   815
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   816
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   817
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   818
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   819
     * Disables all metrics and scope related functionality until {@code close()} is called on the
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   820
     * returned object.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   821
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   822
    public DebugContext.Scope disable() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   823
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   824
            return new DisabledScope();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   825
        } else {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   826
            return null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   827
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   828
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   829
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   830
    public DebugContext.Scope forceLog() throws Throwable {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   831
        if (currentConfig != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   832
            ArrayList<Object> context = new ArrayList<>();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   833
            for (Object obj : context()) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   834
                context.add(obj);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   835
            }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   836
            DebugConfigImpl config = new DebugConfigImpl(new OptionValues(currentConfig.getOptions(), DebugOptions.Log, ":1000"));
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   837
            return sandbox("forceLog", config, context.toArray());
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   838
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   839
        return null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   840
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   841
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   842
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   843
     * Opens a scope in which exception
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   844
     * {@linkplain DebugConfig#interceptException(DebugContext, Throwable) interception} is
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   845
     * disabled. The current state of interception is restored when {@link DebugCloseable#close()}
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   846
     * is called on the returned object.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   847
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   848
     * This is particularly useful to suppress extraneous output in JUnit tests that are expected to
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   849
     * throw an exception.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   850
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   851
    public DebugCloseable disableIntercept() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   852
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   853
            return currentScope.disableIntercept();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   854
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   855
        return null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   856
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   857
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   858
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   859
     * Handles an exception in the context of the debug scope just exited. The just exited scope
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   860
     * must have the current scope as its parent which will be the case if the try-with-resource
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   861
     * pattern recommended by {@link #scope(Object)} and
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   862
     * {@link #sandbox(CharSequence, DebugConfig, Object...)} is used
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   863
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   864
     * @see #scope(Object, Object[])
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   865
     * @see #sandbox(CharSequence, DebugConfig, Object...)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   866
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   867
    public RuntimeException handle(Throwable exception) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   868
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   869
            return currentScope.handle(exception);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   870
        } else {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   871
            if (exception instanceof Error) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   872
                throw (Error) exception;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   873
            }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   874
            if (exception instanceof RuntimeException) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   875
                throw (RuntimeException) exception;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   876
            }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   877
            throw new RuntimeException(exception);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   878
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   879
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   880
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   881
    public void log(String msg) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   882
        log(BASIC_LEVEL, msg);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   883
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   884
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   885
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   886
     * Prints a message to the current debug scope's logging stream if logging is enabled.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   887
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   888
     * @param msg the message to log
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   889
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   890
    public void log(int logLevel, String msg) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   891
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   892
            currentScope.log(logLevel, msg);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   893
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   894
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   895
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   896
    public void log(String format, Object arg) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   897
        log(BASIC_LEVEL, format, arg);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   898
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   899
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   900
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   901
     * Prints a message to the current debug scope's logging stream if logging is enabled.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   902
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   903
     * @param format a format string
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   904
     * @param arg the argument referenced by the format specifiers in {@code format}
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   905
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   906
    public void log(int logLevel, String format, Object arg) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   907
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   908
            currentScope.log(logLevel, format, arg);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   909
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   910
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   911
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   912
    public void log(String format, int arg) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   913
        log(BASIC_LEVEL, format, arg);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   914
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   915
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   916
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   917
     * Prints a message to the current debug scope's logging stream if logging is enabled.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   918
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   919
     * @param format a format string
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   920
     * @param arg the argument referenced by the format specifiers in {@code format}
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   921
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   922
    public void log(int logLevel, String format, int arg) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   923
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   924
            currentScope.log(logLevel, format, arg);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   925
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   926
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   927
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   928
    public void log(String format, Object arg1, Object arg2) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   929
        log(BASIC_LEVEL, format, arg1, arg2);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   930
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   931
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   932
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   933
     * @see #log(int, String, Object)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   934
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   935
    public void log(int logLevel, String format, Object arg1, Object arg2) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   936
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   937
            currentScope.log(logLevel, format, arg1, arg2);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   938
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   939
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   940
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   941
    public void log(String format, int arg1, Object arg2) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   942
        log(BASIC_LEVEL, format, arg1, arg2);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   943
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   944
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   945
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   946
     * @see #log(int, String, Object)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   947
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   948
    public void log(int logLevel, String format, int arg1, Object arg2) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   949
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   950
            currentScope.log(logLevel, format, arg1, arg2);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   951
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   952
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   953
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   954
    public void log(String format, Object arg1, int arg2) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   955
        log(BASIC_LEVEL, format, arg1, arg2);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   956
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   957
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   958
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   959
     * @see #log(int, String, Object)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   960
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   961
    public void log(int logLevel, String format, Object arg1, int arg2) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   962
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   963
            currentScope.log(logLevel, format, arg1, arg2);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   964
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   965
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   966
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   967
    public void log(String format, int arg1, int arg2) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   968
        log(BASIC_LEVEL, format, arg1, arg2);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   969
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   970
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   971
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   972
     * @see #log(int, String, Object)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   973
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   974
    public void log(int logLevel, String format, int arg1, int arg2) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   975
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   976
            currentScope.log(logLevel, format, arg1, arg2);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   977
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   978
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   979
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   980
    public void log(String format, Object arg1, Object arg2, Object arg3) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   981
        log(BASIC_LEVEL, format, arg1, arg2, arg3);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   982
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   983
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   984
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   985
     * @see #log(int, String, Object)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   986
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   987
    public void log(int logLevel, String format, Object arg1, Object arg2, Object arg3) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   988
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   989
            currentScope.log(logLevel, format, arg1, arg2, arg3);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   990
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   991
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   992
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   993
    public void log(String format, int arg1, int arg2, int arg3) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   994
        log(BASIC_LEVEL, format, arg1, arg2, arg3);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   995
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   996
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   997
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   998
     * @see #log(int, String, Object)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
   999
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1000
    public void log(int logLevel, String format, int arg1, int arg2, int arg3) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1001
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1002
            currentScope.log(logLevel, format, arg1, arg2, arg3);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1003
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1004
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1005
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1006
    public void log(String format, Object arg1, Object arg2, Object arg3, Object arg4) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1007
        log(BASIC_LEVEL, format, arg1, arg2, arg3, arg4);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1008
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1009
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1010
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1011
     * @see #log(int, String, Object)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1012
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1013
    public void log(int logLevel, String format, Object arg1, Object arg2, Object arg3, Object arg4) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1014
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1015
            currentScope.log(logLevel, format, arg1, arg2, arg3, arg4);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1016
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1017
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1018
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1019
    public void log(String format, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1020
        log(BASIC_LEVEL, format, arg1, arg2, arg3, arg4, arg5);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1021
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1022
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1023
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1024
     * @see #log(int, String, Object)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1025
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1026
    public void log(int logLevel, String format, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1027
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1028
            currentScope.log(logLevel, format, arg1, arg2, arg3, arg4, arg5);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1029
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1030
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1031
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1032
    public void log(String format, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1033
        log(BASIC_LEVEL, format, arg1, arg2, arg3, arg4, arg5, arg6);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1034
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1035
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1036
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1037
     * @see #log(int, String, Object)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1038
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1039
    public void log(int logLevel, String format, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1040
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1041
            currentScope.log(logLevel, format, arg1, arg2, arg3, arg4, arg5, arg6);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1042
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1043
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1044
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1045
    public void log(String format, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1046
        log(BASIC_LEVEL, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1047
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1048
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1049
    public void log(String format, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7, Object arg8) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1050
        log(BASIC_LEVEL, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1051
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1052
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1053
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1054
     * @see #log(int, String, Object)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1055
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1056
    public void log(int logLevel, String format, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1057
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1058
            currentScope.log(logLevel, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1059
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1060
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1061
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1062
    public void log(int logLevel, String format, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7, Object arg8) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1063
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1064
            currentScope.log(logLevel, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1065
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1066
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1067
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1068
    public void log(String format, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7, Object arg8, Object arg9) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1069
        log(BASIC_LEVEL, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1070
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1071
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1072
    public void log(int logLevel, String format, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7, Object arg8, Object arg9) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1073
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1074
            currentScope.log(logLevel, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1075
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1076
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1077
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1078
    public void log(String format, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7, Object arg8, Object arg9, Object arg10) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1079
        log(BASIC_LEVEL, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1080
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1081
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1082
    public void log(int logLevel, String format, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7, Object arg8, Object arg9, Object arg10) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1083
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1084
            currentScope.log(logLevel, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1085
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1086
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1087
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1088
    public void logv(String format, Object... args) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1089
        logv(BASIC_LEVEL, format, args);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1090
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1091
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1092
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1093
     * Prints a message to the current debug scope's logging stream. This method must only be called
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1094
     * if debugging scopes are {@linkplain DebugContext#areScopesEnabled() enabled} as it incurs
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1095
     * allocation at the call site. If possible, call one of the other {@code log()} methods in this
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1096
     * class that take a fixed number of parameters.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1097
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1098
     * @param format a format string
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1099
     * @param args the arguments referenced by the format specifiers in {@code format}
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1100
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1101
    public void logv(int logLevel, String format, Object... args) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1102
        if (currentScope == null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1103
            throw new InternalError("Use of Debug.logv() must be guarded by a test of Debug.isEnabled()");
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1104
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1105
        currentScope.log(logLevel, format, args);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1106
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1107
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1108
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1109
     * This override exists to catch cases when {@link #log(String, Object)} is called with one
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1110
     * argument bound to a varargs method parameter. It will bind to this method instead of the
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1111
     * single arg variant and produce a deprecation warning instead of silently wrapping the
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1112
     * Object[] inside of another Object[].
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1113
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1114
    @Deprecated
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1115
    public void log(String format, Object[] args) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1116
        assert false : "shouldn't use this";
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1117
        log(BASIC_LEVEL, format, args);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1118
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1119
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1120
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1121
     * This override exists to catch cases when {@link #log(int, String, Object)} is called with one
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1122
     * argument bound to a varargs method parameter. It will bind to this method instead of the
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1123
     * single arg variant and produce a deprecation warning instead of silently wrapping the
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1124
     * Object[] inside of another Object[].
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1125
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1126
    @Deprecated
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1127
    public void log(int logLevel, String format, Object[] args) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1128
        assert false : "shouldn't use this";
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1129
        logv(logLevel, format, args);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1130
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1131
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1132
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1133
     * Forces an unconditional dump. This method exists mainly for debugging. It can also be used to
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1134
     * force a graph dump from IDEs that support invoking a Java method while at a breakpoint.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1135
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1136
    public void forceDump(Object object, String format, Object... args) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1137
        DebugConfig config = currentConfig;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1138
        Collection<DebugDumpHandler> dumpHandlers;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1139
        boolean closeAfterDump;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1140
        if (config != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1141
            dumpHandlers = config.dumpHandlers();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1142
            closeAfterDump = false;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1143
        } else {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1144
            OptionValues options = getOptions();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1145
            dumpHandlers = new ArrayList<>();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1146
            for (DebugHandlersFactory factory : DebugHandlersFactory.LOADER) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1147
                for (DebugHandler handler : factory.createHandlers(options)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1148
                    if (handler instanceof DebugDumpHandler) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1149
                        dumpHandlers.add((DebugDumpHandler) handler);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1150
                    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1151
                }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1152
            }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1153
            closeAfterDump = true;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1154
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1155
        for (DebugDumpHandler dumpHandler : dumpHandlers) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1156
            dumpHandler.dump(this, object, format, args);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1157
            if (closeAfterDump) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1158
                dumpHandler.close();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1159
            }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1160
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1161
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1162
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1163
    public void dump(int dumpLevel, Object object, String msg) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1164
        if (currentScope != null && currentScope.isDumpEnabled(dumpLevel)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1165
            currentScope.dump(dumpLevel, object, msg);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1166
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1167
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1168
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1169
    public void dump(int dumpLevel, Object object, String format, Object arg) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1170
        if (currentScope != null && currentScope.isDumpEnabled(dumpLevel)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1171
            currentScope.dump(dumpLevel, object, format, arg);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1172
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1173
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1174
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1175
    public void dump(int dumpLevel, Object object, String format, Object arg1, Object arg2) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1176
        if (currentScope != null && currentScope.isDumpEnabled(dumpLevel)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1177
            currentScope.dump(dumpLevel, object, format, arg1, arg2);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1178
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1179
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1180
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1181
    public void dump(int dumpLevel, Object object, String format, Object arg1, Object arg2, Object arg3) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1182
        if (currentScope != null && currentScope.isDumpEnabled(dumpLevel)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1183
            currentScope.dump(dumpLevel, object, format, arg1, arg2, arg3);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1184
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1185
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1186
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1187
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1188
     * This override exists to catch cases when {@link #dump(int, Object, String, Object)} is called
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1189
     * with one argument bound to a varargs method parameter. It will bind to this method instead of
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1190
     * the single arg variant and produce a deprecation warning instead of silently wrapping the
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1191
     * Object[] inside of another Object[].
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1192
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1193
    @Deprecated
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1194
    public void dump(int dumpLevel, Object object, String format, Object[] args) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1195
        assert false : "shouldn't use this";
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1196
        if (currentScope != null && currentScope.isDumpEnabled(dumpLevel)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1197
            currentScope.dump(dumpLevel, object, format, args);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1198
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1199
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1200
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1201
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1202
     * Calls all {@link DebugVerifyHandler}s in the current {@linkplain #getConfig() config} to
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1203
     * perform verification on a given object.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1204
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1205
     * @param object object to verify
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1206
     * @param message description of verification context
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1207
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1208
     * @see DebugVerifyHandler#verify
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1209
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1210
    public void verify(Object object, String message) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1211
        if (currentScope != null && currentScope.isVerifyEnabled()) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1212
            currentScope.verify(object, message);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1213
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1214
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1215
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1216
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1217
     * Calls all {@link DebugVerifyHandler}s in the current {@linkplain #getConfig() config} to
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1218
     * perform verification on a given object.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1219
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1220
     * @param object object to verify
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1221
     * @param format a format string for the description of the verification context
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1222
     * @param arg the argument referenced by the format specifiers in {@code format}
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1223
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1224
     * @see DebugVerifyHandler#verify
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1225
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1226
    public void verify(Object object, String format, Object arg) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1227
        if (currentScope != null && currentScope.isVerifyEnabled()) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1228
            currentScope.verify(object, format, arg);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1229
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1230
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1231
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1232
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1233
     * This override exists to catch cases when {@link #verify(Object, String, Object)} is called
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1234
     * with one argument bound to a varargs method parameter. It will bind to this method instead of
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1235
     * the single arg variant and produce a deprecation warning instead of silently wrapping the
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1236
     * Object[] inside of another Object[].
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1237
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1238
    @Deprecated
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1239
    public void verify(Object object, String format, Object[] args) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1240
        assert false : "shouldn't use this";
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1241
        if (currentScope != null && currentScope.isVerifyEnabled()) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1242
            currentScope.verify(object, format, args);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1243
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1244
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1245
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1246
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1247
     * Opens a new indentation level (by adding some spaces) based on the current indentation level.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1248
     * This should be used in a {@linkplain Indent try-with-resources} pattern.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1249
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1250
     * @return an object that reverts to the current indentation level when
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1251
     *         {@linkplain Indent#close() closed} or null if debugging is disabled
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1252
     * @see #logAndIndent(int, String)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1253
     * @see #logAndIndent(int, String, Object)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1254
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1255
    public Indent indent() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1256
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1257
            return currentScope.pushIndentLogger();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1258
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1259
        return null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1260
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1261
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1262
    public Indent logAndIndent(String msg) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1263
        return logAndIndent(BASIC_LEVEL, msg);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1264
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1265
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1266
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1267
     * A convenience function which combines {@link #log(String)} and {@link #indent()}.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1268
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1269
     * @param msg the message to log
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1270
     * @return an object that reverts to the current indentation level when
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1271
     *         {@linkplain Indent#close() closed} or null if debugging is disabled
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1272
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1273
    public Indent logAndIndent(int logLevel, String msg) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1274
        if (currentScope != null && isLogEnabled(logLevel)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1275
            return logvAndIndentInternal(logLevel, msg);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1276
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1277
        return null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1278
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1279
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1280
    public Indent logAndIndent(String format, Object arg) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1281
        return logAndIndent(BASIC_LEVEL, format, arg);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1282
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1283
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1284
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1285
     * A convenience function which combines {@link #log(String, Object)} and {@link #indent()}.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1286
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1287
     * @param format a format string
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1288
     * @param arg the argument referenced by the format specifiers in {@code format}
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1289
     * @return an object that reverts to the current indentation level when
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1290
     *         {@linkplain Indent#close() closed} or null if debugging is disabled
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1291
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1292
    public Indent logAndIndent(int logLevel, String format, Object arg) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1293
        if (currentScope != null && isLogEnabled(logLevel)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1294
            return logvAndIndentInternal(logLevel, format, arg);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1295
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1296
        return null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1297
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1298
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1299
    public Indent logAndIndent(String format, int arg) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1300
        return logAndIndent(BASIC_LEVEL, format, arg);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1301
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1302
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1303
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1304
     * A convenience function which combines {@link #log(String, Object)} and {@link #indent()}.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1305
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1306
     * @param format a format string
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1307
     * @param arg the argument referenced by the format specifiers in {@code format}
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1308
     * @return an object that reverts to the current indentation level when
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1309
     *         {@linkplain Indent#close() closed} or null if debugging is disabled
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1310
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1311
    public Indent logAndIndent(int logLevel, String format, int arg) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1312
        if (currentScope != null && isLogEnabled(logLevel)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1313
            return logvAndIndentInternal(logLevel, format, arg);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1314
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1315
        return null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1316
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1317
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1318
    public Indent logAndIndent(String format, int arg1, Object arg2) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1319
        return logAndIndent(BASIC_LEVEL, format, arg1, arg2);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1320
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1321
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1322
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1323
     * @see #logAndIndent(int, String, Object)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1324
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1325
    public Indent logAndIndent(int logLevel, String format, int arg1, Object arg2) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1326
        if (currentScope != null && isLogEnabled(logLevel)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1327
            return logvAndIndentInternal(logLevel, format, arg1, arg2);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1328
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1329
        return null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1330
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1331
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1332
    public Indent logAndIndent(String format, Object arg1, int arg2) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1333
        return logAndIndent(BASIC_LEVEL, format, arg1, arg2);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1334
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1335
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1336
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1337
     * @see #logAndIndent(int, String, Object)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1338
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1339
    public Indent logAndIndent(int logLevel, String format, Object arg1, int arg2) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1340
        if (currentScope != null && isLogEnabled(logLevel)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1341
            return logvAndIndentInternal(logLevel, format, arg1, arg2);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1342
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1343
        return null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1344
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1345
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1346
    public Indent logAndIndent(String format, int arg1, int arg2) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1347
        return logAndIndent(BASIC_LEVEL, format, arg1, arg2);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1348
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1349
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1350
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1351
     * @see #logAndIndent(int, String, Object)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1352
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1353
    public Indent logAndIndent(int logLevel, String format, int arg1, int arg2) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1354
        if (currentScope != null && isLogEnabled(logLevel)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1355
            return logvAndIndentInternal(logLevel, format, arg1, arg2);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1356
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1357
        return null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1358
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1359
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1360
    public Indent logAndIndent(String format, Object arg1, Object arg2) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1361
        return logAndIndent(BASIC_LEVEL, format, arg1, arg2);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1362
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1363
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1364
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1365
     * @see #logAndIndent(int, String, Object)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1366
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1367
    public Indent logAndIndent(int logLevel, String format, Object arg1, Object arg2) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1368
        if (currentScope != null && isLogEnabled(logLevel)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1369
            return logvAndIndentInternal(logLevel, format, arg1, arg2);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1370
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1371
        return null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1372
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1373
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1374
    public Indent logAndIndent(String format, Object arg1, Object arg2, Object arg3) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1375
        return logAndIndent(BASIC_LEVEL, format, arg1, arg2, arg3);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1376
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1377
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1378
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1379
     * @see #logAndIndent(int, String, Object)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1380
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1381
    public Indent logAndIndent(int logLevel, String format, Object arg1, Object arg2, Object arg3) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1382
        if (currentScope != null && isLogEnabled(logLevel)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1383
            return logvAndIndentInternal(logLevel, format, arg1, arg2, arg3);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1384
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1385
        return null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1386
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1387
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1388
    public Indent logAndIndent(String format, int arg1, int arg2, int arg3) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1389
        return logAndIndent(BASIC_LEVEL, format, arg1, arg2, arg3);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1390
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1391
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1392
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1393
     * @see #logAndIndent(int, String, Object)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1394
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1395
    public Indent logAndIndent(int logLevel, String format, int arg1, int arg2, int arg3) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1396
        if (currentScope != null && isLogEnabled(logLevel)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1397
            return logvAndIndentInternal(logLevel, format, arg1, arg2, arg3);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1398
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1399
        return null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1400
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1401
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1402
    public Indent logAndIndent(String format, Object arg1, int arg2, int arg3) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1403
        return logAndIndent(BASIC_LEVEL, format, arg1, arg2, arg3);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1404
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1405
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1406
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1407
     * @see #logAndIndent(int, String, Object)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1408
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1409
    public Indent logAndIndent(int logLevel, String format, Object arg1, int arg2, int arg3) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1410
        if (currentScope != null && isLogEnabled(logLevel)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1411
            return logvAndIndentInternal(logLevel, format, arg1, arg2, arg3);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1412
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1413
        return null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1414
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1415
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1416
    public Indent logAndIndent(String format, Object arg1, Object arg2, Object arg3, Object arg4) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1417
        return logAndIndent(BASIC_LEVEL, format, arg1, arg2, arg3, arg4);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1418
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1419
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1420
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1421
     * @see #logAndIndent(int, String, Object)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1422
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1423
    public Indent logAndIndent(int logLevel, String format, Object arg1, Object arg2, Object arg3, Object arg4) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1424
        if (currentScope != null && isLogEnabled(logLevel)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1425
            return logvAndIndentInternal(logLevel, format, arg1, arg2, arg3, arg4);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1426
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1427
        return null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1428
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1429
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1430
    public Indent logAndIndent(String format, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1431
        return logAndIndent(BASIC_LEVEL, format, arg1, arg2, arg3, arg4, arg5);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1432
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1433
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1434
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1435
     * @see #logAndIndent(int, String, Object)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1436
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1437
    public Indent logAndIndent(int logLevel, String format, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1438
        if (currentScope != null && isLogEnabled(logLevel)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1439
            return logvAndIndentInternal(logLevel, format, arg1, arg2, arg3, arg4, arg5);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1440
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1441
        return null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1442
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1443
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1444
    public Indent logAndIndent(String format, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1445
        return logAndIndent(BASIC_LEVEL, format, arg1, arg2, arg3, arg4, arg5, arg6);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1446
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1447
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1448
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1449
     * @see #logAndIndent(int, String, Object)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1450
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1451
    public Indent logAndIndent(int logLevel, String format, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1452
        if (currentScope != null && isLogEnabled(logLevel)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1453
            return logvAndIndentInternal(logLevel, format, arg1, arg2, arg3, arg4, arg5, arg6);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1454
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1455
        return null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1456
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1457
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1458
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1459
     * A convenience function which combines {@link #logv(int, String, Object...)} and
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1460
     * {@link #indent()}.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1461
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1462
     * @param format a format string
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1463
     * @param args the arguments referenced by the format specifiers in {@code format}
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1464
     * @return an object that reverts to the current indentation level when
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1465
     *         {@linkplain Indent#close() closed} or null if debugging is disabled
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1466
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1467
    public Indent logvAndIndent(int logLevel, String format, Object... args) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1468
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1469
            if (isLogEnabled(logLevel)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1470
                return logvAndIndentInternal(logLevel, format, args);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1471
            }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1472
            return null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1473
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1474
        throw new InternalError("Use of Debug.logvAndIndent() must be guarded by a test of Debug.isEnabled()");
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1475
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1476
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1477
    private Indent logvAndIndentInternal(int logLevel, String format, Object... args) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1478
        assert currentScope != null && isLogEnabled(logLevel) : "must have checked Debug.isLogEnabled()";
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1479
        currentScope.log(logLevel, format, args);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1480
        return currentScope.pushIndentLogger();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1481
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1482
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1483
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1484
     * This override exists to catch cases when {@link #logAndIndent(String, Object)} is called with
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1485
     * one argument bound to a varargs method parameter. It will bind to this method instead of the
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1486
     * single arg variant and produce a deprecation warning instead of silently wrapping the
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1487
     * Object[] inside of another Object[].
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1488
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1489
    @Deprecated
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1490
    public void logAndIndent(String format, Object[] args) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1491
        assert false : "shouldn't use this";
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1492
        logAndIndent(BASIC_LEVEL, format, args);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1493
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1494
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1495
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1496
     * This override exists to catch cases when {@link #logAndIndent(int, String, Object)} is called
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1497
     * with one argument bound to a varargs method parameter. It will bind to this method instead of
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1498
     * the single arg variant and produce a deprecation warning instead of silently wrapping the
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1499
     * Object[] inside of another Object[].
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1500
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1501
    @Deprecated
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1502
    public void logAndIndent(int logLevel, String format, Object[] args) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1503
        assert false : "shouldn't use this";
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1504
        logvAndIndent(logLevel, format, args);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1505
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1506
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1507
    public Iterable<Object> context() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1508
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1509
            return currentScope.getCurrentContext();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1510
        } else {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1511
            return Collections.emptyList();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1512
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1513
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1514
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1515
    @SuppressWarnings("unchecked")
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1516
    public <T> List<T> contextSnapshot(Class<T> clazz) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1517
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1518
            List<T> result = new ArrayList<>();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1519
            for (Object o : context()) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1520
                if (clazz.isInstance(o)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1521
                    result.add((T) o);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1522
                }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1523
            }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1524
            return result;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1525
        } else {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1526
            return Collections.emptyList();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1527
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1528
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1529
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1530
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1531
     * Searches the current debug scope, bottom up, for a context object that is an instance of a
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1532
     * given type. The first such object found is returned.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1533
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1534
    @SuppressWarnings("unchecked")
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1535
    public <T> T contextLookup(Class<T> clazz) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1536
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1537
            for (Object o : context()) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1538
                if (clazz.isInstance(o)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1539
                    return ((T) o);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1540
                }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1541
            }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1542
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1543
        return null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1544
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1545
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1546
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1547
     * Searches the current debug scope, top down, for a context object that is an instance of a
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1548
     * given type. The first such object found is returned.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1549
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1550
    @SuppressWarnings("unchecked")
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1551
    public <T> T contextLookupTopdown(Class<T> clazz) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1552
        if (currentScope != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1553
            T found = null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1554
            for (Object o : context()) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1555
                if (clazz.isInstance(o)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1556
                    found = (T) o;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1557
                }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1558
            }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1559
            return found;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1560
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1561
        return null;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1562
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1563
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1564
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1565
     * Creates a {@linkplain MemUseTrackerKey memory use tracker}.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1566
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1567
    public static MemUseTrackerKey memUseTracker(CharSequence name) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1568
        return createMemUseTracker("%s", name, null);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1569
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1570
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1571
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1572
     * Creates a debug memory use tracker. Invoking this method is equivalent to:
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1573
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1574
     * <pre>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1575
     * Debug.memUseTracker(format, arg, null)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1576
     * </pre>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1577
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1578
     * except that the string formatting only happens if mem tracking is enabled.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1579
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1580
     * @see #counter(String, Object, Object)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1581
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1582
    public static MemUseTrackerKey memUseTracker(String format, Object arg) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1583
        return createMemUseTracker(format, arg, null);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1584
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1585
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1586
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1587
     * Creates a debug memory use tracker. Invoking this method is equivalent to:
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1588
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1589
     * <pre>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1590
     * Debug.memUseTracker(String.format(format, arg1, arg2))
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1591
     * </pre>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1592
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1593
     * except that the string formatting only happens if memory use tracking is enabled. In
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1594
     * addition, each argument is subject to the following type based conversion before being passed
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1595
     * as an argument to {@link String#format(String, Object...)}:
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1596
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1597
     * <pre>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1598
     *     Type          | Conversion
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1599
     * ------------------+-----------------
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1600
     *  java.lang.Class  | arg.getSimpleName()
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1601
     *                   |
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1602
     * </pre>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1603
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1604
     * @see #memUseTracker(CharSequence)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1605
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1606
    public static MemUseTrackerKey memUseTracker(String format, Object arg1, Object arg2) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1607
        return createMemUseTracker(format, arg1, arg2);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1608
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1609
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1610
    private static MemUseTrackerKey createMemUseTracker(String format, Object arg1, Object arg2) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1611
        return new MemUseTrackerKeyImpl(format, arg1, arg2);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1612
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1613
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1614
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1615
     * Creates a {@linkplain CounterKey counter}.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1616
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1617
    public static CounterKey counter(CharSequence name) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1618
        return createCounter("%s", name, null);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1619
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1620
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1621
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1622
     * Gets a tally of the metric values in this context and a given tally.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1623
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1624
     * @param tally the tally to which the metrics should be added
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1625
     * @return a tally of the metric values in this context and {@code tally}. This will be
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1626
     *         {@code tally} if this context has no metric values or {@code tally} is wide enough to
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1627
     *         hold all the metric values in this context otherwise it will be a new array.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1628
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1629
    public long[] addValuesTo(long[] tally) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1630
        if (metricValues == null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1631
            return tally;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1632
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1633
        if (tally == null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1634
            return metricValues.clone();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1635
        } else if (metricValues.length >= tally.length) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1636
            long[] newTally = metricValues.clone();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1637
            for (int i = 0; i < tally.length; i++) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1638
                newTally[i] += tally[i];
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1639
            }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1640
            return newTally;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1641
        } else {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1642
            for (int i = 0; i < metricValues.length; i++) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1643
                tally[i] += metricValues[i];
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1644
            }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1645
            return tally;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1646
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1647
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1648
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1649
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1650
     * Creates and returns a sorted map from metric names to their values in {@code values}.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1651
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1652
     * @param values values for metrics in the {@link KeyRegistry}.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1653
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1654
    public static EconomicMap<MetricKey, Long> convertValuesToKeyValueMap(long[] values) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1655
        List<MetricKey> keys = KeyRegistry.getKeys();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1656
        Collections.sort(keys, MetricKey.NAME_COMPARATOR);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1657
        EconomicMap<MetricKey, Long> res = EconomicMap.create(keys.size());
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1658
        for (MetricKey key : keys) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1659
            int index = ((AbstractKey) key).getIndex();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1660
            if (index >= values.length) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1661
                res.put(key, 0L);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1662
            } else {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1663
                res.put(key, values[index]);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1664
            }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1665
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1666
        return res;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1667
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1668
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1669
    void setMetricValue(int keyIndex, long l) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1670
        ensureMetricValuesSize(keyIndex);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1671
        metricValues[keyIndex] = l;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1672
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1673
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1674
    long getMetricValue(int keyIndex) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1675
        if (metricValues == null || metricValues.length <= keyIndex) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1676
            return 0L;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1677
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1678
        return metricValues[keyIndex];
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1679
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1680
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1681
    private void ensureMetricValuesSize(int index) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1682
        if (metricValues == null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1683
            metricValues = new long[index + 1];
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1684
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1685
        if (metricValues.length <= index) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1686
            metricValues = Arrays.copyOf(metricValues, index + 1);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1687
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1688
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1689
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1690
    public static String applyFormattingFlagsAndWidth(String s, int flags, int width) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1691
        if (flags == 0 && width < 0) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1692
            return s;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1693
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1694
        StringBuilder sb = new StringBuilder(s);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1695
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1696
        // apply width and justification
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1697
        int len = sb.length();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1698
        if (len < width) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1699
            for (int i = 0; i < width - len; i++) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1700
                if ((flags & LEFT_JUSTIFY) == LEFT_JUSTIFY) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1701
                    sb.append(' ');
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1702
                } else {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1703
                    sb.insert(0, ' ');
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1704
                }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1705
            }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1706
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1707
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1708
        String res = sb.toString();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1709
        if ((flags & UPPERCASE) == UPPERCASE) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1710
            res = res.toUpperCase();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1711
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1712
        return res;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1713
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1714
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1715
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1716
     * Creates a debug counter. Invoking this method is equivalent to:
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1717
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1718
     * <pre>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1719
     * Debug.counter(format, arg, null)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1720
     * </pre>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1721
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1722
     * except that the string formatting only happens if count is enabled.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1723
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1724
     * @see #counter(String, Object, Object)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1725
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1726
    public static CounterKey counter(String format, Object arg) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1727
        return createCounter(format, arg, null);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1728
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1729
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1730
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1731
     * Creates a debug counter. Invoking this method is equivalent to:
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1732
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1733
     * <pre>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1734
     * Debug.counter(String.format(format, arg1, arg2))
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1735
     * </pre>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1736
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1737
     * except that the string formatting only happens if count is enabled. In addition, each
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1738
     * argument is subject to the following type based conversion before being passed as an argument
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1739
     * to {@link String#format(String, Object...)}:
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1740
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1741
     * <pre>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1742
     *     Type          | Conversion
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1743
     * ------------------+-----------------
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1744
     *  java.lang.Class  | arg.getSimpleName()
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1745
     *                   |
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1746
     * </pre>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1747
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1748
     * @see #counter(CharSequence)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1749
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1750
    public static CounterKey counter(String format, Object arg1, Object arg2) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1751
        return createCounter(format, arg1, arg2);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1752
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1753
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1754
    private static CounterKey createCounter(String format, Object arg1, Object arg2) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1755
        return new CounterKeyImpl(format, arg1, arg2);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1756
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1757
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1758
    public DebugConfig getConfig() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1759
        return currentConfig;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1760
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1761
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1762
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1763
     * Creates a {@linkplain TimerKey timer}.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1764
     * <p>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1765
     * A disabled timer has virtually no overhead.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1766
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1767
    public static TimerKey timer(CharSequence name) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1768
        return createTimer("%s", name, null);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1769
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1770
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1771
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1772
     * Creates a debug timer. Invoking this method is equivalent to:
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1773
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1774
     * <pre>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1775
     * Debug.timer(format, arg, null)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1776
     * </pre>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1777
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1778
     * except that the string formatting only happens if timing is enabled.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1779
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1780
     * @see #timer(String, Object, Object)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1781
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1782
    public static TimerKey timer(String format, Object arg) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1783
        return createTimer(format, arg, null);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1784
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1785
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1786
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1787
     * Creates a debug timer. Invoking this method is equivalent to:
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1788
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1789
     * <pre>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1790
     * Debug.timer(String.format(format, arg1, arg2))
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1791
     * </pre>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1792
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1793
     * except that the string formatting only happens if timing is enabled. In addition, each
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1794
     * argument is subject to the following type based conversion before being passed as an argument
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1795
     * to {@link String#format(String, Object...)}:
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1796
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1797
     * <pre>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1798
     *     Type          | Conversion
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1799
     * ------------------+-----------------
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1800
     *  java.lang.Class  | arg.getSimpleName()
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1801
     *                   |
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1802
     * </pre>
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1803
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1804
     * @see #timer(CharSequence)
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1805
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1806
    public static TimerKey timer(String format, Object arg1, Object arg2) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1807
        return createTimer(format, arg1, arg2);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1808
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1809
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1810
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1811
     * There are paths where construction of formatted class names are common and the code below is
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1812
     * surprisingly expensive, so compute it once and cache it.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1813
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1814
    private static final ClassValue<String> formattedClassName = new ClassValue<String>() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1815
        @Override
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1816
        protected String computeValue(Class<?> c) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1817
            final String simpleName = c.getSimpleName();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1818
            Class<?> enclosingClass = c.getEnclosingClass();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1819
            if (enclosingClass != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1820
                String prefix = "";
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1821
                while (enclosingClass != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1822
                    prefix = enclosingClass.getSimpleName() + "_" + prefix;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1823
                    enclosingClass = enclosingClass.getEnclosingClass();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1824
                }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1825
                return prefix + simpleName;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1826
            } else {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1827
                return simpleName;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1828
            }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1829
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1830
    };
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1831
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1832
    public static Object convertFormatArg(Object arg) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1833
        if (arg instanceof Class) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1834
            return formattedClassName.get((Class<?>) arg);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1835
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1836
        return arg;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1837
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1838
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1839
    static String formatDebugName(String format, Object arg1, Object arg2) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1840
        return String.format(format, convertFormatArg(arg1), convertFormatArg(arg2));
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1841
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1842
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1843
    private static TimerKey createTimer(String format, Object arg1, Object arg2) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1844
        return new TimerKeyImpl(format, arg1, arg2);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1845
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1846
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1847
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1848
     * Represents a debug scope entered by {@link DebugContext#scope(Object)} or
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1849
     * {@link DebugContext#sandbox(CharSequence, DebugConfig, Object...)}. Leaving the scope is
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1850
     * achieved via {@link #close()}.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1851
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1852
    public interface Scope extends AutoCloseable {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1853
        /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1854
         * Gets the names of this scope and its ancestors separated by {@code '.'}.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1855
         */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1856
        String getQualifiedName();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1857
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1858
        Iterable<Object> getCurrentContext();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1859
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1860
        @Override
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1861
        void close();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1862
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1863
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1864
    boolean isTimerEnabled(TimerKeyImpl key) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1865
        if (!metricsEnabled) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1866
            // Pulling this common case out of `isTimerEnabledSlow`
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1867
            // gives C1 a better chance to inline this method.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1868
            return false;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1869
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1870
        return isTimerEnabledSlow(key);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1871
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1872
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1873
    private boolean isTimerEnabledSlow(AbstractKey key) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1874
        if (currentScope != null && currentScope.isTimeEnabled()) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1875
            return true;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1876
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1877
        if (immutable.listMetrics) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1878
            key.ensureInitialized();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1879
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1880
        assert checkNoConcurrentAccess();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1881
        EconomicSet<String> unscoped = immutable.unscopedTimers;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1882
        return unscoped != null && (unscoped.isEmpty() || unscoped.contains(key.getName()));
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1883
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1884
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1885
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1886
     * Determines if a given timer is enabled in the current scope.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1887
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1888
    boolean isCounterEnabled(CounterKeyImpl key) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1889
        if (!metricsEnabled) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1890
            // Pulling this common case out of `isCounterEnabledSlow`
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1891
            // gives C1 a better chance to inline this method.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1892
            return false;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1893
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1894
        return isCounterEnabledSlow(key);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1895
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1896
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1897
    private boolean isCounterEnabledSlow(AbstractKey key) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1898
        if (currentScope != null && currentScope.isCountEnabled()) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1899
            return true;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1900
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1901
        if (immutable.listMetrics) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1902
            key.ensureInitialized();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1903
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1904
        assert checkNoConcurrentAccess();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1905
        EconomicSet<String> unscoped = immutable.unscopedCounters;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1906
        return unscoped != null && (unscoped.isEmpty() || unscoped.contains(key.getName()));
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1907
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1908
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1909
    boolean isMemUseTrackerEnabled(MemUseTrackerKeyImpl key) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1910
        if (!metricsEnabled) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1911
            // Pulling this common case out of `isMemUseTrackerEnabledSlow`
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1912
            // gives C1 a better chance to inline this method.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1913
            return false;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1914
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1915
        return isMemUseTrackerEnabledSlow(key);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1916
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1917
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1918
    private boolean isMemUseTrackerEnabledSlow(AbstractKey key) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1919
        if (currentScope != null && currentScope.isMemUseTrackingEnabled()) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1920
            return true;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1921
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1922
        if (immutable.listMetrics) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1923
            key.ensureInitialized();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1924
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1925
        assert checkNoConcurrentAccess();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1926
        EconomicSet<String> unscoped = immutable.unscopedMemUseTrackers;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1927
        return unscoped != null && (unscoped.isEmpty() || unscoped.contains(key.getName()));
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1928
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1929
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1930
    public boolean areMetricsEnabled() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1931
        return metricsEnabled;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1932
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1933
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1934
    @Override
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1935
    public void close() {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1936
        closeDumpHandlers(false);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1937
        if (description != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1938
            printMetrics(description);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1939
        }
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 48190
diff changeset
  1940
        if (metricsEnabled && metricValues != null && globalMetrics != null) {
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1941
            globalMetrics.add(this);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1942
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1943
        metricValues = null;
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 48190
diff changeset
  1944
        if (sharedChannel != null) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 48190
diff changeset
  1945
            try {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 48190
diff changeset
  1946
                sharedChannel.realClose();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 48190
diff changeset
  1947
            } catch (IOException ex) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 48190
diff changeset
  1948
                // ignore.
47f19ff9903c 8194819: Update Graal
iveresov
parents: 48190
diff changeset
  1949
            }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 48190
diff changeset
  1950
        }
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1951
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1952
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1953
    public void closeDumpHandlers(boolean ignoreErrors) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1954
        if (currentConfig != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1955
            currentConfig.closeDumpHandlers(ignoreErrors);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1956
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1957
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1958
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1959
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1960
     * Records how many times a given method has been compiled.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1961
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1962
    private static EconomicMap<Integer, Integer> compilations;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1963
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1964
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1965
     * Maintains maximum buffer size used by {@link #printMetrics(Description)} to minimize buffer
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1966
     * resizing during subsequent calls to this method.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1967
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1968
    private static int metricsBufSize = 50_000;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1969
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1970
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1971
     * Flag that allows the first call to {@link #printMetrics(Description)} to delete the file that
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1972
     * will be appended to.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1973
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1974
    private static boolean metricsFileDeleteCheckPerformed;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1975
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1976
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1977
     * Prints metric values in this object to the file (if any) specified by
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1978
     * {@link DebugOptions#MetricsFile}.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1979
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1980
    public void printMetrics(Description desc) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1981
        if (metricValues == null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1982
            return;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1983
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1984
        String metricsFile = DebugOptions.MetricsFile.getValue(getOptions());
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1985
        if (metricsFile != null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1986
            // Use identity to distinguish methods that have been redefined
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1987
            // or loaded by different class loaders.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1988
            Object compilable = desc.compilable;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1989
            Integer identity = System.identityHashCode(compilable);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1990
            int compilationNr;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1991
            synchronized (PRINT_METRICS_LOCK) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1992
                if (!metricsFileDeleteCheckPerformed) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1993
                    metricsFileDeleteCheckPerformed = true;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1994
                    File file = new File(metricsFile);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1995
                    if (file.exists()) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1996
                        // This can return false in case something like /dev/stdout
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1997
                        // is specified. If the file is unwriteable, the file open
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1998
                        // below will fail.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  1999
                        file.delete();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2000
                    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2001
                }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2002
                if (compilations == null) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2003
                    compilationNr = 0;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2004
                    compilations = EconomicMap.create();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2005
                } else {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2006
                    Integer value = compilations.get(identity);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2007
                    compilationNr = value == null ? 0 : value + 1;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2008
                }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2009
                compilations.put(identity, compilationNr);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2010
            }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2011
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2012
            // Release the lock while generating the content to reduce contention.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2013
            // This means `compilationNr` fields may show up out of order in the file.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2014
            ByteArrayOutputStream baos = new ByteArrayOutputStream(metricsBufSize);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2015
            PrintStream out = new PrintStream(baos);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2016
            if (metricsFile.endsWith(".csv") || metricsFile.endsWith(".CSV")) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2017
                printMetricsCSV(out, compilable, identity, compilationNr, desc.identifier);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2018
            } else {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2019
                printMetrics(out, compilable, identity, compilationNr, desc.identifier);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2020
            }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2021
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2022
            byte[] content = baos.toByteArray();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2023
            Path path = Paths.get(metricsFile);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2024
            synchronized (PRINT_METRICS_LOCK) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2025
                metricsBufSize = Math.max(metricsBufSize, content.length);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2026
                try {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2027
                    Files.write(path, content, StandardOpenOption.CREATE, StandardOpenOption.APPEND);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2028
                } catch (IOException e) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2029
                }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2030
            }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2031
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2032
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2033
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2034
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2035
     * Lock to serialize writes to {@link DebugOptions#MetricsFile}.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2036
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2037
    private static final Object PRINT_METRICS_LOCK = new Object();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2038
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2039
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2040
     * Appends metrics in CSV format to {@code out} for a single method compilation.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2041
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2042
     * @param identity the identity hash code of {@code compilable}
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2043
     * @param compilationNr where this compilation lies in the ordered sequence of all compilations
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2044
     *            identified by {@code identity}
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2045
     * @param compilationId the runtime issued identifier for the compilation
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2046
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2047
    private void printMetricsCSV(PrintStream out, Object compilable, Integer identity, int compilationNr, String compilationId) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2048
        String compilableName = compilable instanceof JavaMethod ? ((JavaMethod) compilable).format("%H.%n(%p)%R") : String.valueOf(compilable);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2049
        String csvFormat = CSVUtil.buildFormatString("%s", "%s", "%d", "%s");
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2050
        String format = String.format(csvFormat, CSVUtil.Escape.escapeArgs(compilableName, identity, compilationNr, compilationId));
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2051
        char sep = CSVUtil.SEPARATOR;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2052
        format += sep + "%s" + sep + "%s" + sep + "%s";
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2053
        for (MetricKey key : KeyRegistry.getKeys()) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2054
            int index = ((AbstractKey) key).getIndex();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2055
            if (index < metricValues.length) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2056
                Pair<String, String> valueAndUnit = key.toCSVFormat(metricValues[index]);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2057
                CSVUtil.Escape.println(out, format, CSVUtil.Escape.escape(key.getName()), valueAndUnit.getLeft(), valueAndUnit.getRight());
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2058
            }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2059
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2060
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2061
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2062
    /**
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2063
     * Appends metrics in a human readable format to {@code out} for a single method compilation.
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2064
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2065
     * @param identity the identity hash code of {@code compilable}
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2066
     * @param compilationNr where this compilation lies in the ordered sequence of all compilations
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2067
     *            identified by {@code identity}
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2068
     * @param compilationId the runtime issued identifier for the compilation
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2069
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2070
    private void printMetrics(PrintStream out, Object compilable, Integer identity, int compilationNr, String compilationId) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2071
        String compilableName = compilable instanceof JavaMethod ? ((JavaMethod) compilable).format("%H.%n(%p)%R") : String.valueOf(compilable);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2072
        int maxKeyWidth = compilableName.length();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2073
        SortedMap<String, String> res = new TreeMap<>();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2074
        for (MetricKey key : KeyRegistry.getKeys()) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2075
            int index = ((AbstractKey) key).getIndex();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2076
            if (index < metricValues.length && metricValues[index] != 0) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2077
                String name = key.getName();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2078
                long value = metricValues[index];
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2079
                String valueString;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2080
                if (key instanceof TimerKey) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2081
                    // Report timers in ms
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2082
                    TimerKey timer = (TimerKey) key;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2083
                    long ms = timer.getTimeUnit().toMillis(value);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2084
                    if (ms == 0) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2085
                        continue;
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2086
                    }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2087
                    valueString = ms + "ms";
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2088
                } else {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2089
                    valueString = String.valueOf(value);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2090
                }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2091
                res.put(name, valueString);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2092
                maxKeyWidth = Math.max(maxKeyWidth, name.length());
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2093
            }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2094
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2095
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2096
        String title = String.format("%s [id:%s compilation:%d compilation_id:%s]", compilableName, identity, compilationNr, compilationId);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2097
        out.println(new String(new char[title.length()]).replace('\0', '#'));
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2098
        out.printf("%s%n", title);
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2099
        out.println(new String(new char[title.length()]).replace('\0', '~'));
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2100
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2101
        for (Map.Entry<String, String> e : res.entrySet()) {
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2102
            out.printf("%-" + String.valueOf(maxKeyWidth) + "s = %20s%n", e.getKey(), e.getValue());
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2103
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2104
        out.println();
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2105
    }
47798
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
  2106
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
  2107
    @SuppressWarnings({"unused", "unchecked"})
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
  2108
    private static <E extends Exception> E rethrowSilently(Class<E> type, Throwable ex) throws E {
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
  2109
        throw (E) ex;
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
  2110
    }
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents:
diff changeset
  2111
}