/*
** !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
**
** This file is generated automatically from 'vtable.tbl' by vtable_h.pl
*/

#if !defined(PARROT_VTABLE_H_GUARD)
#define PARROT_VTABLE_H_GUARD

#include "parrot/parrot.h"

#define VTABLE_SIZE 512

#define YOU_LOSE_VTABLE NULL

typedef void (*init_method_t)(Interp* interpreter, PMC* pmc);
typedef void (*init_pmc_method_t)(Interp* interpreter, PMC* pmc, PMC* initializer);
typedef PMC* (*instantiate_method_t)(Interp* interpreter, PMC* pmc, PMC* sig);
typedef PMC* (*new_from_string_method_t)(Interp* interpreter, PMC* pmc, STRING* rep, INTVAL flags);
typedef void (*morph_method_t)(Interp* interpreter, PMC* pmc, INTVAL type);
typedef void (*mark_method_t)(Interp* interpreter, PMC* pmc);
typedef void (*destroy_method_t)(Interp* interpreter, PMC* pmc);
typedef PMC* (*namespace_method_t)(Interp* interpreter, PMC* pmc);
typedef PMC* (*getprop_method_t)(Interp* interpreter, PMC* pmc, STRING* key);
typedef void (*setprop_method_t)(Interp* interpreter, PMC* pmc, STRING* key, PMC* value);
typedef void (*delprop_method_t)(Interp* interpreter, PMC* pmc, STRING* key);
typedef PMC* (*getprops_method_t)(Interp* interpreter, PMC* pmc);
typedef INTVAL (*type_method_t)(Interp* interpreter, PMC* pmc);
typedef INTVAL (*type_keyed_method_t)(Interp* interpreter, PMC* pmc, PMC* key);
typedef INTVAL (*type_keyed_int_method_t)(Interp* interpreter, PMC* pmc, INTVAL key);
typedef INTVAL (*type_keyed_str_method_t)(Interp* interpreter, PMC* pmc, STRING* key);
typedef UINTVAL (*subtype_method_t)(Interp* interpreter, PMC* pmc, INTVAL type);
typedef STRING* (*name_method_t)(Interp* interpreter, PMC* pmc);
typedef PMC* (*clone_method_t)(Interp* interpreter, PMC* pmc);
typedef PMC* (*find_method_method_t)(Interp* interpreter, PMC* pmc, STRING* method_name);
typedef INTVAL (*hash_method_t)(Interp* interpreter, PMC* pmc, size_t seed);
typedef INTVAL (*get_integer_method_t)(Interp* interpreter, PMC* pmc);
typedef INTVAL (*get_integer_keyed_method_t)(Interp* interpreter, PMC* pmc, PMC* key);
typedef INTVAL (*get_integer_keyed_int_method_t)(Interp* interpreter, PMC* pmc, INTVAL key);
typedef INTVAL (*get_integer_keyed_str_method_t)(Interp* interpreter, PMC* pmc, STRING* key);
typedef FLOATVAL (*get_number_method_t)(Interp* interpreter, PMC* pmc);
typedef FLOATVAL (*get_number_keyed_method_t)(Interp* interpreter, PMC* pmc, PMC* key);
typedef FLOATVAL (*get_number_keyed_int_method_t)(Interp* interpreter, PMC* pmc, INTVAL key);
typedef FLOATVAL (*get_number_keyed_str_method_t)(Interp* interpreter, PMC* pmc, STRING* key);
typedef PMC* (*get_bignum_method_t)(Interp* interpreter, PMC* pmc);
typedef STRING* (*get_string_method_t)(Interp* interpreter, PMC* pmc);
typedef STRING* (*get_repr_method_t)(Interp* interpreter, PMC* pmc);
typedef STRING* (*get_string_keyed_method_t)(Interp* interpreter, PMC* pmc, PMC* key);
typedef STRING* (*get_string_keyed_int_method_t)(Interp* interpreter, PMC* pmc, INTVAL key);
typedef STRING* (*get_string_keyed_str_method_t)(Interp* interpreter, PMC* pmc, STRING* key);
typedef INTVAL (*get_bool_method_t)(Interp* interpreter, PMC* pmc);
typedef PMC* (*get_pmc_method_t)(Interp* interpreter, PMC* pmc);
typedef PMC* (*get_pmc_keyed_method_t)(Interp* interpreter, PMC* pmc, PMC* key);
typedef PMC* (*get_pmc_keyed_int_method_t)(Interp* interpreter, PMC* pmc, INTVAL key);
typedef PMC* (*get_pmc_keyed_str_method_t)(Interp* interpreter, PMC* pmc, STRING* key);
typedef PMC* (*slice_method_t)(Interp* interpreter, PMC* pmc, PMC* key, INTVAL flag);
typedef void* (*get_pointer_method_t)(Interp* interpreter, PMC* pmc);
typedef void* (*get_pointer_keyed_method_t)(Interp* interpreter, PMC* pmc, PMC* key);
typedef void* (*get_pointer_keyed_int_method_t)(Interp* interpreter, PMC* pmc, INTVAL key);
typedef void* (*get_pointer_keyed_str_method_t)(Interp* interpreter, PMC* pmc, STRING* key);
typedef void (*set_integer_native_method_t)(Interp* interpreter, PMC* pmc, INTVAL value);
typedef void (*set_integer_same_method_t)(Interp* interpreter, PMC* pmc, PMC* value);
typedef void (*set_integer_keyed_method_t)(Interp* interpreter, PMC* pmc, PMC* key, INTVAL value);
typedef void (*set_integer_keyed_int_method_t)(Interp* interpreter, PMC* pmc, INTVAL key, INTVAL value);
typedef void (*set_integer_keyed_str_method_t)(Interp* interpreter, PMC* pmc, STRING* key, INTVAL value);
typedef void (*set_number_native_method_t)(Interp* interpreter, PMC* pmc, FLOATVAL value);
typedef void (*set_number_same_method_t)(Interp* interpreter, PMC* pmc, PMC* value);
typedef void (*set_number_keyed_method_t)(Interp* interpreter, PMC* pmc, PMC* key, FLOATVAL value);
typedef void (*set_number_keyed_int_method_t)(Interp* interpreter, PMC* pmc, INTVAL key, FLOATVAL value);
typedef void (*set_number_keyed_str_method_t)(Interp* interpreter, PMC* pmc, STRING* key, FLOATVAL value);
typedef void (*set_bignum_int_method_t)(Interp* interpreter, PMC* pmc, INTVAL value);
typedef void (*set_bignum_num_method_t)(Interp* interpreter, PMC* pmc, FLOATVAL value);
typedef void (*set_bignum_str_method_t)(Interp* interpreter, PMC* pmc, STRING* value);
typedef void (*set_string_native_method_t)(Interp* interpreter, PMC* pmc, STRING* value);
typedef void (*assign_string_native_method_t)(Interp* interpreter, PMC* pmc, STRING* value);
typedef void (*set_string_same_method_t)(Interp* interpreter, PMC* pmc, PMC* value);
typedef void (*set_string_keyed_method_t)(Interp* interpreter, PMC* pmc, PMC* key, STRING* value);
typedef void (*set_string_keyed_int_method_t)(Interp* interpreter, PMC* pmc, INTVAL key, STRING* value);
typedef void (*set_string_keyed_str_method_t)(Interp* interpreter, PMC* pmc, STRING* key, STRING* value);
typedef void (*set_bool_method_t)(Interp* interpreter, PMC* pmc, INTVAL value);
typedef void (*set_pmc_method_t)(Interp* interpreter, PMC* pmc, PMC* value);
typedef void (*assign_pmc_method_t)(Interp* interpreter, PMC* pmc, PMC* value);
typedef void (*set_pmc_keyed_method_t)(Interp* interpreter, PMC* pmc, PMC* key, PMC* value);
typedef void (*set_pmc_keyed_int_method_t)(Interp* interpreter, PMC* pmc, INTVAL key, PMC* value);
typedef void (*set_pmc_keyed_str_method_t)(Interp* interpreter, PMC* pmc, STRING* key, PMC* value);
typedef void (*set_pointer_method_t)(Interp* interpreter, PMC* pmc, void* value);
typedef void (*set_pointer_keyed_method_t)(Interp* interpreter, PMC* pmc, PMC* key, void* value);
typedef void (*set_pointer_keyed_int_method_t)(Interp* interpreter, PMC* pmc, INTVAL key, void* value);
typedef void (*set_pointer_keyed_str_method_t)(Interp* interpreter, PMC* pmc, STRING* key, void* value);
typedef INTVAL (*elements_method_t)(Interp* interpreter, PMC* pmc);
typedef INTVAL (*pop_integer_method_t)(Interp* interpreter, PMC* pmc);
typedef FLOATVAL (*pop_float_method_t)(Interp* interpreter, PMC* pmc);
typedef STRING* (*pop_string_method_t)(Interp* interpreter, PMC* pmc);
typedef PMC* (*pop_pmc_method_t)(Interp* interpreter, PMC* pmc);
typedef void (*push_integer_method_t)(Interp* interpreter, PMC* pmc, INTVAL value);
typedef void (*push_float_method_t)(Interp* interpreter, PMC* pmc, FLOATVAL value);
typedef void (*push_string_method_t)(Interp* interpreter, PMC* pmc, STRING* value);
typedef void (*push_pmc_method_t)(Interp* interpreter, PMC* pmc, PMC* value);
typedef INTVAL (*shift_integer_method_t)(Interp* interpreter, PMC* pmc);
typedef FLOATVAL (*shift_float_method_t)(Interp* interpreter, PMC* pmc);
typedef STRING* (*shift_string_method_t)(Interp* interpreter, PMC* pmc);
typedef PMC* (*shift_pmc_method_t)(Interp* interpreter, PMC* pmc);
typedef void (*unshift_integer_method_t)(Interp* interpreter, PMC* pmc, INTVAL value);
typedef void (*unshift_float_method_t)(Interp* interpreter, PMC* pmc, FLOATVAL value);
typedef void (*unshift_string_method_t)(Interp* interpreter, PMC* pmc, STRING* value);
typedef void (*unshift_pmc_method_t)(Interp* interpreter, PMC* pmc, PMC* value);
typedef void (*splice_method_t)(Interp* interpreter, PMC* pmc, PMC* value, INTVAL offset, INTVAL count);
typedef void (*increment_method_t)(Interp* interpreter, PMC* pmc);
typedef void (*decrement_method_t)(Interp* interpreter, PMC* pmc);
typedef PMC* (*absolute_method_t)(Interp* interpreter, PMC* pmc, PMC* dest);
typedef void (*i_absolute_method_t)(Interp* interpreter, PMC* pmc);
typedef PMC* (*neg_method_t)(Interp* interpreter, PMC* pmc, PMC* dest);
typedef void (*i_neg_method_t)(Interp* interpreter, PMC* pmc);
typedef PMC* (*bitwise_not_method_t)(Interp* interpreter, PMC* pmc, PMC* dest);
typedef void (*i_bitwise_not_method_t)(Interp* interpreter, PMC* pmc);
typedef PMC* (*bitwise_nots_method_t)(Interp* interpreter, PMC* pmc, PMC* dest);
typedef void (*i_bitwise_nots_method_t)(Interp* interpreter, PMC* pmc);
typedef INTVAL (*is_same_method_t)(Interp* interpreter, PMC* pmc, PMC* value);
typedef PMC* (*logical_not_method_t)(Interp* interpreter, PMC* pmc, PMC* dest);
typedef void (*i_logical_not_method_t)(Interp* interpreter, PMC* pmc);
typedef void (*substr_method_t)(Interp* interpreter, PMC* pmc, INTVAL offset, INTVAL length, PMC* dest);
typedef STRING* (*substr_str_method_t)(Interp* interpreter, PMC* pmc, INTVAL offset, INTVAL length);
typedef INTVAL (*exists_keyed_method_t)(Interp* interpreter, PMC* pmc, PMC* key);
typedef INTVAL (*exists_keyed_int_method_t)(Interp* interpreter, PMC* pmc, INTVAL key);
typedef INTVAL (*exists_keyed_str_method_t)(Interp* interpreter, PMC* pmc, STRING* key);
typedef INTVAL (*defined_method_t)(Interp* interpreter, PMC* pmc);
typedef INTVAL (*defined_keyed_method_t)(Interp* interpreter, PMC* pmc, PMC* key);
typedef INTVAL (*defined_keyed_int_method_t)(Interp* interpreter, PMC* pmc, INTVAL key);
typedef INTVAL (*defined_keyed_str_method_t)(Interp* interpreter, PMC* pmc, STRING* key);
typedef void (*delete_keyed_method_t)(Interp* interpreter, PMC* pmc, PMC* key);
typedef void (*delete_keyed_int_method_t)(Interp* interpreter, PMC* pmc, INTVAL key);
typedef void (*delete_keyed_str_method_t)(Interp* interpreter, PMC* pmc, STRING* key);
typedef PMC* (*nextkey_keyed_method_t)(Interp* interpreter, PMC* pmc, PMC* key, INTVAL what);
typedef PMC* (*nextkey_keyed_int_method_t)(Interp* interpreter, PMC* pmc, INTVAL key, INTVAL what);
typedef PMC* (*nextkey_keyed_str_method_t)(Interp* interpreter, PMC* pmc, STRING* key, INTVAL what);
typedef PMC* (*get_iter_method_t)(Interp* interpreter, PMC* pmc);
typedef void* (*invoke_method_t)(Interp* interpreter, PMC* pmc, void* next);
typedef INTVAL (*can_method_t)(Interp* interpreter, PMC* pmc, STRING* method);
typedef INTVAL (*does_method_t)(Interp* interpreter, PMC* pmc, STRING* method);
typedef INTVAL (*isa_method_t)(Interp* interpreter, PMC* pmc, STRING* _class);
typedef PMC* (*subclass_method_t)(Interp* interpreter, PMC* pmc, PMC* name);
typedef PMC* (*get_attr_method_t)(Interp* interpreter, PMC* pmc, INTVAL idx);
typedef PMC* (*get_attr_str_method_t)(Interp* interpreter, PMC* pmc, STRING* idx);
typedef void (*set_attr_method_t)(Interp* interpreter, PMC* pmc, INTVAL idx, PMC* value);
typedef void (*set_attr_str_method_t)(Interp* interpreter, PMC* pmc, STRING* idx, PMC* value);
typedef PMC* (*get_class_method_t)(Interp* interpreter, PMC* pmc);
typedef void (*add_parent_method_t)(Interp* interpreter, PMC* pmc, PMC* parent);
typedef void (*become_parent_method_t)(Interp* interpreter, PMC* pmc, PMC* class);
typedef INTVAL (*class_type_method_t)(Interp* interpreter, PMC* pmc);
typedef void (*add_method_method_t)(Interp* interpreter, PMC* pmc, STRING* method, PMC* sub_pmc);
typedef void (*remove_method_method_t)(Interp* interpreter, PMC* pmc, STRING* method);
typedef PMC* (*new_singleton_method_t)(Interp* interpreter, PMC* pmc);
typedef PMC* (*get_anonymous_subclass_method_t)(Interp* interpreter, PMC* pmc);
typedef void (*freeze_method_t)(Interp* interpreter, PMC* pmc, visit_info* info);
typedef void (*thaw_method_t)(Interp* interpreter, PMC* pmc, visit_info* info);
typedef void (*thawfinish_method_t)(Interp* interpreter, PMC* pmc, visit_info* info);
typedef void (*visit_method_t)(Interp* interpreter, PMC* pmc, visit_info* info);
typedef void (*share_method_t)(Interp* interpreter, PMC* pmc);

typedef enum {
    VTABLE_IS_CONST_FLAG = 0x01,
    VTABLE_HAS_CONST_TOO = 0x02,
    VTABLE_PMC_NEEDS_EXT = 0x04,
    VTABLE_DATA_IS_PMC   = 0x08,
    VTABLE_PMC_IS_SINGLETON = 0x10,
    VTABLE_IS_SHARED_FLAG   = 0x20,
    VTABLE_IS_CONST_PMC_FLAG = 0x40
} vtable_flags_t;

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;           /* Flags. Duh */
    STRING* does_str;        /* space-separated list of interfaces */
    STRING* isa_str;         /* space-separated list of classes */
    PMC *class;              /* for PMCs: a PMC of that type
                                for objects: the class PMC */
    PMC *mro;                /* array PMC of [class, parents ... ] */
    /* Vtable Functions */

    init_method_t init;
    init_pmc_method_t init_pmc;
    instantiate_method_t instantiate;
    new_from_string_method_t new_from_string;
    morph_method_t morph;
    mark_method_t mark;
    destroy_method_t destroy;
    namespace_method_t namespace;
    getprop_method_t getprop;
    setprop_method_t setprop;
    delprop_method_t delprop;
    getprops_method_t getprops;
    type_method_t type;
    type_keyed_method_t type_keyed;
    type_keyed_int_method_t type_keyed_int;
    type_keyed_str_method_t type_keyed_str;
    subtype_method_t subtype;
    name_method_t name;
    clone_method_t clone;
    find_method_method_t find_method;
    hash_method_t hash;
    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_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_bignum_method_t get_bignum;
    get_string_method_t get_string;
    get_repr_method_t get_repr;
    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;
    get_bool_method_t get_bool;
    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;
    slice_method_t slice;
    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;
    set_integer_native_method_t set_integer_native;
    set_integer_same_method_t set_integer_same;
    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_number_native_method_t set_number_native;
    set_number_same_method_t set_number_same;
    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_bignum_int_method_t set_bignum_int;
    set_bignum_num_method_t set_bignum_num;
    set_bignum_str_method_t set_bignum_str;
    set_string_native_method_t set_string_native;
    assign_string_native_method_t assign_string_native;
    set_string_same_method_t set_string_same;
    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_bool_method_t set_bool;
    set_pmc_method_t set_pmc;
    assign_pmc_method_t assign_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;
    elements_method_t elements;
    pop_integer_method_t pop_integer;
    pop_float_method_t pop_float;
    pop_string_method_t pop_string;
    pop_pmc_method_t pop_pmc;
    push_integer_method_t push_integer;
    push_float_method_t push_float;
    push_string_method_t push_string;
    push_pmc_method_t push_pmc;
    shift_integer_method_t shift_integer;
    shift_float_method_t shift_float;
    shift_string_method_t shift_string;
    shift_pmc_method_t shift_pmc;
    unshift_integer_method_t unshift_integer;
    unshift_float_method_t unshift_float;
    unshift_string_method_t unshift_string;
    unshift_pmc_method_t unshift_pmc;
    splice_method_t splice;
    increment_method_t increment;
    decrement_method_t decrement;
    absolute_method_t absolute;
    i_absolute_method_t i_absolute;
    neg_method_t neg;
    i_neg_method_t i_neg;
    bitwise_not_method_t bitwise_not;
    i_bitwise_not_method_t i_bitwise_not;
    bitwise_nots_method_t bitwise_nots;
    i_bitwise_nots_method_t i_bitwise_nots;
    is_same_method_t is_same;
    logical_not_method_t logical_not;
    i_logical_not_method_t i_logical_not;
    substr_method_t substr;
    substr_str_method_t substr_str;
    exists_keyed_method_t exists_keyed;
    exists_keyed_int_method_t exists_keyed_int;
    exists_keyed_str_method_t exists_keyed_str;
    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;
    nextkey_keyed_method_t nextkey_keyed;
    nextkey_keyed_int_method_t nextkey_keyed_int;
    nextkey_keyed_str_method_t nextkey_keyed_str;
    get_iter_method_t get_iter;
    invoke_method_t invoke;
    can_method_t can;
    does_method_t does;
    isa_method_t isa;
    subclass_method_t subclass;
    get_attr_method_t get_attr;
    get_attr_str_method_t get_attr_str;
    set_attr_method_t set_attr;
    set_attr_str_method_t set_attr_str;
    get_class_method_t get_class;
    add_parent_method_t add_parent;
    become_parent_method_t become_parent;
    class_type_method_t class_type;
    add_method_method_t add_method;
    remove_method_method_t remove_method;
    new_singleton_method_t new_singleton;
    get_anonymous_subclass_method_t get_anonymous_subclass;
    freeze_method_t freeze;
    thaw_method_t thaw;
    thawfinish_method_t thawfinish;
    visit_method_t visit;
    share_method_t share;
};

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

