1 // natNameFinder.cc - native helper methods for NameFinder.java
3 /* Copyright (C) 2002 Free Software Foundation, Inc
5 This file is part of libgcj.
7 This software is copyrighted work licensed under the terms of the
8 Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
12 * @author Mark Wielaard (mark@klomp.org)
13 * Based on the old name-finder.cc by Andrew Haley <aph@cygnus.com>.
20 #include <java/lang/String.h>
21 #include <java/lang/StackTraceElement.h>
22 #include <java/lang/StringBuffer.h>
23 #include <java-interp.h>
25 #include <gnu/gcj/runtime/NameFinder.h>
32 gnu::gcj::runtime::NameFinder::getExecutable (void)
34 return JvNewStringLatin1 (_Jv_ThisExecutable ());
38 gnu::gcj::runtime::NameFinder::getAddrAsString(RawData* addrs, jint n)
40 _Jv_frame_info *p = (_Jv_frame_info *) addrs;
41 typedef unsigned word_t __attribute ((mode (word)));
42 word_t w = (word_t) p[n].addr;
43 int digits = sizeof (void *) * 2;
47 for (int i = digits - 1; i >= 0; i--)
52 hex[i+2] = digit > 9 ? 'a' + digit - 10 : '0' + digit;
56 return JvNewStringLatin1(hex);
59 java::lang::StackTraceElement*
60 gnu::gcj::runtime::NameFinder::dladdrLookup(RawData* addrs, jint n)
62 #if defined (HAVE_DLFCN_H) && defined (HAVE_DLADDR)
63 extern char **_Jv_argv;
66 _Jv_frame_info *stack = (_Jv_frame_info *) addrs;
67 void* p = stack[n].addr;
70 if (dladdr (p, &dl_info))
72 if (dl_info.dli_fname)
73 strncpy (file_name, dl_info.dli_fname, sizeof file_name);
74 if (dl_info.dli_sname)
75 strncpy (name, dl_info.dli_sname, sizeof name);
77 /* Don't trust dladdr() if the address is from the main program. */
78 if (dl_info.dli_fname != NULL
79 && dl_info.dli_sname != NULL
80 && (_Jv_argv == NULL || strcmp (file_name, _Jv_argv[0]) != 0))
81 return createStackTraceElement (JvNewStringLatin1 (name),
82 JvNewStringLatin1 (file_name));
88 java::lang::StackTraceElement *
89 gnu::gcj::runtime::NameFinder::lookupInterp(RawData* addrs, jint n)
92 _Jv_frame_info *stack = (_Jv_frame_info *) addrs;
93 if (stack[n].interp == NULL)
96 _Jv_InterpMethod *meth
97 = reinterpret_cast<_Jv_InterpMethod *> (stack[n].interp);
99 java::lang::StringBuffer *sb = new java::lang::StringBuffer();
100 sb->append(_Jv_NewStringUtf8Const(meth->self->name));
101 sb->append(_Jv_NewStringUtf8Const(meth->self->signature));
102 // FIXME: source file name and line number can be found from
103 // bytecode debug information. But currently we don't keep that
105 // FIXME: is using the defining class correct here?
106 return new java::lang::StackTraceElement(NULL, -1,
107 meth->defining_class->getName(),
108 sb->toString(), false);
111 #endif // INTERPRETER