Feature #6198 ยป 0000-attr-with-visibility.patch
| ruby-1.9.3-p125-mod/object.c 2012-03-24 20:32:05.000000000 +0900 | ||
|---|---|---|
| 
     /* 
   | 
||
| 
      *  call-seq: 
   | 
||
| 
      *     attr_reader(symbol, ...)    -> nil 
   | 
||
| 
      *     attr(symbol, ...)             -> nil 
   | 
||
| 
      *     attr_reader(symbol, ...)    -> [method-symbol, ...] 
   | 
||
| 
      *     attr(symbol, ...)             -> [method-symbol, ...] 
   | 
||
| 
      * 
   | 
||
| 
      *  Creates instance variables and corresponding methods that return the 
   | 
||
| 
      *  value of each instance variable. Equivalent to calling 
   | 
||
| ... | ... | |
| 
     rb_mod_attr_reader(int argc, VALUE *argv, VALUE klass) 
   | 
||
| 
     { 
   | 
||
| 
         int i; 
   | 
||
| 
         VALUE result = rb_ary_new(); 
   | 
||
| 
         for (i=0; i<argc; i++) { 
   | 
||
| 
     	rb_attr(klass, rb_to_id(argv[i]), TRUE, FALSE, TRUE); 
   | 
||
| 
     	rb_ary_push(result, ID2SYM(rb_to_id(argv[i]))); 
   | 
||
| 
         } 
   | 
||
| 
         return Qnil; 
   | 
||
| 
         return result; 
   | 
||
| 
     } 
   | 
||
| 
     VALUE 
   | 
||
| ... | ... | |
| 
     /* 
   | 
||
| 
      *  call-seq: 
   | 
||
| 
      *      attr_writer(symbol, ...)    -> nil 
   | 
||
| 
      *      attr_writer(symbol, ...)    -> [method-symbol, ...] 
   | 
||
| 
      * 
   | 
||
| 
      *  Creates an accessor method to allow assignment to the attribute 
   | 
||
| 
      *  <i>aSymbol</i><code>.id2name</code>. 
   | 
||
| 
      *  returns accessor method names like [:x=, :y=, ...] 
   | 
||
| 
      */ 
   | 
||
| 
     static VALUE 
   | 
||
| 
     rb_mod_attr_writer(int argc, VALUE *argv, VALUE klass) 
   | 
||
| 
     { 
   | 
||
| 
         int i; 
   | 
||
| 
         VALUE result = rb_ary_new(); 
   | 
||
| 
         for (i=0; i<argc; i++) { 
   | 
||
| 
     	rb_attr(klass, rb_to_id(argv[i]), FALSE, TRUE, TRUE); 
   | 
||
| 
     	rb_ary_push(result, ID2SYM(rb_id_attrset(rb_to_id(argv[i])))); 
   | 
||
| 
         } 
   | 
||
| 
         return Qnil; 
   | 
||
| 
         return result; 
   | 
||
| 
     } 
   | 
||
| 
     /* 
   | 
||
| 
      *  call-seq: 
   | 
||
| 
      *     attr_accessor(symbol, ...)    -> nil 
   | 
||
| 
      *     attr_accessor(symbol, ...)    -> [method-symbol, ...] 
   | 
||
| 
      * 
   | 
||
| 
      *  Defines a named attribute for this module, where the name is 
   | 
||
| 
      *  <i>symbol.</i><code>id2name</code>, creating an instance variable 
   | 
||
| 
      *  (<code>@name</code>) and a corresponding access method to read it. 
   | 
||
| 
      *  Also creates a method called <code>name=</code> to set the attribute. 
   | 
||
| 
      *  returns both read/write method names like [:x, :x=, :y, :y=, ...] 
   | 
||
| 
      * 
   | 
||
| 
      *     module Mod 
   | 
||
| 
      *       attr_accessor(:one, :two) 
   | 
||
| ... | ... | |
| 
     rb_mod_attr_accessor(int argc, VALUE *argv, VALUE klass) 
   | 
||
| 
     { 
   | 
||
| 
         int i; 
   | 
||
| 
         VALUE result = rb_ary_new(); 
   | 
||
| 
         for (i=0; i<argc; i++) { 
   | 
||
| 
     	rb_attr(klass, rb_to_id(argv[i]), TRUE, TRUE, TRUE); 
   | 
||
| 
     	rb_ary_push(result, ID2SYM(rb_to_id(argv[i]))); 
   | 
||
| 
     	rb_ary_push(result, ID2SYM(rb_id_attrset(rb_to_id(argv[i])))); 
   | 
||
| 
         } 
   | 
||
| 
         return Qnil; 
   | 
||
| 
     | 
||
| 
         return result; 
   | 
||
| 
     } 
   | 
||
| 
     /* 
   | 
||
| ruby-1.9.3-p125-mod/test/ruby/test_module.rb 2012-03-25 00:52:53.000000000 +0900 | ||
|---|---|---|
| 
         INPUT 
   | 
||
| 
         assert_in_out_err([], src, ["NameError"], []) 
   | 
||
| 
       end 
   | 
||
| 
       def test_attr_return_value 
   | 
||
| 
         c = Class.new 
   | 
||
| 
         c.class_eval do 
   | 
||
| 
           @@r1 = attr_reader :r1 
   | 
||
| 
           @@w1 = attr_writer :w1 
   | 
||
| 
           @@rw1 = attr_accessor :rw1 
   | 
||
| 
           @@r2 = attr_reader :r2_1, :r2_2, :r2_3 
   | 
||
| 
           @@w2 = attr_writer :w2_1, :w2_2, :w2_3 
   | 
||
| 
           @@rw2 = attr_accessor :rw2_1, :rw2_2, :rw2_3 
   | 
||
| 
           def self.get_r1; @@r1; end 
   | 
||
| 
           def self.get_w1; @@w1; end 
   | 
||
| 
           def self.get_rw1; @@rw1; end 
   | 
||
| 
           def self.get_r2; @@r2; end 
   | 
||
| 
           def self.get_w2; @@w2; end 
   | 
||
| 
           def self.get_rw2; @@rw2; end 
   | 
||
| 
         end 
   | 
||
| 
         assert_equal(c.get_r1, [:r1]) 
   | 
||
| 
         assert_equal(c.get_w1, [:w1=]) 
   | 
||
| 
         assert_equal(c.get_rw1.sort, [:rw1,:rw1=].sort) 
   | 
||
| 
         assert_equal(c.get_r2, [:r2_1, :r2_2, :r2_3]) 
   | 
||
| 
         assert_equal(c.get_w2, [:w2_1=, :w2_2=, :w2_3=]) 
   | 
||
| 
         assert_equal(c.get_rw2.sort, [:rw2_1,:rw2_1=, 
   | 
||
| 
                                       :rw2_2,:rw2_2=, 
   | 
||
| 
                                       :rw2_3,:rw2_3=].sort) 
   | 
||
| 
       end 
   | 
||
| 
       def test_visibility_array 
   | 
||
| 
         c = Class.new 
   | 
||
| 
         c.class_eval do 
   | 
||
| 
           def foo; end 
   | 
||
| 
           def pub0; end 
   | 
||
| 
           def pub1; end 
   | 
||
| 
           def pub2; end 
   | 
||
| 
           def pub3; end 
   | 
||
| 
     | 
||
| 
           def pro0; end 
   | 
||
| 
           def pro1; end 
   | 
||
| 
           def pro2; end 
   | 
||
| 
           def pro3; end 
   | 
||
| 
     | 
||
| 
           def pri0; end 
   | 
||
| 
           def pri1; end 
   | 
||
| 
           def pri2; end 
   | 
||
| 
           def pri3; end 
   | 
||
| 
     | 
||
| 
           public :pub0, [:pub1, :pub2], :pub3 
   | 
||
| 
           protected :pro0, [], [:pro1], [:pro2, :pro3] 
   | 
||
| 
           private [:pri0, :pri1, :pri2, :pri3] 
   | 
||
| 
         end 
   | 
||
| 
         pub = [true, false, false] 
   | 
||
| 
         pro = [false, true, false] 
   | 
||
| 
         pri = [false, false, true] 
   | 
||
| 
         check = { 
   | 
||
| 
           :pub0 => pub, :pub1 => pub, :pub2 => pub, :pub3 => pub, 
   | 
||
| 
           :pro0 => pro, :pro1 => pro, :pro2 => pro, :pro3 => pro, 
   | 
||
| 
           :pri0 => pri, :pri1 => pri, :pri2 => pri, :pri3 => pri, 
   | 
||
| 
         } 
   | 
||
| 
         check.each do |symbol, (ispub, ispro, ispri)| 
   | 
||
| 
           assert_equal(ispub, c.public_method_defined?(symbol)) 
   | 
||
| 
           assert_equal(ispro, c.protected_method_defined?(symbol)) 
   | 
||
| 
           assert_equal(ispri, c.private_method_defined?(symbol)) 
   | 
||
| 
         end 
   | 
||
| 
       end 
   | 
||
| 
       def test_attr_visibility 
   | 
||
| 
         c = Class.new 
   | 
||
| 
         c.class_eval do 
   | 
||
| 
           public attr_reader :pub_r1 
   | 
||
| 
           protected attr_reader :pro_r1, :pro_r2 
   | 
||
| 
           private attr_reader :pri_r1 
   | 
||
| 
     | 
||
| 
           public attr_writer :pub_w1, :pub_w2 
   | 
||
| 
           protected attr_writer :pro_w1 
   | 
||
| 
           private attr_writer :pri_w1 
   | 
||
| 
           public attr_accessor :pub_a1 
   | 
||
| 
           protected attr_accessor :pro_a1 
   | 
||
| 
           private attr_accessor :pri_a1, :pri_a2 
   | 
||
| 
         end 
   | 
||
| 
         pub = [true, false, false] 
   | 
||
| 
         pro = [false, true, false] 
   | 
||
| 
         pri = [false, false, true] 
   | 
||
| 
         none = [false, false, false] 
   | 
||
| 
         check = { 
   | 
||
| 
           :pub_r1 => pub, :pub_r1= => none, 
   | 
||
| 
           :pro_r1 => pro, :pro_r1= => none, 
   | 
||
| 
           :pro_r2 => pro, :pro_r2= => none, 
   | 
||
| 
           :pri_r1 => pri, :pri_r1= => none, 
   | 
||
| 
           :pub_w1 => none, :pub_w1= => pub, 
   | 
||
| 
           :pub_w2 => none, :pub_w2= => pub, 
   | 
||
| 
           :pro_w1 => none, :pro_w1= => pro, 
   | 
||
| 
           :pri_w1 => none, :pri_w1= => pri, 
   | 
||
| 
           :pub_a1 => pub, :pub_a1= => pub, 
   | 
||
| 
           :pro_a1 => pro, :pro_a1 => pro, 
   | 
||
| 
           :pri_a1 => pri, :pri_a1 => pri, 
   | 
||
| 
           :pri_a2 => pri, :pri_a2 => pri, 
   | 
||
| 
         } 
   | 
||
| 
     | 
||
| 
         check.each do |symbol, (ispub, ispro, ispri)| 
   | 
||
| 
           assert_equal(ispub, c.public_method_defined?(symbol)) 
   | 
||
| 
           assert_equal(ispro, c.protected_method_defined?(symbol)) 
   | 
||
| 
           assert_equal(ispri, c.private_method_defined?(symbol)) 
   | 
||
| 
         end 
   | 
||
| 
       end 
   | 
||
| 
     end 
   | 
||
| ruby-1.9.3-p125-mod/vm_method.c 2012-03-25 01:24:47.000000000 +0900 | ||
|---|---|---|
| 
         } 
   | 
||
| 
     } 
   | 
||
| 
     static int 
   | 
||
| 
     try_set_methods_visibilities(VALUE self, VALUE ary, rb_method_flag_t ex) 
   | 
||
| 
     { 
   | 
||
| 
         int i; 
   | 
||
| 
         VALUE tmp = ary; 
   | 
||
| 
         if(TYPE(ary) != T_ARRAY) { 
   | 
||
| 
     	tmp = rb_check_array_type(tmp); 
   | 
||
| 
     	if(NIL_P(tmp)) { 
   | 
||
| 
     	    return FALSE; 
   | 
||
| 
     	} 
   | 
||
| 
         } 
   | 
||
| 
         for(i=0; i<RARRAY_LEN(ary); ++i) { 
   | 
||
| 
     	rb_export_method(self, rb_to_id(RARRAY_PTR(ary)[i]), ex); 
   | 
||
| 
         } 
   | 
||
| 
     | 
||
| 
         return TRUE; 
   | 
||
| 
     } 
   | 
||
| 
     static void 
   | 
||
| 
     set_method_visibility(VALUE self, int argc, VALUE *argv, rb_method_flag_t ex) 
   | 
||
| 
     { 
   | 
||
| ... | ... | |
| 
         } 
   | 
||
| 
         for (i = 0; i < argc; i++) { 
   | 
||
| 
     	rb_export_method(self, rb_to_id(argv[i]), ex); 
   | 
||
| 
     	if(!try_set_methods_visibilities(self, argv[i], ex)) { 
   | 
||
| 
       	    rb_export_method(self, rb_to_id(argv[i]), ex); 
   | 
||
| 
     	} 
   | 
||
| 
         } 
   | 
||
| 
         rb_clear_cache_by_class(self); 
   | 
||
| 
     } 
   | 
||
| ... | ... | |
| 
      *  call-seq: 
   | 
||
| 
      *     public                 -> self 
   | 
||
| 
      *     public(symbol, ...)    -> self 
   | 
||
| 
      *     public(array, ...)     -> self 
   | 
||
| 
      * 
   | 
||
| 
      *  With no arguments, sets the default visibility for subsequently 
   | 
||
| 
      *  defined methods to public. With arguments, sets the named methods to 
   | 
||
| 
      *  have public visibility. 
   | 
||
| 
      *  have public visibility. Arguments can contain array of symbols. 
   | 
||
| 
      */ 
   | 
||
| 
     static VALUE 
   | 
||
| ... | ... | |
| 
      *  call-seq: 
   | 
||
| 
      *     protected                -> self 
   | 
||
| 
      *     protected(symbol, ...)   -> self 
   | 
||
| 
      *     protected(array, ...)    -> self 
   | 
||
| 
      * 
   | 
||
| 
      *  With no arguments, sets the default visibility for subsequently 
   | 
||
| 
      *  defined methods to protected. With arguments, sets the named methods 
   | 
||
| 
      *  to have protected visibility. 
   | 
||
| 
      *  to have protected visibility. Arguments can contain array of symbols. 
   | 
||
| 
      */ 
   | 
||
| 
     static VALUE 
   | 
||
| ... | ... | |
| 
      *  call-seq: 
   | 
||
| 
      *     private                 -> self 
   | 
||
| 
      *     private(symbol, ...)    -> self 
   | 
||
| 
      *     private(array, ...)     -> self 
   | 
||
| 
      * 
   | 
||
| 
      *  With no arguments, sets the default visibility for subsequently 
   | 
||
| 
      *  defined methods to private. With arguments, sets the named methods 
   | 
||
| 
      *  to have private visibility. 
   | 
||
| 
      *  to have private visibility. Arguments can contain array of symbols. 
   | 
||
| 
      * 
   | 
||
| 
      *     module Mod 
   | 
||
| 
      *       def a()  end 
   | 
||