[前][次][番号順一覧][スレッド一覧]

ruby-changes:4369

From: ko1@a...
Date: Sun, 30 Mar 2008 23:51:15 +0900 (JST)
Subject: [ruby-changes:4369] matz - Ruby:r15860 (trunk): * proc.c (proc_dup): should copy is_lambda attribute as well.

matz	2008-03-30 23:50:55 +0900 (Sun, 30 Mar 2008)

  New Revision: 15860

  Modified files:
    trunk/ChangeLog
    trunk/complex.c
    trunk/ext/tk/sample/encstr_usage.rb
    trunk/ext/tk/sample/irbtkw.rbw
    trunk/ext/tk/sample/tkrttimer.rb
    trunk/ext/tk/stubs.c
    trunk/io.c
    trunk/lib/complex.rb
    trunk/lib/rational.rb
    trunk/proc.c
    trunk/version.h

  Log:
    * proc.c (proc_dup): should copy is_lambda attribute as well.
      [ruby-talk:296244]

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ext/tk/sample/irbtkw.rbw?r1=15860&r2=15859&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/version.h?r1=15860&r2=15859&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/complex.rb?r1=15860&r2=15859&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ext/tk/sample/tkrttimer.rb?r1=15860&r2=15859&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/complex.c?r1=15860&r2=15859&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15860&r2=15859&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/rational.rb?r1=15860&r2=15859&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/io.c?r1=15860&r2=15859&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ext/tk/stubs.c?r1=15860&r2=15859&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/proc.c?r1=15860&r2=15859&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ext/tk/sample/encstr_usage.rb?r1=15860&r2=15859&diff_format=u

Index: complex.c
===================================================================
--- complex.c	(revision 15859)
+++ complex.c	(revision 15860)
@@ -85,22 +85,6 @@
 }
 
 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)
 {
   VALUE r;
@@ -200,6 +184,22 @@
 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 @@
   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
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 15859)
+++ ChangeLog	(revision 15860)
@@ -1,3 +1,8 @@
+Sun Mar 30 23:16:49 2008  Yukihiro Matsumoto  <matz@r...>
+
+	* proc.c (proc_dup): should copy is_lambda attribute as well.
+	  [ruby-talk:296244]
+
 Sun Mar 30 15:33:29 2008  Tanaka Akira  <akr@f...>
 
 	* io.c: IO.copy_stream implemented.  [ruby-dev:33843]
Index: io.c
===================================================================
--- io.c	(revision 15859)
+++ io.c	(revision 15860)
@@ -2228,79 +2228,8 @@
     return io;
 }
 
-static VALUE 
-io_getc(rb_io_t *fptr, rb_encoding *enc)
-{
-    int r, n;
-    VALUE str;
-
-    if (io_fillbuf(fptr) < 0) {
-	return Qnil;
-    }
-    r = rb_enc_precise_mbclen(fptr->rbuf+fptr->rbuf_off, fptr->rbuf+fptr->rbuf_off+fptr->rbuf_len, enc);
-    if (MBCLEN_CHARFOUND_P(r) &&
-        (n = MBCLEN_CHARFOUND_LEN(r)) <= fptr->rbuf_len) {
-	str = rb_str_new(fptr->rbuf+fptr->rbuf_off, n);
-	fptr->rbuf_off += n;
-	fptr->rbuf_len -= n;
-    }
-    else if (MBCLEN_NEEDMORE_P(r)) {
-	str = rb_str_new(fptr->rbuf+fptr->rbuf_off, fptr->rbuf_len);
-        fptr->rbuf_len = 0;
-      getc_needmore:
-        if (io_fillbuf(fptr) != -1) {
-            rb_str_cat(str, fptr->rbuf+fptr->rbuf_off, 1);
-            fptr->rbuf_off++;
-            fptr->rbuf_len--;
-            r = rb_enc_precise_mbclen(RSTRING_PTR(str), RSTRING_PTR(str)+RSTRING_LEN(str), enc);
-            if (MBCLEN_NEEDMORE_P(r)) {
-                goto getc_needmore;
-            }
-        }
-    }
-    else {
-	str = rb_str_new(fptr->rbuf+fptr->rbuf_off, 1);
-	fptr->rbuf_off++;
-	fptr->rbuf_len--;
-    }
-    return io_enc_str(str, fptr);
-}
-
 /*
  *  call-seq:
- *     ios.each_char {|c| block }  => ios
- *
- *  Calls the given block once for each character in <em>ios</em>,
- *  passing the character as an argument. The stream must be opened for
- *  reading or an <code>IOError</code> will be raised.
- *
- *     f = File.new("testfile")
- *     f.each_char {|c| print c, ' ' }   #=> #<File:testfile>
- */
-
-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
@@ -2312,9 +2241,9 @@
  */
 
 static VALUE
-rb_io_lines(int argc, VALUE *argv, VALUE io)
+rb_io_lines(int argc, VALUE *argv, VALUE str)
 {
-    return rb_enumeratorize(io, ID2SYM(rb_intern("each_line")), argc, argv);
+    return rb_enumeratorize(str, ID2SYM(rb_intern("each_line")), argc, argv);
 }
 
 /*
@@ -2327,31 +2256,13 @@
  */
 
 static VALUE
-rb_io_bytes(VALUE io)
+rb_io_bytes(VALUE str)
 {
-    return rb_enumeratorize(io, ID2SYM(rb_intern("each_byte")), 0, 0);
+    return rb_enumeratorize(str, ID2SYM(rb_intern("each_byte")), 0, 0);
 }
 
 /*
  *  call-seq:
- *     ios.chars   => anEnumerator
- *  
- *  Returns an enumerator that gives each character in <em>ios</em>.
- *  The stream must be opened for reading or an <code>IOError</code>
- *  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 <em>ios</em>. Returns
@@ -2375,8 +2286,38 @@
 
     enc = io_input_encoding(fptr);
     READ_CHECK(fptr);
-    return io_getc(fptr, enc);
+    if (io_fillbuf(fptr) < 0) {
+	return Qnil;
+    }
+    r = rb_enc_precise_mbclen(fptr->rbuf+fptr->rbuf_off, fptr->rbuf+fptr->rbuf_off+fptr->rbuf_len, enc);
+    if (MBCLEN_CHARFOUND_P(r) &&
+        (n = MBCLEN_CHARFOUND_LEN(r)) <= fptr->rbuf_len) {
+	str = rb_str_new(fptr->rbuf+fptr->rbuf_off, n);
+	fptr->rbuf_off += n;
+	fptr->rbuf_len -= n;
+    }
+    else if (MBCLEN_NEEDMORE_P(r)) {
+	str = rb_str_new(fptr->rbuf+fptr->rbuf_off, fptr->rbuf_len);
+        fptr->rbuf_len = 0;
+      getc_needmore:
+        if (io_fillbuf(fptr) != -1) {
+            rb_str_cat(str, fptr->rbuf+fptr->rbuf_off, 1);
+            fptr->rbuf_off++;
+            fptr->rbuf_len--;
+            r = rb_enc_precise_mbclen(RSTRING_PTR(str), RSTRING_PTR(str)+RSTRING_LEN(str), enc);
+            if (MBCLEN_NEEDMORE_P(r)) {
+                goto getc_needmore;
+            }
+        }
+    }
+    else {
+	str = rb_str_new(fptr->rbuf+fptr->rbuf_off, 1);
+	fptr->rbuf_off++;
+	fptr->rbuf_len--;
+    }
+    return io_enc_str(str, fptr);
 }
+
 int
 rb_getc(FILE *f)
 {
@@ -7065,17 +7006,6 @@
 }
 
 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)
 {
     next_argv();
@@ -7373,10 +7303,8 @@
     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 @@
     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);
Index: lib/rational.rb
===================================================================
--- lib/rational.rb	(revision 15859)
+++ lib/rational.rb	(revision 15860)
@@ -15,3 +15,35 @@
   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
Index: lib/complex.rb
===================================================================
--- lib/complex.rb	(revision 15859)
+++ lib/complex.rb	(revision 15860)
@@ -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
Index: proc.c
===================================================================
--- proc.c	(revision 15859)
+++ proc.c	(revision 15860)
@@ -95,6 +95,7 @@
     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;
 }
Index: ext/tk/stubs.c
===================================================================
--- ext/tk/stubs.c	(revision 15859)
+++ ext/tk/stubs.c	(revision 15860)
@@ -1,11 +1,5 @@
-/************************************************
-
-  stubs.c - Tcl/Tk stubs support
-
-************************************************/
-
-#include "ruby.h"
 #include "stubs.h"
+#include "ruby/ruby.h"
 #include <tcl.h>
 #include <tk.h>
 
@@ -92,12 +86,7 @@
 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 @@
 }
 
 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 @@
 
 
 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 @@
 }
 
 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 @@
 }
 
 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 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 @@
     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 @@
     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 @@
 }
 
 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 @@
 }
 
 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 @@
 }
 
 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)
Index: ext/tk/sample/encstr_usage.rb
===================================================================
--- ext/tk/sample/encstr_usage.rb	(revision 15859)
+++ ext/tk/sample/encstr_usage.rb	(revision 15860)
@@ -11,7 +11,7 @@
 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', 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
Index: ext/tk/sample/tkrttimer.rb
===================================================================
--- ext/tk/sample/tkrttimer.rb	(revision 15859)
+++ ext/tk/sample/tkrttimer.rb	(revision 15860)
@@ -17,17 +17,8 @@
 label2 = TkLabel.new(:parent=>f2, :relief=>:raised, 
                      :width=>10).pack(:fill=>:both)
 
-TkLabel.new(:padx=>10, :pady=>5, :justify=>'left', :text=><<EOT).pack
-Interval setting of each timer object is 10 ms.
-Each timer object counts up the value on each callback
-(the value is not the clock data).
-The count of the TkTimer object is delayed by execution 
-time of callbacks and inaccuracy of interval.
-On the other hand, the count of the TkRTTimer object is 
-not delayed. Its callback interval is not accurate too. 
-But it can compute error correction about the time when 
-a callback should start.
-EOT
+TkLabel.new(: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
Index: ext/tk/sample/irbtkw.rbw
===================================================================
--- ext/tk/sample/irbtkw.rbw	(revision 15859)
+++ ext/tk/sample/irbtkw.rbw	(revision 15860)
@@ -4,7 +4,7 @@
 #
 #                                 by Hidetoshi NAGAI (nagai@a...)
 #
-release = '2008/03/08'
+release = '2006/11/06'
 
 require 'tk'
 begin
@@ -15,32 +15,10 @@
 
 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)
Index: version.h
===================================================================
--- version.h	(revision 15859)
+++ version.h	(revision 15860)
@@ -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[];

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]