[#9581] SIGFPE isn't raised on FreeBSD 4.0 — gotoken@... (GOTO Kentaro)

ごとけんです

18 messages 2000/04/18
[#9582] Re: SIGFPE isn't raised on FreeBSD 4.0 — ARIMA Yasuhiro <fit0298@...> 2000/04/18

有馬です。

[#9583] Re: SIGFPE isn't raised on FreeBSD 4.0 — EGUCHI Osamu <eguchi@...> 2000/04/18

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

[ruby-dev:9580] [BUG] B_ERROR == -1 !

From: Katsuyuki Komatsu <komatsu@...>
Date: 2000-04-17 14:49:37 UTC
List: ruby-dev #9580
小松です。

BeOSだとB_ERROR (General OS error) というのがerrnoに設定される
場合があるのですが、この値が-1のためset_syserr()が落ちてしまいます。

$ cat httpget.rb
require 'net/http.rb'
c = Net::HTTP::Proxy(ENV['PROXY_HOST'], ENV['PROXY_PORT'].to_i)
c.start('www.ruby-lang.org', 80) do |http|
  header, data = http.get('/ja/index.html')
  print data
end
$ ruby httpget.rb
  ……
/boot/home/config/lib/ruby/1.4/net/protocol.rb:703: [BUG] Segmentation fault
Abort
$ 

うまくBeOS用のエラーテーブルに入れられないので、B_ERRORだけ
特別扱いして、Errno::ERRORを作るようにしてみました。

# error.cのBeOSのところはインデントがなぜか3なので合わせています。

ところで、BeOSの場合だけset_syserr()でrb_global_variable()を
呼んでますが、必要なんでしょうか?

# 追加部分でも呼んでみましたが……

--- ruby-1.4.4.dist/error.c	Mon Apr 10 14:48:27 2000
+++ ruby-1.4.4/error.c	Mon Apr 17 23:09:22 2000
@@ -404,2 +404,3 @@ typedef struct {
 
+static VALUE syserr_error;
 static VALUE syserr_list_b_general[16+1];
@@ -464,2 +465,7 @@ set_syserr(i, name)
 #ifdef __BEOS__
+   if (i == B_ERROR) {
+      syserr_error = error;
+      rb_global_variable(&syserr_error);
+      return error;
+   }
    i -= B_GENERAL_ERROR_BASE;
@@ -497,2 +503,3 @@ get_syserr(int i)
    
+   if (i == B_ERROR) return syserr_error;
    i -= B_GENERAL_ERROR_BASE;
@@ -688,2 +695,3 @@ init_syserr()
    }
+   set_syserr(B_ERROR, "ERROR");
 #else

--
小松克行 / Katsuyuki Komatsu <komatsu@sarion.co.jp>

In This Thread

Prev Next