[#12387] reducing logical operation — "Nobuyoshi.Nakada" <nobu.nakada@...>

なかだです。

17 messages 2001/03/07
[#12388] Re: reducing logical operation — EGUCHI Osamu <eguchi@...> 2001/03/07

えぐち@エスアンドイー です。

[#12389] Re: reducing logical operation — nobu.nakada@... 2001/03/07

なかだです。

[#12391] Re: reducing logical operation — EGUCHI Osamu <eguchi@...> 2001/03/07

えぐち@エスアンドイー です。

[#12404] fork in threads — keiju@... (Keiju ISHITSUKA)

けいじゅ@日本ラショナルソフトウェアです.

14 messages 2001/03/09

[#12405] at_exit — keiju@... (Keiju ISHITSUKA)

けいじゅ@日本ラショナルソフトウェアです.

15 messages 2001/03/09
[#12409] Re: at_exit — matz@... (Yukihiro Matsumoto) 2001/03/10

まつもと ゆきひろです

[#12411] Re: at_exit — keiju@... (石塚圭樹) 2001/03/10

けいじゅ@日本ラショナルソフトウェアです.

[#12425] bignum % の結果が負数になることがある — Hisayasu Nakao <h-nakao@...>

最近、ruby-1.6.2を使い出したばかりの中尾です。

39 messages 2001/03/12
[#12427] Re: bignum % の結果が負数になることがある — WATANABE Hirofumi <eban@...> 2001/03/12

わたなべです。

[#12463] Re: bignum % の結果が負数になることがある — Takahiro Kambe <taca@...> 2001/03/13

In message <4518-Mon12Mar2001145434+0900-eban@os.rim.or.jp>

[#12464] Re: bignum % の結果が負数になることがある — matz@... (Yukihiro Matsumoto) 2001/03/13

まつもと ゆきひろです

[#12466] Re: bignum % の結果が負数になることがある — Takahiro Kambe <taca@...> 2001/03/13

In message <984469222.234203.1007.nullmailer@ev.netlab.zetabits.com>

[#12475] Re: bignum % の結果が負数になることがある — matz@... (Yukihiro Matsumoto) 2001/03/14

まつもと ゆきひろです

[#12476] Re: bignum % の結果が負数になることがある — Takahiro Kambe <taca@...> 2001/03/14

In message <984550885.417146.3670.nullmailer@ev.netlab.zetabits.com>

[#12480] Re: bignum % の結果が負数になることがある — matz@... (Yukihiro Matsumoto) 2001/03/14

まつもと ゆきひろです

[#12481] Re: bignum % の結果が負数になることがある — Takahiro Kambe <taca@...> 2001/03/14

In message <984553493.009507.3747.nullmailer@ev.netlab.zetabits.com>

[#12488] Re: bignum % の結果が負数になることがある — matz@... (Yukihiro Matsumoto) 2001/03/14

まつもと ゆきひろです

[#12493] Re: bignum % の結果が負数になることがある — Takahiro Kambe <taca@...> 2001/03/14

In message <984579430.080967.5569.nullmailer@ev.netlab.zetabits.com>

[#12578] require 'win32api' — Kazuhiro NISHIYAMA <zn@...>

require 'win32api'のエラーメッセージがわかりにくいと

21 messages 2001/03/20
[#12579] Re: require 'win32api' — nobu.nakada@... 2001/03/20

なかだです。

[#12598] Re: require 'win32api' — nobu.nakada@... 2001/03/21

なかだです。

[#12582] finalizer problem — keiju@... (Keiju ISHITSUKA)

けいじゅ@日本ラショナルソフトウェアです.

20 messages 2001/03/20
[#12583] Re: finalizer problem — matz@... (Yukihiro Matsumoto) 2001/03/20

まつもと ゆきひろです

[#12585] Re: finalizer problem — keiju@... (石塚圭樹) 2001/03/20

けいじゅ@日本ラショナルソフトウェアです.

[#12591] Re: finalizer problem — matz@... (Yukihiro Matsumoto) 2001/03/20

まつもと ゆきひろです

[#12619] Re: finalizer problem — keiju@... (石塚圭樹) 2001/03/22

けいじゅ@日本ラショナルソフトウェアです.

[#12605] extern inline (ruby.h) ruby-1.6.3 — WATANABE Tetsuya <tetsu@...>

渡辺哲也です。

17 messages 2001/03/22
[#12606] Re: extern inline (ruby.h) ruby-1.6.3 — matz@... (Yukihiro Matsumoto) 2001/03/22

まつもと ゆきひろです

[#12607] Re: extern inline (ruby.h) ruby-1.6.3 — WATANABE Tetsuya <tetsu@...> 2001/03/22

渡辺哲也です。

[#12608] Re: extern inline (ruby.h) ruby-1.6.3 — matz@... (Yukihiro Matsumoto) 2001/03/22

まつもと ゆきひろです

[#12674] Was: [rubyist:0454] Re: to_str — Kenichi Komiya <kom@...1.accsnet.ne.jp>

21 messages 2001/03/25
[#12675] Re: Was: [rubyist:0454] Re: to_str — matz@... (Yukihiro Matsumoto) 2001/03/26

まつもと ゆきひろです

[#12678] Re: Was: [rubyist:0454] Re: to_str — Kenichi Komiya <kom@...1.accsnet.ne.jp> 2001/03/26

[#12681] Re: Was: [rubyist:0454] Re: to_str — matz@... (Yukihiro Matsumoto) 2001/03/26

まつもと ゆきひろです

[#12687] Re: Was: [rubyist:0454] Re: to_str — Kenichi Komiya <kom@...1.accsnet.ne.jp> 2001/03/27

[#12688] Re: Was: [rubyist:0454] Re: to_str — matz@... (Yukihiro Matsumoto) 2001/03/28

まつもと ゆきひろです

[#12710] Re: Was: [rubyist:0454] Re: to_str — Kenichi Komiya <kom@...1.accsnet.ne.jp> 2001/03/31

[ruby-dev:12663] Re: require 'win32api'

From: nobu.nakada@...
Date: 2001-03-24 13:06:43 UTC
List: ruby-dev #12663
なかだです。

At Sat, 24 Mar 2001 12:59:43 +0900,
arton <arton@geocities.co.jp> wrote:
> >   システムの時期によってはロードするライブラリをかえなきゃいけ
> > ないということでなければ、どちらでもいいんですけど。その場合は
> > LoadLibraryEx() を二回試せばいいだけですが、なんかめんどくさい
> > し。
> さすがに、それは無さそうな。
(snip)

  了解です。単なる MSDN のミスということで気にすることはないで
すね。

> あと、書き間違いがありました。

  う゛、家には Windows の開発環境がないもので(^^;;;。確認せずに
出しちゃいました。すいません。

> #ruby-dev[12598]は不要?

  要りません。それに ext/Win32API/Win32API.c の最後にある
Init_win32api() 自体も不要です。

# 名前によって動作をかえる拡張ライブラリなんて作らないよなぁ。

> Windows98だと、書き間違いは結構、速度的なペナルティになりますね。正しく
> 書けば瞬間ですが、間違えると探索しているというのが目に見えます(1〜2秒く
> らいかな?)
> というわけで、正しく書いたほうが当然お得。

  やはりかなりのオーバーヘッドですね。

> あと、ちょっと気になったんですが、これ
> rerequi 'SoCket'
> でも、通っちゃうんですよね。スクリプトを他のOSに持ってったときに、悩むこ
> とになりませんか? rb_warningじゃなくて、rb_warnで強制的に文句垂れたほ
> うがいいような気がします。

  通っちゃうのは逆にはねる方法が存在しないのでどうしようもない
んですが、オーバーヘッドも考えると rb_warn() の方がいいようです。

  それと dlerror() ではすでにファイル名もエントリポイント名も含
まれてたので、_WIN32 && !__CYGWIN__ な環境だけに絞りました。


Index: dln.c
===================================================================
RCS file: /cvs/ruby/src/ruby/dln.c,v
retrieving revision 1.20
diff -u -2 -p -r1.20 dln.c
--- dln.c	2001/03/13 05:45:08	1.20
+++ dln.c	2001/03/24 08:12:10
@@ -86,6 +86,12 @@ int eaccess();
 # if defined(__hp9000s300) ||  (defined(__NetBSD__) && !defined(__ELF__)) || defined(__BORLANDC__) || (defined(__FreeBSD__) && __FreeBSD__ < 3) || defined(__OpenBSD__) || defined(NeXT) || defined(__WATCOMC__) || defined(__APPLE__)
 #  define FUNCNAME_PATTERN "_Init_%s"
+#  define FUNCNAME_FEATURE(n) ((n) + 6)
+#  define FUNCNAME_MATCH(n1, n2) (strncmp((n1), (n2), 6) == 0 && \
+				  strcasecmp(FUNCNAME_FEATURE(n1), FUNCNAME_FEATURE(n2)) == 0)
 # else
 #  define FUNCNAME_PATTERN "Init_%s"
+#  define FUNCNAME_FEATURE(n) ((n) + 5)
+#  define FUNCNAME_MATCH(n1, n2) (strncmp((n1), (n2), 5) == 0 && \
+				  strcasecmp(FUNCNAME_FEATURE(n1), FUNCNAME_FEATURE(n2)) == 0)
 # endif
 #endif
@@ -1114,4 +1120,85 @@ dln_sym(name)
 #if defined _WIN32 && !defined __CYGWIN__
 #include <windows.h>
+
+typedef BOOL (__stdcall *initialize_t)(HANDLE, const char*, BOOL);
+typedef BOOL (__stdcall *loadmodule_t)(HANDLE, HANDLE, const char *, const char *, DWORD, DWORD);
+typedef BOOL (__stdcall *unloadmodule_t)(HANDLE, DWORD);
+typedef BOOL (__stdcall *enumsyms_t)(HANDLE, DWORD, BOOL (CALLBACK *)(const char*, ULONG, ULONG, void*), void*);
+
+struct search_entry {
+    HMODULE module;
+    const char* sym;
+    char *name;
+    FARPROC addr;
+};
+
+static BOOL CALLBACK
+symbols_i(const char *name, ULONG addr, ULONG size, void* arg)
+{
+    struct search_entry *const ent = arg;
+    FARPROC proc;
+
+    if (FUNCNAME_MATCH(name, ent->sym) &&
+	(proc = GetProcAddress(ent->module, name))) {
+	ent->addr = proc;
+	strcpy(ent->name, name);
+	return FALSE;
+    }
+    return TRUE;
+}
+
+static FARPROC
+search_insensitively(const char *path, const char *sym, char *name, HMODULE module)
+{
+    static HANDLE imagehlp;
+    static initialize_t initialize;
+    static loadmodule_t loadmodule;
+    static unloadmodule_t unloadmodule;
+    static enumsyms_t enumsyms;
+    DWORD base;
+    struct search_entry ent;
+
+    if (!imagehlp) {
+	if (!(imagehlp = LoadLibraryExA("imagehlp.dll", NULL, LOAD_WITH_ALTERED_SEARCH_PATH)) ||
+	    !(initialize = (initialize_t)GetProcAddress(imagehlp, "SymInitialize")) ||
+	    !(loadmodule = (loadmodule_t)GetProcAddress(imagehlp, "SymLoadModule")) ||
+	    !(unloadmodule = (unloadmodule_t)GetProcAddress(imagehlp, "SymUnloadModule")) ||
+	    !(enumsyms = (enumsyms_t)GetProcAddress(imagehlp, "SymEnumerateSymbols")))
+	{
+	    errno = GetLastError();
+	    rb_warning("can't load image help library - %s", strerror(errno));
+	    return NULL;
+	}
+
+	if (!(*initialize)(0, NULL, FALSE)) {
+	    errno = GetLastError();
+	    rb_warning("SymInitialize - %s", strerror(errno));
+	    initialize = NULL;
+	    return NULL;
+	}
+    }
+
+    if (!initialize) return NULL;
+
+    if (!(base = (*loadmodule)(0, 0, path, 0, 0, 0))) {
+	errno = GetLastError();
+	rb_warning("SymLoadModule(%s) - %s", path, strerror(errno));
+	return NULL;
+    }
+
+    ent.addr = NULL;
+    ent.sym = sym;
+    ent.name = name;
+    ent.module = module;
+    if (!(*enumsyms)(0, base, symbols_i, &ent)) {
+	errno = GetLastError();
+	rb_warning("SymEnumerateSymbols(%s:%s) - %s", path, sym, strerror(errno));
+	ent.addr = NULL;
+    }
+
+    (*unloadmodule)(0, base);
+
+    return ent.addr;
+}
 #endif
 
@@ -1235,11 +1322,16 @@ dln_load(file)
     if ((handle =
 	LoadLibraryExA(winfile, NULL, LOAD_WITH_ALTERED_SEARCH_PATH)) == NULL) {
-        printf("LoadLibraryExA: %s\n", winfile);
 	goto failed;
     }
 
     if ((init_fct = (void(*)())GetProcAddress(handle, buf)) == NULL) {
-        printf("GetProcAddress %s\n", buf);
-	goto failed;
+	/* try case insensitive search */
+	int len = strlen(buf) + 1/* including null terminator */;
+	char *name = (len > sizeof(buf) / 2) ? alloca(len) : buf + len;
+ 	if (!(init_fct = (void(*)())search_insensitively(winfile, buf, name, handle))) {
+	    rb_loaderror("%s - %s\n%s", dln_strerror(), buf, file);
+	}
+	rb_warn("use `%s' to require, not but wrong-case name `%s'",
+		FUNCNAME_FEATURE(name), FUNCNAME_FEATURE(buf));
     }
     /* Call the init code */


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread