mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	Revert GH-808
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@49181 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									a8565ad220
								
							
						
					
					
						commit
						759a31b4a3
					
				
					 3 changed files with 12 additions and 25 deletions
				
			
		| 
						 | 
				
			
			@ -56,12 +56,6 @@ Mon Jan  5 14:58:01 2015  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>
 | 
			
		|||
	* test/ruby/test_io.rb: added timeout for AIX environment.
 | 
			
		||||
	  [ruby-core:62983][Bug #9917]
 | 
			
		||||
 | 
			
		||||
Mon Jan  5 10:57:24 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 | 
			
		||||
 | 
			
		||||
	* lib/ostruct.rb (modifiable?, new_ostruct_member!, table!):
 | 
			
		||||
	  append suffixes to protected methods so that they will not clash
 | 
			
		||||
	  with assigned members.  [Fix GH-806]
 | 
			
		||||
 | 
			
		||||
Sun Jan  4 22:33:33 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 | 
			
		||||
 | 
			
		||||
	* test/lib/test/unit.rb (ExcludesOption): add "excludes" support
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -90,7 +90,7 @@ class OpenStruct
 | 
			
		|||
      hash.each_pair do |k, v|
 | 
			
		||||
        k = k.to_sym
 | 
			
		||||
        @table[k] = v
 | 
			
		||||
        new_ostruct_member!(k)
 | 
			
		||||
        new_ostruct_member(k)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			@ -99,7 +99,7 @@ class OpenStruct
 | 
			
		|||
  def initialize_copy(orig)
 | 
			
		||||
    super
 | 
			
		||||
    @table = @table.dup
 | 
			
		||||
    @table.each_key{|key| new_ostruct_member!(key)}
 | 
			
		||||
    @table.each_key{|key| new_ostruct_member(key)}
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  #
 | 
			
		||||
| 
						 | 
				
			
			@ -141,14 +141,14 @@ class OpenStruct
 | 
			
		|||
  #
 | 
			
		||||
  def marshal_load(x)
 | 
			
		||||
    @table = x
 | 
			
		||||
    @table.each_key{|key| new_ostruct_member!(key)}
 | 
			
		||||
    @table.each_key{|key| new_ostruct_member(key)}
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  #
 | 
			
		||||
  # Used internally to check if the OpenStruct is able to be
 | 
			
		||||
  # modified before granting access to the internal Hash table to be modified.
 | 
			
		||||
  #
 | 
			
		||||
  def modifiable?
 | 
			
		||||
  def modifiable
 | 
			
		||||
    begin
 | 
			
		||||
      @modifiable = true
 | 
			
		||||
    rescue
 | 
			
		||||
| 
						 | 
				
			
			@ -156,22 +156,22 @@ class OpenStruct
 | 
			
		|||
    end
 | 
			
		||||
    @table
 | 
			
		||||
  end
 | 
			
		||||
  protected :modifiable?
 | 
			
		||||
  protected :modifiable
 | 
			
		||||
 | 
			
		||||
  #
 | 
			
		||||
  # Used internally to defined properties on the
 | 
			
		||||
  # OpenStruct. It does this by using the metaprogramming function
 | 
			
		||||
  # define_singleton_method for both the getter method and the setter method.
 | 
			
		||||
  #
 | 
			
		||||
  def new_ostruct_member!(name)
 | 
			
		||||
  def new_ostruct_member(name)
 | 
			
		||||
    name = name.to_sym
 | 
			
		||||
    unless respond_to?(name)
 | 
			
		||||
      define_singleton_method(name) { @table[name] }
 | 
			
		||||
      define_singleton_method("#{name}=") { |x| modifiable?[name] = x }
 | 
			
		||||
      define_singleton_method("#{name}=") { |x| modifiable[name] = x }
 | 
			
		||||
    end
 | 
			
		||||
    name
 | 
			
		||||
  end
 | 
			
		||||
  protected :new_ostruct_member!
 | 
			
		||||
  protected :new_ostruct_member
 | 
			
		||||
 | 
			
		||||
  def method_missing(mid, *args) # :nodoc:
 | 
			
		||||
    mname = mid.id2name
 | 
			
		||||
| 
						 | 
				
			
			@ -180,7 +180,7 @@ class OpenStruct
 | 
			
		|||
      if len != 1
 | 
			
		||||
        raise ArgumentError, "wrong number of arguments (#{len} for 1)", caller(1)
 | 
			
		||||
      end
 | 
			
		||||
      modifiable?[new_ostruct_member!(mname)] = args[0]
 | 
			
		||||
      modifiable[new_ostruct_member(mname)] = args[0]
 | 
			
		||||
    elsif len == 0
 | 
			
		||||
      @table[mid]
 | 
			
		||||
    else
 | 
			
		||||
| 
						 | 
				
			
			@ -207,7 +207,7 @@ class OpenStruct
 | 
			
		|||
  #   person.age # => 42
 | 
			
		||||
  #
 | 
			
		||||
  def []=(name, value)
 | 
			
		||||
    modifiable?[new_ostruct_member!(name)] = value
 | 
			
		||||
    modifiable[new_ostruct_member(name)] = value
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  #
 | 
			
		||||
| 
						 | 
				
			
			@ -256,7 +256,6 @@ class OpenStruct
 | 
			
		|||
 | 
			
		||||
  attr_reader :table # :nodoc:
 | 
			
		||||
  protected :table
 | 
			
		||||
  alias table! table
 | 
			
		||||
 | 
			
		||||
  #
 | 
			
		||||
  # Compares this object and +other+ for equality.  An OpenStruct is equal to
 | 
			
		||||
| 
						 | 
				
			
			@ -265,7 +264,7 @@ class OpenStruct
 | 
			
		|||
  #
 | 
			
		||||
  def ==(other)
 | 
			
		||||
    return false unless other.kind_of?(OpenStruct)
 | 
			
		||||
    @table == other.table!
 | 
			
		||||
    @table == other.table
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  #
 | 
			
		||||
| 
						 | 
				
			
			@ -275,7 +274,7 @@ class OpenStruct
 | 
			
		|||
  #
 | 
			
		||||
  def eql?(other)
 | 
			
		||||
    return false unless other.kind_of?(OpenStruct)
 | 
			
		||||
    @table.eql?(other.table!)
 | 
			
		||||
    @table.eql?(other.table)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # Compute a hash-code for this OpenStruct.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -135,10 +135,4 @@ class TC_OpenStruct < Test::Unit::TestCase
 | 
			
		|||
    e = assert_raise(ArgumentError) { os.send :foo=, true, true }
 | 
			
		||||
    assert_match(/#{__callee__}/, e.backtrace[0])
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_modifiable
 | 
			
		||||
    os = OpenStruct.new(modifiable: true)
 | 
			
		||||
    assert_equal true, os.modifiable
 | 
			
		||||
    assert_nothing_raised { os.foo = true }
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue