mproperty
of an instance recv
and return its value.If the attribute in not yet initialized, then aborts with an error message.
# Read the attribute `mproperty` of an instance `recv` and return its value.
# If the attribute in not yet initialized, then aborts with an error message.
fun read_attribute(mproperty: MAttribute, recv: Instance): Instance
do
assert recv isa MutableInstance
if not recv.attributes.has_key(mproperty) then
fatal("Uninitialized attribute {mproperty.name}")
abort
end
return recv.attributes[mproperty]
end
src/interpreter/naive_interpreter.nit:634,2--644,4
# Return the value of the attribute `mproperty` for the object `recv`
redef fun read_attribute(mproperty: MAttribute, recv: Instance): Instance
do
assert recv isa MutableInstance
var i: Instance
var position = recv.mtype.as(MClassType).mclass.get_position_attributes(mproperty.intro_mclassdef.mclass)
if position > 0 then
# if this attribute class has an unique position for this receiver, then use direct access
i = read_attribute_sst(recv.internal_attributes, position + mproperty.offset)
else
# Otherwise, read the attribute value with perfect hashing
var id = mproperty.intro_mclassdef.mclass.vtable.id
i = read_attribute_ph(recv.internal_attributes, recv.vtable.internal_vtable,
recv.vtable.mask, id, mproperty.offset)
end
# If we get a `MInit` value, throw an error
if i == initialization_value then
fatal("Uninitialized attribute {mproperty.name}")
abort
end
return i
end
src/vm/virtual_machine.nit:286,2--311,4