#define VTABLE_init(interp, pmc) \
    (pmc)->vtable->init(interp, pmc)
#define VTABLE_init_pmc(interp, pmc, initializer) \
    (pmc)->vtable->init_pmc(interp, pmc, initializer)
#define VTABLE_instantiate(interp, pmc, sig) \
    (pmc)->vtable->instantiate(interp, pmc, sig)
#define VTABLE_new_from_string(interp, pmc, rep, flags) \
    (pmc)->vtable->new_from_string(interp, pmc, rep, flags)
#define VTABLE_morph(interp, pmc, type) \
    (pmc)->vtable->morph(interp, pmc, type)
#define VTABLE_mark(interp, pmc) \
    (pmc)->vtable->mark(interp, pmc)
#define VTABLE_destroy(interp, pmc) \
    (pmc)->vtable->destroy(interp, pmc)
#define VTABLE_namespace(interp, pmc) \
    (pmc)->vtable->namespace(interp, pmc)
#define VTABLE_getprop(interp, pmc, key) \
    (pmc)->vtable->getprop(interp, pmc, key)
#define VTABLE_setprop(interp, pmc, key, value) \
    (pmc)->vtable->setprop(interp, pmc, key, value)
#define VTABLE_delprop(interp, pmc, key) \
    (pmc)->vtable->delprop(interp, pmc, key)
#define VTABLE_getprops(interp, pmc) \
    (pmc)->vtable->getprops(interp, pmc)
#define VTABLE_type(interp, pmc) \
    (pmc)->vtable->type(interp, pmc)
#define VTABLE_type_keyed(interp, pmc, key) \
    (pmc)->vtable->type_keyed(interp, pmc, key)
#define VTABLE_type_keyed_int(interp, pmc, key) \
    (pmc)->vtable->type_keyed_int(interp, pmc, key)
#define VTABLE_type_keyed_str(interp, pmc, key) \
    (pmc)->vtable->type_keyed_str(interp, pmc, key)
#define VTABLE_subtype(interp, pmc, type) \
    (pmc)->vtable->subtype(interp, pmc, type)
#define VTABLE_name(interp, pmc) \
    (pmc)->vtable->name(interp, pmc)
#define VTABLE_clone(interp, pmc) \
    (pmc)->vtable->clone(interp, pmc)
#define VTABLE_find_method(interp, pmc, method_name) \
    (pmc)->vtable->find_method(interp, pmc, method_name)
#define VTABLE_hash(interp, pmc, seed) \
    (pmc)->vtable->hash(interp, pmc, seed)
#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_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_bignum(interp, pmc) \
    (pmc)->vtable->get_bignum(interp, pmc)
#define VTABLE_get_string(interp, pmc) \
    (pmc)->vtable->get_string(interp, pmc)
#define VTABLE_get_repr(interp, pmc) \
    (pmc)->vtable->get_repr(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_get_bool(interp, pmc) \
    (pmc)->vtable->get_bool(interp, pmc)
#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_slice(interp, pmc, key, flag) \
    (pmc)->vtable->slice(interp, pmc, key, flag)
#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_set_integer_native(interp, pmc, value) \
    (pmc)->vtable->set_integer_native(interp, pmc, value)
#define VTABLE_set_integer_same(interp, pmc, value) \
    (pmc)->vtable->set_integer_same(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_number_native(interp, pmc, value) \
    (pmc)->vtable->set_number_native(interp, pmc, value)
#define VTABLE_set_number_same(interp, pmc, value) \
    (pmc)->vtable->set_number_same(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_bignum_int(interp, pmc, value) \
    (pmc)->vtable->set_bignum_int(interp, pmc, value)
#define VTABLE_set_bignum_num(interp, pmc, value) \
    (pmc)->vtable->set_bignum_num(interp, pmc, value)
#define VTABLE_set_bignum_str(interp, pmc, value) \
    (pmc)->vtable->set_bignum_str(interp, pmc, value)
#define VTABLE_set_string_native(interp, pmc, value) \
    (pmc)->vtable->set_string_native(interp, pmc, value)
#define VTABLE_assign_string_native(interp, pmc, value) \
    (pmc)->vtable->assign_string_native(interp, pmc, value)
#define VTABLE_set_string_same(interp, pmc, value) \
    (pmc)->vtable->set_string_same(interp, pmc, 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_bool(interp, pmc, value) \
    (pmc)->vtable->set_bool(interp, pmc, value)
#define VTABLE_set_pmc(interp, pmc, value) \
    (pmc)->vtable->set_pmc(interp, pmc, value)
#define VTABLE_assign_pmc(interp, pmc, value) \
    (pmc)->vtable->assign_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_elements(interp, pmc) \
    (pmc)->vtable->elements(interp, pmc)
#define VTABLE_pop_integer(interp, pmc) \
    (pmc)->vtable->pop_integer(interp, pmc)
#define VTABLE_pop_float(interp, pmc) \
    (pmc)->vtable->pop_float(interp, pmc)
#define VTABLE_pop_string(interp, pmc) \
    (pmc)->vtable->pop_string(interp, pmc)
#define VTABLE_pop_pmc(interp, pmc) \
    (pmc)->vtable->pop_pmc(interp, pmc)
#define VTABLE_push_integer(interp, pmc, value) \
    (pmc)->vtable->push_integer(interp, pmc, value)
#define VTABLE_push_float(interp, pmc, value) \
    (pmc)->vtable->push_float(interp, pmc, value)
#define VTABLE_push_string(interp, pmc, value) \
    (pmc)->vtable->push_string(interp, pmc, value)
#define VTABLE_push_pmc(interp, pmc, value) \
    (pmc)->vtable->push_pmc(interp, pmc, value)
#define VTABLE_shift_integer(interp, pmc) \
    (pmc)->vtable->shift_integer(interp, pmc)
#define VTABLE_shift_float(interp, pmc) \
    (pmc)->vtable->shift_float(interp, pmc)
#define VTABLE_shift_string(interp, pmc) \
    (pmc)->vtable->shift_string(interp, pmc)
#define VTABLE_shift_pmc(interp, pmc) \
    (pmc)->vtable->shift_pmc(interp, pmc)
#define VTABLE_unshift_integer(interp, pmc, value) \
    (pmc)->vtable->unshift_integer(interp, pmc, value)
#define VTABLE_unshift_float(interp, pmc, value) \
    (pmc)->vtable->unshift_float(interp, pmc, value)
#define VTABLE_unshift_string(interp, pmc, value) \
    (pmc)->vtable->unshift_string(interp, pmc, value)
#define VTABLE_unshift_pmc(interp, pmc, value) \
    (pmc)->vtable->unshift_pmc(interp, pmc, value)
#define VTABLE_splice(interp, pmc, value, offset, count) \
    (pmc)->vtable->splice(interp, pmc, value, offset, count)
#define VTABLE_increment(interp, pmc) \
    (pmc)->vtable->increment(interp, pmc)
#define VTABLE_decrement(interp, pmc) \
    (pmc)->vtable->decrement(interp, pmc)
#define VTABLE_absolute(interp, pmc, dest) \
    (pmc)->vtable->absolute(interp, pmc, dest)
#define VTABLE_i_absolute(interp, pmc) \
    (pmc)->vtable->i_absolute(interp, pmc)
#define VTABLE_neg(interp, pmc, dest) \
    (pmc)->vtable->neg(interp, pmc, dest)
#define VTABLE_i_neg(interp, pmc) \
    (pmc)->vtable->i_neg(interp, pmc)
#define VTABLE_bitwise_not(interp, pmc, dest) \
    (pmc)->vtable->bitwise_not(interp, pmc, dest)
#define VTABLE_i_bitwise_not(interp, pmc) \
    (pmc)->vtable->i_bitwise_not(interp, pmc)
#define VTABLE_bitwise_nots(interp, pmc, dest) \
    (pmc)->vtable->bitwise_nots(interp, pmc, dest)
#define VTABLE_i_bitwise_nots(interp, pmc) \
    (pmc)->vtable->i_bitwise_nots(interp, pmc)
#define VTABLE_is_same(interp, pmc, value) \
    (pmc)->vtable->is_same(interp, pmc, value)
#define VTABLE_logical_not(interp, pmc, dest) \
    (pmc)->vtable->logical_not(interp, pmc, dest)
#define VTABLE_i_logical_not(interp, pmc) \
    (pmc)->vtable->i_logical_not(interp, pmc)
#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_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_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_nextkey_keyed(interp, pmc, key, what) \
    (pmc)->vtable->nextkey_keyed(interp, pmc, key, what)
#define VTABLE_nextkey_keyed_int(interp, pmc, key, what) \
    (pmc)->vtable->nextkey_keyed_int(interp, pmc, key, what)
#define VTABLE_nextkey_keyed_str(interp, pmc, key, what) \
    (pmc)->vtable->nextkey_keyed_str(interp, pmc, key, what)
#define VTABLE_get_iter(interp, pmc) \
    (pmc)->vtable->get_iter(interp, pmc)
#define VTABLE_invoke(interp, pmc, next) \
    (pmc)->vtable->invoke(interp, pmc, next)
#define VTABLE_can(interp, pmc, method) \
    (pmc)->vtable->can(interp, pmc, method)
#define VTABLE_does(interp, pmc, method) \
    (pmc)->vtable->does(interp, pmc, method)
#define VTABLE_isa(interp, pmc, _class) \
    (pmc)->vtable->isa(interp, pmc, _class)
#define VTABLE_subclass(interp, pmc, name) \
    (pmc)->vtable->subclass(interp, pmc, name)
#define VTABLE_get_attr(interp, pmc, idx) \
    (pmc)->vtable->get_attr(interp, pmc, idx)
#define VTABLE_get_attr_str(interp, pmc, idx) \
    (pmc)->vtable->get_attr_str(interp, pmc, idx)
#define VTABLE_set_attr(interp, pmc, idx, value) \
    (pmc)->vtable->set_attr(interp, pmc, idx, value)
#define VTABLE_set_attr_str(interp, pmc, idx, value) \
    (pmc)->vtable->set_attr_str(interp, pmc, idx, value)
#define VTABLE_get_class(interp, pmc) \
    (pmc)->vtable->get_class(interp, pmc)
#define VTABLE_add_parent(interp, pmc, parent) \
    (pmc)->vtable->add_parent(interp, pmc, parent)
#define VTABLE_become_parent(interp, pmc, class) \
    (pmc)->vtable->become_parent(interp, pmc, class)
#define VTABLE_class_type(interp, pmc) \
    (pmc)->vtable->class_type(interp, pmc)
#define VTABLE_add_method(interp, pmc, method, sub_pmc) \
    (pmc)->vtable->add_method(interp, pmc, method, sub_pmc)
#define VTABLE_remove_method(interp, pmc, method) \
    (pmc)->vtable->remove_method(interp, pmc, method)
#define VTABLE_new_singleton(interp, pmc) \
    (pmc)->vtable->new_singleton(interp, pmc)
#define VTABLE_get_anonymous_subclass(interp, pmc) \
    (pmc)->vtable->get_anonymous_subclass(interp, pmc)
#define VTABLE_freeze(interp, pmc, info) \
    (pmc)->vtable->freeze(interp, pmc, info)
#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_visit(interp, pmc, info) \
    (pmc)->vtable->visit(interp, pmc, info)
#define VTABLE_share(interp, pmc) \
    (pmc)->vtable->share(interp, pmc)

/*
 * vtable method name defines for delegate
 */

/* &gen_from_def(vtable_methods.pasm) */
#define PARROT_VTABLE_INIT_METHNAME "__init"
#define PARROT_VTABLE_INIT_PMC_METHNAME "__init_pmc"
#define PARROT_VTABLE_INSTANTIATE_METHNAME "__instantiate"
#define PARROT_VTABLE_NEW_FROM_STRING_METHNAME "__new_from_string"
#define PARROT_VTABLE_MORPH_METHNAME "__morph"
#define PARROT_VTABLE_MARK_METHNAME "__mark"
#define PARROT_VTABLE_DESTROY_METHNAME "__destroy"
#define PARROT_VTABLE_NAMESPACE_METHNAME "__namespace"
#define PARROT_VTABLE_GETPROP_METHNAME "__getprop"
#define PARROT_VTABLE_SETPROP_METHNAME "__setprop"
#define PARROT_VTABLE_DELPROP_METHNAME "__delprop"
#define PARROT_VTABLE_GETPROPS_METHNAME "__getprops"
#define PARROT_VTABLE_TYPE_METHNAME "__type"
#define PARROT_VTABLE_TYPE_KEYED_METHNAME "__type_keyed"
#define PARROT_VTABLE_TYPE_KEYED_INT_METHNAME "__type_keyed_int"
#define PARROT_VTABLE_TYPE_KEYED_STR_METHNAME "__type_keyed_str"
#define PARROT_VTABLE_SUBTYPE_METHNAME "__subtype"
#define PARROT_VTABLE_NAME_METHNAME "__name"
#define PARROT_VTABLE_CLONE_METHNAME "__clone"
#define PARROT_VTABLE_FIND_METHOD_METHNAME "__find_method"
#define PARROT_VTABLE_HASH_METHNAME "__hash"
#define PARROT_VTABLE_GET_INTEGER_METHNAME "__get_integer"
#define PARROT_VTABLE_GET_INTEGER_KEYED_METHNAME "__get_integer_keyed"
#define PARROT_VTABLE_GET_INTEGER_KEYED_INT_METHNAME "__get_integer_keyed_int"
#define PARROT_VTABLE_GET_INTEGER_KEYED_STR_METHNAME "__get_integer_keyed_str"
#define PARROT_VTABLE_GET_NUMBER_METHNAME "__get_number"
#define PARROT_VTABLE_GET_NUMBER_KEYED_METHNAME "__get_number_keyed"
#define PARROT_VTABLE_GET_NUMBER_KEYED_INT_METHNAME "__get_number_keyed_int"
#define PARROT_VTABLE_GET_NUMBER_KEYED_STR_METHNAME "__get_number_keyed_str"
#define PARROT_VTABLE_GET_BIGNUM_METHNAME "__get_bignum"
#define PARROT_VTABLE_GET_STRING_METHNAME "__get_string"
#define PARROT_VTABLE_GET_REPR_METHNAME "__get_repr"
#define PARROT_VTABLE_GET_STRING_KEYED_METHNAME "__get_string_keyed"
#define PARROT_VTABLE_GET_STRING_KEYED_INT_METHNAME "__get_string_keyed_int"
#define PARROT_VTABLE_GET_STRING_KEYED_STR_METHNAME "__get_string_keyed_str"
#define PARROT_VTABLE_GET_BOOL_METHNAME "__get_bool"
#define PARROT_VTABLE_GET_PMC_METHNAME "__get_pmc"
#define PARROT_VTABLE_GET_PMC_KEYED_METHNAME "__get_pmc_keyed"
#define PARROT_VTABLE_GET_PMC_KEYED_INT_METHNAME "__get_pmc_keyed_int"
#define PARROT_VTABLE_GET_PMC_KEYED_STR_METHNAME "__get_pmc_keyed_str"
#define PARROT_VTABLE_SLICE_METHNAME "__slice"
#define PARROT_VTABLE_GET_POINTER_METHNAME "__get_pointer"
#define PARROT_VTABLE_GET_POINTER_KEYED_METHNAME "__get_pointer_keyed"
#define PARROT_VTABLE_GET_POINTER_KEYED_INT_METHNAME "__get_pointer_keyed_int"
#define PARROT_VTABLE_GET_POINTER_KEYED_STR_METHNAME "__get_pointer_keyed_str"
#define PARROT_VTABLE_SET_INTEGER_NATIVE_METHNAME "__set_integer_native"
#define PARROT_VTABLE_SET_INTEGER_SAME_METHNAME "__set_integer_same"
#define PARROT_VTABLE_SET_INTEGER_KEYED_METHNAME "__set_integer_keyed"
#define PARROT_VTABLE_SET_INTEGER_KEYED_INT_METHNAME "__set_integer_keyed_int"
#define PARROT_VTABLE_SET_INTEGER_KEYED_STR_METHNAME "__set_integer_keyed_str"
#define PARROT_VTABLE_SET_NUMBER_NATIVE_METHNAME "__set_number_native"
#define PARROT_VTABLE_SET_NUMBER_SAME_METHNAME "__set_number_same"
#define PARROT_VTABLE_SET_NUMBER_KEYED_METHNAME "__set_number_keyed"
#define PARROT_VTABLE_SET_NUMBER_KEYED_INT_METHNAME "__set_number_keyed_int"
#define PARROT_VTABLE_SET_NUMBER_KEYED_STR_METHNAME "__set_number_keyed_str"
#define PARROT_VTABLE_SET_BIGNUM_INT_METHNAME "__set_bignum_int"
#define PARROT_VTABLE_SET_BIGNUM_NUM_METHNAME "__set_bignum_num"
#define PARROT_VTABLE_SET_BIGNUM_STR_METHNAME "__set_bignum_str"
#define PARROT_VTABLE_SET_STRING_NATIVE_METHNAME "__set_string_native"
#define PARROT_VTABLE_ASSIGN_STRING_NATIVE_METHNAME "__assign_string_native"
#define PARROT_VTABLE_SET_STRING_SAME_METHNAME "__set_string_same"
#define PARROT_VTABLE_SET_STRING_KEYED_METHNAME "__set_string_keyed"
#define PARROT_VTABLE_SET_STRING_KEYED_INT_METHNAME "__set_string_keyed_int"
#define PARROT_VTABLE_SET_STRING_KEYED_STR_METHNAME "__set_string_keyed_str"
#define PARROT_VTABLE_SET_BOOL_METHNAME "__set_bool"
#define PARROT_VTABLE_SET_PMC_METHNAME "__set_pmc"
#define PARROT_VTABLE_ASSIGN_PMC_METHNAME "__assign_pmc"
#define PARROT_VTABLE_SET_PMC_KEYED_METHNAME "__set_pmc_keyed"
#define PARROT_VTABLE_SET_PMC_KEYED_INT_METHNAME "__set_pmc_keyed_int"
#define PARROT_VTABLE_SET_PMC_KEYED_STR_METHNAME "__set_pmc_keyed_str"
#define PARROT_VTABLE_SET_POINTER_METHNAME "__set_pointer"
#define PARROT_VTABLE_SET_POINTER_KEYED_METHNAME "__set_pointer_keyed"
#define PARROT_VTABLE_SET_POINTER_KEYED_INT_METHNAME "__set_pointer_keyed_int"
#define PARROT_VTABLE_SET_POINTER_KEYED_STR_METHNAME "__set_pointer_keyed_str"
#define PARROT_VTABLE_ELEMENTS_METHNAME "__elements"
#define PARROT_VTABLE_POP_INTEGER_METHNAME "__pop_integer"
#define PARROT_VTABLE_POP_FLOAT_METHNAME "__pop_float"
#define PARROT_VTABLE_POP_STRING_METHNAME "__pop_string"
#define PARROT_VTABLE_POP_PMC_METHNAME "__pop_pmc"
#define PARROT_VTABLE_PUSH_INTEGER_METHNAME "__push_integer"
#define PARROT_VTABLE_PUSH_FLOAT_METHNAME "__push_float"
#define PARROT_VTABLE_PUSH_STRING_METHNAME "__push_string"
#define PARROT_VTABLE_PUSH_PMC_METHNAME "__push_pmc"
#define PARROT_VTABLE_SHIFT_INTEGER_METHNAME "__shift_integer"
#define PARROT_VTABLE_SHIFT_FLOAT_METHNAME "__shift_float"
#define PARROT_VTABLE_SHIFT_STRING_METHNAME "__shift_string"
#define PARROT_VTABLE_SHIFT_PMC_METHNAME "__shift_pmc"
#define PARROT_VTABLE_UNSHIFT_INTEGER_METHNAME "__unshift_integer"
#define PARROT_VTABLE_UNSHIFT_FLOAT_METHNAME "__unshift_float"
#define PARROT_VTABLE_UNSHIFT_STRING_METHNAME "__unshift_string"
#define PARROT_VTABLE_UNSHIFT_PMC_METHNAME "__unshift_pmc"
#define PARROT_VTABLE_SPLICE_METHNAME "__splice"
#define PARROT_VTABLE_ADD_METHNAME "__add"
#define PARROT_VTABLE_ADD_INT_METHNAME "__add_int"
#define PARROT_VTABLE_ADD_FLOAT_METHNAME "__add_float"
#define PARROT_VTABLE_I_ADD_METHNAME "__i_add"
#define PARROT_VTABLE_I_ADD_INT_METHNAME "__i_add_int"
#define PARROT_VTABLE_I_ADD_FLOAT_METHNAME "__i_add_float"
#define PARROT_VTABLE_SUBTRACT_METHNAME "__subtract"
#define PARROT_VTABLE_SUBTRACT_INT_METHNAME "__subtract_int"
#define PARROT_VTABLE_SUBTRACT_FLOAT_METHNAME "__subtract_float"
#define PARROT_VTABLE_I_SUBTRACT_METHNAME "__i_subtract"
#define PARROT_VTABLE_I_SUBTRACT_INT_METHNAME "__i_subtract_int"
#define PARROT_VTABLE_I_SUBTRACT_FLOAT_METHNAME "__i_subtract_float"
#define PARROT_VTABLE_MULTIPLY_METHNAME "__multiply"
#define PARROT_VTABLE_MULTIPLY_INT_METHNAME "__multiply_int"
#define PARROT_VTABLE_MULTIPLY_FLOAT_METHNAME "__multiply_float"
#define PARROT_VTABLE_I_MULTIPLY_METHNAME "__i_multiply"
#define PARROT_VTABLE_I_MULTIPLY_INT_METHNAME "__i_multiply_int"
#define PARROT_VTABLE_I_MULTIPLY_FLOAT_METHNAME "__i_multiply_float"
#define PARROT_VTABLE_DIVIDE_METHNAME "__divide"
#define PARROT_VTABLE_DIVIDE_INT_METHNAME "__divide_int"
#define PARROT_VTABLE_DIVIDE_FLOAT_METHNAME "__divide_float"
#define PARROT_VTABLE_I_DIVIDE_METHNAME "__i_divide"
#define PARROT_VTABLE_I_DIVIDE_INT_METHNAME "__i_divide_int"
#define PARROT_VTABLE_I_DIVIDE_FLOAT_METHNAME "__i_divide_float"
#define PARROT_VTABLE_FLOOR_DIVIDE_METHNAME "__floor_divide"
#define PARROT_VTABLE_FLOOR_DIVIDE_INT_METHNAME "__floor_divide_int"
#define PARROT_VTABLE_FLOOR_DIVIDE_FLOAT_METHNAME "__floor_divide_float"
#define PARROT_VTABLE_I_FLOOR_DIVIDE_METHNAME "__i_floor_divide"
#define PARROT_VTABLE_I_FLOOR_DIVIDE_INT_METHNAME "__i_floor_divide_int"
#define PARROT_VTABLE_I_FLOOR_DIVIDE_FLOAT_METHNAME "__i_floor_divide_float"
#define PARROT_VTABLE_MODULUS_METHNAME "__modulus"
#define PARROT_VTABLE_MODULUS_INT_METHNAME "__modulus_int"
#define PARROT_VTABLE_MODULUS_FLOAT_METHNAME "__modulus_float"
#define PARROT_VTABLE_I_MODULUS_METHNAME "__i_modulus"
#define PARROT_VTABLE_I_MODULUS_INT_METHNAME "__i_modulus_int"
#define PARROT_VTABLE_I_MODULUS_FLOAT_METHNAME "__i_modulus_float"
#define PARROT_VTABLE_CMODULUS_METHNAME "__cmodulus"
#define PARROT_VTABLE_CMODULUS_INT_METHNAME "__cmodulus_int"
#define PARROT_VTABLE_CMODULUS_FLOAT_METHNAME "__cmodulus_float"
#define PARROT_VTABLE_I_CMODULUS_METHNAME "__i_cmodulus"
#define PARROT_VTABLE_I_CMODULUS_INT_METHNAME "__i_cmodulus_int"
#define PARROT_VTABLE_I_CMODULUS_FLOAT_METHNAME "__i_cmodulus_float"
#define PARROT_VTABLE_POW_METHNAME "__pow"
#define PARROT_VTABLE_POW_INT_METHNAME "__pow_int"
#define PARROT_VTABLE_POW_FLOAT_METHNAME "__pow_float"
#define PARROT_VTABLE_I_POW_METHNAME "__i_pow"
#define PARROT_VTABLE_I_POW_INT_METHNAME "__i_pow_int"
#define PARROT_VTABLE_I_POW_FLOAT_METHNAME "__i_pow_float"
#define PARROT_VTABLE_INCREMENT_METHNAME "__increment"
#define PARROT_VTABLE_DECREMENT_METHNAME "__decrement"
#define PARROT_VTABLE_ABSOLUTE_METHNAME "__absolute"
#define PARROT_VTABLE_I_ABSOLUTE_METHNAME "__i_absolute"
#define PARROT_VTABLE_NEG_METHNAME "__neg"
#define PARROT_VTABLE_I_NEG_METHNAME "__i_neg"
#define PARROT_VTABLE_BITWISE_OR_METHNAME "__bitwise_or"
#define PARROT_VTABLE_BITWISE_OR_INT_METHNAME "__bitwise_or_int"
#define PARROT_VTABLE_I_BITWISE_OR_METHNAME "__i_bitwise_or"
#define PARROT_VTABLE_I_BITWISE_OR_INT_METHNAME "__i_bitwise_or_int"
#define PARROT_VTABLE_BITWISE_AND_METHNAME "__bitwise_and"
#define PARROT_VTABLE_BITWISE_AND_INT_METHNAME "__bitwise_and_int"
#define PARROT_VTABLE_I_BITWISE_AND_METHNAME "__i_bitwise_and"
#define PARROT_VTABLE_I_BITWISE_AND_INT_METHNAME "__i_bitwise_and_int"
#define PARROT_VTABLE_BITWISE_XOR_METHNAME "__bitwise_xor"
#define PARROT_VTABLE_BITWISE_XOR_INT_METHNAME "__bitwise_xor_int"
#define PARROT_VTABLE_I_BITWISE_XOR_METHNAME "__i_bitwise_xor"
#define PARROT_VTABLE_I_BITWISE_XOR_INT_METHNAME "__i_bitwise_xor_int"
#define PARROT_VTABLE_BITWISE_ORS_METHNAME "__bitwise_ors"
#define PARROT_VTABLE_BITWISE_ORS_STR_METHNAME "__bitwise_ors_str"
#define PARROT_VTABLE_I_BITWISE_ORS_METHNAME "__i_bitwise_ors"
#define PARROT_VTABLE_I_BITWISE_ORS_STR_METHNAME "__i_bitwise_ors_str"
#define PARROT_VTABLE_BITWISE_ANDS_METHNAME "__bitwise_ands"
#define PARROT_VTABLE_BITWISE_ANDS_STR_METHNAME "__bitwise_ands_str"
#define PARROT_VTABLE_I_BITWISE_ANDS_METHNAME "__i_bitwise_ands"
#define PARROT_VTABLE_I_BITWISE_ANDS_STR_METHNAME "__i_bitwise_ands_str"
#define PARROT_VTABLE_BITWISE_XORS_METHNAME "__bitwise_xors"
#define PARROT_VTABLE_BITWISE_XORS_STR_METHNAME "__bitwise_xors_str"
#define PARROT_VTABLE_I_BITWISE_XORS_METHNAME "__i_bitwise_xors"
#define PARROT_VTABLE_I_BITWISE_XORS_STR_METHNAME "__i_bitwise_xors_str"
#define PARROT_VTABLE_BITWISE_NOT_METHNAME "__bitwise_not"
#define PARROT_VTABLE_I_BITWISE_NOT_METHNAME "__i_bitwise_not"
#define PARROT_VTABLE_BITWISE_NOTS_METHNAME "__bitwise_nots"
#define PARROT_VTABLE_I_BITWISE_NOTS_METHNAME "__i_bitwise_nots"
#define PARROT_VTABLE_BITWISE_SHL_METHNAME "__bitwise_shl"
#define PARROT_VTABLE_BITWISE_SHL_INT_METHNAME "__bitwise_shl_int"
#define PARROT_VTABLE_I_BITWISE_SHL_METHNAME "__i_bitwise_shl"
#define PARROT_VTABLE_I_BITWISE_SHL_INT_METHNAME "__i_bitwise_shl_int"
#define PARROT_VTABLE_BITWISE_SHR_METHNAME "__bitwise_shr"
#define PARROT_VTABLE_BITWISE_SHR_INT_METHNAME "__bitwise_shr_int"
#define PARROT_VTABLE_I_BITWISE_SHR_METHNAME "__i_bitwise_shr"
#define PARROT_VTABLE_I_BITWISE_SHR_INT_METHNAME "__i_bitwise_shr_int"
#define PARROT_VTABLE_BITWISE_LSR_METHNAME "__bitwise_lsr"
#define PARROT_VTABLE_BITWISE_LSR_INT_METHNAME "__bitwise_lsr_int"
#define PARROT_VTABLE_I_BITWISE_LSR_METHNAME "__i_bitwise_lsr"
#define PARROT_VTABLE_I_BITWISE_LSR_INT_METHNAME "__i_bitwise_lsr_int"
#define PARROT_VTABLE_IS_EQUAL_METHNAME "__is_equal"
#define PARROT_VTABLE_IS_EQUAL_NUM_METHNAME "__is_equal_num"
#define PARROT_VTABLE_IS_EQUAL_STRING_METHNAME "__is_equal_string"
#define PARROT_VTABLE_IS_SAME_METHNAME "__is_same"
#define PARROT_VTABLE_CMP_METHNAME "__cmp"
#define PARROT_VTABLE_CMP_NUM_METHNAME "__cmp_num"
#define PARROT_VTABLE_CMP_STRING_METHNAME "__cmp_string"
#define PARROT_VTABLE_LOGICAL_OR_METHNAME "__logical_or"
#define PARROT_VTABLE_LOGICAL_AND_METHNAME "__logical_and"
#define PARROT_VTABLE_LOGICAL_XOR_METHNAME "__logical_xor"
#define PARROT_VTABLE_LOGICAL_NOT_METHNAME "__logical_not"
#define PARROT_VTABLE_I_LOGICAL_NOT_METHNAME "__i_logical_not"
#define PARROT_VTABLE_CONCATENATE_METHNAME "__concatenate"
#define PARROT_VTABLE_CONCATENATE_STR_METHNAME "__concatenate_str"
#define PARROT_VTABLE_I_CONCATENATE_METHNAME "__i_concatenate"
#define PARROT_VTABLE_I_CONCATENATE_STR_METHNAME "__i_concatenate_str"
#define PARROT_VTABLE_REPEAT_METHNAME "__repeat"
#define PARROT_VTABLE_REPEAT_INT_METHNAME "__repeat_int"
#define PARROT_VTABLE_I_REPEAT_METHNAME "__i_repeat"
#define PARROT_VTABLE_I_REPEAT_INT_METHNAME "__i_repeat_int"
#define PARROT_VTABLE_SUBSTR_METHNAME "__substr"
#define PARROT_VTABLE_SUBSTR_STR_METHNAME "__substr_str"
#define PARROT_VTABLE_EXISTS_KEYED_METHNAME "__exists_keyed"
#define PARROT_VTABLE_EXISTS_KEYED_INT_METHNAME "__exists_keyed_int"
#define PARROT_VTABLE_EXISTS_KEYED_STR_METHNAME "__exists_keyed_str"
#define PARROT_VTABLE_DEFINED_METHNAME "__defined"
#define PARROT_VTABLE_DEFINED_KEYED_METHNAME "__defined_keyed"
#define PARROT_VTABLE_DEFINED_KEYED_INT_METHNAME "__defined_keyed_int"
#define PARROT_VTABLE_DEFINED_KEYED_STR_METHNAME "__defined_keyed_str"
#define PARROT_VTABLE_DELETE_KEYED_METHNAME "__delete_keyed"
#define PARROT_VTABLE_DELETE_KEYED_INT_METHNAME "__delete_keyed_int"
#define PARROT_VTABLE_DELETE_KEYED_STR_METHNAME "__delete_keyed_str"
#define PARROT_VTABLE_NEXTKEY_KEYED_METHNAME "__nextkey_keyed"
#define PARROT_VTABLE_NEXTKEY_KEYED_INT_METHNAME "__nextkey_keyed_int"
#define PARROT_VTABLE_NEXTKEY_KEYED_STR_METHNAME "__nextkey_keyed_str"
#define PARROT_VTABLE_GET_ITER_METHNAME "__get_iter"
#define PARROT_VTABLE_INVOKE_METHNAME "__invoke"
#define PARROT_VTABLE_CAN_METHNAME "__can"
#define PARROT_VTABLE_DOES_METHNAME "__does"
#define PARROT_VTABLE_ISA_METHNAME "__isa"
#define PARROT_VTABLE_SUBCLASS_METHNAME "__subclass"
#define PARROT_VTABLE_GET_ATTR_METHNAME "__get_attr"
#define PARROT_VTABLE_GET_ATTR_STR_METHNAME "__get_attr_str"
#define PARROT_VTABLE_SET_ATTR_METHNAME "__set_attr"
#define PARROT_VTABLE_SET_ATTR_STR_METHNAME "__set_attr_str"
#define PARROT_VTABLE_GET_CLASS_METHNAME "__get_class"
#define PARROT_VTABLE_ADD_PARENT_METHNAME "__add_parent"
#define PARROT_VTABLE_BECOME_PARENT_METHNAME "__become_parent"
#define PARROT_VTABLE_CLASS_TYPE_METHNAME "__class_type"
#define PARROT_VTABLE_ADD_METHOD_METHNAME "__add_method"
#define PARROT_VTABLE_REMOVE_METHOD_METHNAME "__remove_method"
#define PARROT_VTABLE_NEW_SINGLETON_METHNAME "__new_singleton"
#define PARROT_VTABLE_GET_ANONYMOUS_SUBCLASS_METHNAME "__get_anonymous_subclass"
#define PARROT_VTABLE_FREEZE_METHNAME "__freeze"
#define PARROT_VTABLE_THAW_METHNAME "__thaw"
#define PARROT_VTABLE_THAWFINISH_METHNAME "__thawfinish"
#define PARROT_VTABLE_VISIT_METHNAME "__visit"
#define PARROT_VTABLE_SHARE_METHNAME "__share"
/* &end_gen */

/*
 * vtable slot names
 */
#ifdef PARROT_IN_OBJECTS_C
static const char * const Parrot_vtable_slot_names[] = {
    "",     /* Pointer to namespace for this class */
    "",     /* 'type' value for MMD */
    "",     /* Name of class this vtable is for */
    "",     /* Flags. Duh */
    "",     /* space-separated list of interfaces */
    "",     /* space-separated list of classes */
    "",     /* class */
    "",     /* mro */

    /* Vtable Functions */
        "__init",
        "__init_pmc",
        "__instantiate",
        "__new_from_string",
        "__morph",
        "__mark",
        "__destroy",
        "__namespace",
        "__getprop",
        "__setprop",
        "__delprop",
        "__getprops",
        "__type",
        "__type_keyed",
        "__type_keyed_int",
        "__type_keyed_str",
        "__subtype",
        "__name",
        "__clone",
        "__find_method",
        "__hash",
        "__get_integer",
        "__get_integer_keyed",
        "__get_integer_keyed_int",
        "__get_integer_keyed_str",
        "__get_number",
        "__get_number_keyed",
        "__get_number_keyed_int",
        "__get_number_keyed_str",
        "__get_bignum",
        "__get_string",
        "__get_repr",
        "__get_string_keyed",
        "__get_string_keyed_int",
        "__get_string_keyed_str",
        "__get_bool",
        "__get_pmc",
        "__get_pmc_keyed",
        "__get_pmc_keyed_int",
        "__get_pmc_keyed_str",
        "__slice",
        "__get_pointer",
        "__get_pointer_keyed",
        "__get_pointer_keyed_int",
        "__get_pointer_keyed_str",
        "__set_integer_native",
        "__set_integer_same",
        "__set_integer_keyed",
        "__set_integer_keyed_int",
        "__set_integer_keyed_str",
        "__set_number_native",
        "__set_number_same",
        "__set_number_keyed",
        "__set_number_keyed_int",
        "__set_number_keyed_str",
        "__set_bignum_int",
        "__set_bignum_num",
        "__set_bignum_str",
        "__set_string_native",
        "__assign_string_native",
        "__set_string_same",
        "__set_string_keyed",
        "__set_string_keyed_int",
        "__set_string_keyed_str",
        "__set_bool",
        "__set_pmc",
        "__assign_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",
        "__elements",
        "__pop_integer",
        "__pop_float",
        "__pop_string",
        "__pop_pmc",
        "__push_integer",
        "__push_float",
        "__push_string",
        "__push_pmc",
        "__shift_integer",
        "__shift_float",
        "__shift_string",
        "__shift_pmc",
        "__unshift_integer",
        "__unshift_float",
        "__unshift_string",
        "__unshift_pmc",
        "__splice",
        "__increment",
        "__decrement",
        "__absolute",
        "__i_absolute",
        "__neg",
        "__i_neg",
        "__bitwise_not",
        "__i_bitwise_not",
        "__bitwise_nots",
        "__i_bitwise_nots",
        "__is_same",
        "__logical_not",
        "__i_logical_not",
        "__substr",
        "__substr_str",
        "__exists_keyed",
        "__exists_keyed_int",
        "__exists_keyed_str",
        "__defined",
        "__defined_keyed",
        "__defined_keyed_int",
        "__defined_keyed_str",
        "__delete_keyed",
        "__delete_keyed_int",
        "__delete_keyed_str",
        "__nextkey_keyed",
        "__nextkey_keyed_int",
        "__nextkey_keyed_str",
        "__get_iter",
        "__invoke",
        "__can",
        "__does",
        "__isa",
        "__subclass",
        "__get_attr",
        "__get_attr_str",
        "__set_attr",
        "__set_attr_str",
        "__get_class",
        "__add_parent",
        "__become_parent",
        "__class_type",
        "__add_method",
        "__remove_method",
        "__new_singleton",
        "__get_anonymous_subclass",
        "__freeze",
        "__thaw",
        "__thawfinish",
        "__visit",
        "__share",
    NULL
};

#endif /* PARROT_IN_OBJECTS_C */

/* Need this for add, subtract, multiply, divide, mod, cmod, bitwise
   (and, or, xor, lshift, rshift), concat, logical (and, or, xor),
   repeat, eq, cmp */

/* &gen_from_enum(mmd.pasm) */

typedef enum {
        MMD_ADD,
        MMD_I_ADD,
        MMD_SUBTRACT,
        MMD_I_SUBTRACT,
        MMD_MULTIPLY,
        MMD_I_MULTIPLY,
        MMD_DIVIDE,
        MMD_I_DIVIDE,
        MMD_FLOOR_DIVIDE,
        MMD_I_FLOOR_DIVIDE,
        MMD_MOD,
        MMD_I_MOD,
        MMD_CMOD,
        MMD_I_CMOD,
        MMD_POW,
        MMD_I_POW,
        MMD_BOR,
        MMD_I_BOR,
        MMD_BAND,
        MMD_I_BAND,
        MMD_BXOR,
        MMD_I_BXOR,
        MMD_SOR,
        MMD_I_SOR,
        MMD_SAND,
        MMD_I_SAND,
        MMD_SXOR,
        MMD_I_SXOR,
        MMD_BSL,
        MMD_I_BSL,
        MMD_BSR,
        MMD_I_BSR,
        MMD_LSR,
        MMD_I_LSR,
        MMD_EQ,
        MMD_NUMEQ,
        MMD_STREQ,
        MMD_CMP,
        MMD_NUMCMP,
        MMD_STRCMP,
        MMD_LOR,
        MMD_LAND,
        MMD_LXOR,
        MMD_CONCAT,
        MMD_I_CONCAT,
        MMD_REPEAT,
        MMD_I_REPEAT,
        MMD_USER_FIRST
} parrot_mmd_func_enum;

/* &end_gen */

#ifdef PARROT_IN_OBJECTS_C
static const char * const Parrot_mmd_func_names[] = {
        "__add",
        "__i_add",
        "__subtract",
        "__i_subtract",
        "__multiply",
        "__i_multiply",
        "__divide",
        "__i_divide",
        "__floor_divide",
        "__i_floor_divide",
        "__modulus",
        "__i_modulus",
        "__cmodulus",
        "__i_cmodulus",
        "__pow",
        "__i_pow",
        "__bitwise_or",
        "__i_bitwise_or",
        "__bitwise_and",
        "__i_bitwise_and",
        "__bitwise_xor",
        "__i_bitwise_xor",
        "__bitwise_ors",
        "__i_bitwise_ors",
        "__bitwise_ands",
        "__i_bitwise_ands",
        "__bitwise_xors",
        "__i_bitwise_xors",
        "__bitwise_shl",
        "__i_bitwise_shl",
        "__bitwise_shr",
        "__i_bitwise_shr",
        "__bitwise_lsr",
        "__i_bitwise_lsr",
        "__is_equal",
        "__is_equal_num",
        "__is_equal_string",
        "__cmp",
        "__cmp_num",
        "__cmp_string",
        "__logical_or",
        "__logical_and",
        "__logical_xor",
        "__concatenate",
        "__i_concatenate",
        "__repeat",
        "__i_repeat",
    NULL
};

#endif

#endif
