diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-10-20 12:47:20 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-10-20 12:47:20 +0000 |
commit | 2ec51ee0d506c90f3afba694e6c502ef3d52e4f8 (patch) | |
tree | db3928abc44090d749b6609bfb7ef49f2631a5c9 /eval.c | |
parent | 959077c8e0ec27dfa72025a85c99a4acc26f6491 (diff) |
* string.c (str_gsub): reentrant check. [ruby-dev:24432]
* backport all SEGV bug fixes from CVS HEAD. [ruby-dev:24536]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@7090 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 61 |
1 files changed, 48 insertions, 13 deletions
@@ -1127,7 +1127,8 @@ error_print() eclass = CLASS_OF(ruby_errinfo); if (EXEC_TAG() == 0) { - e = rb_obj_as_string(ruby_errinfo); + e = rb_funcall(ruby_errinfo, rb_intern("message"), 0, 0); + StringValue(e); einfo = RSTRING(e)->ptr; elen = RSTRING(e)->len; } @@ -1441,13 +1442,11 @@ ruby_cleanup(ex) return ex; } -int -ruby_exec() +static int +ruby_exec_internal() { int state; - volatile NODE *tmp; - Init_stack((void*)&tmp); PUSH_TAG(PROT_NONE); PUSH_ITER(ITER_NOT); /* default visibility is private at toplevel */ @@ -1467,6 +1466,15 @@ ruby_stop(ex) exit(ruby_cleanup(ex)); } +int +ruby_exec() +{ + volatile NODE *tmp; + + Init_stack((void*)&tmp); + return ruby_exec_internal(); +} + void ruby_run() { @@ -5472,6 +5480,7 @@ rb_call0(klass, recv, id, oid, argc, argv, body, nosuper) if ((++tick & 0xff) == 0) { CHECK_INTS; /* better than nothing */ stack_check(); + rb_gc_finalize_deferred(); } PUSH_ITER(itr); PUSH_FRAME(); @@ -7800,6 +7809,21 @@ blk_copy_prev(block) } +static void +blk_dup(dup, orig) + struct BLOCK *dup, *orig; +{ + MEMCPY(dup, orig, struct BLOCK, 1); + frame_dup(&dup->frame); + + if (dup->iter) { + blk_copy_prev(dup); + } + else { + dup->prev = 0; + } +} + /* * MISSING: documentation */ @@ -7814,15 +7838,25 @@ proc_clone(self) Data_Get_Struct(self, struct BLOCK, orig); bind = Data_Make_Struct(rb_obj_class(self),struct BLOCK,blk_mark,blk_free,data); CLONESETUP(bind, self); - MEMCPY(data, orig, struct BLOCK, 1); - frame_dup(&data->frame); + blk_dup(data, orig); - if (data->iter) { - blk_copy_prev(data); - } - else { - data->prev = 0; - } + return bind; +} + +/* + * MISSING: documentation + */ + +static VALUE +proc_dup(self) + VALUE self; +{ + struct BLOCK *orig, *data; + VALUE bind; + + Data_Get_Struct(self, struct BLOCK, orig); + bind = Data_Make_Struct(rb_obj_class(self),struct BLOCK,blk_mark,blk_free,data); + blk_dup(data, orig); return bind; } @@ -9159,6 +9193,7 @@ Init_Proc() rb_define_singleton_method(rb_cProc, "new", proc_s_new, -1); rb_define_method(rb_cProc, "clone", proc_clone, 0); + rb_define_method(rb_cProc, "dup", proc_dup, 0); rb_define_method(rb_cProc, "call", proc_call, -2); rb_define_method(rb_cProc, "arity", proc_arity, 0); rb_define_method(rb_cProc, "[]", proc_call, -2); |