зеркало из https://github.com/github/ruby.git
* dln.c (init_funcname): allocate and build initialization
funciton name at once. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29737 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
6f4bfdc115
Коммит
5ddcc93a3f
|
@ -1,3 +1,8 @@
|
||||||
|
Tue Nov 9 21:57:45 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* dln.c (init_funcname): allocate and build initialization
|
||||||
|
funciton name at once.
|
||||||
|
|
||||||
Tue Nov 9 21:14:54 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Tue Nov 9 21:14:54 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* configure.in (AC_FUNC_GETPGRP, AC_FUNC_SETPGRP): no need when
|
* configure.in (AC_FUNC_GETPGRP, AC_FUNC_SETPGRP): no need when
|
||||||
|
|
47
dln.c
47
dln.c
|
@ -107,43 +107,46 @@ dln_loaderror(const char *format, ...)
|
||||||
|
|
||||||
#ifndef FUNCNAME_PATTERN
|
#ifndef FUNCNAME_PATTERN
|
||||||
# if defined(__hp9000s300) || ((defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)) && !defined(__ELF__)) || defined(__BORLANDC__) || defined(NeXT) || defined(__WATCOMC__) || defined(MACOSX_DYLD)
|
# if defined(__hp9000s300) || ((defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)) && !defined(__ELF__)) || defined(__BORLANDC__) || defined(NeXT) || defined(__WATCOMC__) || defined(MACOSX_DYLD)
|
||||||
# define FUNCNAME_PATTERN "_Init_%s"
|
# define FUNCNAME_PREFIX "_Init_"
|
||||||
# else
|
# else
|
||||||
# define FUNCNAME_PATTERN "Init_%s"
|
# define FUNCNAME_PREFIX "Init_"
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined __CYGWIN__ || defined DOSISH
|
||||||
|
#define isdirsep(x) ((x) == '/' || (x) == '\\')
|
||||||
|
#else
|
||||||
|
#define isdirsep(x) ((x) == '/')
|
||||||
|
#endif
|
||||||
|
|
||||||
static size_t
|
static size_t
|
||||||
init_funcname_len(char **buf, const char *file)
|
init_funcname_len(const char **file)
|
||||||
{
|
{
|
||||||
char *p;
|
const char *p = *file, *base, *dot = NULL;
|
||||||
const char *slash;
|
|
||||||
size_t len;
|
|
||||||
|
|
||||||
/* Load the file as an object one */
|
/* Load the file as an object one */
|
||||||
for (slash = file-1; *file; file++) /* Find position of last '/' */
|
for (base = p; *p; p++) { /* Find position of last '/' */
|
||||||
if (*file == '/') slash = file;
|
if (*p == '.') dot = p;
|
||||||
|
if (isdirsep(*p)) base = p+1;
|
||||||
len = strlen(FUNCNAME_PATTERN) + strlen(slash + 1);
|
|
||||||
*buf = xmalloc(len);
|
|
||||||
snprintf(*buf, len, FUNCNAME_PATTERN, slash + 1);
|
|
||||||
for (p = *buf; *p; p++) { /* Delete suffix if it exists */
|
|
||||||
if (*p == '.') {
|
|
||||||
*p = '\0'; break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return p - *buf;
|
*file = base;
|
||||||
|
/* Delete suffix if it exists */
|
||||||
|
return (dot && dot > base ? dot : p) - base;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char funcname_prefix[sizeof(FUNCNAME_PREFIX) - 1] = FUNCNAME_PREFIX;
|
||||||
|
|
||||||
#define init_funcname(buf, file) do {\
|
#define init_funcname(buf, file) do {\
|
||||||
size_t len = init_funcname_len(buf, file);\
|
const char *base = file;\
|
||||||
char *tmp = ALLOCA_N(char, len+1);\
|
const size_t flen = init_funcname_len(&base);\
|
||||||
|
const size_t plen = sizeof(funcname_prefix);\
|
||||||
|
char *const tmp = ALLOCA_N(char, plen+flen+1);\
|
||||||
if (!tmp) {\
|
if (!tmp) {\
|
||||||
free(*buf);\
|
|
||||||
dln_memerror();\
|
dln_memerror();\
|
||||||
}\
|
}\
|
||||||
strlcpy(tmp, *buf, len + 1);\
|
memcpy(tmp, funcname_prefix, plen);\
|
||||||
free(*buf);\
|
memcpy(tmp+plen, base, flen);\
|
||||||
|
tmp[plen+flen] = '\0';\
|
||||||
*buf = tmp;\
|
*buf = tmp;\
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче