*** 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
