From 3730710d79aa0bde6ab5b36e18c734dd9718aac0 Mon Sep 17 00:00:00 2001 From: matz Date: Sun, 30 Mar 2008 14:50:55 +0000 Subject: [PATCH] * proc.c (proc_dup): should copy is_lambda attribute as well. [ruby-talk:296244] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15860 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 + complex.c | 45 +++++---- ext/tk/sample/encstr_usage.rb | 5 +- ext/tk/sample/irbtkw.rbw | 24 +---- ext/tk/sample/tkrttimer.rb | 13 +-- ext/tk/stubs.c | 64 +----------- io.c | 181 ++++++++++------------------------ lib/complex.rb | 32 ++++++ lib/rational.rb | 32 ++++++ proc.c | 1 + version.h | 6 +- 11 files changed, 162 insertions(+), 246 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4cb507f093..5662e08f74 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Sun Mar 30 23:16:49 2008 Yukihiro Matsumoto + + * proc.c (proc_dup): should copy is_lambda attribute as well. + [ruby-talk:296244] + Sun Mar 30 15:33:29 2008 Tanaka Akira * io.c: IO.copy_stream implemented. [ruby-dev:33843] diff --git a/complex.c b/complex.c index 1644746360..58704110ce 100644 --- a/complex.c +++ b/complex.c @@ -84,22 +84,6 @@ f_add(VALUE x, VALUE y) return r; } -inline static VALUE -f_cmp(VALUE x, VALUE y) -{ - VALUE r; - if (FIXNUM_P(x) && FIXNUM_P(y)) { - long c = FIX2LONG(x) - FIX2LONG(y); - if (c > 0) - c = 1; - else if (c < 0) - c = -1; - r = INT2FIX(c); - } else - r = rb_funcall(x, id_cmp, 1, y); - return r; -} - inline static VALUE f_div(VALUE x, VALUE y) { @@ -200,6 +184,22 @@ fun1(to_r) fun1(to_s) fun1(truncate) +inline static VALUE +f_cmp(VALUE x, VALUE y) +{ + VALUE r; + if (FIXNUM_P(x) && FIXNUM_P(y)) { + long c = FIX2LONG(x) - FIX2LONG(y); + if (c > 0) + c = 1; + else if (c < 0) + c = -1; + r = INT2FIX(c); + } else + r = rb_funcall(x, id_cmp, 1, y); + return r; +} + fun2(coerce) fun2(divmod) @@ -1016,13 +1016,22 @@ nucomp_inexact_p(VALUE self) return f_boolcast(!nucomp_exact_p(self)); } -extern VALUE rb_lcm(VALUE x, VALUE y); +extern VALUE rb_gcd(VALUE x, VALUE y); + +static VALUE +f_lcm(VALUE x, VALUE y) +{ + if (f_zero_p(x) || f_zero_p(y)) + return ZERO; + else + return f_abs(f_mul(f_div(x, rb_gcd(x, y)), y)); +} static VALUE nucomp_denominator(VALUE self) { get_dat1(self); - return rb_lcm(f_denominator(dat->real), f_denominator(dat->image)); + return f_lcm(f_denominator(dat->real), f_denominator(dat->image)); } static VALUE diff --git a/ext/tk/sample/encstr_usage.rb b/ext/tk/sample/encstr_usage.rb index b22c2504ac..4285ec861c 100644 --- a/ext/tk/sample/encstr_usage.rb +++ b/ext/tk/sample/encstr_usage.rb @@ -11,7 +11,7 @@ t1 = TkText.new(:height=>5).pack t2 = TkText.new(:height=>5).pack t3 = TkText.new(:height=>5).pack -src_str = IO.readlines(File.join(File.dirname(__FILE__),'iso2022-kr.txt')).join +src_str = IO.readlines('iso2022-kr.txt').join t1.insert('end', "use neither Tk::EncodedString class nor Tk.encoding= method\n\n") @@ -23,8 +23,7 @@ t2.insert('end', t2.insert('end', enc_str) Tk.encoding = 'iso2022-kr' -t3.insert('end', "use Tk.encoding = 'iso2022-kr' (Tk.force_default_encoding? == #{Tk.force_default_encoding?})\n\n") - +t3.insert('end', "use Tk.encoding = 'iso2022-kr'\n\n") t3.insert('end', src_str) Tk.mainloop diff --git a/ext/tk/sample/irbtkw.rbw b/ext/tk/sample/irbtkw.rbw index 3fb6dde626..f6a35be6ed 100644 --- a/ext/tk/sample/irbtkw.rbw +++ b/ext/tk/sample/irbtkw.rbw @@ -4,7 +4,7 @@ # # by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) # -release = '2008/03/08' +release = '2006/11/06' require 'tk' begin @@ -15,32 +15,10 @@ end require 'irb' -if TkCore::WITH_ENCODING -else - # $KCODE setup - case Tk.encoding - when 'shiftjis', 'cp932' - $KCODE='SJIS' - when 'euc-jp' - $KCODE='EUC' - when 'utf-8', 'unicode' - $KCODE='UTF8' - else - # unknown - end -end - # console setup top = TkToplevel.new(:title=>'IRB console') top.protocol(:WM_DELETE_WINDOW){ Tk.exit } -case (Tk.windowingsystem) -when 'win32' - fnt = ['MS Gothic', '-12'] -else - fnt = ['courier', '-12'] -end - console = TkTextIO.new(top, :mode=>:console, :width=>80).pack(:side=>:left, :expand=>true, :fill=>:both) diff --git a/ext/tk/sample/tkrttimer.rb b/ext/tk/sample/tkrttimer.rb index 0abd4ecbd2..531f4a8d5a 100644 --- a/ext/tk/sample/tkrttimer.rb +++ b/ext/tk/sample/tkrttimer.rb @@ -17,17 +17,8 @@ TkLabel.new(f2, :text=>'use TkRTTimer class').pack label2 = TkLabel.new(:parent=>f2, :relief=>:raised, :width=>10).pack(:fill=>:both) -TkLabel.new(:padx=>10, :pady=>5, :justify=>'left', :text=><'Interval setting of each timer is 10 ms.', + :padx=>10, :pady=>5).pack # define the procedure repeated by the TkTimer object tick = proc{|aobj| #<== TkTimer object diff --git a/ext/tk/stubs.c b/ext/tk/stubs.c index 6d3b330f0e..d0aaf61f31 100644 --- a/ext/tk/stubs.c +++ b/ext/tk/stubs.c @@ -1,11 +1,5 @@ -/************************************************ - - stubs.c - Tcl/Tk stubs support - -************************************************/ - -#include "ruby.h" #include "stubs.h" +#include "ruby/ruby.h" #include #include @@ -92,12 +86,7 @@ static DL_HANDLE tcl_dll = (DL_HANDLE)0; static DL_HANDLE tk_dll = (DL_HANDLE)0; int -#ifdef RUBY_VM ruby_open_tcl_dll(char *appname) -#else -ruby_open_tcl_dll(appname) - char *appname; -#endif { void (*p_Tcl_FindExecutable)(const char *); int n; @@ -179,12 +168,7 @@ ruby_open_tk_dll() } int -#ifdef RUBY_VM ruby_open_tcltk_dll(char *appname) -#else -ruby_open_tcltk_dll(appname) - char *appname; -#endif { return( ruby_open_tcl_dll(appname) || ruby_open_tk_dll() ); } @@ -203,12 +187,7 @@ tk_stubs_init_p() Tcl_Interp * -#ifdef RUBY_VM ruby_tcl_create_ip_and_stubs_init(int *st) -#else -ruby_tcl_create_ip_and_stubs_init(st) - int *st; -#endif { Tcl_Interp *tcl_ip; @@ -290,12 +269,7 @@ ruby_tcl_stubs_init() } int -#ifdef RUBY_VM ruby_tk_stubs_init(Tcl_Interp *tcl_ip) -#else -ruby_tk_stubs_init(tcl_ip) - Tcl_Interp *tcl_ip; -#endif { Tcl_ResetResult(tcl_ip); @@ -330,12 +304,7 @@ ruby_tk_stubs_init(tcl_ip) } int -#ifdef RUBY_VM ruby_tk_stubs_safeinit(Tcl_Interp *tcl_ip) -#else -ruby_tk_stubs_safeinit(tcl_ip) - Tcl_Interp *tcl_ip; -#endif { Tcl_ResetResult(tcl_ip); @@ -421,12 +390,7 @@ static int open_tcl_dll = 0; static int call_tk_stubs_init = 0; int -#ifdef RUBY_VM ruby_open_tcl_dll(char *appname) -#else -ruby_open_tcl_dll(appname) - char *appname; -#endif { if (appname) { Tcl_FindExecutable(appname); @@ -438,8 +402,7 @@ ruby_open_tcl_dll(appname) return TCLTK_STUBS_OK; } -int -ruby_open_tk_dll() +int ruby_open_tk_dll() { if (!open_tcl_dll) { /* ruby_open_tcl_dll(RSTRING_PTR(rb_argv0)); */ @@ -449,13 +412,7 @@ ruby_open_tk_dll() return TCLTK_STUBS_OK; } -int -#ifdef RUBY_VM -ruby_open_tcltk_dll(char *appname) -#else -ruby_open_tcltk_dll(appname) - char *appname; -#endif +int ruby_open_tcltk_dll(char *appname) { return( ruby_open_tcl_dll(appname) || ruby_open_tk_dll() ); } @@ -473,12 +430,7 @@ tk_stubs_init_p() } Tcl_Interp * -#ifdef RUBY_VM ruby_tcl_create_ip_and_stubs_init(int *st) -#else -ruby_tcl_create_ip_and_stubs_init(st) - int *st; -#endif { Tcl_Interp *tcl_ip; @@ -506,12 +458,7 @@ ruby_tcl_stubs_init() } int -#ifdef RUBY_VM ruby_tk_stubs_init(Tcl_Interp *tcl_ip) -#else -ruby_tk_stubs_init(tcl_ip) - Tcl_Interp *tcl_ip; -#endif { if (Tk_Init(tcl_ip) == TCL_ERROR) return FAIL_Tk_Init; @@ -527,12 +474,7 @@ ruby_tk_stubs_init(tcl_ip) } int -#ifdef RUBY_VM ruby_tk_stubs_safeinit(Tcl_Interp *tcl_ip) -#else -ruby_tk_stubs_safeinit(tcl_ip) - Tcl_Interp *tcl_ip; -#endif { #if TCL_MAJOR_VERSION >= 8 if (Tk_SafeInit(tcl_ip) == TCL_ERROR) diff --git a/io.c b/io.c index 9a7d6e8864..504c4571b9 100644 --- a/io.c +++ b/io.c @@ -2228,12 +2228,64 @@ rb_io_each_byte(VALUE io) return io; } -static VALUE -io_getc(rb_io_t *fptr, rb_encoding *enc) +/* + * call-seq: + * str.lines(sep=$/) => anEnumerator + * str.lines(limit) => anEnumerator + * str.lines(sep, limit) => anEnumerator + * + * Returns an enumerator that gives each line in the string. + * + * "foo\nbar\n".lines.to_a #=> ["foo\n", "bar\n"] + * "foo\nb ar".lines.sort #=> ["b ar", "foo\n"] + */ + +static VALUE +rb_io_lines(int argc, VALUE *argv, VALUE str) { + return rb_enumeratorize(str, ID2SYM(rb_intern("each_line")), argc, argv); +} + +/* + * call-seq: + * str.bytes => anEnumerator + * + * Returns an enumerator that gives each byte in the string. + * + * "hello".bytes.to_a #=> [104, 101, 108, 108, 111] + */ + +static VALUE +rb_io_bytes(VALUE str) +{ + return rb_enumeratorize(str, ID2SYM(rb_intern("each_byte")), 0, 0); +} + +/* + * call-seq: + * ios.getc => fixnum or nil + * + * Reads a one-character string from ios. Returns + * nil if called at end of file. + * + * f = File.new("testfile") + * f.getc #=> "8" + * f.getc #=> "1" + */ + +static VALUE +rb_io_getc(VALUE io) +{ + rb_io_t *fptr; int r, n; VALUE str; + rb_encoding *enc; + GetOpenFile(io, fptr); + rb_io_check_readable(fptr); + + enc = io_input_encoding(fptr); + READ_CHECK(fptr); if (io_fillbuf(fptr) < 0) { return Qnil; } @@ -2266,117 +2318,6 @@ io_getc(rb_io_t *fptr, rb_encoding *enc) return io_enc_str(str, fptr); } -/* - * call-seq: - * ios.each_char {|c| block } => ios - * - * Calls the given block once for each character in ios, - * passing the character as an argument. The stream must be opened for - * reading or an IOError will be raised. - * - * f = File.new("testfile") - * f.each_char {|c| print c, ' ' } #=> # - */ - -static VALUE -rb_io_each_char(VALUE io) -{ - rb_io_t *fptr; - rb_encoding *enc; - VALUE c; - - RETURN_ENUMERATOR(io, 0, 0); - GetOpenFile(io, fptr); - rb_io_check_readable(fptr); - - enc = io_input_encoding(fptr); - READ_CHECK(fptr); - while (!NIL_P(c = io_getc(fptr, enc))) { - rb_yield(c); - } - return io; -} - - - -/* - * call-seq: - * str.lines(sep=$/) => anEnumerator - * str.lines(limit) => anEnumerator - * str.lines(sep, limit) => anEnumerator - * - * Returns an enumerator that gives each line in the string. - * - * "foo\nbar\n".lines.to_a #=> ["foo\n", "bar\n"] - * "foo\nb ar".lines.sort #=> ["b ar", "foo\n"] - */ - -static VALUE -rb_io_lines(int argc, VALUE *argv, VALUE io) -{ - return rb_enumeratorize(io, ID2SYM(rb_intern("each_line")), argc, argv); -} - -/* - * call-seq: - * str.bytes => anEnumerator - * - * Returns an enumerator that gives each byte in the string. - * - * "hello".bytes.to_a #=> [104, 101, 108, 108, 111] - */ - -static VALUE -rb_io_bytes(VALUE io) -{ - return rb_enumeratorize(io, ID2SYM(rb_intern("each_byte")), 0, 0); -} - -/* - * call-seq: - * ios.chars => anEnumerator - * - * Returns an enumerator that gives each character in ios. - * The stream must be opened for reading or an IOError - * will be raised. - * - * f = File.new("testfile) - * f.chars.each {|c| print c, ' ' } - */ - -static VALUE -rb_io_chars(VALUE io) -{ - return rb_enumeratorize(io, ID2SYM(rb_intern("each_char")), 0, 0); -} - -/* - * call-seq: - * ios.getc => fixnum or nil - * - * Reads a one-character string from ios. Returns - * nil if called at end of file. - * - * f = File.new("testfile") - * f.getc #=> "8" - * f.getc #=> "1" - */ - -static VALUE -rb_io_getc(VALUE io) -{ - rb_io_t *fptr; - int r, n; - VALUE str; - rb_encoding *enc; - - GetOpenFile(io, fptr); - rb_io_check_readable(fptr); - - enc = io_input_encoding(fptr); - READ_CHECK(fptr); - return io_getc(fptr, enc); -} int rb_getc(FILE *f) { @@ -7064,17 +7005,6 @@ argf_each_byte(VALUE argf) } } -static VALUE -argf_each_char(VALUE argf) -{ - RETURN_ENUMERATOR(argf, 0, 0); - for (;;) { - if (!next_argv()) return Qnil; - rb_block_call(current_file, rb_intern("each_char"), 0, 0, rb_yield, 0); - next_p = 1; - } -} - static VALUE argf_filename(VALUE argf) { @@ -7373,10 +7303,8 @@ Init_IO(void) rb_define_method(rb_cIO, "each", rb_io_each_line, -1); rb_define_method(rb_cIO, "each_line", rb_io_each_line, -1); rb_define_method(rb_cIO, "each_byte", rb_io_each_byte, 0); - rb_define_method(rb_cIO, "each_char", rb_io_each_char, 0); rb_define_method(rb_cIO, "lines", rb_io_lines, -1); rb_define_method(rb_cIO, "bytes", rb_io_bytes, 0); - rb_define_method(rb_cIO, "chars", rb_io_chars, 0); rb_define_method(rb_cIO, "syswrite", rb_io_syswrite, 1); rb_define_method(rb_cIO, "sysread", rb_io_sysread, -1); @@ -7473,7 +7401,6 @@ Init_IO(void) rb_define_method(rb_cARGF, "each", argf_each_line, -1); rb_define_method(rb_cARGF, "each_line", argf_each_line, -1); rb_define_method(rb_cARGF, "each_byte", argf_each_byte, 0); - rb_define_method(rb_cARGF, "each_char", argf_each_char, 0); rb_define_method(rb_cARGF, "read", argf_read, -1); rb_define_method(rb_cARGF, "readpartial", argf_readpartial, -1); diff --git a/lib/complex.rb b/lib/complex.rb index 9d926023a7..505b0120e3 100644 --- a/lib/complex.rb +++ b/lib/complex.rb @@ -1,3 +1,35 @@ +class Integer + + def gcd(other) + min = self.abs + max = other.abs + while min > 0 + tmp = min + min = max % min + max = tmp + end + max + end + + def lcm(other) + if self.zero? or other.zero? + 0 + else + (self.div(self.gcd(other)) * other).abs + end + end + + def gcdlcm(other) + gcd = self.gcd(other) + if self.zero? or other.zero? + [gcd, 0] + else + [gcd, (self.div(gcd) * other).abs] + end + end + +end + module Math alias exp! exp diff --git a/lib/rational.rb b/lib/rational.rb index 87c5d3f111..b12bf7ef38 100644 --- a/lib/rational.rb +++ b/lib/rational.rb @@ -15,3 +15,35 @@ class Bignum alias rpower ** end + +class Integer + + def gcd(other) + min = self.abs + max = other.abs + while min > 0 + tmp = min + min = max % min + max = tmp + end + max + end + + def lcm(other) + if self.zero? or other.zero? + 0 + else + (self.div(self.gcd(other)) * other).abs + end + end + + def gcdlcm(other) + gcd = self.gcd(other) + if self.zero? or other.zero? + [gcd, 0] + else + [gcd, (self.div(gcd) * other).abs] + end + end + +end diff --git a/proc.c b/proc.c index bad935d62e..a2c53ce699 100644 --- a/proc.c +++ b/proc.c @@ -95,6 +95,7 @@ proc_dup(VALUE self) dst->envval = src->envval; dst->safe_level = dst->safe_level; dst->special_cref_stack = src->special_cref_stack; + dst->is_lambda = src->is_lambda; return procval; } diff --git a/version.h b/version.h index 8d99c70921..7ea651cc9c 100644 --- a/version.h +++ b/version.h @@ -1,7 +1,7 @@ #define RUBY_VERSION "1.9.0" -#define RUBY_RELEASE_DATE "2008-03-29" +#define RUBY_RELEASE_DATE "2008-03-30" #define RUBY_VERSION_CODE 190 -#define RUBY_RELEASE_CODE 20080329 +#define RUBY_RELEASE_CODE 20080330 #define RUBY_PATCHLEVEL 0 #define RUBY_VERSION_MAJOR 1 @@ -9,7 +9,7 @@ #define RUBY_VERSION_TEENY 0 #define RUBY_RELEASE_YEAR 2008 #define RUBY_RELEASE_MONTH 3 -#define RUBY_RELEASE_DAY 29 +#define RUBY_RELEASE_DAY 30 #ifdef RUBY_EXTERN RUBY_EXTERN const char ruby_version[];