1/*
2 * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23package jdk.vm.ci.hotspot;
24
25import static java.util.FormattableFlags.ALTERNATE;
26import static java.util.FormattableFlags.LEFT_JUSTIFY;
27import static java.util.FormattableFlags.UPPERCASE;
28
29import java.util.Formattable;
30import java.util.Formatter;
31
32import jdk.vm.ci.meta.JavaMethod;
33import jdk.vm.ci.meta.ResolvedJavaMethod;
34
35abstract class HotSpotMethod implements JavaMethod, Formattable {
36
37    public static String applyFormattingFlagsAndWidth(String s, int flags, int width) {
38        if (flags == 0 && width < 0) {
39            return s;
40        }
41        StringBuilder sb = new StringBuilder(s);
42
43        // apply width and justification
44        int len = sb.length();
45        if (len < width) {
46            for (int i = 0; i < width - len; i++) {
47                if ((flags & LEFT_JUSTIFY) == LEFT_JUSTIFY) {
48                    sb.append(' ');
49                } else {
50                    sb.insert(0, ' ');
51                }
52            }
53        }
54
55        String res = sb.toString();
56        if ((flags & UPPERCASE) == UPPERCASE) {
57            res = res.toUpperCase();
58        }
59        return res;
60    }
61
62    /**
63     * Controls whether {@link #toString()} includes the qualified or simple name of the class in
64     * which the method is declared.
65     */
66    public static final boolean FULLY_QUALIFIED_METHOD_NAME = false;
67
68    @Override
69    public final String toString() {
70        char h = FULLY_QUALIFIED_METHOD_NAME ? 'H' : 'h';
71        String suffix = this instanceof ResolvedJavaMethod ? "" : ", unresolved";
72        String fmt = String.format("HotSpotMethod<%%%c.%%n(%%p)%s>", h, suffix);
73        return format(fmt);
74    }
75
76    public void formatTo(Formatter formatter, int flags, int width, int precision) {
77        String base = (flags & ALTERNATE) == ALTERNATE ? getName() : toString();
78        formatter.format(applyFormattingFlagsAndWidth(base, flags & ~ALTERNATE, width));
79    }
80
81    public JavaMethod asJavaMethod() {
82        return this;
83    }
84}
85