/* ex: set ro:
** !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
**
** This file is generated automatically from 'src/vtable.tbl' by tools/build/vtable_h.pl
*/

#ifndef PARROT_VTABLE_H_GUARD
#define PARROT_VTABLE_H_GUARD

#include "parrot/parrot.h"

#define VTABLE_SIZE 512

typedef PMC* (*absolute_method_t)(PARROT_INTERP, PMC* pmc, PMC* dest);
typedef PMC* (*add_method_t)(PARROT_INTERP, PMC* pmc, PMC* value, PMC* dest);
typedef void (*add_attribute_method_t)(PARROT_INTERP, PMC* pmc, STRING* name, PMC* type);
typedef PMC* (*add_float_method_t)(PARROT_INTERP, PMC* pmc, FLOATVAL value, PMC* dest);
typedef PMC* (*add_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL value, PMC* dest);
typedef void (*add_method_method_t)(PARROT_INTERP, PMC* pmc, STRING* method_name, PMC* sub_pmc);
typedef void (*add_parent_method_t)(PARROT_INTERP, PMC* pmc, PMC* parent);
typedef void (*add_role_method_t)(PARROT_INTERP, PMC* pmc, PMC* role);
typedef void (*add_vtable_override_method_t)(PARROT_INTERP, PMC* pmc, STRING* vtable_name, PMC* sub_pmc);
typedef void (*assign_pmc_method_t)(PARROT_INTERP, PMC* pmc, PMC* value);
typedef void (*assign_string_native_method_t)(PARROT_INTERP, PMC* pmc, STRING* value);
typedef INTVAL (*can_method_t)(PARROT_INTERP, PMC* pmc, STRING* method);
typedef PMC* (*clone_method_t)(PARROT_INTERP, PMC* pmc);
typedef PMC* (*clone_pmc_method_t)(PARROT_INTERP, PMC* pmc, PMC* args);
typedef INTVAL (*cmp_method_t)(PARROT_INTERP, PMC* pmc, PMC* value);
typedef INTVAL (*cmp_num_method_t)(PARROT_INTERP, PMC* pmc, PMC* value);
typedef PMC* (*cmp_pmc_method_t)(PARROT_INTERP, PMC* pmc, PMC* value);
typedef INTVAL (*cmp_string_method_t)(PARROT_INTERP, PMC* pmc, PMC* value);
typedef PMC* (*concatenate_method_t)(PARROT_INTERP, PMC* pmc, PMC* value, PMC* dest);
typedef PMC* (*concatenate_str_method_t)(PARROT_INTERP, PMC* pmc, STRING* value, PMC* dest);
typedef void (*decrement_method_t)(PARROT_INTERP, PMC* pmc);
typedef INTVAL (*defined_method_t)(PARROT_INTERP, PMC* pmc);
typedef INTVAL (*defined_keyed_method_t)(PARROT_INTERP, PMC* pmc, PMC* key);
typedef INTVAL (*defined_keyed_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL key);
typedef INTVAL (*defined_keyed_str_method_t)(PARROT_INTERP, PMC* pmc, STRING* key);
typedef void (*delete_keyed_method_t)(PARROT_INTERP, PMC* pmc, PMC* key);
typedef void (*delete_keyed_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL key);
typedef void (*delete_keyed_str_method_t)(PARROT_INTERP, PMC* pmc, STRING* key);
typedef void (*delprop_method_t)(PARROT_INTERP, PMC* pmc, STRING* key);
typedef void (*destroy_method_t)(PARROT_INTERP, PMC* pmc);
typedef PMC* (*divide_method_t)(PARROT_INTERP, PMC* pmc, PMC* value, PMC* dest);
typedef PMC* (*divide_float_method_t)(PARROT_INTERP, PMC* pmc, FLOATVAL value, PMC* dest);
typedef PMC* (*divide_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL value, PMC* dest);
typedef INTVAL (*does_method_t)(PARROT_INTERP, PMC* pmc, STRING* role);
typedef INTVAL (*does_pmc_method_t)(PARROT_INTERP, PMC* pmc, PMC* role);
typedef INTVAL (*elements_method_t)(PARROT_INTERP, PMC* pmc);
typedef INTVAL (*exists_keyed_method_t)(PARROT_INTERP, PMC* pmc, PMC* key);
typedef INTVAL (*exists_keyed_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL key);
typedef INTVAL (*exists_keyed_str_method_t)(PARROT_INTERP, PMC* pmc, STRING* key);
typedef PMC* (*find_method_method_t)(PARROT_INTERP, PMC* pmc, STRING* method_name);
typedef PMC* (*floor_divide_method_t)(PARROT_INTERP, PMC* pmc, PMC* value, PMC* dest);
typedef PMC* (*floor_divide_float_method_t)(PARROT_INTERP, PMC* pmc, FLOATVAL value, PMC* dest);
typedef PMC* (*floor_divide_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL value, PMC* dest);
typedef void (*freeze_method_t)(PARROT_INTERP, PMC* pmc, PMC* info);
typedef PMC* (*get_attr_keyed_method_t)(PARROT_INTERP, PMC* pmc, PMC* key, STRING* idx);
typedef PMC* (*get_attr_str_method_t)(PARROT_INTERP, PMC* pmc, STRING* idx);
typedef INTVAL (*get_bool_method_t)(PARROT_INTERP, PMC* pmc);
typedef PMC* (*get_class_method_t)(PARROT_INTERP, PMC* pmc);
typedef INTVAL (*get_integer_method_t)(PARROT_INTERP, PMC* pmc);
typedef INTVAL (*get_integer_keyed_method_t)(PARROT_INTERP, PMC* pmc, PMC* key);
typedef INTVAL (*get_integer_keyed_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL key);
typedef INTVAL (*get_integer_keyed_str_method_t)(PARROT_INTERP, PMC* pmc, STRING* key);
typedef PMC* (*get_iter_method_t)(PARROT_INTERP, PMC* pmc);
typedef PMC* (*get_namespace_method_t)(PARROT_INTERP, PMC* pmc);
typedef FLOATVAL (*get_number_method_t)(PARROT_INTERP, PMC* pmc);
typedef FLOATVAL (*get_number_keyed_method_t)(PARROT_INTERP, PMC* pmc, PMC* key);
typedef FLOATVAL (*get_number_keyed_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL key);
typedef FLOATVAL (*get_number_keyed_str_method_t)(PARROT_INTERP, PMC* pmc, STRING* key);
typedef PMC* (*get_pmc_method_t)(PARROT_INTERP, PMC* pmc);
typedef PMC* (*get_pmc_keyed_method_t)(PARROT_INTERP, PMC* pmc, PMC* key);
typedef PMC* (*get_pmc_keyed_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL key);
typedef PMC* (*get_pmc_keyed_str_method_t)(PARROT_INTERP, PMC* pmc, STRING* key);
typedef void* (*get_pointer_method_t)(PARROT_INTERP, PMC* pmc);
typedef void* (*get_pointer_keyed_method_t)(PARROT_INTERP, PMC* pmc, PMC* key);
typedef void* (*get_pointer_keyed_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL key);
typedef void* (*get_pointer_keyed_str_method_t)(PARROT_INTERP, PMC* pmc, STRING* key);
typedef STRING* (*get_repr_method_t)(PARROT_INTERP, PMC* pmc);
typedef STRING* (*get_string_method_t)(PARROT_INTERP, PMC* pmc);
typedef STRING* (*get_string_keyed_method_t)(PARROT_INTERP, PMC* pmc, PMC* key);
typedef STRING* (*get_string_keyed_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL key);
typedef STRING* (*get_string_keyed_str_method_t)(PARROT_INTERP, PMC* pmc, STRING* key);
typedef PMC* (*getprop_method_t)(PARROT_INTERP, PMC* pmc, STRING* key);
typedef PMC* (*getprops_method_t)(PARROT_INTERP, PMC* pmc);
typedef INTVAL (*hashvalue_method_t)(PARROT_INTERP, PMC* pmc);
typedef void (*i_absolute_method_t)(PARROT_INTERP, PMC* pmc);
typedef void (*i_add_method_t)(PARROT_INTERP, PMC* pmc, PMC* value);
typedef void (*i_add_float_method_t)(PARROT_INTERP, PMC* pmc, FLOATVAL value);
typedef void (*i_add_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL value);
typedef void (*i_concatenate_method_t)(PARROT_INTERP, PMC* pmc, PMC* value);
typedef void (*i_concatenate_str_method_t)(PARROT_INTERP, PMC* pmc, STRING* value);
typedef void (*i_divide_method_t)(PARROT_INTERP, PMC* pmc, PMC* value);
typedef void (*i_divide_float_method_t)(PARROT_INTERP, PMC* pmc, FLOATVAL value);
typedef void (*i_divide_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL value);
typedef void (*i_floor_divide_method_t)(PARROT_INTERP, PMC* pmc, PMC* value);
typedef void (*i_floor_divide_float_method_t)(PARROT_INTERP, PMC* pmc, FLOATVAL value);
typedef void (*i_floor_divide_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL value);
typedef void (*i_modulus_method_t)(PARROT_INTERP, PMC* pmc, PMC* value);
typedef void (*i_modulus_float_method_t)(PARROT_INTERP, PMC* pmc, FLOATVAL value);
typedef void (*i_modulus_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL value);
typedef void (*i_multiply_method_t)(PARROT_INTERP, PMC* pmc, PMC* value);
typedef void (*i_multiply_float_method_t)(PARROT_INTERP, PMC* pmc, FLOATVAL value);
typedef void (*i_multiply_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL value);
typedef void (*i_neg_method_t)(PARROT_INTERP, PMC* pmc);
typedef void (*i_repeat_method_t)(PARROT_INTERP, PMC* pmc, PMC* value);
typedef void (*i_repeat_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL value);
typedef void (*i_subtract_method_t)(PARROT_INTERP, PMC* pmc, PMC* value);
typedef void (*i_subtract_float_method_t)(PARROT_INTERP, PMC* pmc, FLOATVAL value);
typedef void (*i_subtract_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL value);
typedef void (*increment_method_t)(PARROT_INTERP, PMC* pmc);
typedef void (*init_method_t)(PARROT_INTERP, PMC* pmc);
typedef void (*init_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL initializer);
typedef void (*init_pmc_method_t)(PARROT_INTERP, PMC* pmc, PMC* initializer);
typedef PMC* (*inspect_method_t)(PARROT_INTERP, PMC* pmc);
typedef PMC* (*inspect_str_method_t)(PARROT_INTERP, PMC* pmc, STRING* what);
typedef PMC* (*instantiate_method_t)(PARROT_INTERP, PMC* pmc, PMC* sig);
typedef opcode_t* (*invoke_method_t)(PARROT_INTERP, PMC* pmc, void* next);
typedef INTVAL (*is_equal_method_t)(PARROT_INTERP, PMC* pmc, PMC* value);
typedef INTVAL (*is_equal_num_method_t)(PARROT_INTERP, PMC* pmc, PMC* value);
typedef INTVAL (*is_equal_string_method_t)(PARROT_INTERP, PMC* pmc, PMC* value);
typedef INTVAL (*is_same_method_t)(PARROT_INTERP, PMC* pmc, PMC* value);
typedef INTVAL (*isa_method_t)(PARROT_INTERP, PMC* pmc, STRING* _class);
typedef INTVAL (*isa_pmc_method_t)(PARROT_INTERP, PMC* pmc, PMC* _class);
typedef void (*mark_method_t)(PARROT_INTERP, PMC* pmc);
typedef PMC* (*modulus_method_t)(PARROT_INTERP, PMC* pmc, PMC* value, PMC* dest);
typedef PMC* (*modulus_float_method_t)(PARROT_INTERP, PMC* pmc, FLOATVAL value, PMC* dest);
typedef PMC* (*modulus_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL value, PMC* dest);
typedef void (*morph_method_t)(PARROT_INTERP, PMC* pmc, PMC* type);
typedef PMC* (*multiply_method_t)(PARROT_INTERP, PMC* pmc, PMC* value, PMC* dest);
typedef PMC* (*multiply_float_method_t)(PARROT_INTERP, PMC* pmc, FLOATVAL value, PMC* dest);
typedef PMC* (*multiply_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL value, PMC* dest);
typedef STRING* (*name_method_t)(PARROT_INTERP, PMC* pmc);
typedef PMC* (*neg_method_t)(PARROT_INTERP, PMC* pmc, PMC* dest);
typedef FLOATVAL (*pop_float_method_t)(PARROT_INTERP, PMC* pmc);
typedef INTVAL (*pop_integer_method_t)(PARROT_INTERP, PMC* pmc);
typedef PMC* (*pop_pmc_method_t)(PARROT_INTERP, PMC* pmc);
typedef STRING* (*pop_string_method_t)(PARROT_INTERP, PMC* pmc);
typedef void (*push_float_method_t)(PARROT_INTERP, PMC* pmc, FLOATVAL value);
typedef void (*push_integer_method_t)(PARROT_INTERP, PMC* pmc, INTVAL value);
typedef void (*push_pmc_method_t)(PARROT_INTERP, PMC* pmc, PMC* value);
typedef void (*push_string_method_t)(PARROT_INTERP, PMC* pmc, STRING* value);
typedef void (*remove_attribute_method_t)(PARROT_INTERP, PMC* pmc, STRING* name);
typedef void (*remove_method_method_t)(PARROT_INTERP, PMC* pmc, STRING* method_name);
typedef void (*remove_parent_method_t)(PARROT_INTERP, PMC* pmc, PMC* parent);
typedef void (*remove_role_method_t)(PARROT_INTERP, PMC* pmc, PMC* role);
typedef void (*remove_vtable_override_method_t)(PARROT_INTERP, PMC* pmc, STRING* vtable_name);
typedef PMC* (*repeat_method_t)(PARROT_INTERP, PMC* pmc, PMC* value, PMC* dest);
typedef PMC* (*repeat_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL value, PMC* dest);
typedef void (*set_attr_keyed_method_t)(PARROT_INTERP, PMC* pmc, PMC* key, STRING* idx, PMC* value);
typedef void (*set_attr_str_method_t)(PARROT_INTERP, PMC* pmc, STRING* idx, PMC* value);
typedef void (*set_bool_method_t)(PARROT_INTERP, PMC* pmc, INTVAL value);
typedef void (*set_integer_keyed_method_t)(PARROT_INTERP, PMC* pmc, PMC* key, INTVAL value);
typedef void (*set_integer_keyed_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL key, INTVAL value);
typedef void (*set_integer_keyed_str_method_t)(PARROT_INTERP, PMC* pmc, STRING* key, INTVAL value);
typedef void (*set_integer_native_method_t)(PARROT_INTERP, PMC* pmc, INTVAL value);
typedef void (*set_number_keyed_method_t)(PARROT_INTERP, PMC* pmc, PMC* key, FLOATVAL value);
typedef void (*set_number_keyed_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL key, FLOATVAL value);
typedef void (*set_number_keyed_str_method_t)(PARROT_INTERP, PMC* pmc, STRING* key, FLOATVAL value);
typedef void (*set_number_native_method_t)(PARROT_INTERP, PMC* pmc, FLOATVAL value);
typedef void (*set_pmc_method_t)(PARROT_INTERP, PMC* pmc, PMC* value);
typedef void (*set_pmc_keyed_method_t)(PARROT_INTERP, PMC* pmc, PMC* key, PMC* value);
typedef void (*set_pmc_keyed_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL key, PMC* value);
typedef void (*set_pmc_keyed_str_method_t)(PARROT_INTERP, PMC* pmc, STRING* key, PMC* value);
typedef void (*set_pointer_method_t)(PARROT_INTERP, PMC* pmc, void* value);
typedef void (*set_pointer_keyed_method_t)(PARROT_INTERP, PMC* pmc, PMC* key, void* value);
typedef void (*set_pointer_keyed_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL key, void* value);
typedef void (*set_pointer_keyed_str_method_t)(PARROT_INTERP, PMC* pmc, STRING* key, void* value);
typedef void (*set_string_keyed_method_t)(PARROT_INTERP, PMC* pmc, PMC* key, STRING* value);
typedef void (*set_string_keyed_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL key, STRING* value);
typedef void (*set_string_keyed_str_method_t)(PARROT_INTERP, PMC* pmc, STRING* key, STRING* value);
typedef void (*set_string_native_method_t)(PARROT_INTERP, PMC* pmc, STRING* value);
typedef void (*setprop_method_t)(PARROT_INTERP, PMC* pmc, STRING* key, PMC* value);
typedef void (*share_method_t)(PARROT_INTERP, PMC* pmc);
typedef PMC* (*share_ro_method_t)(PARROT_INTERP, PMC* pmc);
typedef FLOATVAL (*shift_float_method_t)(PARROT_INTERP, PMC* pmc);
typedef INTVAL (*shift_integer_method_t)(PARROT_INTERP, PMC* pmc);
typedef PMC* (*shift_pmc_method_t)(PARROT_INTERP, PMC* pmc);
typedef STRING* (*shift_string_method_t)(PARROT_INTERP, PMC* pmc);
typedef void (*splice_method_t)(PARROT_INTERP, PMC* pmc, PMC* value, INTVAL offset, INTVAL count);
typedef void (*substr_method_t)(PARROT_INTERP, PMC* pmc, INTVAL offset, INTVAL length, PMC* dest);
typedef STRING* (*substr_str_method_t)(PARROT_INTERP, PMC* pmc, INTVAL offset, INTVAL length);
typedef PMC* (*subtract_method_t)(PARROT_INTERP, PMC* pmc, PMC* value, PMC* dest);
typedef PMC* (*subtract_float_method_t)(PARROT_INTERP, PMC* pmc, FLOATVAL value, PMC* dest);
typedef PMC* (*subtract_int_method_t)(PARROT_INTERP, PMC* pmc, INTVAL value, PMC* dest);
typedef void (*thaw_method_t)(PARROT_INTERP, PMC* pmc, PMC* info);
typedef void (*thawfinish_method_t)(PARROT_INTERP, PMC* pmc, PMC* info);
typedef INTVAL (*type_method_t)(PARROT_INTERP, PMC* pmc);
typedef void (*unshift_float_method_t)(PARROT_INTERP, PMC* pmc, FLOATVAL value);
typedef void (*unshift_integer_method_t)(PARROT_INTERP, PMC* pmc, INTVAL value);
typedef void (*unshift_pmc_method_t)(PARROT_INTERP, PMC* pmc, PMC* value);
typedef void (*unshift_string_method_t)(PARROT_INTERP, PMC* pmc, STRING* value);
typedef void (*visit_method_t)(PARROT_INTERP, PMC* pmc, PMC* info);

typedef enum {
    VTABLE_IS_CONST_FLAG     = 0x001,
    VTABLE_HAS_CONST_TOO     = 0x002,
    VTABLE_PMC_NEEDS_EXT     = 0x004,
    VTABLE_DATA_IS_PMC       = 0x008,
    VTABLE_PMC_IS_SINGLETON  = 0x010,
    VTABLE_IS_SHARED_FLAG    = 0x020,
    VTABLE_IS_CONST_PMC_FLAG = 0x040,
    VTABLE_HAS_READONLY_FLAG = 0x080,
    VTABLE_IS_READONLY_FLAG  = 0x100
} vtable_flags_t;

typedef struct _vtable {
    PMC    *_namespace;     /* Pointer to namespace for this class */
    INTVAL  base_type;      /* 'type' value for MMD */
    STRING *whoami;         /* Name of class this vtable is for */
    UINTVAL flags;          /* VTABLE flags (constant, is_ro, etc). */
    STRING *provides_str;   /* space-separated list of interfaces */
    Hash   *isa_hash;       /* Hash of class names */
    PMC    *pmc_class;      /* for PMCs: a PMC of that type
                               for objects: the class PMC */
    PMC    *mro;            /* array PMC of [class, parents ... ] */
    const char *attribute_defs; /* list of PMC attributes */
    struct _vtable *ro_variant_vtable; /* A variant of this vtable with the
                                   opposite IS_READONLY flag */
    /* Vtable Functions */

    absolute_method_t absolute;
    add_method_t add;
    add_attribute_method_t add_attribute;
    add_float_method_t add_float;
    add_int_method_t add_int;
    add_method_method_t add_method;
    add_parent_method_t add_parent;
    add_role_method_t add_role;
    add_vtable_override_method_t add_vtable_override;
    assign_pmc_method_t assign_pmc;
    assign_string_native_method_t assign_string_native;
    can_method_t can;
    clone_method_t clone;
    clone_pmc_method_t clone_pmc;
    cmp_method_t cmp;
    cmp_num_method_t cmp_num;
    cmp_pmc_method_t cmp_pmc;
    cmp_string_method_t cmp_string;
    concatenate_method_t concatenate;
    concatenate_str_method_t concatenate_str;
    decrement_method_t decrement;
    defined_method_t defined;
    defined_keyed_method_t defined_keyed;
    defined_keyed_int_method_t defined_keyed_int;
    defined_keyed_str_method_t defined_keyed_str;
    delete_keyed_method_t delete_keyed;
    delete_keyed_int_method_t delete_keyed_int;
    delete_keyed_str_method_t delete_keyed_str;
    delprop_method_t delprop;
    destroy_method_t destroy;
    divide_method_t divide;
    divide_float_method_t divide_float;
    divide_int_method_t divide_int;
    does_method_t does;
    does_pmc_method_t does_pmc;
    elements_method_t elements;
    exists_keyed_method_t exists_keyed;
    exists_keyed_int_method_t exists_keyed_int;
    exists_keyed_str_method_t exists_keyed_str;
    find_method_method_t find_method;
    floor_divide_method_t floor_divide;
    floor_divide_float_method_t floor_divide_float;
    floor_divide_int_method_t floor_divide_int;
    freeze_method_t freeze;
    get_attr_keyed_method_t get_attr_keyed;
    get_attr_str_method_t get_attr_str;
    get_bool_method_t get_bool;
    get_class_method_t get_class;
    get_integer_method_t get_integer;
    get_integer_keyed_method_t get_integer_keyed;
    get_integer_keyed_int_method_t get_integer_keyed_int;
    get_integer_keyed_str_method_t get_integer_keyed_str;
    get_iter_method_t get_iter;
    get_namespace_method_t get_namespace;
    get_number_method_t get_number;
    get_number_keyed_method_t get_number_keyed;
    get_number_keyed_int_method_t get_number_keyed_int;
    get_number_keyed_str_method_t get_number_keyed_str;
    get_pmc_method_t get_pmc;
    get_pmc_keyed_method_t get_pmc_keyed;
    get_pmc_keyed_int_method_t get_pmc_keyed_int;
    get_pmc_keyed_str_method_t get_pmc_keyed_str;
    get_pointer_method_t get_pointer;
    get_pointer_keyed_method_t get_pointer_keyed;
    get_pointer_keyed_int_method_t get_pointer_keyed_int;
    get_pointer_keyed_str_method_t get_pointer_keyed_str;
    get_repr_method_t get_repr;
    get_string_method_t get_string;
    get_string_keyed_method_t get_string_keyed;
    get_string_keyed_int_method_t get_string_keyed_int;
    get_string_keyed_str_method_t get_string_keyed_str;
    getprop_method_t getprop;
    getprops_method_t getprops;
    hashvalue_method_t hashvalue;
    i_absolute_method_t i_absolute;
    i_add_method_t i_add;
    i_add_float_method_t i_add_float;
    i_add_int_method_t i_add_int;
    i_concatenate_method_t i_concatenate;
    i_concatenate_str_method_t i_concatenate_str;
    i_divide_method_t i_divide;
    i_divide_float_method_t i_divide_float;
    i_divide_int_method_t i_divide_int;
    i_floor_divide_method_t i_floor_divide;
    i_floor_divide_float_method_t i_floor_divide_float;
    i_floor_divide_int_method_t i_floor_divide_int;
    i_modulus_method_t i_modulus;
    i_modulus_float_method_t i_modulus_float;
    i_modulus_int_method_t i_modulus_int;
    i_multiply_method_t i_multiply;
    i_multiply_float_method_t i_multiply_float;
    i_multiply_int_method_t i_multiply_int;
    i_neg_method_t i_neg;
    i_repeat_method_t i_repeat;
    i_repeat_int_method_t i_repeat_int;
    i_subtract_method_t i_subtract;
    i_subtract_float_method_t i_subtract_float;
    i_subtract_int_method_t i_subtract_int;
    increment_method_t increment;
    init_method_t init;
    init_int_method_t init_int;
    init_pmc_method_t init_pmc;
    inspect_method_t inspect;
    inspect_str_method_t inspect_str;
    instantiate_method_t instantiate;
    invoke_method_t invoke;
    is_equal_method_t is_equal;
    is_equal_num_method_t is_equal_num;
    is_equal_string_method_t is_equal_string;
    is_same_method_t is_same;
    isa_method_t isa;
    isa_pmc_method_t isa_pmc;
    mark_method_t mark;
    modulus_method_t modulus;
    modulus_float_method_t modulus_float;
    modulus_int_method_t modulus_int;
    morph_method_t morph;
    multiply_method_t multiply;
    multiply_float_method_t multiply_float;
    multiply_int_method_t multiply_int;
    name_method_t name;
    neg_method_t neg;
    pop_float_method_t pop_float;
    pop_integer_method_t pop_integer;
    pop_pmc_method_t pop_pmc;
    pop_string_method_t pop_string;
    push_float_method_t push_float;
    push_integer_method_t push_integer;
    push_pmc_method_t push_pmc;
    push_string_method_t push_string;
    remove_attribute_method_t remove_attribute;
    remove_method_method_t remove_method;
    remove_parent_method_t remove_parent;
    remove_role_method_t remove_role;
    remove_vtable_override_method_t remove_vtable_override;
    repeat_method_t repeat;
    repeat_int_method_t repeat_int;
    set_attr_keyed_method_t set_attr_keyed;
    set_attr_str_method_t set_attr_str;
    set_bool_method_t set_bool;
    set_integer_keyed_method_t set_integer_keyed;
    set_integer_keyed_int_method_t set_integer_keyed_int;
    set_integer_keyed_str_method_t set_integer_keyed_str;
    set_integer_native_method_t set_integer_native;
    set_number_keyed_method_t set_number_keyed;
    set_number_keyed_int_method_t set_number_keyed_int;
    set_number_keyed_str_method_t set_number_keyed_str;
    set_number_native_method_t set_number_native;
    set_pmc_method_t set_pmc;
    set_pmc_keyed_method_t set_pmc_keyed;
    set_pmc_keyed_int_method_t set_pmc_keyed_int;
    set_pmc_keyed_str_method_t set_pmc_keyed_str;
    set_pointer_method_t set_pointer;
    set_pointer_keyed_method_t set_pointer_keyed;
    set_pointer_keyed_int_method_t set_pointer_keyed_int;
    set_pointer_keyed_str_method_t set_pointer_keyed_str;
    set_string_keyed_method_t set_string_keyed;
    set_string_keyed_int_method_t set_string_keyed_int;
    set_string_keyed_str_method_t set_string_keyed_str;
    set_string_native_method_t set_string_native;
    setprop_method_t setprop;
    share_method_t share;
    share_ro_method_t share_ro;
    shift_float_method_t shift_float;
    shift_integer_method_t shift_integer;
    shift_pmc_method_t shift_pmc;
    shift_string_method_t shift_string;
    splice_method_t splice;
    substr_method_t substr;
    substr_str_method_t substr_str;
    subtract_method_t subtract;
    subtract_float_method_t subtract_float;
    subtract_int_method_t subtract_int;
    thaw_method_t thaw;
    thawfinish_method_t thawfinish;
    type_method_t type;
    unshift_float_method_t unshift_float;
    unshift_integer_method_t unshift_integer;
    unshift_pmc_method_t unshift_pmc;
    unshift_string_method_t unshift_string;
    visit_method_t visit;
    UINTVAL attr_size;      /* Size of the attributes struct */
} _vtable;

/*
 * vtable accessor macros
 * as vtable functions might get moved around internally
 * these macros hide the details
 */

#define VTABLE_absolute(interp, pmc, dest) \
    (pmc)->vtable->absolute(interp, pmc, dest)
#define VTABLE_add(interp, pmc, value, dest) \
    (pmc)->vtable->add(interp, pmc, value, dest)
#define VTABLE_add_attribute(interp, pmc, name, type) \
    (pmc)->vtable->add_attribute(interp, pmc, name, type)
#define VTABLE_add_float(interp, pmc, value, dest) \
    (pmc)->vtable->add_float(interp, pmc, value, dest)
#define VTABLE_add_int(interp, pmc, value, dest) \
    (pmc)->vtable->add_int(interp, pmc, value, dest)
#define VTABLE_add_method(interp, pmc, method_name, sub_pmc) \
    (pmc)->vtable->add_method(interp, pmc, method_name, sub_pmc)
#define VTABLE_add_parent(interp, pmc, parent) \
    (pmc)->vtable->add_parent(interp, pmc, parent)
#define VTABLE_add_role(interp, pmc, role) \
    (pmc)->vtable->add_role(interp, pmc, role)
#define VTABLE_add_vtable_override(interp, pmc, vtable_name, sub_pmc) \
    (pmc)->vtable->add_vtable_override(interp, pmc, vtable_name, sub_pmc)
#define VTABLE_assign_pmc(interp, pmc, value) \
    (pmc)->vtable->assign_pmc(interp, pmc, value)
#define VTABLE_assign_string_native(interp, pmc, value) \
    (pmc)->vtable->assign_string_native(interp, pmc, value)
#define VTABLE_can(interp, pmc, method) \
    (pmc)->vtable->can(interp, pmc, method)
#define VTABLE_clone(interp, pmc) \
    (pmc)->vtable->clone(interp, pmc)
#define VTABLE_clone_pmc(interp, pmc, args) \
    (pmc)->vtable->clone_pmc(interp, pmc, args)
#define VTABLE_cmp(interp, pmc, value) \
    (pmc)->vtable->cmp(interp, pmc, value)
#define VTABLE_cmp_num(interp, pmc, value) \
    (pmc)->vtable->cmp_num(interp, pmc, value)
#define VTABLE_cmp_pmc(interp, pmc, value) \
    (pmc)->vtable->cmp_pmc(interp, pmc, value)
#define VTABLE_cmp_string(interp, pmc, value) \
    (pmc)->vtable->cmp_string(interp, pmc, value)
#define VTABLE_concatenate(interp, pmc, value, dest) \
    (pmc)->vtable->concatenate(interp, pmc, value, dest)
#define VTABLE_concatenate_str(interp, pmc, value, dest) \
    (pmc)->vtable->concatenate_str(interp, pmc, value, dest)
#define VTABLE_decrement(interp, pmc) \
    (pmc)->vtable->decrement(interp, pmc)
#define VTABLE_defined(interp, pmc) \
    (pmc)->vtable->defined(interp, pmc)
#define VTABLE_defined_keyed(interp, pmc, key) \
    (pmc)->vtable->defined_keyed(interp, pmc, key)
#define VTABLE_defined_keyed_int(interp, pmc, key) \
    (pmc)->vtable->defined_keyed_int(interp, pmc, key)
#define VTABLE_defined_keyed_str(interp, pmc, key) \
    (pmc)->vtable->defined_keyed_str(interp, pmc, key)
#define VTABLE_delete_keyed(interp, pmc, key) \
    (pmc)->vtable->delete_keyed(interp, pmc, key)
#define VTABLE_delete_keyed_int(interp, pmc, key) \
    (pmc)->vtable->delete_keyed_int(interp, pmc, key)
#define VTABLE_delete_keyed_str(interp, pmc, key) \
    (pmc)->vtable->delete_keyed_str(interp, pmc, key)
#define VTABLE_delprop(interp, pmc, key) \
    (pmc)->vtable->delprop(interp, pmc, key)
#define VTABLE_destroy(interp, pmc) \
    (pmc)->vtable->destroy(interp, pmc)
#define VTABLE_divide(interp, pmc, value, dest) \
    (pmc)->vtable->divide(interp, pmc, value, dest)
#define VTABLE_divide_float(interp, pmc, value, dest) \
    (pmc)->vtable->divide_float(interp, pmc, value, dest)
#define VTABLE_divide_int(interp, pmc, value, dest) \
    (pmc)->vtable->divide_int(interp, pmc, value, dest)
#define VTABLE_does(interp, pmc, role) \
    (pmc)->vtable->does(interp, pmc, role)
#define VTABLE_does_pmc(interp, pmc, role) \
    (pmc)->vtable->does_pmc(interp, pmc, role)
#define VTABLE_elements(interp, pmc) \
    (pmc)->vtable->elements(interp, pmc)
#define VTABLE_exists_keyed(interp, pmc, key) \
    (pmc)->vtable->exists_keyed(interp, pmc, key)
#define VTABLE_exists_keyed_int(interp, pmc, key) \
    (pmc)->vtable->exists_keyed_int(interp, pmc, key)
#define VTABLE_exists_keyed_str(interp, pmc, key) \
    (pmc)->vtable->exists_keyed_str(interp, pmc, key)
#define VTABLE_find_method(interp, pmc, method_name) \
    (pmc)->vtable->find_method(interp, pmc, method_name)
#define VTABLE_floor_divide(interp, pmc, value, dest) \
    (pmc)->vtable->floor_divide(interp, pmc, value, dest)
#define VTABLE_floor_divide_float(interp, pmc, value, dest) \
    (pmc)->vtable->floor_divide_float(interp, pmc, value, dest)
#define VTABLE_floor_divide_int(interp, pmc, value, dest) \
    (pmc)->vtable->floor_divide_int(interp, pmc, value, dest)
#define VTABLE_freeze(interp, pmc, info) \
    (pmc)->vtable->freeze(interp, pmc, info)
#define VTABLE_get_attr_keyed(interp, pmc, key, idx) \
    (pmc)->vtable->get_attr_keyed(interp, pmc, key, idx)
#define VTABLE_get_attr_str(interp, pmc, idx) \
    (pmc)->vtable->get_attr_str(interp, pmc, idx)
#define VTABLE_get_bool(interp, pmc) \
    (pmc)->vtable->get_bool(interp, pmc)
#define VTABLE_get_class(interp, pmc) \
    (pmc)->vtable->get_class(interp, pmc)
#define VTABLE_get_integer(interp, pmc) \
    (pmc)->vtable->get_integer(interp, pmc)
#define VTABLE_get_integer_keyed(interp, pmc, key) \
    (pmc)->vtable->get_integer_keyed(interp, pmc, key)
#define VTABLE_get_integer_keyed_int(interp, pmc, key) \
    (pmc)->vtable->get_integer_keyed_int(interp, pmc, key)
#define VTABLE_get_integer_keyed_str(interp, pmc, key) \
    (pmc)->vtable->get_integer_keyed_str(interp, pmc, key)
#define VTABLE_get_iter(interp, pmc) \
    (pmc)->vtable->get_iter(interp, pmc)
#define VTABLE_get_namespace(interp, pmc) \
    (pmc)->vtable->get_namespace(interp, pmc)
#define VTABLE_get_number(interp, pmc) \
    (pmc)->vtable->get_number(interp, pmc)
#define VTABLE_get_number_keyed(interp, pmc, key) \
    (pmc)->vtable->get_number_keyed(interp, pmc, key)
#define VTABLE_get_number_keyed_int(interp, pmc, key) \
    (pmc)->vtable->get_number_keyed_int(interp, pmc, key)
#define VTABLE_get_number_keyed_str(interp, pmc, key) \
    (pmc)->vtable->get_number_keyed_str(interp, pmc, key)
#define VTABLE_get_pmc(interp, pmc) \
    (pmc)->vtable->get_pmc(interp, pmc)
#define VTABLE_get_pmc_keyed(interp, pmc, key) \
    (pmc)->vtable->get_pmc_keyed(interp, pmc, key)
#define VTABLE_get_pmc_keyed_int(interp, pmc, key) \
    (pmc)->vtable->get_pmc_keyed_int(interp, pmc, key)
#define VTABLE_get_pmc_keyed_str(interp, pmc, key) \
    (pmc)->vtable->get_pmc_keyed_str(interp, pmc, key)
#define VTABLE_get_pointer(interp, pmc) \
    (pmc)->vtable->get_pointer(interp, pmc)
#define VTABLE_get_pointer_keyed(interp, pmc, key) \
    (pmc)->vtable->get_pointer_keyed(interp, pmc, key)
#define VTABLE_get_pointer_keyed_int(interp, pmc, key) \
    (pmc)->vtable->get_pointer_keyed_int(interp, pmc, key)
#define VTABLE_get_pointer_keyed_str(interp, pmc, key) \
    (pmc)->vtable->get_pointer_keyed_str(interp, pmc, key)
#define VTABLE_get_repr(interp, pmc) \
    (pmc)->vtable->get_repr(interp, pmc)
#define VTABLE_get_string(interp, pmc) \
    (pmc)->vtable->get_string(interp, pmc)
#define VTABLE_get_string_keyed(interp, pmc, key) \
    (pmc)->vtable->get_string_keyed(interp, pmc, key)
#define VTABLE_get_string_keyed_int(interp, pmc, key) \
    (pmc)->vtable->get_string_keyed_int(interp, pmc, key)
#define VTABLE_get_string_keyed_str(interp, pmc, key) \
    (pmc)->vtable->get_string_keyed_str(interp, pmc, key)
#define VTABLE_getprop(interp, pmc, key) \
    (pmc)->vtable->getprop(interp, pmc, key)
#define VTABLE_getprops(interp, pmc) \
    (pmc)->vtable->getprops(interp, pmc)
#define VTABLE_hashvalue(interp, pmc) \
    (pmc)->vtable->hashvalue(interp, pmc)
#define VTABLE_i_absolute(interp, pmc) \
    (pmc)->vtable->i_absolute(interp, pmc)
#define VTABLE_i_add(interp, pmc, value) \
    (pmc)->vtable->i_add(interp, pmc, value)
#define VTABLE_i_add_float(interp, pmc, value) \
    (pmc)->vtable->i_add_float(interp, pmc, value)
#define VTABLE_i_add_int(interp, pmc, value) \
    (pmc)->vtable->i_add_int(interp, pmc, value)
#define VTABLE_i_concatenate(interp, pmc, value) \
    (pmc)->vtable->i_concatenate(interp, pmc, value)
#define VTABLE_i_concatenate_str(interp, pmc, value) \
    (pmc)->vtable->i_concatenate_str(interp, pmc, value)
#define VTABLE_i_divide(interp, pmc, value) \
    (pmc)->vtable->i_divide(interp, pmc, value)
#define VTABLE_i_divide_float(interp, pmc, value) \
    (pmc)->vtable->i_divide_float(interp, pmc, value)
#define VTABLE_i_divide_int(interp, pmc, value) \
    (pmc)->vtable->i_divide_int(interp, pmc, value)
#define VTABLE_i_floor_divide(interp, pmc, value) \
    (pmc)->vtable->i_floor_divide(interp, pmc, value)
#define VTABLE_i_floor_divide_float(interp, pmc, value) \
    (pmc)->vtable->i_floor_divide_float(interp, pmc, value)
#define VTABLE_i_floor_divide_int(interp, pmc, value) \
    (pmc)->vtable->i_floor_divide_int(interp, pmc, value)
#define VTABLE_i_modulus(interp, pmc, value) \
    (pmc)->vtable->i_modulus(interp, pmc, value)
#define VTABLE_i_modulus_float(interp, pmc, value) \
    (pmc)->vtable->i_modulus_float(interp, pmc, value)
#define VTABLE_i_modulus_int(interp, pmc, value) \
    (pmc)->vtable->i_modulus_int(interp, pmc, value)
#define VTABLE_i_multiply(interp, pmc, value) \
    (pmc)->vtable->i_multiply(interp, pmc, value)
#define VTABLE_i_multiply_float(interp, pmc, value) \
    (pmc)->vtable->i_multiply_float(interp, pmc, value)
#define VTABLE_i_multiply_int(interp, pmc, value) \
    (pmc)->vtable->i_multiply_int(interp, pmc, value)
#define VTABLE_i_neg(interp, pmc) \
    (pmc)->vtable->i_neg(interp, pmc)
#define VTABLE_i_repeat(interp, pmc, value) \
    (pmc)->vtable->i_repeat(interp, pmc, value)
#define VTABLE_i_repeat_int(interp, pmc, value) \
    (pmc)->vtable->i_repeat_int(interp, pmc, value)
#define VTABLE_i_subtract(interp, pmc, value) \
    (pmc)->vtable->i_subtract(interp, pmc, value)
#define VTABLE_i_subtract_float(interp, pmc, value) \
    (pmc)->vtable->i_subtract_float(interp, pmc, value)
#define VTABLE_i_subtract_int(interp, pmc, value) \
    (pmc)->vtable->i_subtract_int(interp, pmc, value)
#define VTABLE_increment(interp, pmc) \
    (pmc)->vtable->increment(interp, pmc)
#define VTABLE_init(interp, pmc) \
    (pmc)->vtable->init(interp, pmc)
#define VTABLE_init_int(interp, pmc, initializer) \
    (pmc)->vtable->init_int(interp, pmc, initializer)
#define VTABLE_init_pmc(interp, pmc, initializer) \
    (pmc)->vtable->init_pmc(interp, pmc, initializer)
#define VTABLE_inspect(interp, pmc) \
    (pmc)->vtable->inspect(interp, pmc)
#define VTABLE_inspect_str(interp, pmc, what) \
    (pmc)->vtable->inspect_str(interp, pmc, what)
#define VTABLE_instantiate(interp, pmc, sig) \
    (pmc)->vtable->instantiate(interp, pmc, sig)
#define VTABLE_invoke(interp, pmc, next) \
    (pmc)->vtable->invoke(interp, pmc, next)
#define VTABLE_is_equal(interp, pmc, value) \
    (pmc)->vtable->is_equal(interp, pmc, value)
#define VTABLE_is_equal_num(interp, pmc, value) \
    (pmc)->vtable->is_equal_num(interp, pmc, value)
#define VTABLE_is_equal_string(interp, pmc, value) \
    (pmc)->vtable->is_equal_string(interp, pmc, value)
#define VTABLE_is_same(interp, pmc, value) \
    (pmc)->vtable->is_same(interp, pmc, value)
#define VTABLE_isa(interp, pmc, _class) \
    (pmc)->vtable->isa(interp, pmc, _class)
#define VTABLE_isa_pmc(interp, pmc, _class) \
    (pmc)->vtable->isa_pmc(interp, pmc, _class)
#define VTABLE_mark(interp, pmc) \
    (pmc)->vtable->mark(interp, pmc)
#define VTABLE_modulus(interp, pmc, value, dest) \
    (pmc)->vtable->modulus(interp, pmc, value, dest)
#define VTABLE_modulus_float(interp, pmc, value, dest) \
    (pmc)->vtable->modulus_float(interp, pmc, value, dest)
#define VTABLE_modulus_int(interp, pmc, value, dest) \
    (pmc)->vtable->modulus_int(interp, pmc, value, dest)
#define VTABLE_morph(interp, pmc, type) \
    (pmc)->vtable->morph(interp, pmc, type)
#define VTABLE_multiply(interp, pmc, value, dest) \
    (pmc)->vtable->multiply(interp, pmc, value, dest)
#define VTABLE_multiply_float(interp, pmc, value, dest) \
    (pmc)->vtable->multiply_float(interp, pmc, value, dest)
#define VTABLE_multiply_int(interp, pmc, value, dest) \
    (pmc)->vtable->multiply_int(interp, pmc, value, dest)
#define VTABLE_name(interp, pmc) \
    (pmc)->vtable->name(interp, pmc)
#define VTABLE_neg(interp, pmc, dest) \
    (pmc)->vtable->neg(interp, pmc, dest)
#define VTABLE_pop_float(interp, pmc) \
    (pmc)->vtable->pop_float(interp, pmc)
#define VTABLE_pop_integer(interp, pmc) \
    (pmc)->vtable->pop_integer(interp, pmc)
