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