*** evil.rb.orig 2008-04-13 12:23:30.000000000 +0900 --- evil.rb 2008-04-12 19:43:42.000000000 +0900 *************** module RubyInternal *** 109,119 **** "st_table *iv_tbl" ]) ! RClass = struct(Basic + [ ! "st_table *iv_tbl", ! "st_table *m_tbl", ! "VALUE super" ! ]) RModule = RClass --- 109,138 ---- "st_table *iv_tbl" ]) ! if Is_1_8 ! RClass = struct(Basic + [ ! "st_table *iv_tbl", ! "st_table *m_tbl", ! "VALUE super" ! ]) ! else ! RClass = struct(Basic + [ ! "rb_class_ext_t *ext", ! "st_table *m_tbl", ! "st_tble *iv_index_tbl" ! ]) ! RClass::Extension = struct([ ! "VALUE super", ! "st_table *iv_tbl" ! ]) ! class RClass ! # for compatibility ! def iv_tbl; Extension.new(self.ext).iv_tbl end ! def iv_tbl=(value); Extension.new(self.ext).iv_tbl = value end ! def super; Extension.new(self.ext).super end ! def super=(value); Extension.new(self.ext).super= value end ! end ! end RModule = RClass *************** class Proc *** 689,691 **** --- 708,748 ---- end alias :context= :self= end + + class Object + def actual_class + if direct_value? + self.class + else + RubyInternal::RBasic.new(self.internal_ptr).klass.ptr2ref + end + end + def classification + result = [] + obj = self + until result.include?(obj) or obj.nil? + result << obj + obj = obj.actual_class + end + result << obj + end + end + class Module + def actual_superclass + RubyInternal::RModule.new(self.internal_ptr).super.ptr2ref + end + def actual_ancestors + result = [] + obj = self + until result.include?(obj) or obj.nil? + result << obj + obj = obj.actual_superclass rescue nil + end + result << obj + end + end + class Fixnum + def ptr2ref + ObjectSpace._id2ref(self >> 1) + end + end