/*
 * Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/*
 * This source code is provided to illustrate the usage of a given feature
 * or technique and has been deliberately simplified. Additional steps
 * required for a production-quality application, such as security checks,
 * input validation and proper error handling, might not be present in
 * this sample code.
 */


package com.sun.tools.example.debug.bdi;   //### does it belong here?

import com.sun.jdi.*;

public class Utils {

    
Return the thread status description.
/** * Return the thread status description. */
public static String getStatus(ThreadReference thr) { int status = thr.status(); String result; switch (status) { case ThreadReference.THREAD_STATUS_UNKNOWN: result = "unknown status"; break; case ThreadReference.THREAD_STATUS_ZOMBIE: result = "zombie"; break; case ThreadReference.THREAD_STATUS_RUNNING: result = "running"; break; case ThreadReference.THREAD_STATUS_SLEEPING: result = "sleeping"; break; case ThreadReference.THREAD_STATUS_MONITOR: result = "waiting to acquire a monitor lock"; break; case ThreadReference.THREAD_STATUS_WAIT: result = "waiting on a condition"; break; default: result = "<invalid thread status>"; } if (thr.isSuspended()) { result += " (suspended)"; } return result; }
Return a description of an object.
/** * Return a description of an object. */
public static String description(ObjectReference ref) { ReferenceType clazz = ref.referenceType(); long id = ref.uniqueID(); //### TODO use real id if (clazz == null) { return toHex(id); } else { return "(" + clazz.name() + ")" + toHex(id); } }
Convert a long to a hexadecimal string.
/** * Convert a long to a hexadecimal string. */
public static String toHex(long n) { char s1[] = new char[16]; char s2[] = new char[18]; // Store digits in reverse order. int i = 0; do { long d = n & 0xf; s1[i++] = (char)((d < 10) ? ('0' + d) : ('a' + d - 10)); } while ((n >>>= 4) > 0); // Now reverse the array. s2[0] = '0'; s2[1] = 'x'; int j = 2; while (--i >= 0) { s2[j++] = s1[i]; } return new String(s2, 0, j); }
Convert hexadecimal strings to longs.
/** * Convert hexadecimal strings to longs. */
public static long fromHex(String hexStr) { String str = hexStr.startsWith("0x") ? hexStr.substring(2).toLowerCase() : hexStr.toLowerCase(); if (hexStr.length() == 0) { throw new NumberFormatException(); } long ret = 0; for (int i = 0; i < str.length(); i++) { int c = str.charAt(i); if (c >= '0' && c <= '9') { ret = (ret * 16) + (c - '0'); } else if (c >= 'a' && c <= 'f') { ret = (ret * 16) + (c - 'a' + 10); } else { throw new NumberFormatException(); } } return ret; } /* * The next two methods are used by this class and by EventHandler * to print consistent locations and error messages. */ public static String locationString(Location loc) { return loc.declaringType().name() + "." + loc.method().name() + "(), line=" + loc.lineNumber(); } //### UNUSED.
private String typedName(Method method) { // TO DO: Use method.signature() instead of method.arguments() so that // we get sensible results for classes without debugging info StringBuffer buf = new StringBuffer(); buf.append(method.name()); buf.append("("); Iterator it = method.arguments().iterator(); while (it.hasNext()) { buf.append(((LocalVariable)it.next()).typeName()); if (it.hasNext()) { buf.append(","); } } buf.append(")"); return buf.toString(); }
/************************ private String typedName(Method method) { // TO DO: Use method.signature() instead of method.arguments() so that // we get sensible results for classes without debugging info StringBuffer buf = new StringBuffer(); buf.append(method.name()); buf.append("("); Iterator it = method.arguments().iterator(); while (it.hasNext()) { buf.append(((LocalVariable)it.next()).typeName()); if (it.hasNext()) { buf.append(","); } } buf.append(")"); return buf.toString(); } ************************/
public static boolean isValidMethodName(String s) { return isJavaIdentifier(s) || s.equals("<init>") || s.equals("<clinit>"); } public static boolean isJavaIdentifier(String s) { if (s.length() == 0) { return false; } int cp = s.codePointAt(0); if (! Character.isJavaIdentifierStart(cp)) { return false; } for (int i = Character.charCount(cp); i < s.length(); i += Character.charCount(cp)) { cp = s.codePointAt(i); if (! Character.isJavaIdentifierPart(cp)) { return false; } } return true; } }