/* forward typedefs ***********************************************************/
-typedef struct _vftbl vftbl_t;
typedef struct arraydescriptor arraydescriptor;
typedef struct primitivetypeinfo primitivetypeinfo;
#include "vm/class.h"
#include "vm/references.h"
-
-
-/* virtual function table ******************************************************
-
- The vtbl has a bidirectional layout with open ends at both sides.
- interfacetablelength gives the number of entries of the interface
- table at the start of the vftbl. The vftbl pointer points to
- &interfacetable[0]. vftbllength gives the number of entries of
- table at the end of the vftbl.
-
- runtime type check (checkcast):
-
- Different methods are used for runtime type check depending on the
- argument of checkcast/instanceof.
-
- A check against a class is implemented via relative numbering on
- the class hierachy tree. The tree is numbered in a depth first
- traversal setting the base field and the diff field. The diff field
- gets the result of (high - base) so that a range check can be
- implemented by an unsigned compare. A sub type test is done by
- checking the inclusion of base of the sub class in the range of the
- superclass.
-
- A check against an interface is implemented via the
- interfacevftbl. If the interfacevftbl contains a nonnull value a
- class is a subclass of this interface.
-
- interfacetable:
-
- Like standard virtual methods interface methods are called using
- virtual function tables. All interfaces are numbered sequentially
- (starting with zero). For each class there exist an interface table
- of virtual function tables for each implemented interface. The
- length of the interface table is determined by the highest number
- of an implemented interface.
-
- The following example assumes a class which implements interface 0 and 3:
-
- interfacetablelength = 4
-
- | ... | +----------+
- +-----------+ | method 2 |---> method z
- | class | | method 1 |---> method y
- +-----------+ | method 0 |---> method x
- | ivftbl 0 |----------> +----------+
- vftblptr ---> +-----------+
- | ivftbl -1 |--> NULL +----------+
- | ivftbl -2 |--> NULL | method 1 |---> method x
- | ivftbl -3 |-----+ | method 0 |---> method a
- +-----------+ +----> +----------+
-
- +---------------+
- | length 3 = 2 |
- | length 2 = 0 |
- | length 1 = 0 |
- | length 0 = 3 |
- interfacevftbllength ---> +---------------+
-
-*******************************************************************************/
-
-#define DISPLAY_SIZE 4
-
-struct _vftbl {
- methodptr *interfacetable[1]; /* interface table (access via macro) */
- classinfo *clazz; /* class, the vtbl belongs to */
- arraydescriptor *arraydesc; /* for array classes, otherwise NULL */
- s4 vftbllength; /* virtual function table length */
- s4 interfacetablelength; /* interface table length */
- s4 baseval; /* base for runtime type check */
- /* (-index for interfaces) */
- s4 diffval; /* high - base for runtime type check */
-
- s4 subtype_depth;
- s4 subtype_offset;
- struct _vftbl *subtype_display[DISPLAY_SIZE+1]; /* the last one is cache */
- struct _vftbl **subtype_overflow;
-
- s4 *interfacevftbllength; /* length of interface vftbls */
- methodptr table[1]; /* class vftbl */
-};
+#include "vm/vftbl.hpp"
/* arraydescriptor *************************************************************