#define VTABLE_pop_pmc(interp, pmc) \
    (pmc)->vtable->pop_pmc(interp, pmc)
#define VTABLE_pop_string(interp, pmc) \
    (pmc)->vtable->pop_string(interp, pmc)
#define VTABLE_push_float(interp, pmc, value) \
    (pmc)->vtable->push_float(interp, pmc, value)
#define VTABLE_push_integer(interp, pmc, value) \
    (pmc)->vtable->push_integer(interp, pmc, value)
#define VTABLE_push_pmc(interp, pmc, value) \
    (pmc)->vtable->push_pmc(interp, pmc, value)
#define VTABLE_push_string(interp, pmc, value) \
    (pmc)->vtable->push_string(interp, pmc, value)
#define VTABLE_remove_attribute(interp, pmc, name) \
    (pmc)->vtable->remove_attribute(interp, pmc, name)
#define VTABLE_remove_method(interp, pmc, method_name) \
    (pmc)->vtable->remove_method(interp, pmc, method_name)
#define VTABLE_remove_parent(interp, pmc, parent) \
    (pmc)->vtable->remove_parent(interp, pmc, parent)
#define VTABLE_remove_role(interp, pmc, role) \
    (pmc)->vtable->remove_role(interp, pmc, role)
#define VTABLE_remove_vtable_override(interp, pmc, vtable_name) \
    (pmc)->vtable->remove_vtable_override(interp, pmc, vtable_name)
#define VTABLE_repeat(interp, pmc, value, dest) \
    (pmc)->vtable->repeat(interp, pmc, value, dest)
#define VTABLE_repeat_int(interp, pmc, value, dest) \
    (pmc)->vtable->repeat_int(interp, pmc, value, dest)
#define VTABLE_set_attr_keyed(interp, pmc, key, idx, value) \
    (pmc)->vtable->set_attr_keyed(interp, pmc, key, idx, value)
#define VTABLE_set_attr_str(interp, pmc, idx, value) \
    (pmc)->vtable->set_attr_str(interp, pmc, idx, value)
#define VTABLE_set_bool(interp, pmc, value) \
    (pmc)->vtable->set_bool(interp, pmc, value)
#define VTABLE_set_integer_keyed(interp, pmc, key, value) \
    (pmc)->vtable->set_integer_keyed(interp, pmc, key, value)
#define VTABLE_set_integer_keyed_int(interp, pmc, key, value) \
    (pmc)->vtable->set_integer_keyed_int(interp, pmc, key, value)
#define VTABLE_set_integer_keyed_str(interp, pmc, key, value) \
    (pmc)->vtable->set_integer_keyed_str(interp, pmc, key, value)
#define VTABLE_set_integer_native(interp, pmc, value) \
    (pmc)->vtable->set_integer_native(interp, pmc, value)
#define VTABLE_set_number_keyed(interp, pmc, key, value) \
    (pmc)->vtable->set_number_keyed(interp, pmc, key, value)
#define VTABLE_set_number_keyed_int(interp, pmc, key, value) \
    (pmc)->vtable->set_number_keyed_int(interp, pmc, key, value)
#define VTABLE_set_number_keyed_str(interp, pmc, key, value) \
    (pmc)->vtable->set_number_keyed_str(interp, pmc, key, value)
#define VTABLE_set_number_native(interp, pmc, value) \
    (pmc)->vtable->set_number_native(interp, pmc, value)
#define VTABLE_set_pmc(interp, pmc, value) \
    (pmc)->vtable->set_pmc(interp, pmc, value)
#define VTABLE_set_pmc_keyed(interp, pmc, key, value) \
    (pmc)->vtable->set_pmc_keyed(interp, pmc, key, value)
#define VTABLE_set_pmc_keyed_int(interp, pmc, key, value) \
    (pmc)->vtable->set_pmc_keyed_int(interp, pmc, key, value)
#define VTABLE_set_pmc_keyed_str(interp, pmc, key, value) \
    (pmc)->vtable->set_pmc_keyed_str(interp, pmc, key, value)
#define VTABLE_set_pointer(interp, pmc, value) \
    (pmc)->vtable->set_pointer(interp, pmc, value)
#define VTABLE_set_pointer_keyed(interp, pmc, key, value) \
    (pmc)->vtable->set_pointer_keyed(interp, pmc, key, value)
#define VTABLE_set_pointer_keyed_int(interp, pmc, key, value) \
    (pmc)->vtable->set_pointer_keyed_int(interp, pmc, key, value)
#define VTABLE_set_pointer_keyed_str(interp, pmc, key, value) \
    (pmc)->vtable->set_pointer_keyed_str(interp, pmc, key, value)
#define VTABLE_set_string_keyed(interp, pmc, key, value) \
    (pmc)->vtable->set_string_keyed(interp, pmc, key, value)
#define VTABLE_set_string_keyed_int(interp, pmc, key, value) \
    (pmc)->vtable->set_string_keyed_int(interp, pmc, key, value)
#define VTABLE_set_string_keyed_str(interp, pmc, key, value) \
    (pmc)->vtable->set_string_keyed_str(interp, pmc, key, value)
#define VTABLE_set_string_native(interp, pmc, value) \
    (pmc)->vtable->set_string_native(interp, pmc, value)
#define VTABLE_setprop(interp, pmc, key, value) \
    (pmc)->vtable->setprop(interp, pmc, key, value)
#define VTABLE_share(interp, pmc) \
    (pmc)->vtable->share(interp, pmc)
#define VTABLE_share_ro(interp, pmc) \
    (pmc)->vtable->share_ro(interp, pmc)
#define VTABLE_shift_float(interp, pmc) \
    (pmc)->vtable->shift_float(interp, pmc)
#define VTABLE_shift_integer(interp, pmc) \
    (pmc)->vtable->shift_integer(interp, pmc)
#define VTABLE_shift_pmc(interp, pmc) \
    (pmc)->vtable->shift_pmc(interp, pmc)
#define VTABLE_shift_string(interp, pmc) \
    (pmc)->vtable->shift_string(interp, pmc)
#define VTABLE_splice(interp, pmc, value, offset, count) \
    (pmc)->vtable->splice(interp, pmc, value, offset, count)
#define VTABLE_substr(interp, pmc, offset, length, dest) \
    (pmc)->vtable->substr(interp, pmc, offset, length, dest)
#define VTABLE_substr_str(interp, pmc, offset, length) \
    (pmc)->vtable->substr_str(interp, pmc, offset, length)
#define VTABLE_subtract(interp, pmc, value, dest) \
    (pmc)->vtable->subtract(interp, pmc, value, dest)
#define VTABLE_subtract_float(interp, pmc, value, dest) \
    (pmc)->vtable->subtract_float(interp, pmc, value, dest)
#define VTABLE_subtract_int(interp, pmc, value, dest) \
    (pmc)->vtable->subtract_int(interp, pmc, value, dest)
#define VTABLE_thaw(interp, pmc, info) \
    (pmc)->vtable->thaw(interp, pmc, info)
#define VTABLE_thawfinish(interp, pmc, info) \
    (pmc)->vtable->thawfinish(interp, pmc, info)
#define VTABLE_type(interp, pmc) \
    (pmc)->vtable->type(interp, pmc)
#define VTABLE_unshift_float(interp, pmc, value) \
    (pmc)->vtable->unshift_float(interp, pmc, value)
#define VTABLE_unshift_integer(interp, pmc, value) \
    (pmc)->vtable->unshift_integer(interp, pmc, value)
#define VTABLE_unshift_pmc(interp, pmc, value) \
    (pmc)->vtable->unshift_pmc(interp, pmc, value)
#define VTABLE_unshift_string(interp, pmc, value) \
    (pmc)->vtable->unshift_string(interp, pmc, value)
#define VTABLE_visit(interp, pmc, info) \
    (pmc)->vtable->visit(interp, pmc, info)
/*
 * vtable slot names
 */
#define PARROT_VTABLE_SLOT_ABSOLUTE 9
#define PARROT_VTABLE_SLOT_ADD 10
#define PARROT_VTABLE_SLOT_ADD_ATTRIBUTE 11
#define PARROT_VTABLE_SLOT_ADD_FLOAT 12
#define PARROT_VTABLE_SLOT_ADD_INT 13
#define PARROT_VTABLE_SLOT_ADD_METHOD 14
#define PARROT_VTABLE_SLOT_ADD_PARENT 15
#define PARROT_VTABLE_SLOT_ADD_ROLE 16
#define PARROT_VTABLE_SLOT_ADD_VTABLE_OVERRIDE 17
#define PARROT_VTABLE_SLOT_ASSIGN_PMC 18
#define PARROT_VTABLE_SLOT_ASSIGN_STRING_NATIVE 19
#define PARROT_VTABLE_SLOT_CAN 20
#define PARROT_VTABLE_SLOT_CLONE 21
#define PARROT_VTABLE_SLOT_CLONE_PMC 22
#define PARROT_VTABLE_SLOT_CMP 23
#define PARROT_VTABLE_SLOT_CMP_NUM 24
#define PARROT_VTABLE_SLOT_CMP_PMC 25
#define PARROT_VTABLE_SLOT_CMP_STRING 26
#define PARROT_VTABLE_SLOT_CONCATENATE 27
#define PARROT_VTABLE_SLOT_CONCATENATE_STR 28
#define PARROT_VTABLE_SLOT_DECREMENT 29
#define PARROT_VTABLE_SLOT_DEFINED 30
#define PARROT_VTABLE_SLOT_DEFINED_KEYED 31
#define PARROT_VTABLE_SLOT_DEFINED_KEYED_INT 32
#define PARROT_VTABLE_SLOT_DEFINED_KEYED_STR 33
#define PARROT_VTABLE_SLOT_DELETE_KEYED 34
#define PARROT_VTABLE_SLOT_DELETE_KEYED_INT 35
#define PARROT_VTABLE_SLOT_DELETE_KEYED_STR 36
#define PARROT_VTABLE_SLOT_DELPROP 37
#define PARROT_VTABLE_SLOT_DESTROY 38
#define PARROT_VTABLE_SLOT_DIVIDE 39
#define PARROT_VTABLE_SLOT_DIVIDE_FLOAT 40
#define PARROT_VTABLE_SLOT_DIVIDE_INT 41
#define PARROT_VTABLE_SLOT_DOES 42
#define PARROT_VTABLE_SLOT_DOES_PMC 43
#define PARROT_VTABLE_SLOT_ELEMENTS 44
#define PARROT_VTABLE_SLOT_EXISTS_KEYED 45
#define PARROT_VTABLE_SLOT_EXISTS_KEYED_INT 46
#define PARROT_VTABLE_SLOT_EXISTS_KEYED_STR 47
#define PARROT_VTABLE_SLOT_FIND_METHOD 48
#define PARROT_VTABLE_SLOT_FLOOR_DIVIDE 49
#define PARROT_VTABLE_SLOT_FLOOR_DIVIDE_FLOAT 50
#define PARROT_VTABLE_SLOT_FLOOR_DIVIDE_INT 51
#define PARROT_VTABLE_SLOT_FREEZE 52
#define PARROT_VTABLE_SLOT_GET_ATTR_KEYED 53
#define PARROT_VTABLE_SLOT_GET_ATTR_STR 54
#define PARROT_VTABLE_SLOT_GET_BOOL 55
#define PARROT_VTABLE_SLOT_GET_CLASS 56
#define PARROT_VTABLE_SLOT_GET_INTEGER 57
#define PARROT_VTABLE_SLOT_GET_INTEGER_KEYED 58
#define PARROT_VTABLE_SLOT_GET_INTEGER_KEYED_INT 59
#define PARROT_VTABLE_SLOT_GET_INTEGER_KEYED_STR 60
#define PARROT_VTABLE_SLOT_GET_ITER 61
#define PARROT_VTABLE_SLOT_GET_NAMESPACE 62
#define PARROT_VTABLE_SLOT_GET_NUMBER 63
#define PARROT_VTABLE_SLOT_GET_NUMBER_KEYED 64
#define PARROT_VTABLE_SLOT_GET_NUMBER_KEYED_INT 65
#define PARROT_VTABLE_SLOT_GET_NUMBER_KEYED_STR 66
#define PARROT_VTABLE_SLOT_GET_PMC 67
#define PARROT_VTABLE_SLOT_GET_PMC_KEYED 68
#define PARROT_VTABLE_SLOT_GET_PMC_KEYED_INT 69
#define PARROT_VTABLE_SLOT_GET_PMC_KEYED_STR 70
#define PARROT_VTABLE_SLOT_GET_POINTER 71
#define PARROT_VTABLE_SLOT_GET_POINTER_KEYED 72
#define PARROT_VTABLE_SLOT_GET_POINTER_KEYED_INT 73
#define PARROT_VTABLE_SLOT_GET_POINTER_KEYED_STR 74
#define PARROT_VTABLE_SLOT_GET_REPR 75
#define PARROT_VTABLE_SLOT_GET_STRING 76
#define PARROT_VTABLE_SLOT_GET_STRING_KEYED 77
#define PARROT_VTABLE_SLOT_GET_STRING_KEYED_INT 78
#define PARROT_VTABLE_SLOT_GET_STRING_KEYED_STR 79
#define PARROT_VTABLE_SLOT_GETPROP 80
#define PARROT_VTABLE_SLOT_GETPROPS 81
#define PARROT_VTABLE_SLOT_HASHVALUE 82
#define PARROT_VTABLE_SLOT_I_ABSOLUTE 83
#define PARROT_VTABLE_SLOT_I_ADD 84
#define PARROT_VTABLE_SLOT_I_ADD_FLOAT 85
#define PARROT_VTABLE_SLOT_I_ADD_INT 86
#define PARROT_VTABLE_SLOT_I_CONCATENATE 87
#define PARROT_VTABLE_SLOT_I_CONCATENATE_STR 88
#define PARROT_VTABLE_SLOT_I_DIVIDE 89
#define PARROT_VTABLE_SLOT_I_DIVIDE_FLOAT 90
#define PARROT_VTABLE_SLOT_I_DIVIDE_INT 91
#define PARROT_VTABLE_SLOT_I_FLOOR_DIVIDE 92
#define PARROT_VTABLE_SLOT_I_FLOOR_DIVIDE_FLOAT 93
#define PARROT_VTABLE_SLOT_I_FLOOR_DIVIDE_INT 94
#define PARROT_VTABLE_SLOT_I_MODULUS 95
#define PARROT_VTABLE_SLOT_I_MODULUS_FLOAT 96
#define PARROT_VTABLE_SLOT_I_MODULUS_INT 97
#define PARROT_VTABLE_SLOT_I_MULTIPLY 98
#define PARROT_VTABLE_SLOT_I_MULTIPLY_FLOAT 99
#define PARROT_VTABLE_SLOT_I_MULTIPLY_INT 100
#define PARROT_VTABLE_SLOT_I_NEG 101
#define PARROT_VTABLE_SLOT_I_REPEAT 102
#define PARROT_VTABLE_SLOT_I_REPEAT_INT 103
#define PARROT_VTABLE_SLOT_I_SUBTRACT 104
#define PARROT_VTABLE_SLOT_I_SUBTRACT_FLOAT 105
#define PARROT_VTABLE_SLOT_I_SUBTRACT_INT 106
#define PARROT_VTABLE_SLOT_INCREMENT 107
#define PARROT_VTABLE_SLOT_INIT 108
#define PARROT_VTABLE_SLOT_INIT_INT 109
#define PARROT_VTABLE_SLOT_INIT_PMC 110
#define PARROT_VTABLE_SLOT_INSPECT 111
#define PARROT_VTABLE_SLOT_INSPECT_STR 112
#define PARROT_VTABLE_SLOT_INSTANTIATE 113
#define PARROT_VTABLE_SLOT_INVOKE 114
#define PARROT_VTABLE_SLOT_IS_EQUAL 115
#define PARROT_VTABLE_SLOT_IS_EQUAL_NUM 116
#define PARROT_VTABLE_SLOT_IS_EQUAL_STRING 117
#define PARROT_VTABLE_SLOT_IS_SAME 118
#define PARROT_VTABLE_SLOT_ISA 119
#define PARROT_VTABLE_SLOT_ISA_PMC 120
#define PARROT_VTABLE_SLOT_MARK 121
#define PARROT_VTABLE_SLOT_MODULUS 122
#define PARROT_VTABLE_SLOT_MODULUS_FLOAT 123
#define PARROT_VTABLE_SLOT_MODULUS_INT 124
#define PARROT_VTABLE_SLOT_MORPH 125
#define PARROT_VTABLE_SLOT_MULTIPLY 126
#define PARROT_VTABLE_SLOT_MULTIPLY_FLOAT 127
#define PARROT_VTABLE_SLOT_MULTIPLY_INT 128
#define PARROT_VTABLE_SLOT_NAME 129
#define PARROT_VTABLE_SLOT_NEG 130
#define PARROT_VTABLE_SLOT_POP_FLOAT 131
#define PARROT_VTABLE_SLOT_POP_INTEGER 132
#define PARROT_VTABLE_SLOT_POP_PMC 133
#define PARROT_VTABLE_SLOT_POP_STRING 134
#define PARROT_VTABLE_SLOT_PUSH_FLOAT 135
#define PARROT_VTABLE_SLOT_PUSH_INTEGER 136
#define PARROT_VTABLE_SLOT_PUSH_PMC 137
#define PARROT_VTABLE_SLOT_PUSH_STRING 138
#define PARROT_VTABLE_SLOT_REMOVE_ATTRIBUTE 139
#define PARROT_VTABLE_SLOT_REMOVE_METHOD 140
#define PARROT_VTABLE_SLOT_REMOVE_PARENT 141
#define PARROT_VTABLE_SLOT_REMOVE_ROLE 142
#define PARROT_VTABLE_SLOT_REMOVE_VTABLE_OVERRIDE 143
#define PARROT_VTABLE_SLOT_REPEAT 144
#define PARROT_VTABLE_SLOT_REPEAT_INT 145
#define PARROT_VTABLE_SLOT_SET_ATTR_KEYED 146
#define PARROT_VTABLE_SLOT_SET_ATTR_STR 147
#define PARROT_VTABLE_SLOT_SET_BOOL 148
#define PARROT_VTABLE_SLOT_SET_INTEGER_KEYED 149
#define PARROT_VTABLE_SLOT_SET_INTEGER_KEYED_INT 150
#define PARROT_VTABLE_SLOT_SET_INTEGER_KEYED_STR 151
#define PARROT_VTABLE_SLOT_SET_INTEGER_NATIVE 152
#define PARROT_VTABLE_SLOT_SET_NUMBER_KEYED 153
#define PARROT_VTABLE_SLOT_SET_NUMBER_KEYED_INT 154
#define PARROT_VTABLE_SLOT_SET_NUMBER_KEYED_STR 155
#define PARROT_VTABLE_SLOT_SET_NUMBER_NATIVE 156
#define PARROT_VTABLE_SLOT_SET_PMC 157
#define PARROT_VTABLE_SLOT_SET_PMC_KEYED 158
#define PARROT_VTABLE_SLOT_SET_PMC_KEYED_INT 159
#define PARROT_VTABLE_SLOT_SET_PMC_KEYED_STR 160
#define PARROT_VTABLE_SLOT_SET_POINTER 161
#define PARROT_VTABLE_SLOT_SET_POINTER_KEYED 162
#define PARROT_VTABLE_SLOT_SET_POINTER_KEYED_INT 163
#define PARROT_VTABLE_SLOT_SET_POINTER_KEYED_STR 164
#define PARROT_VTABLE_SLOT_SET_STRING_KEYED 165
#define PARROT_VTABLE_SLOT_SET_STRING_KEYED_INT 166
#define PARROT_VTABLE_SLOT_SET_STRING_KEYED_STR 167
#define PARROT_VTABLE_SLOT_SET_STRING_NATIVE 168
#define PARROT_VTABLE_SLOT_SETPROP 169
#define PARROT_VTABLE_SLOT_SHARE 170
#define PARROT_VTABLE_SLOT_SHARE_RO 171
#define PARROT_VTABLE_SLOT_SHIFT_FLOAT 172
#define PARROT_VTABLE_SLOT_SHIFT_INTEGER 173
#define PARROT_VTABLE_SLOT_SHIFT_PMC 174
#define PARROT_VTABLE_SLOT_SHIFT_STRING 175
#define PARROT_VTABLE_SLOT_SPLICE 176
#define PARROT_VTABLE_SLOT_SUBSTR 177
#define PARROT_VTABLE_SLOT_SUBSTR_STR 178
#define PARROT_VTABLE_SLOT_SUBTRACT 179
#define PARROT_VTABLE_SLOT_SUBTRACT_FLOAT 180
#define PARROT_VTABLE_SLOT_SUBTRACT_INT 181
#define PARROT_VTABLE_SLOT_THAW 182
#define PARROT_VTABLE_SLOT_THAWFINISH 183
#define PARROT_VTABLE_SLOT_TYPE 184
#define PARROT_VTABLE_SLOT_UNSHIFT_FLOAT 185
#define PARROT_VTABLE_SLOT_UNSHIFT_INTEGER 186
#define PARROT_VTABLE_SLOT_UNSHIFT_PMC 187
#define PARROT_VTABLE_SLOT_UNSHIFT_STRING 188
#define PARROT_VTABLE_SLOT_VISIT 189

#ifdef PARROT_IN_OBJECTS_C

#define PARROT_VTABLE_LOW 9

static PARROT_OBSERVER const char * const Parrot_vtable_slot_names[] = {
    "",   /* Pointer to namespace for this class */
    "",   /* 'type' value for MMD */
    "",   /* Name of class this vtable is for */
    "",   /* VTABLE flags (constant, is_ro, etc). */
    "",   /* space-separated list of interfaces */
    "",   /* space-separated list of classes */
    "",   /* class */
    "",   /* mro */
    "",   /* ro_variant_vtable */

    /* Vtable Functions */
        "absolute",
        "add",
        "add_attribute",
        "add_float",
        "add_int",
        "add_method",
        "add_parent",
        "add_role",
        "add_vtable_override",
        "assign_pmc",
        "assign_string_native",
        "can",
        "clone",
        "clone_pmc",
        "cmp",
        "cmp_num",
        "cmp_pmc",
        "cmp_string",
        "concatenate",
        "concatenate_str",
        "decrement",
        "defined",
        "defined_keyed",
        "defined_keyed_int",
        "defined_keyed_str",
        "delete_keyed",
        "delete_keyed_int",
        "delete_keyed_str",
        "delprop",
        "destroy",
        "divide",
        "divide_float",
        "divide_int",
        "does",
        "does_pmc",
        "elements",
        "exists_keyed",
        "exists_keyed_int",
        "exists_keyed_str",
        "find_method",
        "floor_divide",
        "floor_divide_float",
        "floor_divide_int",
        "freeze",
        "get_attr_keyed",
        "get_attr_str",
        "get_bool",
        "get_class",
        "get_integer",
        "get_integer_keyed",
        "get_integer_keyed_int",
        "get_integer_keyed_str",
        "get_iter",
        "get_namespace",
        "get_number",
        "get_number_keyed",
        "get_number_keyed_int",
        "get_number_keyed_str",
        "get_pmc",
        "get_pmc_keyed",
        "get_pmc_keyed_int",
        "get_pmc_keyed_str",
        "get_pointer",
        "get_pointer_keyed",
        "get_pointer_keyed_int",
        "get_pointer_keyed_str",
        "get_repr",
        "get_string",
        "get_string_keyed",
        "get_string_keyed_int",
        "get_string_keyed_str",
        "getprop",
        "getprops",
        "hashvalue",
        "i_absolute",
        "i_add",
        "i_add_float",
        "i_add_int",
        "i_concatenate",
        "i_concatenate_str",
        "i_divide",
        "i_divide_float",
        "i_divide_int",
        "i_floor_divide",
        "i_floor_divide_float",
        "i_floor_divide_int",
        "i_modulus",
        "i_modulus_float",
        "i_modulus_int",
        "i_multiply",
        "i_multiply_float",
        "i_multiply_int",
        "i_neg",
        "i_repeat",
        "i_repeat_int",
        "i_subtract",
        "i_subtract_float",
        "i_subtract_int",
        "increment",
        "init",
        "init_int",
        "init_pmc",
        "inspect",
        "inspect_str",
        "instantiate",
        "invoke",
        "is_equal",
        "is_equal_num",
        "is_equal_string",
        "is_same",
        "isa",
        "isa_pmc",
        "mark",
        "modulus",
        "modulus_float",
        "modulus_int",
        "morph",
        "multiply",
        "multiply_float",
        "multiply_int",
        "name",
        "neg",
        "pop_float",
        "pop_integer",
        "pop_pmc",
        "pop_string",
        "push_float",
        "push_integer",
        "push_pmc",
        "push_string",
        "remove_attribute",
        "remove_method",
        "remove_parent",
        "remove_role",
        "remove_vtable_override",
        "repeat",
        "repeat_int",
        "set_attr_keyed",
        "set_attr_str",
        "set_bool",
        "set_integer_keyed",
        "set_integer_keyed_int",
        "set_integer_keyed_str",
        "set_integer_native",
        "set_number_keyed",
        "set_number_keyed_int",
        "set_number_keyed_str",
        "set_number_native",
        "set_pmc",
        "set_pmc_keyed",
        "set_pmc_keyed_int",
        "set_pmc_keyed_str",
        "set_pointer",
        "set_pointer_keyed",
        "set_pointer_keyed_int",
        "set_pointer_keyed_str",
        "set_string_keyed",
        "set_string_keyed_int",
        "set_string_keyed_str",
        "set_string_native",
        "setprop",
        "share",
        "share_ro",
        "shift_float",
        "shift_integer",
        "shift_pmc",
        "shift_string",
        "splice",
        "substr",
        "substr_str",
        "subtract",
        "subtract_float",
        "subtract_int",
        "thaw",
        "thawfinish",
        "type",
        "unshift_float",
        "unshift_integer",
        "unshift_pmc",
        "unshift_string",
        "visit",
    NULL
};

#define NUM_VTABLE_FUNCTIONS 181

#endif /* PARROT_IN_OBJECTS_C */

#endif /* PARROT_VTABLE_H_GUARD */

/*
 * Local variables:
 *   c-file-style: "parrot"
 *   buffer-read-only: t
 * End:
 * vim: expandtab shiftwidth=4:
 */
