[#33511] [Ruby 1.9-Bug#4108][Open] irb hangs on Windows with trunk — Heesob Park <redmine@...>
Bug #4108: irb hangs on Windows with trunk
[#33521] [Ruby 1.9-Feature#4111][Open] Add XLIST support to Net::IMAP — Geoff Youngs <redmine@...>
Feature #4111: Add XLIST support to Net::IMAP
[#33530] [Ruby 1.9-Bug#4113][Open] Cannot build trunk with MSVC. — Heesob Park <redmine@...>
Bug #4113: Cannot build trunk with MSVC.
[#33583] Initialization time — SASADA Koichi <ko1@...>
Hi,
[#33605] Why is SyncEnumerator in REXML? — Asher <asher@...>
in 1.8 SyncEnumerator is in lib/generator.rb; in 1.9 it is in lib/rexml/syncenumerator.rb
On Dec 6, 2010, at 11:09 PM, Asher wrote:
If that is the case, it would make sense historically, but doesn't seem to make much sense now, as SyncEnumerator doesn't seem to have any relation to REXML, even if REXML utilizes it.
[#33628] [Ruby 1.8-Bug#4132][Open] Socket.close attempting to close the socket twice — Claudio Villalobos <redmine@...>
Bug #4132: Socket.close attempting to close the socket twice
[#33640] [Ruby 1.9-Bug#4136][Open] Enumerable#reject should not inherit the receiver's instance variables — Hiro Asari <redmine@...>
Bug #4136: Enumerable#reject should not inherit the receiver's instance variables
Issue #4136 has been updated by Marc-Andre Lafortune.
Hi,
[#33648] Why doesn’t StringIO implement #freeze? — Nikolai Weibull <now@...>
IO implements #freeze, but StringIO doesn’t. What’s up with that?
Hi,
On Fri, Dec 31, 2010 at 03:09, Nobuyoshi Nakada <nobu@ruby-lang.org> wrote:
[#33656] [Ruby 1.9-Bug#4141][Open] Tk extension is not accepting any type of parameter combination — Luis Lavena <redmine@...>
Bug #4141: Tk extension is not accepting any type of parameter combination
Hi,
On Sun, Dec 26, 2010 at 10:05 PM, Hidetoshi NAGAI
[#33661] [Ruby 1.9-Feature#4145][Open] The result of UTF-16 encoded string concatenation — Heesob Park <redmine@...>
Feature #4145: The result of UTF-16 encoded string concatenation
Issue #4145 has been updated by Yui NARUSE.
[#33667] [Ruby 1.9-Bug#4149][Open] Documentation submission: syslog standard library — mathew murphy <redmine@...>
Bug #4149: Documentation submission: syslog standard library
Issue #4149 has been updated by mathew murphy.
[#33683] [feature:trunk] Enumerable#categorize — Tanaka Akira <akr@...>
Hi.
2010/12/12 "Martin J. Dst" <duerst@it.aoyama.ac.jp>:
Hello Akira,
2010/12/20 "Martin J. Dst" <duerst@it.aoyama.ac.jp>:
Hi!
2010/12/27 Marc-Andre Lafortune <ruby-core-mailing-list@marc-andre.ca>:
Hi!
[#33687] Towards a standardized AST for Ruby code — Magnus Holm <judofyr@...>
Hey folks,
On Sun, Dec 12, 2010 at 9:55 AM, Magnus Holm <judofyr@gmail.com> wrote:
On Dec 12, 2010, at 17:46 , Charles Oliver Nutter wrote:
On Sun, Dec 12, 2010 at 7:09 PM, Ryan Davis <ryand-ruby@zenspider.com>wrote:
(2010/12/13 1:54), Haase, Konstantin wrote:
(2010/12/13 9:06), Ryan Davis wrote:
On Sun, Dec 12, 2010 at 6:33 PM, Ryan Davis <ryand-ruby@zenspider.com> wrote:
On Dec 14, 2010, at 09:47 , Charles Oliver Nutter wrote:
On Tue, Dec 14, 2010 at 2:54 AM, Haase, Konstantin
[#33690] [Ruby 1.9-Bug#4153][Open] Minitest or ruby bug - wrong return code — Robert Pankowecki <redmine@...>
Bug #4153: Minitest or ruby bug - wrong return code
[#33735] [Ruby 1.9-Bug#4163][Assigned] RubyGems uses deprecated API: YAML.quick_emit. — Yui NARUSE <redmine@...>
Bug #4163: RubyGems uses deprecated API: YAML.quick_emit.
On Thu, Dec 16, 2010 at 04:46:33AM +0900, Yui NARUSE wrote:
[#33763] [Ruby 1.9-Bug#4168][Open] WeakRef is unsafe to use in Ruby 1.9 — Brian Durand <redmine@...>
Bug #4168: WeakRef is unsafe to use in Ruby 1.9
Issue #4168 has been updated by Kurt Stephens.
[#33779] [Ruby 1.9-Bug#4174][Open] 1F1E on rdoc tests — Kouhei Yanagita <redmine@...>
Bug #4174: 1F1E on rdoc tests
[#33801] [Ruby 1.9-Feature#4183][Open] [ext/openssl] Timestamp support — Martin Bosslet <redmine@...>
Feature #4183: [ext/openssl] Timestamp support
On Wed, Dec 22, 2010 at 03:19:12AM +0900, Martin Bosslet wrote:
[#33815] trunk warnflags build issue with curb 0.7.9? — Jon <jon.forums@...>
As this may turn out to be a 3rd party issue rather than a bug, I'd like some feedback.
Hi,
[#33818] [Ruby 1.9-Bug#4188][Open] minitest warnings in 1.9.3 — Aaron Patterson <redmine@...>
Bug #4188: minitest warnings in 1.9.3
[#33825] PATCH: REE fast-thread.patch: stack_free() not called in rb_thread_die(). — Kurt Stephens <ks@...>
http://code.google.com/p/rubyenterpriseedition/issues/detail?id=57
Similar technique might be relevant in MRI 1.9 if fiber/continuation
> Similar technique might be relevant in MRI 1.9 if fiber/continuation stacks
[#33833] Ruby 1.9.2 is going to be released — "Yuki Sonoda (Yugui)" <yugui@...>
-----BEGIN PGP SIGNED MESSAGE-----
On Thu, Dec 23, 2010 at 9:47 AM, Yuki Sonoda (Yugui) <yugui@yugui.jp> wrote:
On Thu, Dec 23, 2010 at 9:47 AM, Yuki Sonoda (Yugui) <yugui@yugui.jp> wrote:
[#33845] Getting involved in Ruby — Benoit Daloze <eregontp@...>
Hi dear Ruby core team !
[#33846] [Ruby 1.9-Feature#4197][Open] Improvement of the benchmark library — Benoit Daloze <redmine@...>
Feature #4197: Improvement of the benchmark library
Issue #4197 has been updated by Yui NARUSE.
[#33852] [Ruby 1.9-Bug#4199][Open] make test ruby-1.9.2-p0 failed on Solaris10 x86 — Dmitry Perfilyev <redmine@...>
Bug #4199: make test ruby-1.9.2-p0 failed on Solaris10 x86
[#33864] [Backport92-Backport#4200][Open] minitest 2.0.2 on trunk — Ryan Davis <redmine@...>
Backport #4200: minitest 2.0.2 on trunk
Issue #4200 has been updated by Ryan Davis.
[#33880] As platform mantainer - what are my boundaries? — Luis Lavena <luislavena@...>
Hello,
Hello,
On Sun, Dec 26, 2010 at 9:50 PM, U.Nakamura <usa@garbagecollect.jp> wrote:
On Mon, Dec 27, 2010 at 11:05 AM, Luis Lavena <luislavena@gmail.com> wrote:
Luis,
On Wed, Dec 29, 2010 at 1:31 AM, Yugui <yugui@yugui.jp> wrote:
[#33910] [Ruby 1.9-Feature#4211][Open] Converting the Ruby and C API documentation to YARD syntax — Loren Segal <redmine@...>
Feature #4211: Converting the Ruby and C API documentation to YARD syntax
On Dec 26, 2010, at 13:00, Loren Segal wrote:
Issue #4211 has been updated by Yui NARUSE.
On Mon, Dec 27, 2010 at 12:01:00PM +0900, Yui NARUSE wrote:
[#33923] [Ruby 1.9-Bug#4214][Open] Fiddle::WINDOWS == false on Windows — Jon Forums <redmine@...>
Bug #4214: Fiddle::WINDOWS == false on Windows
Issue #4214 has been updated by Luis Lavena.
[#33948] Multi-line comments — Rodrigo Rosenfeld Rosas <rr.rosas@...>
I was always curious about the reasoning Ruby doesn't support
On Mon, Dec 27, 2010 at 8:55 PM, Rodrigo Rosenfeld Rosas <rr.rosas@gmail.com
On 28-12-2010 01:54, Joshua Ballanco wrote:
[#33951] [Ruby 1.9-Bug#4217][Open] irb exits unexpectedly with non-ascii Regexp on Windows — Heesob Park <redmine@...>
Bug #4217: irb exits unexpectedly with non-ascii Regexp on Windows
Issue #4217 has been updated by Heesob Park.
[#33953] my redmine login is not working and wanted to submit a bug — deepak kannan <kannan.deepak@...>
hi,
[#34011] [Backport92-Backport#4228][Open] Backward gemspec compatibility change in r29663 broke rake gems — Luis Lavena <redmine@...>
Backport #4228: Backward gemspec compatibility change in r29663 broke rake gems
[#34023] ruby -h doesn't include --disable-gems — Ryan Davis <ryand-ruby@...>
Is there a reason why ruby -h doesn't show --disable-gems ?
2011/1/4 Ryan Davis <ryand-ruby@zenspider.com>:
On Tue, Jan 4, 2011 at 12:14 AM, KOSAKI Motohiro
[ruby-core:33567] Re: [Ruby 1.9-Feature#4085][Open] Refinements and nested methods
Hi, 2010/12/3 Yusuke ENDOH <mame@tsg.ne.jp>: >>> ... Oops! his does not work as excepted. had believed that this >>> would work... hy don't you allow this? >> >> Currently refine doesn't work without blocks, but do you mean that? > > Ah sorry. > > odule FooExt > efine(Fixnum) do > ef /(other); quo(other); end > nd > nd > odule BarExt > nclude FooExt # or using FooExt > nd > sing BarExt > 1 / 2 #=> actual: 0, expected: (1/2) I forgot to support it. Please apply the attached patch. I have also added Kernel#refine. >> I think it's hard to add new keywords by a gem. ave you abandoned >> keywords? prefer to the keyword refine to the method refine without >> blocks suggested by you. > > I first said in [ruby-core:33375]: > >> However, we should discuss this topic (new keyword) towards >> 2.0. odule's methods are not bad, as a part of reflection >> features (such as Module#define_method for `def' keyword). > > Needless to say, we must not add any new keywords to 1.9.x, especially > normal simple word like "refine." 'm ok to include this feature in > 1.9.x, and now I believe that gem is a good idea as the first step. > > However, I received many negative comments to this approach (gem), > from nars*, kosak*, ko*, nakad*, shyouhe*. hey seem to think that > it is better to import your patch "as is". I also wouldn't like to see such a language core feature in a gem. >> Isn't it enough to introduce refinements as an experimental feature, >> at least in trunk? > > I don't like to include a feature called "experimental", not because > it is not complete yet, but because it becomes "de facto standard." > It would be good if there are not only "document" but also "mechanism" > to inform users that the feature is experimental, such as warning or > a new method like "RubyVM.enable_experimental_features". As far as I know, the current status of trunk is unstable, and if new features break backward compatibility, Yugui will create the branch ruby_1_9, won't you, Yugui? So, we don't need the above mechanism until new experimental features are decided to include to 1.9.x. > Note that this is just my opinion, and that I seem to be in the > minority ;-) > I hope that 1.9.x would be stable, but many other committers seem to > hope to include new feature in 1.9.x aggressively. I also hope that 1.9.x would be stable, but I'd like to develop aggressively in trunk. I don't think the current design and implementation of refinements are mature, but I can't make them mature on my own, so I'd like to have help from other committers. -- Shugo Maeda
Attachments (1)
diff --git a/eval.c b/eval.c
index 6d5af7b..bcef1d9 100644
--- a/eval.c
+++ b/eval.c
@@ -898,8 +898,19 @@ rb_overlay_module(NODE *cref, VALUE klass, VALUE module)
rb_clear_cache_by_class(klass);
}
+void rb_using_module(NODE *cref, VALUE module);
+
+static int
+using_module_i(VALUE module, VALUE value, VALUE arg)
+{
+ NODE *cref = (NODE *) arg;
+
+ rb_using_module(cref, module);
+ return ST_CONTINUE;
+}
+
static int
-using_module_i(VALUE klass, VALUE module, VALUE arg)
+overlay_module_i(VALUE klass, VALUE module, VALUE arg)
{
NODE *cref = (NODE *) arg;
int i;
@@ -911,14 +922,18 @@ using_module_i(VALUE klass, VALUE module, VALUE arg)
void
rb_using_module(NODE *cref, VALUE module)
{
- ID id_overlayed_modules;
- VALUE overlayed_modules;
+ ID id_overlayed_modules, id_using_modules;
+ VALUE overlayed_modules, using_modules;
- Check_Type(module, T_MODULE);
+ CONST_ID(id_using_modules, "__using_modules__");
+ using_modules = rb_attr_get(module, id_using_modules);
+ if (!NIL_P(using_modules)) {
+ rb_hash_foreach(using_modules, using_module_i, (VALUE) cref);
+ }
CONST_ID(id_overlayed_modules, "__overlayed_modules__");
overlayed_modules = rb_attr_get(module, id_overlayed_modules);
if (NIL_P(overlayed_modules)) return;
- rb_hash_foreach(overlayed_modules, using_module_i, (VALUE) cref);
+ rb_hash_foreach(overlayed_modules, overlay_module_i, (VALUE) cref);
}
/*
@@ -935,6 +950,7 @@ rb_mod_using(VALUE self, VALUE module)
ID id_using_modules;
VALUE using_modules;
+ Check_Type(module, T_MODULE);
CONST_ID(id_using_modules, "__using_modules__");
using_modules = rb_attr_get(self, id_using_modules);
if (NIL_P(using_modules)) {
@@ -994,6 +1010,21 @@ refinement_module_include(int argc, VALUE *argv, VALUE module)
return result;
}
+static VALUE
+refinement_module_new(VALUE klass)
+{
+ ID id_refined_class;
+ VALUE mod = rb_module_new();
+
+ CONST_ID(id_refined_class, "__refined_class__");
+ rb_ivar_set(mod, id_refined_class, klass);
+ rb_define_singleton_method(mod, "method_added",
+ refinement_module_method_added, 1);
+ rb_define_singleton_method(mod, "include",
+ refinement_module_include, -1);
+ return mod;
+}
+
/*
* call-seq:
* refine(klass) { block } -> self
@@ -1006,7 +1037,7 @@ rb_mod_refine(VALUE module, VALUE klass)
{
NODE *cref = rb_vm_cref();
VALUE mod;
- ID id_overlayed_modules, id_refined_class;
+ ID id_overlayed_modules;
VALUE overlayed_modules, modules;
Check_Type(klass, T_CLASS);
@@ -1019,13 +1050,7 @@ rb_mod_refine(VALUE module, VALUE klass)
}
mod = rb_hash_aref(overlayed_modules, klass);
if (NIL_P(mod)) {
- mod = rb_module_new();
- CONST_ID(id_refined_class, "__refined_class__");
- rb_ivar_set(mod, id_refined_class, klass);
- rb_define_singleton_method(mod, "method_added",
- refinement_module_method_added, 1);
- rb_define_singleton_method(mod, "include",
- refinement_module_include, -1);
+ mod = refinement_module_new(klass);
rb_overlay_module(cref, klass, mod);
rb_hash_aset(overlayed_modules, klass, mod);
}
@@ -1033,6 +1058,26 @@ rb_mod_refine(VALUE module, VALUE klass)
return mod;
}
+/*
+ * call-seq:
+ * refine(klass) { block } -> self
+ *
+ * Refine <i>klass</i> in the scope where the method is called.
+ */
+
+static VALUE
+f_refine(VALUE self, VALUE klass)
+{
+ NODE *cref = rb_vm_cref();
+ VALUE mod;
+
+ Check_Type(klass, T_CLASS);
+ mod = refinement_module_new(klass);
+ rb_overlay_module(cref, klass, mod);
+ rb_mod_module_eval(0, NULL, mod);
+ return mod;
+}
+
void
rb_obj_call_init(VALUE obj, int argc, VALUE *argv)
{
@@ -1157,6 +1202,7 @@ f_using(VALUE self, VALUE module)
{
NODE *cref = rb_vm_cref();
+ Check_Type(module, T_MODULE);
rb_using_module(cref, module);
return self;
}
@@ -1331,6 +1377,7 @@ Init_eval(void)
rb_define_singleton_method(rb_vm_top_self(), "include", top_include, -1);
rb_define_global_function("using", f_using, 1);
+ rb_define_global_function("refine", f_refine, 1);
rb_define_method(rb_mKernel, "extend", rb_obj_extend, -1);
diff --git a/test/ruby/test_refinement.rb b/test/ruby/test_refinement.rb
index 05a4f33..ed01c77 100644
--- a/test/ruby/test_refinement.rb
+++ b/test/ruby/test_refinement.rb
@@ -86,6 +86,18 @@ class TestRefinement < Test::Unit::TestCase
end
end
+ module FooExt3
+ using FooExt
+ end
+
+ class FooExtClient3
+ using FooExt3
+
+ def self.invoke_x_on(foo)
+ return foo.x
+ end
+ end
+
def test_override
foo = Foo.new
assert_equal("Foo#x", foo.x)
@@ -150,6 +162,13 @@ class TestRefinement < Test::Unit::TestCase
assert_raise(NoMethodError) { sub.z }
end
+ def test_indirect_using
+ foo = Foo.new
+ assert_equal("Foo#x", foo.x)
+ assert_equal("FooExt#x", FooExtClient3.invoke_x_on(foo))
+ assert_equal("Foo#x", foo.x)
+ end
+
def test_module_eval
foo = Foo.new
assert_equal("Foo#x", foo.x)
@@ -307,5 +326,33 @@ class TestRefinement < Test::Unit::TestCase
assert_equal("m2#bar", m.call_bar("abc"))
assert_equal("m3#baz", m.call_baz("abc"))
end
+
+ def test_refine_at_toplevel
+ assert_equal(0, 1 / 2)
+ result = eval(<<-EOF, TOPLEVEL_BINDING)
+ refine Fixnum do
+ def /(other) quo(other) end
+ end
+
+ 1 / 2
+ EOF
+ assert_equal(Rational(1, 2), result)
+ assert_equal(0, 1 / 2)
+ end
+
+ def refine_in_method
+ refine Fixnum do
+ def /(other) quo(other) end
+ end
+
+ return 1 / 2
+ end
+ private :refine_in_method
+
+ def test_refine_in_method
+ assert_equal(0, 1 / 2)
+ assert_equal(Rational(1, 2), refine_in_method)
+ assert_equal(0, 1 / 2)
+ end
end
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index 6bb6f5b..4a4156a 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -1763,10 +1763,9 @@ rb_vm_using_modules(NODE *cref, VALUE klass)
ID id_using_modules;
VALUE using_modules;
- CONST_ID(id_using_modules, "__using_modules__");
- using_modules = rb_attr_get(klass, id_using_modules);
- switch (TYPE(klass)) {
- case T_CLASS:
+ if (TYPE(klass) == T_CLASS) {
+ CONST_ID(id_using_modules, "__using_modules__");
+ using_modules = rb_attr_get(klass, id_using_modules);
if (NIL_P(using_modules)) {
VALUE super = rb_class_real(RCLASS_SUPER(klass));
using_modules = rb_attr_get(super, id_using_modules);
@@ -1775,14 +1774,7 @@ rb_vm_using_modules(NODE *cref, VALUE klass)
rb_ivar_set(klass, id_using_modules, using_modules);
}
}
- break;
- case T_MODULE:
- rb_using_module(cref, klass);
- break;
- }
- if (!NIL_P(using_modules)) {
- rb_hash_foreach(using_modules, vm_using_module_i,
- (VALUE) cref);
}
+ rb_using_module(cref, klass);
}