⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 natnamefinder.cc

📁 this gcc-g++-3.3.1.tar.gz is a source file of gcc, you can learn more about gcc through this codes f
💻 CC
字号:
// natNameFinder.cc - native helper methods for NameFinder.java/* Copyright (C) 2002  Free Software Foundation, Inc   This file is part of libgcj.This software is copyrighted work licensed under the terms of theLibgcj License.  Please consult the file "LIBGCJ_LICENSE" fordetails.  *//** * @author Mark Wielaard (mark@klomp.org) * Based on the old name-finder.cc by Andrew Haley <aph@cygnus.com>. */#include <config.h>#include <string.h>#include <gcj/cni.h>#include <jvm.h>#include <java/lang/String.h>#include <java/lang/StackTraceElement.h>#include <java/lang/StringBuffer.h>#include <java-interp.h>#include <gnu/gcj/runtime/NameFinder.h>#ifdef HAVE_DLFCN_H#include <dlfcn.h>#endif// On some systems, a prefix is attached to a method name before// it is exported as a label. The GCC preprocessor predefines // this prefix as the macro __USER_LABEL_PREFIX__ which expands to// a string (not string constant) representing the prefix, if any.#undef LABEL_PREFIX#ifdef __USER_LABEL_PREFIX__#define USER_LABEL_PREFIX_STRING_0(s) #s#define USER_LABEL_PREFIX_STRING(s) USER_LABEL_PREFIX_STRING_0(s)#define LABEL_PREFIX USER_LABEL_PREFIX_STRING(__USER_LABEL_PREFIX__)#else /* __USER_LABEL_PREFIX__ */#define LABEL_PREFIX ""#endif /* ! __USER_LABEL_PREFIX__ */java::lang::String*gnu::gcj::runtime::NameFinder::getExternalLabel (java::lang::String* name){  jsize nameLen = JvGetStringUTFLength (name);  jsize pfxLen = strlen (LABEL_PREFIX);  char *newName = (char *) JvMalloc (pfxLen + nameLen + 1);  *(newName + 0) = '\0';  strcpy (newName, LABEL_PREFIX);  JvGetStringUTFRegion (name, 0, nameLen, newName + pfxLen);  *(newName + pfxLen + nameLen) = '\0';  return JvNewStringLatin1 (newName);}java::lang::String*gnu::gcj::runtime::NameFinder::getExecutable (void){  return JvNewStringLatin1 (_Jv_ThisExecutable ());}java::lang::String*gnu::gcj::runtime::NameFinder::getAddrAsString(RawData* addrs, jint n){  _Jv_frame_info *p = (_Jv_frame_info *) addrs;  typedef unsigned word_t __attribute ((mode (word)));  word_t w = (word_t) p[n].addr;  int digits = sizeof (void *) * 2;  char hex[digits+5];  strcpy (hex, "0x");  for (int i = digits - 1; i >= 0; i--)    {      int digit = w % 16;      w /= 16;      hex[i+2] = digit > 9 ? 'a' + digit - 10 : '0' + digit;    }  hex [digits+2] = 0;  return JvNewStringLatin1(hex);}java::lang::StackTraceElement*gnu::gcj::runtime::NameFinder::dladdrLookup(RawData* addrs, jint n){#if defined (HAVE_DLFCN_H) && defined (HAVE_DLADDR)  extern char **_Jv_argv;  char name[1024];  char file_name[1024];  _Jv_frame_info *stack = (_Jv_frame_info *) addrs;  void* p = stack[n].addr;  Dl_info dl_info;     if (dladdr (p, &dl_info))    {      if (dl_info.dli_fname)        strncpy (file_name, dl_info.dli_fname, sizeof file_name);      if (dl_info.dli_sname)        strncpy (name, dl_info.dli_sname, sizeof name);          /* Don't trust dladdr() if the address is from the main program. */     if (dl_info.dli_fname != NULL         && dl_info.dli_sname != NULL         && (_Jv_argv == NULL || strcmp (file_name, _Jv_argv[0]) != 0))       return createStackTraceElement (JvNewStringLatin1 (name),				       JvNewStringLatin1 (file_name));    }#endif  return NULL;}java::lang::StackTraceElement *gnu::gcj::runtime::NameFinder::lookupInterp(RawData* addrs, jint n){#ifdef INTERPRETER  _Jv_frame_info *stack = (_Jv_frame_info *) addrs;  if (stack[n].interp == NULL)    return NULL;  _Jv_InterpMethod *meth    = reinterpret_cast<_Jv_InterpMethod *> (stack[n].interp);  java::lang::StringBuffer *sb = new java::lang::StringBuffer();  sb->append(_Jv_NewStringUtf8Const(meth->self->name));  sb->append(_Jv_NewStringUtf8Const(meth->self->signature));  // FIXME: source file name and line number can be found from  // bytecode debug information.  But currently we don't keep that  // around.  // FIXME: is using the defining class correct here?  java::lang::String *className = meth->defining_class->getName();  java::lang::String *methodName	  = demangleInterpreterMethod(sb->toString(), className);  return new java::lang::StackTraceElement(NULL, -1,					   className, methodName, false);#else // INTERPRETER  return NULL;#endif // INTERPRETER}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -