The object system is implemented in the vcl/object.c and
vcl/object.h files. Every interface is identified with an integer,
which is also an index to the vcl_ifaces
growing array of interface
descriptors (struct vcl_iface_dsc
). Every virtual method
(generic, not an actual implementation) is identified with an integer from one
to (method_counter
- 1). Methods of one interface are assigned
consecutive integer values (items first_fn
and fn_count
in struct vcl_iface_dsc
).
A class is identified with
vcl_vtable
, which is an array (of length
method_counter
), in the zero slot there is a pointer struct
vcl_class_dsc
, in the next slots there are pointers to implementations of
virtual functions. The check whether a given class supports a given interface
is implemented by a check whether the appropriate slot for first_fn
of that interface is non-empty. All interfaces must be defined before
the first class definition, because otherwise different classes would have
different sizes of vtables
and a check whether a new interface is
supported by the old class could cause invalid memory access.