rubyx/lib/parfait/object.rb
Torsten Ruger 4e3640e432 shift code from class to module
as class derives from module, module carries
much of the code that one thinks of as class
class only handles allocation really
2015-05-18 12:35:01 +03:00

88 lines
3.1 KiB
Ruby

# to be precise, this should be an ObjectReference, as the Reference is a Value
# but we don't want to make that distinction all the time , so we don't.
# that does lead to the fact that we have Reference functions on the Object though
# Objects are arranged or layed out (in memory) according to their Layout
# every object has a Layout. Layout objects are immutalbe and may be resued for a group/class
# off objects.
# The Layout of an object may change, but then a new Layout is created
# The Layout also defines the class of the object
# The Layout is **always** the first entry (index 1) in an object, but the type word is index 0
module Parfait
class Object < Value
TYPE_WORD = 0
LAYOUT_INDEX = 1
CLASS_INDEX = 2 #only used in class, but keep constants together
def self.new_object *args
object = self.new(*args)
object
end
def get_type_of( index )
type_word = internal_object_get( TYPE_WORD )
res = type_word >> (index*4)
# least significant nibble, this is still adhoc, not tested. but the idea is there
res & 0xF
end
# This is the crux of the object system. The class of an object is stored in the objects
# memory (as opposed to an integer that has no memory and so always has the same class)
#
# In Salama we store the class in the Layout, and so the Layout is the only fixed
# data that every object carries.
def get_class()
l = get_layout()
puts "Layout #{l.class} in #{self.class}"
l.get_object_class()
end
def get_layout()
puts "ME #{self.class}"
return internal_object_get(LAYOUT_INDEX)
end
# class stores the "latest" layout for instances, ie the layout a new object will
# be created with.
# inside parfait (and for now everywhere) these are constant.
@@EMPTY = { :names => [] , :types => []}
def self.class_layout()
@@EMPTY
end
def instance_variables
get_layout().instance_variables
end
def instance_variable_get name
index = instance_variable_defined(name)
return nil if index == nil
return internal_get(index)
end
def instance_variable_set name , value
index = instance_variable_defined(name)
return nil if index == nil
return internal_set(index , value)
end
def instance_variable_defined name
layout().index_of(name)
end
# Object
# :nil?, :===, :=~, :!~, :eql?, :hash, :<=>, :class, :singleton_class, :clone, :dup, :taint, :tainted?, :untaint,
# :untrust, :untrusted?, :trust, :freeze, :frozen?, :to_s, :inspect, :methods, :singleton_methods, :protected_methods,
# :private_methods, :public_methods, :instance_variables, :instance_variable_get, :instance_variable_set, :instance_variable_defined?,
# :remove_instance_variable, :instance_of?, :kind_of?, :is_a?, :tap, :send, :public_send, :respond_to?,
# :extend, :display, :method, :public_method, :singleton_method, :define_singleton_method,
# :object_id, :to_enum, :enum_for
#
# BasicObject
# :==, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__, :__id__
end
end