mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	class.c: freeze meta class only
* class.c (singleton_class_of): should not propagete freezing to meta meta class. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47574 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									05b374b824
								
							
						
					
					
						commit
						4df147d6e8
					
				
					 3 changed files with 7 additions and 3 deletions
				
			
		
							
								
								
									
										2
									
								
								class.c
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								class.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1575,7 +1575,7 @@ singleton_class_of(VALUE obj)
 | 
			
		|||
    else {
 | 
			
		||||
	FL_UNSET(klass, FL_TAINT);
 | 
			
		||||
    }
 | 
			
		||||
    if (OBJ_FROZEN(obj)) OBJ_FREEZE(klass);
 | 
			
		||||
    if (OBJ_FROZEN(obj)) OBJ_FREEZE_RAW(klass);
 | 
			
		||||
 | 
			
		||||
    return klass;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1105,6 +1105,7 @@ struct RStruct {
 | 
			
		|||
    RBASIC(x)->flags |= RBASIC(s)->flags & FL_TAINT : 0)
 | 
			
		||||
 | 
			
		||||
#define OBJ_FROZEN(x) (FL_ABLE(x) ? !!(RBASIC(x)->flags&FL_FREEZE) : 1)
 | 
			
		||||
#define OBJ_FREEZE_RAW(x) (RBASIC(x)->flags |= FL_FREEZE)
 | 
			
		||||
#define OBJ_FREEZE(x) rb_obj_freeze_inline((VALUE)x)
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
| 
						 | 
				
			
			@ -1112,9 +1113,9 @@ rb_obj_freeze_inline(VALUE x)
 | 
			
		|||
{
 | 
			
		||||
    if (FL_ABLE(x)) {
 | 
			
		||||
	VALUE klass = RBASIC_CLASS(x);
 | 
			
		||||
	RBASIC(x)->flags |= FL_FREEZE;
 | 
			
		||||
	OBJ_FREEZE_RAW(x);
 | 
			
		||||
	if (FL_TEST(klass, (FL_SINGLETON|FL_FREEZE)) == FL_SINGLETON) {
 | 
			
		||||
	    RBASIC(klass)->flags |= FL_FREEZE;
 | 
			
		||||
	    OBJ_FREEZE_RAW(klass);
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -392,6 +392,9 @@ class TestClass < Test::Unit::TestCase
 | 
			
		|||
    assert_raise_with_message(RuntimeError, /frozen object/) {
 | 
			
		||||
      c.class_eval {def f; end}
 | 
			
		||||
    }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_singleton_class_message
 | 
			
		||||
    c = Class.new.freeze
 | 
			
		||||
    assert_raise_with_message(RuntimeError, /frozen Class/) {
 | 
			
		||||
      def c.f; end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue