@@ -805,14 +805,80 @@ Perl_class_seal_stash(pTHX_ HV *stash)
805805 aux -> xhv_class_initfields_cv = initfields ;
806806 }
807807 else {
808- /* we had errors, clean up and don't populate initfields */
808+ /* we had errors, clean up */
809+
810+ SvREFCNT_dec (aux -> xhv_class_superclass );
811+ aux -> xhv_class_superclass = NULL ;
812+
813+ /* clean up adjust blocks */
814+ SvREFCNT_dec (aux -> xhv_class_adjust_blocks );
815+ aux -> xhv_class_adjust_blocks = NULL ;
816+
817+ /* name to slot index */
818+ SvREFCNT_dec (aux -> xhv_class_param_map );
819+ aux -> xhv_class_param_map = NULL ;
820+
821+ /* clean up the ops for defaults for fields, if any, since
822+ padname_free() doesn't.
823+ */
809824 PADNAMELIST * fieldnames = aux -> xhv_class_fields ;
810825 if (fieldnames ) {
811826 for (SSize_t i = PadnamelistMAX (fieldnames ); i >= 0 ; i -- ) {
812827 PADNAME * pn = PadnamelistARRAY (fieldnames )[i ];
813828 op_free (PadnameFIELDINFO (pn )-> defop );
829+ PadnameFIELDINFO (pn )-> defop = NULL ;
814830 }
831+ PadnamelistREFCNT_dec (fieldnames );
832+ aux -> xhv_class_fields = NULL ;
833+ }
834+
835+ /* TODO: cleanup DOES if added above */
836+
837+ /* clean up methods */
838+ /* should we keep a separate list of these instead? */
839+ if (hv_iterinit (stash )) {
840+ HE * he ;
841+ while ((he = hv_iternext (stash )) != NULL ) {
842+ STRLEN klen ;
843+ const char * const kpv = HePV (he , klen );
844+ SV * entry = HeVAL (he );
845+ CV * cv = NULL ;
846+ if (SvTYPE (entry ) == SVt_PVGV
847+ && (cv = GvCV ((GV * )entry ))
848+ && (CvIsMETHOD (cv ) || memEQs (kpv , klen , "new" ))) {
849+ SvREFCNT_dec (cv );
850+ GvCV_set ((GV * )entry , NULL );
851+ }
852+ else if (SvTYPE (entry ) == SVt_PVCV
853+ && (CvIsMETHOD ((CV * )entry ) || memEQs (kpv , klen , "new" ))) {
854+ (void )hv_delete (stash , kpv , HeUTF8 (he ) ? - (I32 )klen : (I32 )klen ,
855+ G_DISCARD );
856+ }
857+ }
858+ ++ PL_sub_generation ;
859+ }
860+
861+ /* field clean up */
862+ resume_compcv_final (aux -> xhv_class_suspended_initfields_compcv );
863+ SvREFCNT_dec (PL_compcv );
864+ Safefree (aux -> xhv_class_suspended_initfields_compcv );
865+ aux -> xhv_class_suspended_initfields_compcv = NULL ;
866+
867+ /* remove any ISA entries */
868+ SV * isaname = newSVpvf ("%" HEKf "::ISA" , HvNAME_HEK (stash ));
869+ sv_2mortal (isaname );
870+ AV * isa = get_av (SvPV_nolen (isaname ), (SvFLAGS (isaname ) & SVf_UTF8 ));
871+ if (isa ) {
872+ /* we make this read-only above since class-keyword
873+ classes manage ISA themselves, the class has failed to
874+ load, so we no longer manage it.
875+ */
876+ SvREADONLY_off ((SV * )isa );
877+ av_clear (isa );
815878 }
879+
880+ /* no longer a class */
881+ aux -> xhv_aux_flags &= ~HvAUXf_IS_CLASS ;
816882 }
817883}
818884
0 commit comments