summaryrefslogtreecommitdiff
path: root/sv_inline.h
diff options
context:
space:
mode:
authorPaul "LeoNerd" Evans <leonerd@leonerd.org.uk>2023-02-04 00:27:00 +0000
committerPaul "LeoNerd" Evans <leonerd@leonerd.org.uk>2023-02-10 12:07:02 +0000
commit24c33697796a1556af3f58e15fc4fb6b0d1538dc (patch)
treef747d7bdf730b423528f6d960db2465f9c708d4e /sv_inline.h
parent99b497aa90ed7db99d29a301b47c91fba65c9cb3 (diff)
downloadperl-24c33697796a1556af3f58e15fc4fb6b0d1538dc.tar.gz
Create a specific SV type for object instances
Diffstat (limited to 'sv_inline.h')
-rw-r--r--sv_inline.h23
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 */