@@ -805,14 +805,78 @@ 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 ;
830+ }
831+ PadnamelistREFCNT_dec (fieldnames );
832+ aux -> xhv_class_fields = NULL ;
833+ }
834+
835+ /* clean up methods */
836+ /* should we keep a separate list of these instead? */
837+ if (hv_iterinit (stash )) {
838+ HE * he ;
839+ while ((he = hv_iternext (stash )) != NULL ) {
840+ STRLEN klen ;
841+ const char * const kpv = HePV (he , klen );
842+ SV * entry = HeVAL (he );
843+ CV * cv = NULL ;
844+ if (SvTYPE (entry ) == SVt_PVGV
845+ && (cv = GvCV ((GV * )entry ))
846+ && (CvIsMETHOD (cv ) || memEQs (kpv , klen , "new" ))) {
847+ SvREFCNT_dec (cv );
848+ GvCV_set ((GV * )entry , NULL );
849+ }
850+ else if (SvTYPE (entry ) == SVt_PVCV
851+ && (CvIsMETHOD ((CV * )entry ) || memEQs (kpv , klen , "new" ))) {
852+ (void )hv_delete (stash , kpv , HeUTF8 (he ) ? - (I32 )klen : (I32 )klen ,
853+ G_DISCARD );
854+ }
814855 }
856+ ++ PL_sub_generation ;
857+ }
858+
859+ /* field clean up */
860+ resume_compcv_final (aux -> xhv_class_suspended_initfields_compcv );
861+ SvREFCNT_dec (PL_compcv );
862+ Safefree (aux -> xhv_class_suspended_initfields_compcv );
863+ aux -> xhv_class_suspended_initfields_compcv = NULL ;
864+
865+ /* remove any ISA entries */
866+ SV * isaname = newSVpvf ("%" HEKf "::ISA" , HvNAME_HEK (stash ));
867+ sv_2mortal (isaname );
868+ AV * isa = get_av (SvPV_nolen (isaname ), (SvFLAGS (isaname ) & SVf_UTF8 ));
869+ if (isa ) {
870+ /* we make this read-only above since class-keyword
871+ classes manage ISA themselves, the class has failed to
872+ load, so we no longer manage it.
873+ */
874+ SvREADONLY_off ((SV * )isa );
875+ av_clear (isa );
815876 }
877+
878+ /* no longer a class */
879+ aux -> xhv_aux_flags &= ~HvAUXf_IS_CLASS ;
816880 }
817881}
818882
0 commit comments