static internal RClass SingletonClass(object obj, NetRuby ruby) { if (obj is int || obj is long || obj is double || Symbol.IsSymbol(obj)) { throw new eTypeError("can't define singleton"); } if (RBasic.IsSpecialConstType(obj)) { if (obj == null) { if (ruby.cNilClass.IsSingleton == false) { ruby.cNilClass = new RSingletonClass(ruby.cNilClass); return(ruby.cNilClass); } } bool b = (bool)obj; RClass o = (b) ? ruby.cTrueClass : ruby.cFalseClass; if (o.IsSingleton == false) { if (b) { o = ruby.cTrueClass = new RSingletonClass(o); } else { o = ruby.cFalseClass = new RSingletonClass(o); } } return(o); } if (obj is RBasic == false) { ruby.bug("Unknown object " + obj.ToString()); } RBasic bas = (RBasic)obj; RClass klass = null; if (bas is RSingletonClass) { klass = (RClass)bas.klass; } else { klass = new RSingletonClass(bas.klass); bas.klass = klass; klass.AttachSingleton((RObjectBase)obj); } if (bas.Test(FL.TAINT)) { klass.Set(FL.TAINT); } else { klass.Unset(FL.TAINT); } if (bas.Test(FL.FREEZE)) { klass.Set(FL.FREEZE); } return(klass); }