3 * Copyright (C) 2022 by Paul Evans and others
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
10 /* This file contains the code that implements perl's new `use feature 'class'`
15 #define PERL_IN_CLASS_C
26 Perl_croak_kw_unless_class(pTHX_ const char *kw)
28 PERL_ARGS_ASSERT_CROAK_KW_UNLESS_CLASS;
30 if(!HvSTASH_IS_CLASS(PL_curstash))
31 croak("Cannot '%s' outside of a 'class'", kw);
34 #define newSVobject(fieldcount) Perl_newSVobject(aTHX_ fieldcount)
36 Perl_newSVobject(pTHX_ Size_t fieldcount)
38 SV *sv = newSV_type(SVt_PVOBJ);
40 Newx(ObjectFIELDS(sv), fieldcount, SV *);
41 ObjectMAXFIELD(sv) = fieldcount - 1;
43 Zero(ObjectFIELDS(sv), fieldcount, SV *);
50 UNOP_AUX_item *aux = cUNOP_AUX->op_aux;
52 SV *self = PAD_SVl(PADIX_SELF);
53 assert(SvTYPE(SvRV(self)) == SVt_PVOBJ);
54 SV *instance = SvRV(self);
56 SV **fields = ObjectFIELDS(instance);
58 PADOFFSET fieldix = aux[0].uv;
62 switch(PL_op->op_private & (OPpINITFIELD_AV|OPpINITFIELD_HV)) {
64 if(PL_op->op_flags & OPf_STACKED) {
65 val = newSVsv(*PL_stack_sp);
75 if(PL_op->op_flags & OPf_STACKED) {
76 SV **svp = PL_stack_base + POPMARK + 1;
77 STRLEN count = PL_stack_sp - svp + 1;
79 av = newAV_alloc_x(count);
81 while(svp <= PL_stack_sp) {
82 av_push_simple(av, newSVsv(*svp));
85 rpp_popfree_to(PL_stack_sp - count);
96 if(PL_op->op_flags & OPf_STACKED) {
97 SV **svp = PL_stack_base + POPMARK + 1;
98 STRLEN svcount = PL_stack_sp - svp + 1;
102 packWARN(WARN_MISC), "Odd number of elements in hash field initialization");
104 while(svp <= PL_stack_sp) {
105 SV *key = *svp; svp++;
106 SV *val = svp <= PL_stack_sp ? *svp : &PL_sv_undef; svp++;
108 (void)hv_store_ent(hv, key, newSVsv(val), 0);
110 rpp_popfree_to(PL_stack_sp - svcount);
117 fields[fieldix] = val;
119 PADOFFSET padix = PL_op->op_targ;
121 SAVESPTR(PAD_SVl(padix));
122 SV *sv = PAD_SVl(padix) = SvREFCNT_inc(val);
129 XS(injected_constructor);
130 XS(injected_constructor)
134 HV *stash = (HV *)XSANY.any_sv;
135 assert(HvSTASH_IS_CLASS(stash));
137 struct xpvhv_aux *aux = HvAUX(stash);
140 Perl_warn(aTHX_ "Odd number of arguments passed to %" HvNAMEf_QUOTEDPREFIX " constructor",
145 /* Set up params HV */
147 SAVEFREESV((SV *)params);
149 for(SSize_t i = 1; i < items; i += 2) {
151 SV *val = (i+1 < items) ? ST(i+1) : &PL_sv_undef;
153 /* TODO: think about sanity-checking name for being
155 * not ref (but overloaded objects?? boo)
157 * But then, %params = @_; wouldn't do that
160 (void)hv_store_ent(params, name, SvREFCNT_inc(val), 0);
164 SV *instance = newSVobject(aux->xhv_class_next_fieldix);
165 SvOBJECT_on(instance);
166 SvSTASH_set(instance, MUTABLE_HV(SvREFCNT_inc_simple(stash)));
168 SV *self = sv_2mortal(newRV_noinc(instance));
170 assert(aux->xhv_class_initfields_cv);
179 PUSHs((SV *)params); // yes a raw HV
184 call_sv((SV *)aux->xhv_class_initfields_cv, G_VOID);
192 if(aux->xhv_class_adjust_blocks) {
193 CV **cvp = (CV **)AvARRAY(aux->xhv_class_adjust_blocks);
194 U32 nblocks = av_count(aux->xhv_class_adjust_blocks);
196 for(U32 i = 0; i < nblocks; i++) {
204 PUSHs(self); /* I don't believe this needs to be an sv_mortalcopy() */
207 call_sv((SV *)cvp[i], G_VOID);
216 if(params && hv_iterinit(params) > 0) {
217 /* TODO: consider sorting these into a canonical order, but that's awkward */
218 HE *he = hv_iternext(params);
220 SV *paramnames = newSVsv(HeSVKEY_force(he));
221 SAVEFREESV(paramnames);
223 while((he = hv_iternext(params)))
224 Perl_sv_catpvf(aTHX_ paramnames, ", %" SVf, SVfARG(HeSVKEY_force(he)));
226 croak("Unrecognised parameters for %" HvNAMEf_QUOTEDPREFIX " constructor: %" SVf,
227 HvNAMEfARG(stash), SVfARG(paramnames));
235 /* OP_METHSTART is an UNOP_AUX whose AUX list contains
236 * [0].uv = count of fieldbinding pairs
237 * [1].uv = maximum fieldidx found in the binding list
238 * [...] = pairs of (padix, fieldix) to bind in .uv fields
241 /* TODO: People would probably expect to find this in pp.c ;) */
244 /* note that if AvREAL(@_), be careful not to leak self:
245 * so keep it in @_ for now, and only shift it later */
246 SV *self = *(av_fetch(GvAV(PL_defgv), 0, 1));
249 /* pp_methstart happens before the first OP_NEXTSTATE of the method body,
250 * meaning PL_curcop still points at the callsite. This is useful for
251 * croak() messages. However, it means we have to find our current stash
252 * via a different technique.
255 if(LIKELY(CxTYPE(CX_CUR()) == CXt_SUB))
256 curcv = CX_CUR()->blk_sub.cv;
258 curcv = find_runcv(NULL);
261 !SvOBJECT((rv = SvRV(self))) ||
262 SvTYPE(rv) != SVt_PVOBJ) {
263 HEK *namehek = CvGvNAME_HEK(curcv);
265 namehek ? "Cannot invoke method %" HEKf_QUOTEDPREFIX " on a non-instance" :
266 "Cannot invoke method on a non-instance",
270 if(CvSTASH(curcv) != SvSTASH(rv) &&
271 !sv_derived_from_hv(self, CvSTASH(curcv)))
272 croak("Cannot invoke a method of %" HvNAMEf_QUOTEDPREFIX " on an instance of %" HvNAMEf_QUOTEDPREFIX,
273 HvNAMEfARG(CvSTASH(curcv)), HvNAMEfARG(SvSTASH(rv)));
275 save_clearsv(&PAD_SVl(PADIX_SELF));
276 sv_setsv(PAD_SVl(PADIX_SELF), self);
278 UNOP_AUX_item *aux = cUNOP_AUX->op_aux;
280 assert(SvTYPE(SvRV(self)) == SVt_PVOBJ);
281 SV *instance = SvRV(self);
282 SV **fieldp = ObjectFIELDS(instance);
284 U32 fieldcount = (aux++)->uv;
285 U32 max_fieldix = (aux++)->uv;
287 assert((U32)(ObjectMAXFIELD(instance)+1) > max_fieldix);
288 PERL_UNUSED_VAR(max_fieldix);
290 for(Size_t i = 0; i < fieldcount; i++) {
291 PADOFFSET padix = (aux++)->uv;
292 U32 fieldix = (aux++)->uv;
294 assert(fieldp[fieldix]);
296 /* TODO: There isn't a convenient SAVE macro for doing both these
297 * steps in one go. Add one. */
298 SAVESPTR(PAD_SVl(padix));
299 SV *sv = PAD_SVl(padix) = SvREFCNT_inc(fieldp[fieldix]);
304 /* safe to shift and free self now */
305 self = av_shift(GvAV(PL_defgv));
306 if (AvREAL(GvAV(PL_defgv)))
307 SvREFCNT_dec_NN(self);
309 if(PL_op->op_private & OPpINITFIELDS) {
310 SV *params = *av_fetch(GvAV(PL_defgv), 0, 0);
311 if(params && SvTYPE(params) == SVt_PVHV) {
312 SAVESPTR(PAD_SVl(PADIX_PARAMS));
313 PAD_SVl(PADIX_PARAMS) = SvREFCNT_inc(params);
322 invoke_class_seal(pTHX_ void *_arg)
324 class_seal_stash((HV *)_arg);
328 Perl_class_setup_stash(pTHX_ HV *stash)
330 PERL_ARGS_ASSERT_CLASS_SETUP_STASH;
332 assert(HvHasAUX(stash));
334 if(HvSTASH_IS_CLASS(stash)) {
335 croak("Cannot reopen existing class %" HvNAMEf_QUOTEDPREFIX,
340 SV *isaname = newSVpvf("%" HEKf "::ISA", HvNAME_HEK(stash));
343 AV *isa = get_av(SvPV_nolen(isaname), (SvFLAGS(isaname) & SVf_UTF8));
345 if(isa && av_count(isa) > 0)
346 croak("Cannot create class %" HEKf " as it already has a non-empty @ISA",
350 char *classname = HvNAME(stash);
351 U32 nameflags = HvNAMEUTF8(stash) ? SVf_UTF8 : 0;
354 * Set some kind of flag on the stash to point out it's a class
355 * Allocate storage for all the extra things a class needs
356 * See https://github.com/leonerd/perl5/discussions/1
359 /* Inject the constructor */
361 SV *newname = Perl_newSVpvf(aTHX_ "%s::new", classname);
364 CV *newcv = newXS_flags(SvPV_nolen(newname), injected_constructor, __FILE__, NULL, nameflags);
365 CvXSUBANY(newcv).any_sv = (SV *)stash;
366 CvREFCOUNTED_ANYSV_on(newcv);
373 struct xpvhv_aux *aux = HvAUX(stash);
374 aux->xhv_class_superclass = NULL;
375 aux->xhv_class_initfields_cv = NULL;
376 aux->xhv_class_adjust_blocks = NULL;
377 aux->xhv_class_fields = NULL;
378 aux->xhv_class_next_fieldix = 0;
379 aux->xhv_class_param_map = NULL;
381 aux->xhv_aux_flags |= HvAUXf_IS_CLASS;
383 SAVEDESTRUCTOR_X(invoke_class_seal, stash);
385 /* Prepare a suspended compcv for parsing field init expressions */
387 I32 floor_ix = start_subparse(FALSE, 0);
389 CvIsMETHOD_on(PL_compcv);
391 /* We don't want to make `$self` visible during the expression but we
392 * still need to give it a name. Make it unusable from pure perl
394 PADOFFSET padix = pad_add_name_pvs("$(self)", 0, NULL, NULL);
395 assert(padix == PADIX_SELF);
397 padix = pad_add_name_pvs("%(params)", 0, NULL, NULL);
398 assert(padix == PADIX_PARAMS);
400 PERL_UNUSED_VAR(padix);
402 Newx(aux->xhv_class_suspended_initfields_compcv, 1, struct suspended_compcv);
403 suspend_compcv(aux->xhv_class_suspended_initfields_compcv);
405 LEAVE_SCOPE(floor_ix);
409 #define split_package_ver(value, pkgname, pkgversion) S_split_package_ver(aTHX_ value, pkgname, pkgversion)
410 static const char *S_split_package_ver(pTHX_ SV *value, SV *pkgname, SV *pkgversion)
412 const char *start = SvPVX(value),
414 *end = start + SvCUR(value);
416 while(*p && !isSPACE_utf8_safe(p, end))
419 sv_setpvn(pkgname, start, p - start);
423 while(*p && isSPACE_utf8_safe(p, end))
427 /* scan_version() gets upset about trailing content. We need to extract
428 * exactly what it wants
433 while(*p && strchr("0123456789._", *p))
435 SV *tmpsv = newSVpvn(start, p - start);
438 scan_version(SvPVX(tmpsv), pkgversion, FALSE);
441 while(*p && isSPACE_utf8_safe(p, end))
447 #define ensure_module_version(module, version) S_ensure_module_version(aTHX_ module, version)
448 static void S_ensure_module_version(pTHX_ SV *module, SV *version)
452 PUSHMARK(PL_stack_sp);
453 rpp_xpush_2(module, version);
454 call_method("VERSION", G_VOID);
459 #define split_attr_nameval(sv, namp, valp) S_split_attr_nameval(aTHX_ sv, namp, valp)
460 static void S_split_attr_nameval(pTHX_ SV *sv, SV **namp, SV **valp)
462 STRLEN svlen = SvCUR(sv);
463 bool do_utf8 = SvUTF8(sv);
465 const char *paren_at = (const char *)memchr(SvPVX(sv), '(', svlen);
467 STRLEN namelen = paren_at - SvPVX(sv);
469 if(SvPVX(sv)[svlen-1] != ')')
470 /* Should be impossible to reach this by parsing regular perl code
471 * by as class_apply_attributes() is XS-visible API it might still
472 * be reachable. As it's likely unreachable by normal perl code,
473 * don't bother listing it in perldiag.
475 /* diag_listed_as: SKIPME */
476 croak("Malformed attribute string");
477 *namp = sv_2mortal(newSVpvn_utf8(SvPVX(sv), namelen, do_utf8));
479 const char *value_at = paren_at + 1;
480 const char *value_max = SvPVX(sv) + svlen - 2;
482 /* TODO: We're only obeying ASCII whitespace here */
484 /* Trim whitespace at the start */
485 while(value_at < value_max && isSPACE(*value_at))
487 while(value_max > value_at && isSPACE(*value_max))
490 if(value_max >= value_at)
491 *valp = sv_2mortal(newSVpvn_utf8(value_at, value_max - value_at + 1, do_utf8));
500 apply_class_attribute_isa(pTHX_ HV *stash, SV *value)
502 assert(HvSTASH_IS_CLASS(stash));
503 struct xpvhv_aux *aux = HvAUX(stash);
505 /* Parse `value` into name + version */
506 SV *superclassname = sv_newmortal(), *superclassver = sv_newmortal();
507 const char *end = split_package_ver(value, superclassname, superclassver);
509 croak("Unexpected characters while parsing class :isa attribute: %s", end);
511 if(aux->xhv_class_superclass)
512 croak("Class already has a superclass, cannot add another");
514 HV *superstash = gv_stashsv(superclassname, 0);
515 if (!superstash || !HvSTASH_IS_CLASS(superstash)) {
516 /* Try to `require` the module then attempt a second time */
517 load_module(PERL_LOADMOD_NOIMPORT, newSVsv(superclassname), NULL, NULL);
518 superstash = gv_stashsv(superclassname, 0);
520 if(!superstash || !HvSTASH_IS_CLASS(superstash))
521 /* TODO: This would be a useful feature addition */
522 croak("Class :isa attribute requires a class but %" HvNAMEf_QUOTEDPREFIX " is not one",
523 HvNAMEfARG(superstash));
525 if(superclassver && SvOK(superclassver))
526 ensure_module_version(superclassname, superclassver);
528 /* TODO: Suuuurely there's a way to fetch this neatly with stash + "ISA"
529 * You'd think that GvAV() of hv_fetchs() would do it, but no, because it
530 * won't lazily create a proper (magical) GV if one didn't already exist.
533 SV *isaname = newSVpvf("%" HEKf "::ISA", HvNAME_HEK(stash));
536 AV *isa = get_av(SvPV_nolen(isaname), GV_ADD | (SvFLAGS(isaname) & SVf_UTF8));
540 /* Temporarily remove the SVf_READONLY flag */
541 SAVESETSVFLAGS((SV *)isa, SVf_READONLY|SVf_PROTECT, SVf_READONLY|SVf_PROTECT);
542 SvREADONLY_off((SV *)isa);
544 av_push(isa, newSVsv(value));
549 aux->xhv_class_superclass = (HV *)SvREFCNT_inc(superstash);
551 struct xpvhv_aux *superaux = HvAUX(superstash);
553 aux->xhv_class_next_fieldix = superaux->xhv_class_next_fieldix;
555 if(superaux->xhv_class_adjust_blocks) {
556 if(!aux->xhv_class_adjust_blocks)
557 aux->xhv_class_adjust_blocks = newAV();
559 for(SSize_t i = 0; i <= AvFILL(superaux->xhv_class_adjust_blocks); i++)
560 av_push(aux->xhv_class_adjust_blocks, AvARRAY(superaux->xhv_class_adjust_blocks)[i]);
563 if(superaux->xhv_class_param_map) {
564 aux->xhv_class_param_map = newHVhv(superaux->xhv_class_param_map);
571 void (*apply)(pTHX_ HV *stash, SV *value);
572 } const class_attributes[] = {
574 .requires_value = true,
575 .apply = &apply_class_attribute_isa,
577 { NULL, false, NULL }
581 S_class_apply_attribute(pTHX_ HV *stash, OP *attr)
583 assert(attr->op_type == OP_CONST);
586 split_attr_nameval(cSVOPx_sv(attr), &name, &value);
588 for(int i = 0; class_attributes[i].name; i++) {
589 /* TODO: These attribute names are not UTF-8 aware */
590 if(!strEQ(SvPVX(name), class_attributes[i].name))
593 if(class_attributes[i].requires_value && !(value && SvOK(value)))
594 croak("Class attribute %" SVf " requires a value", SVfARG(name));
596 (*class_attributes[i].apply)(aTHX_ stash, value);
600 croak("Unrecognized class attribute %" SVf, SVfARG(name));
604 Perl_class_apply_attributes(pTHX_ HV *stash, OP *attrlist)
606 PERL_ARGS_ASSERT_CLASS_APPLY_ATTRIBUTES;
610 if(attrlist->op_type == OP_NULL) {
615 if(attrlist->op_type == OP_LIST) {
616 OP *o = cLISTOPx(attrlist)->op_first;
617 assert(o->op_type == OP_PUSHMARK);
620 for(; o; o = OpSIBLING(o))
621 S_class_apply_attribute(aTHX_ stash, o);
624 S_class_apply_attribute(aTHX_ stash, attrlist);
630 Perl_class_seal_stash(pTHX_ HV *stash)
632 PERL_ARGS_ASSERT_CLASS_SEAL_STASH;
634 assert(HvSTASH_IS_CLASS(stash));
635 struct xpvhv_aux *aux = HvAUX(stash);
637 if (PL_parser->error_count == 0) {
638 /* generate initfields CV */
639 I32 floor_ix = PL_savestack_ix;
641 save_item(PL_subname);
643 resume_compcv_final(aux->xhv_class_suspended_initfields_compcv);
645 /* Some OP_INITFIELD ops will need to populate the pad with their
646 * result because later ops will rely on it. There's no need to do
647 * this for every op though. Store a mapping to work out which ones
650 PADNAMELIST *pnl = PadlistNAMES(CvPADLIST(PL_compcv));
651 HV *fieldix_to_padix = newHV();
652 SAVEFREESV((SV *)fieldix_to_padix);
654 /* padix 0 == @_; padix 1 == $self. Start at 2 */
655 for(PADOFFSET padix = 2; padix <= PadnamelistMAX(pnl); padix++) {
656 PADNAME *pn = PadnamelistARRAY(pnl)[padix];
657 if(!pn || !PadnameIsFIELD(pn))
660 U32 fieldix = PadnameFIELDINFO(pn)->fieldix;
661 (void)hv_store_ent(fieldix_to_padix, sv_2mortal(newSVuv(fieldix)), newSVuv(padix), 0);
666 ops = op_append_list(OP_LINESEQ, ops,
667 newUNOP_AUX(OP_METHSTART, OPpINITFIELDS << 8, NULL, NULL));
669 if(aux->xhv_class_superclass) {
670 HV *superstash = aux->xhv_class_superclass;
671 assert(HvSTASH_IS_CLASS(superstash));
672 struct xpvhv_aux *superaux = HvAUX(superstash);
674 /* Build an OP_ENTERSUB */
675 OP *o = newLISTOPn(OP_ENTERSUB, OPf_WANT_VOID|OPf_STACKED,
676 newPADxVOP(OP_PADSV, 0, PADIX_SELF),
677 newPADxVOP(OP_PADHV, OPf_REF, PADIX_PARAMS),
678 /* TODO: This won't work at all well under `use threads` because
679 * it embeds the CV * to the superclass initfields CV right into
680 * the optree. Maybe we'll have to pop it in the pad or something
682 newSVOP(OP_CONST, 0, (SV *)superaux->xhv_class_initfields_cv),
685 ops = op_append_list(OP_LINESEQ, ops, o);
688 PADNAMELIST *fieldnames = aux->xhv_class_fields;
690 for(SSize_t i = 0; fieldnames && i <= PadnamelistMAX(fieldnames); i++) {
691 PADNAME *pn = PadnamelistARRAY(fieldnames)[i];
692 char sigil = PadnamePV(pn)[0];
693 PADOFFSET fieldix = PadnameFIELDINFO(pn)->fieldix;
695 /* Extract the OP_{NEXT,DB}STATE op from the defop so we can
698 OP *valop = PadnameFIELDINFO(pn)->defop;
699 if(valop && valop->op_type == OP_LINESEQ) {
700 OP *o = cLISTOPx(valop)->op_first;
701 cLISTOPx(valop)->op_first = NULL;
702 cLISTOPx(valop)->op_last = NULL;
703 /* have to clear the OPf_KIDS flag or op_free() will get upset */
704 valop->op_flags &= ~OPf_KIDS;
708 assert(fieldcop->op_type == OP_NEXTSTATE || fieldcop->op_type == OP_DBSTATE);
710 OpLASTSIB_set(fieldcop, NULL);
713 OpLASTSIB_set(valop, NULL);
715 ops = op_append_list(OP_LINESEQ, ops, fieldcop);
718 SV *paramname = PadnameFIELDINFO(pn)->paramname;
726 newSVpvf("Required parameter '%" SVf "' is missing for %" HvNAMEf_QUOTEDPREFIX " constructor",
727 SVfARG(paramname), HvNAMEfARG(stash));
728 valop = newLISTOPn(OP_DIE, 0,
729 newSVOP(OP_CONST, 0, message),
734 newBINOP(OP_HELEM, 0,
735 newPADxVOP(OP_PADHV, OPf_REF, PADIX_PARAMS),
736 newSVOP(OP_CONST, 0, SvREFCNT_inc(paramname)));
738 if(PadnameFIELDINFO(pn)->def_if_undef) {
739 /* delete $params{$paramname} // DEFOP */
740 valop = newLOGOP(OP_DOR, 0,
741 newUNOP(OP_DELETE, 0, helemop), valop);
743 else if(PadnameFIELDINFO(pn)->def_if_false) {
744 /* delete $params{$paramname} || DEFOP */
745 valop = newLOGOP(OP_OR, 0,
746 newUNOP(OP_DELETE, 0, helemop), valop);
749 /* exists $params{$paramname} ? delete $params{$paramname} : DEFOP */
750 /* more efficient with the new OP_HELEMEXISTSOR */
751 valop = newLOGOP(OP_HELEMEXISTSOR, OPpHELEMEXISTSOR_DELETE << 8,
755 valop = op_contextualize(valop, G_SCALAR);
760 op_priv = OPpINITFIELD_AV;
764 op_priv = OPpINITFIELD_HV;
772 Newx(aux, 2, UNOP_AUX_item);
776 OP *fieldop = newUNOP_AUX(OP_INITFIELD, valop ? OPf_STACKED : 0, valop, aux);
777 fieldop->op_private = op_priv;
780 if((he = hv_fetch_ent(fieldix_to_padix, sv_2mortal(newSVuv(fieldix)), 0, 0)) &&
782 fieldop->op_targ = SvUV(HeVAL(he));
785 ops = op_append_list(OP_LINESEQ, ops, fieldop);
788 /* initfields CV should not get class_wrap_method_body() called on its
789 * body. pretend it isn't a method for now */
790 CvIsMETHOD_off(PL_compcv);
791 CV *initfields = newATTRSUB(floor_ix, NULL, NULL, NULL, ops);
792 CvIsMETHOD_on(initfields);
794 aux->xhv_class_initfields_cv = initfields;
797 /* we had errors, clean up and don't populate initfields */
798 PADNAMELIST *fieldnames = aux->xhv_class_fields;
800 for(SSize_t i = PadnamelistMAX(fieldnames); i >= 0 ; i--) {
801 PADNAME *pn = PadnamelistARRAY(fieldnames)[i];
802 op_free(PadnameFIELDINFO(pn)->defop);
809 Perl_class_prepare_initfield_parse(pTHX)
811 PERL_ARGS_ASSERT_CLASS_PREPARE_INITFIELD_PARSE;
813 assert(HvSTASH_IS_CLASS(PL_curstash));
814 struct xpvhv_aux *aux = HvAUX(PL_curstash);
816 resume_compcv_and_save(aux->xhv_class_suspended_initfields_compcv);
817 CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax;
821 Perl_class_prepare_method_parse(pTHX_ CV *cv)
823 PERL_ARGS_ASSERT_CLASS_PREPARE_METHOD_PARSE;
825 assert(cv == PL_compcv);
826 assert(HvSTASH_IS_CLASS(PL_curstash));
828 /* We expect this to be at the start of sub parsing, so there won't be
829 * anything in the pad yet
831 assert(PL_comppad_name_fill == 0);
835 padix = pad_add_name_pvs("$self", 0, NULL, NULL);
836 assert(padix == PADIX_SELF);
837 PERL_UNUSED_VAR(padix);
841 CvNOWARN_AMBIGUOUS_on(cv);
846 Perl_class_wrap_method_body(pTHX_ OP *o)
848 PERL_ARGS_ASSERT_CLASS_WRAP_METHOD_BODY;
853 PADNAMELIST *pnl = PadlistNAMES(CvPADLIST(PL_compcv));
855 AV *fieldmap = newAV();
857 SAVEFREESV((SV *)fieldmap);
859 /* padix 0 == @_; padix 1 == $self. Start at 2 */
860 for(PADOFFSET padix = 2; padix <= PadnamelistMAX(pnl); padix++) {
861 PADNAME *pn = PadnamelistARRAY(pnl)[padix];
862 if(!pn || !PadnameIsFIELD(pn))
865 U32 fieldix = PadnameFIELDINFO(pn)->fieldix;
866 if(fieldix > max_fieldix)
867 max_fieldix = fieldix;
869 av_push_simple(fieldmap, newSVuv(padix));
870 av_push_simple(fieldmap, newSVuv(fieldix));
873 UNOP_AUX_item *aux = NULL;
875 if(av_count(fieldmap)) {
876 Newx(aux, 2 + av_count(fieldmap), UNOP_AUX_item);
878 UNOP_AUX_item *ap = aux;
880 (ap++)->uv = av_count(fieldmap) / 2;
881 (ap++)->uv = max_fieldix;
883 for(Size_t i = 0; i < av_count(fieldmap); i++)
884 (ap++)->uv = SvUV(AvARRAY(fieldmap)[i]);
887 /* If this is an empty method body then o will be an OP_STUB and not a
888 * list. This will confuse op_sibling_splice() */
889 if(o->op_type != OP_LINESEQ)
890 o = newLISTOP(OP_LINESEQ, 0, o, NULL);
892 op_sibling_splice(o, NULL, 0, newUNOP_AUX(OP_METHSTART, 0, NULL, aux));
898 Perl_class_add_field(pTHX_ HV *stash, PADNAME *pn)
900 PERL_ARGS_ASSERT_CLASS_ADD_FIELD;
902 assert(HvSTASH_IS_CLASS(stash));
903 struct xpvhv_aux *aux = HvAUX(stash);
905 PADOFFSET fieldix = aux->xhv_class_next_fieldix;
906 aux->xhv_class_next_fieldix++;
908 Newxz(PadnameFIELDINFO(pn), 1, struct padname_fieldinfo);
909 PadnameFLAGS(pn) |= PADNAMEf_FIELD;
911 PadnameFIELDINFO(pn)->refcount = 1;
912 PadnameFIELDINFO(pn)->fieldix = fieldix;
913 PadnameFIELDINFO(pn)->fieldstash = (HV *)SvREFCNT_inc(stash);
915 if(!aux->xhv_class_fields)
916 aux->xhv_class_fields = newPADNAMELIST(0);
918 padnamelist_store(aux->xhv_class_fields, PadnamelistMAX(aux->xhv_class_fields)+1, pn);
919 PadnameREFCNT_inc(pn);
923 apply_field_attribute_param(pTHX_ PADNAME *pn, SV *value)
926 /* Default to name minus the sigil */
927 value = newSVpvn_utf8(PadnamePV(pn) + 1, PadnameLEN(pn) - 1, PadnameUTF8(pn));
929 if(PadnamePV(pn)[0] != '$')
930 croak("Only scalar fields can take a :param attribute");
932 if(PadnameFIELDINFO(pn)->paramname)
933 croak("Field already has a parameter name, cannot add another");
935 HV *stash = PadnameFIELDINFO(pn)->fieldstash;
936 assert(HvSTASH_IS_CLASS(stash));
937 struct xpvhv_aux *aux = HvAUX(stash);
939 if(aux->xhv_class_param_map &&
940 hv_exists_ent(aux->xhv_class_param_map, value, 0))
941 croak("Cannot assign :param(%" SVf ") to field %" SVf " because that name is already in use",
942 SVfARG(value), SVfARG(PadnameSV(pn)));
944 PadnameFIELDINFO(pn)->paramname = SvREFCNT_inc(value);
946 if(!aux->xhv_class_param_map)
947 aux->xhv_class_param_map = newHV();
949 (void)hv_store_ent(aux->xhv_class_param_map, value, newSVuv(PadnameFIELDINFO(pn)->fieldix), 0);
955 void (*apply)(pTHX_ PADNAME *pn, SV *value);
956 } const field_attributes[] = {
958 .requires_value = false,
959 .apply = &apply_field_attribute_param,
961 { NULL, false, NULL }
965 S_class_apply_field_attribute(pTHX_ PADNAME *pn, OP *attr)
967 assert(attr->op_type == OP_CONST);
970 split_attr_nameval(cSVOPx_sv(attr), &name, &value);
972 for(int i = 0; field_attributes[i].name; i++) {
973 /* TODO: These attribute names are not UTF-8 aware */
974 if(!strEQ(SvPVX(name), field_attributes[i].name))
977 if(field_attributes[i].requires_value && !(value && SvOK(value)))
978 croak("Field attribute %" SVf " requires a value", SVfARG(name));
980 (*field_attributes[i].apply)(aTHX_ pn, value);
984 croak("Unrecognized field attribute %" SVf, SVfARG(name));
988 Perl_class_apply_field_attributes(pTHX_ PADNAME *pn, OP *attrlist)
990 PERL_ARGS_ASSERT_CLASS_APPLY_FIELD_ATTRIBUTES;
994 if(attrlist->op_type == OP_NULL) {
999 if(attrlist->op_type == OP_LIST) {
1000 OP *o = cLISTOPx(attrlist)->op_first;
1001 assert(o->op_type == OP_PUSHMARK);
1004 for(; o; o = OpSIBLING(o))
1005 S_class_apply_field_attribute(aTHX_ pn, o);
1008 S_class_apply_field_attribute(aTHX_ pn, attrlist);
1014 Perl_class_set_field_defop(pTHX_ PADNAME *pn, OPCODE defmode, OP *defop)
1016 PERL_ARGS_ASSERT_CLASS_SET_FIELD_DEFOP;
1018 assert(defmode == 0 || defmode == OP_ORASSIGN || defmode == OP_DORASSIGN);
1020 assert(HvSTASH_IS_CLASS(PL_curstash));
1022 op_free(PadnameFIELDINFO(pn)->defop);
1024 /* set here to ensure clean up if forbid_outofblock_ops() throws */
1025 PadnameFIELDINFO(pn)->defop = defop;
1027 forbid_outofblock_ops(defop, "field initialiser expression");
1029 char sigil = PadnamePV(pn)[0];
1032 defop = op_contextualize(defop, G_SCALAR);
1037 defop = op_contextualize(op_force_list(defop), G_LIST);
1041 PadnameFIELDINFO(pn)->defop = newLISTOP(OP_LINESEQ, 0,
1042 newSTATEOP(0, NULL, NULL), defop);
1045 PadnameFIELDINFO(pn)->def_if_undef = true;
1048 PadnameFIELDINFO(pn)->def_if_false = true;
1054 Perl_class_add_ADJUST(pTHX_ HV *stash, CV *cv)
1056 PERL_ARGS_ASSERT_CLASS_ADD_ADJUST;
1058 assert(HvSTASH_IS_CLASS(stash));
1059 struct xpvhv_aux *aux = HvAUX(stash);
1061 if(!aux->xhv_class_adjust_blocks)
1062 aux->xhv_class_adjust_blocks = newAV();
1064 av_push(aux->xhv_class_adjust_blocks, (SV *)cv);
1068 Perl_ck_classname(pTHX_ OP *o)
1070 if(!CvIsMETHOD(PL_compcv))
1071 croak("Cannot use __CLASS__ outside of a method or field initializer expression");
1080 SV *self = PAD_SVl(PADIX_SELF);
1081 assert(SvTYPE(SvRV(self)) == SVt_PVOBJ);
1084 sv_ref(TARG, SvRV(self), true);
1090 * ex: set ts=8 sts=4 sw=4 et: