Object-Pad
view release on metacpan or search on metacpan
share/include/object_pad.h view on Meta::CPAN
SV *(*parse)(pTHX_ FieldMeta *fieldmeta, SV *valuesrc, void *funcdata);
/* called immediately at apply time; return FALSE means it did its thing immediately, so don't store it */
bool (*apply)(pTHX_ FieldMeta *fieldmeta, SV *value, SV **attrdata_ptr, void *funcdata);
/* called at the end of `has` statement compiletime */
void (*seal)(pTHX_ FieldMeta *fieldmeta, SV *attrdata, void *funcdata);
/* called as part of accessor generation */
void (*gen_accessor_ops)(pTHX_ FieldMeta *fieldmeta, SV *attrdata, void *funcdata,
enum AccessorType type, struct AccessorGenerationCtx *ctx);
/* called by constructor */
union {
void (*post_makefield)(pTHX_ FieldMeta *fieldmeta, SV *attrdata, void *funcdata, SV *field);
// This used to be called post_initfield but was badly named because it
// actually ran *before* initfields
void (*post_initfield)(pTHX_ FieldMeta *fieldmeta, SV *attrdata, void *funcdata, SV *field);
};
void (*post_construct)(pTHX_ FieldMeta *fieldmeta, SV *attrdata, void *funcdata, SV *field);
/* called as part of constructor generation
* TODO: Not yet used by accessors, but maybe a future version will add a
* flag to do this.
*/
OP *(*gen_valueassert_op)(pTHX_ FieldMeta *fieldmeta, SV *attrdata, void *funcdata, OP *valueop);
};
struct FieldHook {
FIELDOFFSET fieldix; /* unused when in FieldMeta->hooks; used by ClassMeta->fieldhooks_* */
FieldMeta *fieldmeta;
const struct FieldHookFuncs *funcs;
void *funcdata;
SV *attrdata; /* used to be called 'hookdata' */
};
enum MetaType {
METATYPE_CLASS,
METATYPE_ROLE,
};
enum ReprType {
REPR_NATIVE, /* instances are in native format - blessed AV as backing */
REPR_HASH, /* instances are blessed HASHes; our backing lives in $self->{"Object::Pad/slots"} */
REPR_MAGIC, /* instances store backing AV via magic; superconstructor must be foreign */
REPR_AUTOSELECT, /* pick one of the above depending on foreign_new and SvTYPE()==SVt_PVHV */
REPR_KEYS, /* instances are blessed HASHes, each field lives in an individually-named key */
REPR_PVOBJ, /* instances are SVt_PVOBJ on perl 5.38+ */
};
/* Special pad indexes within `method` CVs */
enum {
PADIX_SELF = 1,
PADIX_FIELDS = 2,
/* for role methods */
PADIX_EMBEDDING = 3,
/* during initfields */
PADIX_PARAMS = 4,
};
/* Function prototypes */
#define get_compclassmeta() ObjectPad_get_compclassmeta(aTHX)
ClassMeta *ObjectPad_get_compclassmeta(pTHX);
#define extend_pad_vars(meta) ObjectPad_extend_pad_vars(aTHX_ meta)
void ObjectPad_extend_pad_vars(pTHX_ const ClassMeta *meta);
#define get_field_for_padix(padix) ObjectPad_get_field_for_padix(aTHX_ padix)
FieldMeta *ObjectPad_get_field_for_padix(pTHX_ PADOFFSET padix);
enum {
/* Common flags for newMETHSTARTOP and newFIELDSVOP */
OPfMETHSTART_ROLE = (1 << 16),
};
#define newMETHSTARTOP(flags) ObjectPad_newMETHSTARTOP(aTHX_ flags)
OP *ObjectPad_newMETHSTARTOP(pTHX_ U32 flags);
#define newCOMMONMETHSTARTOP(flags) ObjectPad_newCOMMONMETHSTARTOP(aTHX_ flags)
OP *ObjectPad_newCOMMONMETHSTARTOP(pTHX_ U32 flags);
/* op_private flags on FIELDPAD ops */
enum {
OPpFIELDPAD_SV, /* has $x */
OPpFIELDPAD_AV, /* has @y */
OPpFIELDPAD_HV, /* has %z */
};
/* Deprecated */
#define get_obj_backingav(self, repr, create) ObjectPad_get_obj_backingav(aTHX_ self, repr, create)
SV *ObjectPad_get_obj_backingav(pTHX_ SV *self, enum ReprType repr, bool create);
#define get_obj_fieldstore(self, repr, create) ObjectPad_get_obj_fieldstore(aTHX_ self, repr, create)
SV *ObjectPad_get_obj_fieldstore(pTHX_ SV *self, enum ReprType repr, bool create);
#define get_obj_fieldsv(self, fieldmeta) ObjectPad_get_obj_fieldsv(aTHX_ self, fieldmeta)
SV *ObjectPad_get_obj_fieldsv(pTHX_ SV *self, FieldMeta *fieldmeta);
/* Class API */
#define mop_create_class(type, name) ObjectPad_mop_create_class(aTHX_ type, name)
ClassMeta *ObjectPad_mop_create_class(pTHX_ enum MetaType type, SV *name);
#define mop_get_class_for_stash(stash) ObjectPad_mop_get_class_for_stash(aTHX_ stash)
ClassMeta *ObjectPad_mop_get_class_for_stash(pTHX_ HV *stash);
#define mop_class_get_name(class) ObjectPad_mop_class_get_name(aTHX_ class)
SV *ObjectPad_mop_class_get_name(pTHX_ ClassMeta *class);
#define mop_class_load_and_set_superclass(class, supername, superver) ObjectPad_mop_class_load_and_set_superclass(aTHX_ class, supername, superver)
void ObjectPad_mop_class_load_and_set_superclass(pTHX_ ClassMeta *class, SV *supername, SV *superver);
#define mop_class_set_superclass(class, super) ObjectPad_mop_class_set_superclass(aTHX_ class, super)
void ObjectPad_mop_class_set_superclass(pTHX_ ClassMeta *class, SV *superclassname);
( run in 0.882 second using v1.01-cache-2.11-cpan-71847e10f99 )