diff options
Diffstat (limited to 'sv_inline.h')
-rw-r--r-- | sv_inline.h | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/sv_inline.h b/sv_inline.h index d1ed6f0d54..1bb8c2897d 100644 --- a/sv_inline.h +++ b/sv_inline.h @@ -125,7 +125,7 @@ struct body_details { U8 body_size; /* Size to allocate */ U8 copy; /* Size of structure to copy (may be shorter) */ U8 offset; /* Size of unalloced ghost fields to first alloced field*/ - PERL_BITFIELD8 type : 4; /* We have space for a sanity check. */ + PERL_BITFIELD8 type : 5; /* We have space for a sanity check. */ PERL_BITFIELD8 cant_upgrade : 1;/* Cannot upgrade this type */ PERL_BITFIELD8 zero_nv : 1; /* zero the NV when upgrading from this */ PERL_BITFIELD8 arena : 1; /* Allocated from an arena */ @@ -149,6 +149,7 @@ ALIGNED_TYPE(XPVHV_WITH_AUX); ALIGNED_TYPE(XPVCV); ALIGNED_TYPE(XPVFM); ALIGNED_TYPE(XPVIO); +ALIGNED_TYPE(XPVOBJ); #define HADNV FALSE #define NONV TRUE @@ -280,6 +281,12 @@ static const struct body_details bodies_by_type[] = { 0, SVt_PVIO, TRUE, NONV, HASARENA, FIT_ARENA(24, sizeof(ALIGNED_TYPE_NAME(XPVIO))) }, + + { sizeof(ALIGNED_TYPE_NAME(XPVOBJ)), + copy_length(XPVOBJ, xobject_fields), + 0, + SVt_PVOBJ, TRUE, NONV, HASARENA, + FIT_ARENA(0, sizeof(ALIGNED_TYPE_NAME(XPVOBJ))) }, }; #define new_body_allocated(sv_type) \ @@ -390,6 +397,7 @@ Perl_newSV_type(pTHX_ const svtype type) break; case SVt_PVHV: case SVt_PVAV: + case SVt_PVOBJ: assert(type_details->body_size); #ifndef PURIFY @@ -409,13 +417,15 @@ Perl_newSV_type(pTHX_ const svtype type) SvSTASH_set(sv, NULL); SvMAGIC_set(sv, NULL); - if (type == SVt_PVAV) { + switch(type) { + case SVt_PVAV: AvFILLp(sv) = -1; AvMAX(sv) = -1; AvALLOC(sv) = NULL; AvREAL_only(sv); - } else { + break; + case SVt_PVHV: HvTOTALKEYS(sv) = 0; /* start with PERL_HASH_DEFAULT_HvMAX+1 buckets: */ HvMAX(sv) = PERL_HASH_DEFAULT_HvMAX; @@ -427,6 +437,13 @@ Perl_newSV_type(pTHX_ const svtype type) #endif /* start with PERL_HASH_DEFAULT_HvMAX+1 buckets: */ HvMAX(sv) = PERL_HASH_DEFAULT_HvMAX; + break; + case SVt_PVOBJ: + ObjectMAXFIELD(sv) = -1; + ObjectFIELDS(sv) = NULL; + break; + default: + NOT_REACHED; } sv->sv_u.svu_array = NULL; /* or svu_hash */ |