[#14850] str[re, -1] raises NoMemoryError — nobu.nakada@...
なかだです。
6 messages
2001/10/03
[#14888] perl6 apocalypse 3 — nobu.nakada@...
なかだです。
7 messages
2001/10/04
[#14903] Re: [rubyist:0825] Re: Thread — nobu.nakada@...
なかだです。
8 messages
2001/10/09
[#14909] ext/socket h_addr_list — WATANABE Tetsuya <tetsu@...>
渡辺哲也です。
9 messages
2001/10/11
[#14922] alias $gvar — Koji Arai <JCA02266@...>
新井です。
19 messages
2001/10/14
[#14941] Re: alias $gvar
— matz@... (Yukihiro Matsumoto)
2001/10/16
まつもと ゆきひろです
[#14924] Re: alias $gvar
— nobu.nakada@...
2001/10/14
なかだです。
[#14932] Re: alias $gvar
— nobu.nakada@...
2001/10/15
なかだです。
[#14934] Re: alias $gvar
— Koji Arai <JCA02266@...>
2001/10/15
新井です。
[#14942] [BUG] SEGV: module_eval — Satoru Takabayashi <satoru@...>
こんなことする方が悪いという気がしますが、次のコードを実行す
5 messages
2001/10/16
[#14961] [PATCH] Marshal.load/dump — nobu.nakada@...
なかだです。
9 messages
2001/10/18
[#14962] alias var and trace_var — "K.Kosako" <kosako@...>
新井さんの指摘から、中田さんのパッチで
12 messages
2001/10/19
[#14963] Re: alias var and trace_var
— nobu.nakada@...
2001/10/19
なかだです。
[#14965] Re: alias var and trace_var
— "K.Kosako" <kosako@...>
2001/10/19
nobu.nakada@nifty.ne.jpさんの
[#14967] Re: alias var and trace_var
— nobu.nakada@...
2001/10/19
なかだです。
[#14971] Re: alias var and trace_var
— "K.Kosako" <kosako@...>
2001/10/22
nobu.nakada@nifty.ne.jpさんの
[#14984] [PATCH] stack overflow while GC marking. — nobu.nakada@...
なかだです。
7 messages
2001/10/23
[#14987] tracer.rb — keiju@... (Keiju ISHITSUKA)
けいじゅ@日本ラショナルソフトウェアです.
5 messages
2001/10/23
[#14998] TCPSocket.gethostbyname で Segmentation fault — tomohiko machida <machida@...>
はじめまして。
4 messages
2001/10/25
[#15001] finalizer problem — keiju@... (Keiju ISHITSUKA)
けいじゅ@日本ラショナルソフトウェアです.
3 messages
2001/10/25
[#15006] Re: eval.c (rb_stack_check): prohibit recursive raising error — WATANABE Hirofumi <eban@...>
わたなべです。
13 messages
2001/10/26
[#15008] Re: eval.c (rb_stack_check): prohibit recursive raising error
— Shugo Maeda <shugo@...>
2001/10/26
前田です。
[#15207] Re: eval.c (rb_stack_check): prohibit recursive raising error
— nobu.nakada@...
2001/11/19
なかだです。
[#15209] Re: eval.c (rb_stack_check): prohibit recursive raising error
— matz@... (Yukihiro Matsumoto)
2001/11/19
まつもと ゆきひろです
[#15210] Re: eval.c (rb_stack_check): prohibit recursive raising error
— nobu.nakada@...
2001/11/19
なかだです。
[#15211] Re: eval.c (rb_stack_check): prohibit recursive raising error
— matz@... (Yukihiro Matsumoto)
2001/11/19
まつもと ゆきひろです
[#15212] Re: eval.c (rb_stack_check): prohibit recursive raising error
— nobu.nakada@...
2001/11/19
なかだです。
[#15214] Re: eval.c (rb_stack_check): prohibit recursive raising error
— matz@... (Yukihiro Matsumoto)
2001/11/19
まつもと ゆきひろです
[ruby-dev:14872] Re: allocation framework(Re: custom marshal)
From:
nobu.nakada@...
Date:
2001-10-03 11:27:30 UTC
List:
ruby-dev #14872
なかだです。
At Wed, 3 Oct 2001 15:43:43 +0900,
matz@ruby-lang.org (Yukihiro Matsumoto) wrote:
> もうちょっとイロイロやりました。と、口で説明するよりコミット
> した方が早いでしょうね。
若干まずいです。
* Regexp.new(str)が無限に再帰してスタックオーバーフロー
* メソッド内のProc.newがwithout blockでArgumentError
こんなかなぁ。Regexp.newはまぁ見ての通りなんですが、Procの方
はProc.allocateの中からブロックにうまくアクセスできなかったんで、
Proc#initializeとに分けてみました。あとは初期化されてないProcの
ためにいくらか修正。
Index: eval.c
===================================================================
RCS file: /cvs/ruby/src/ruby/eval.c,v
retrieving revision 1.208
diff -u -2 -p -r1.208 eval.c
--- eval.c 2001/10/03 07:19:10 1.208
+++ eval.c 2001/10/03 11:17:54
@@ -6147,4 +6147,5 @@ blk_free(data)
void *tmp;
+ if (!data) return;
frame = data->frame.prev;
while (frame) {
@@ -6326,8 +6327,14 @@ proc_set_safe_level(data)
static VALUE
-proc_new(klass)
+proc_s_alloc(klass)
VALUE klass;
{
- volatile VALUE proc;
+ return Data_Wrap_Struct(klass, blk_mark, blk_free, 0);
+}
+
+static VALUE
+proc_new(proc)
+ VALUE proc;
+{
struct BLOCK *data, *p;
struct RVarmap *vars;
@@ -6337,5 +6344,11 @@ proc_new(klass)
}
- proc = Data_Make_Struct(klass, struct BLOCK, blk_mark, blk_free, data);
+ data = DATA_PTR(proc);
+ if (data) {
+ DATA_PTR(proc) = 0;
+ blk_free(data);
+ }
+ data = ALLOC(struct BLOCK);
+ DATA_PTR(proc) = data;
*data = *ruby_block;
@@ -6365,8 +6378,16 @@ proc_new(klass)
}
+static VALUE
+proc_initialize(proc)
+ VALUE proc;
+{
+ ruby_frame = ruby_frame->prev;
+ return proc_new(proc);
+}
+
VALUE
rb_f_lambda()
{
- return proc_new(rb_cProc);
+ return proc_new(proc_s_alloc(rb_cProc));
}
@@ -6375,4 +6396,7 @@ blk_orphan(data)
struct BLOCK *data;
{
+ if (!data) {
+ rb_raise(rb_eTypeError, "uninitialized Proc");
+ }
if (!(data->scope->flags & SCOPE_NOSTACK)) {
return 0;
@@ -6484,4 +6508,7 @@ proc_arity(proc)
Data_Get_Struct(proc, struct BLOCK, data);
+ if (!data) {
+ rb_raise(rb_eTypeError, "uninitialized Proc");
+ }
if (data->var == 0) return INT2FIX(-1);
if (data->var == (NODE*)1) return INT2FIX(0);
@@ -6514,4 +6541,6 @@ proc_eq(self, other)
Data_Get_Struct(self, struct BLOCK, data);
Data_Get_Struct(other, struct BLOCK, data2);
+ if (data == data2) return Qtrue;
+ if (!data || !data2) return Qfalse;
if (data->tag == data2->tag) return Qtrue;
return Qfalse;
@@ -6528,5 +6557,5 @@ proc_to_s(self, other)
Data_Get_Struct(self, struct BLOCK, data);
str = rb_str_new(0, strlen(cname)+6+16+1); /* 6:tags 16:addr 1:nul */
- sprintf(RSTRING(str)->ptr, "#<%s:0x%lx>", cname, data->tag);
+ sprintf(RSTRING(str)->ptr, "#<%s:0x%lx>", cname, data ? data->tag : 0);
RSTRING(str)->len = strlen(RSTRING(str)->ptr);
if (OBJ_TAINTED(self)) OBJ_TAINT(str);
@@ -6970,5 +6999,6 @@ Init_Proc()
rb_cProc = rb_define_class("Proc", rb_cObject);
- rb_define_singleton_method(rb_cProc, "allocate", proc_new, 0);
+ rb_define_singleton_method(rb_cProc, "allocate", proc_s_alloc, 0);
+ rb_define_method(rb_cProc, "initialize", proc_initialize, 0);
rb_define_method(rb_cProc, "call", proc_call, -2);
Index: re.c
===================================================================
RCS file: /src/ruby/re.c,v
retrieving revision 1.48
diff -u -2 -p -u -r1.48 re.c
--- re.c 2001/10/03 07:19:10 1.48
+++ re.c 2001/10/03 11:11:06
@@ -1046,11 +1046,12 @@ rb_reg_s_alloc(klass)
VALUE klass;
{
- VALUE re = rb_obj_alloc(klass);
+ NEWOBJ(re, struct RRegexp);
+ OBJSETUP(re, klass, T_REGEXP);
- RREGEXP(re)->ptr = 0;
- RREGEXP(re)->len = 0;
- RREGEXP(re)->str = 0;
+ re->ptr = 0;
+ re->len = 0;
+ re->str = 0;
- return re;
+ return (VALUE)re;
}
--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