mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	Ensure the shortcut cached in the class
As well as the other places using RCLASS_IV_INDEX_TBL. `IO#reopen` seems the only case that the class of an object can be changed.
This commit is contained in:
		
							parent
							
								
									27f7b047e0
								
							
						
					
					
						commit
						b52a501ca7
					
				
					 2 changed files with 13 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -2489,6 +2489,17 @@ class TestIO < Test::Unit::TestCase
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_reopen_ivar
 | 
			
		||||
    assert_ruby_status([], "#{<<~"begin;"}\n#{<<~'end;'}")
 | 
			
		||||
    begin;
 | 
			
		||||
      f = File.open(IO::NULL)
 | 
			
		||||
      f.instance_variable_set(:@foo, 42)
 | 
			
		||||
      f.reopen(STDIN)
 | 
			
		||||
      f.instance_variable_defined?(:@foo)
 | 
			
		||||
      f.instance_variable_get(:@foo)
 | 
			
		||||
    end;
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_foreach
 | 
			
		||||
    a = []
 | 
			
		||||
    IO.foreach("|" + EnvUtil.rubybin + " -e 'puts :foo; puts :bar; puts :baz'") {|x| a << x }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -885,7 +885,7 @@ generic_ivar_delete(VALUE obj, ID id, VALUE undef)
 | 
			
		|||
	st_table *iv_index_tbl = RCLASS_IV_INDEX_TBL(rb_obj_class(obj));
 | 
			
		||||
	st_data_t index;
 | 
			
		||||
 | 
			
		||||
	if (st_lookup(iv_index_tbl, (st_data_t)id, &index)) {
 | 
			
		||||
	if (iv_index_tbl && st_lookup(iv_index_tbl, (st_data_t)id, &index)) {
 | 
			
		||||
	    if (index < ivtbl->numiv) {
 | 
			
		||||
		VALUE ret = ivtbl->ivptr[index];
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -906,7 +906,7 @@ generic_ivar_get(VALUE obj, ID id, VALUE undef)
 | 
			
		|||
	st_table *iv_index_tbl = RCLASS_IV_INDEX_TBL(rb_obj_class(obj));
 | 
			
		||||
	st_data_t index;
 | 
			
		||||
 | 
			
		||||
	if (st_lookup(iv_index_tbl, (st_data_t)id, &index)) {
 | 
			
		||||
	if (iv_index_tbl && st_lookup(iv_index_tbl, (st_data_t)id, &index)) {
 | 
			
		||||
	    if (index < ivtbl->numiv) {
 | 
			
		||||
		VALUE ret = ivtbl->ivptr[index];
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue