diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-10-19 19:17:33 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-10-19 19:17:33 +0000 |
commit | 9f6b3edcd65e2f62f38106495f03f986f6dc9673 (patch) | |
tree | 38e816c1ccabb276324a5ae54ec8b58941bbf6fb | |
parent | b9ec9b69a92432c5566f7a7981945dfe1c2c6d18 (diff) | |
download | ruby-9f6b3edcd65e2f62f38106495f03f986f6dc9673.tar.gz |
* array.c (rb_ary_times): Array#* should return an instance of
the class of right operand. [ruby-dev:24526]
* ext/zlib/zlib.c (zstream_detach_buffer): should not expose
class-less object to Ruby world. [ruby-dev:24530]
* eval.c (proc_dup): provide Proc#dup as well. [ruby-talk:116915]
* eval.c (ruby_exec): stack marking position may be higher than
expected. thanks to Guy Decoux. [ruby-core:03527]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7077 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | array.c | 2 | ||||
-rw-r--r-- | eval.c | 57 | ||||
-rw-r--r-- | ext/socket/socket.c | 12 | ||||
-rw-r--r-- | ext/zlib/zlib.c | 1 | ||||
-rw-r--r-- | lib/delegate.rb | 14 |
6 files changed, 78 insertions, 21 deletions
@@ -1,3 +1,16 @@ +Wed Oct 20 01:37:18 2004 Yukihiro Matsumoto <matz@ruby-lang.org> + + * array.c (rb_ary_times): Array#* should return an instance of + the class of right operand. [ruby-dev:24526] + + * ext/zlib/zlib.c (zstream_detach_buffer): should not expose + class-less object to Ruby world. [ruby-dev:24530] + + * eval.c (proc_dup): provide Proc#dup as well. [ruby-talk:116915] + + * eval.c (ruby_exec): stack marking position may be higher than + expected. thanks to Guy Decoux. [ruby-core:03527] + Wed Oct 20 00:25:41 2004 Nobuyoshi Nakada <nobu@ruby-lang.org> * eval.c (search_required): required name must not be changed before @@ -2506,7 +2506,7 @@ rb_ary_times(ary, times) } len = NUM2LONG(times); - if (len == 0) return rb_ary_new2(0); + if (len == 0) return ary_new(rb_obj_class(ary), 0); if (len < 0) { rb_raise(rb_eArgError, "negative argument"); } @@ -1444,13 +1444,11 @@ extern NODE *ruby_eval_tree; static void cont_call _((VALUE)); -int -ruby_exec() +static int +ruby_exec_internal() { int state; - volatile NODE *tmp; - Init_stack((void*)&tmp); PUSH_TAG(PROT_THREAD); PUSH_ITER(ITER_NOT); /* default visibility is private at toplevel */ @@ -1468,6 +1466,15 @@ ruby_exec() return state; } +int +ruby_exec() +{ + volatile NODE *tmp; + + Init_stack((void*)&tmp); + return ruby_exec_internal(); +} + void ruby_stop(ex) int ex; @@ -7777,6 +7784,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 */ @@ -7791,15 +7813,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; } @@ -9224,6 +9256,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); diff --git a/ext/socket/socket.c b/ext/socket/socket.c index 044d411b29..5c57f2e1f1 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -285,6 +285,8 @@ bsock_setsockopt(sock, lev, optname, val) rb_secure(2); level = NUM2INT(lev); option = NUM2INT(optname); + GetOpenFile(sock, fptr); + switch (TYPE(val)) { case T_FIXNUM: i = FIX2INT(val); @@ -304,7 +306,6 @@ bsock_setsockopt(sock, lev, optname, val) break; } - GetOpenFile(sock, fptr); if (setsockopt(fileno(fptr->f), level, option, v, vlen) < 0) rb_sys_fail(fptr->path); @@ -2182,7 +2183,7 @@ sock_s_gethostbyaddr(argc, argv) t = AF_INET6; } #endif - h = gethostbyaddr((char*)RSTRING(addr)->ptr, RSTRING(addr)->len, t); + h = gethostbyaddr(RSTRING(addr)->ptr, RSTRING(addr)->len, t); if (h == NULL) { #ifdef HAVE_HSTRERROR extern int h_errno; @@ -2223,14 +2224,15 @@ sock_s_getservbyaname(argc, argv) rb_scan_args(argc, argv, "11", &service, &proto); if (NIL_P(proto)) proto = rb_str_new2("tcp"); - else StringValue(proto); + StringValue(service); + StringValue(proto); - sp = getservbyname((char*)RSTRING(service)->ptr, RSTRING(proto)->ptr); + sp = getservbyname(StringValueCStr(service), StringValueCStr(proto)); if (sp) { port = ntohs(sp->s_port); } else { - char *s = StringValuePtr(service); + char *s = RSTRING(service)->ptr; char *end; port = strtoul(s, &end, 0); diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c index 9d1b204eb7..f5fe2e3fa4 100644 --- a/ext/zlib/zlib.c +++ b/ext/zlib/zlib.c @@ -532,6 +532,7 @@ zstream_detach_buffer(z) z->buf_filled = 0; z->stream.next_out = 0; z->stream.avail_out = 0; + RBASIC(dst)->klass = rb_cString; return dst; } diff --git a/lib/delegate.rb b/lib/delegate.rb index c6f8f5d946..10b135116d 100644 --- a/lib/delegate.rb +++ b/lib/delegate.rb @@ -76,10 +76,14 @@ class SimpleDelegator<Delegator @_sd_obj = obj end - def initialize_copy(obj) + def clone(obj) super __setobj__(obj.__getobj__.clone) end + def dup(obj) + super + __setobj__(obj.__getobj__.dup) + end end # backward compatibility ^_^;;; @@ -108,9 +112,13 @@ def DelegateClass(superclass) def __setobj__(obj) @_dc_obj = obj end - def initialize_copy(obj) + def clone(obj) super - __setobj__(obj.__getobj__.clone) + __setobj__(obj.__getobj__.clone) + end + def dup(obj) + super + __setobj__(obj.__getobj__.dup) end } for method in methods |