Skip to content

Commit

Permalink
[mycpp/runtime] Move field mask in ObjHeader, opening up obj_id
Browse files Browse the repository at this point in the history
  • Loading branch information
Andy C committed Jan 2, 2023
1 parent 28ce38e commit e3342ed
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 25 deletions.
2 changes: 1 addition & 1 deletion mycpp/demo/target_lang.cc
Expand Up @@ -529,7 +529,7 @@ class Derived : public Base {
public:
Derived(int i, int j) : Base(i), j(j) {
// annoying: should be in initializer list
header_.field_mask |= 0x5;
FIELD_MASK(header_) |= 0x5;
}
int j;
Node* three;
Expand Down
6 changes: 3 additions & 3 deletions mycpp/gc_heap_test.cc
Expand Up @@ -50,7 +50,7 @@ TEST field_masks_test() {
StackRoots _roots({&L});

L->append(1);
log("List mask = %d", L->header_.field_mask);
log("List mask = %d", FIELD_MASK(L->header_));

auto d = Alloc<Dict<Str*, int>>();
StackRoots _roots2({&d});
Expand All @@ -63,7 +63,7 @@ TEST field_masks_test() {
// expression! Gah!
// d->set(StrFromC("foo"), 3);

log("Dict mask = %d", d->header_.field_mask);
log("Dict mask = %d", FIELD_MASK(d->header_));

#if 0
ShowFixedChildren(L);
Expand Down Expand Up @@ -354,7 +354,7 @@ TEST vtable_test() {
ShowObj(header);

ASSERT_EQ_FMT(HeapTag::FixedSize, header->heap_tag, "%d");
ASSERT_EQ_FMT(0, header->field_mask, "%d");
ASSERT_EQ_FMT(0, FIELD_MASK(*header), "%d");
#if 0
// casts get rid of warning
ASSERT_EQ_FMT((int)sizeof(DerivedObj), (int)header->obj_len, "%d");
Expand Down
30 changes: 15 additions & 15 deletions mycpp/gc_obj.h
Expand Up @@ -27,6 +27,7 @@ const unsigned kZeroMask = 0; // for types with no pointers

// no obj_len computed for global List/Slab/Dict
const int kNoObjLen = 0x0badbeef;
const int kNoObjId = 42;

// The first member of every GC-managed object is 'ObjHeader header_'.
// (There's no inheritance!)
Expand All @@ -35,8 +36,7 @@ struct ObjHeader {
// Overlaps with RawObject::points_to_header
unsigned type_tag : 7; // TypeTag, ASDL variant / shared variant
#ifdef MARK_SWEEP
// TODO: change to obj_id
unsigned field_mask : 24; // For some user-defined classes, so max 16 fields
unsigned obj_id : 24; // For some user-defined classes, so max 16 fields
#else
unsigned field_mask : 24; // Cheney needs field_maks AND obj_len
#endif
Expand All @@ -52,7 +52,7 @@ struct ObjHeader {
};

#if MARK_SWEEP
#define FIELD_MASK(header) (header).field_mask
#define FIELD_MASK(header) (header).u_mask_npointers_strlen
#define STR_LEN(header) (header).u_mask_npointers_strlen
#define NUM_POINTERS(header) (header).u_mask_npointers_strlen
#else
Expand All @@ -70,22 +70,22 @@ struct RawObject {
// ObjHeader. See mycpp/demo/gc_header.cc.

// Used by hand-written and generated classes
#define GC_CLASS_FIXED(header_, field_mask, obj_len) \
header_ { \
kIsHeader, TypeTag::OtherClass, field_mask, HeapTag::FixedSize, obj_len \
#define GC_CLASS_FIXED(header_, field_mask, obj_len) \
header_ { \
kIsHeader, TypeTag::OtherClass, kNoObjId, HeapTag::FixedSize, field_mask \
}

// Used by mycpp and frontend/flag_gen.py. TODO: Sort fields and use
// HeapTag::Scanned.
#define GC_CLASS(header_, heap_tag, field_mask, obj_len) \
header_ { \
kIsHeader, TypeTag::OtherClass, field_mask, heap_tag, obj_len \
#define GC_CLASS(header_, heap_tag, field_mask, obj_len) \
header_ { \
kIsHeader, TypeTag::OtherClass, kNoObjId, heap_tag, field_mask \
}

// Used by ASDL. TODO: Sort fields and use HeapTag::Scanned
#define GC_ASDL_CLASS(header_, type_tag, field_mask, obj_len) \
header_ { \
kIsHeader, type_tag, field_mask, HeapTag::FixedSize, obj_len \
#define GC_ASDL_CLASS(header_, type_tag, field_mask, obj_len) \
header_ { \
kIsHeader, type_tag, kNoObjId, HeapTag::FixedSize, field_mask \
}

#define GC_STR(header_) \
Expand All @@ -98,9 +98,9 @@ struct RawObject {
kIsHeader, TypeTag::Slab, kZeroMask, heap_tag, num_pointers \
}

#define GC_TUPLE(header_, field_mask, obj_len) \
header_ { \
kIsHeader, TypeTag::Tuple, field_mask, HeapTag::FixedSize, obj_len \
#define GC_TUPLE(header_, field_mask, obj_len) \
header_ { \
kIsHeader, TypeTag::Tuple, kNoObjId, HeapTag::FixedSize, field_mask \
}

// TODO: could omit this in BUMP_LEAK mode
Expand Down
12 changes: 6 additions & 6 deletions mycpp/gc_tuple_test.cc
Expand Up @@ -3,25 +3,25 @@

TEST tuple_field_masks_test() {
Tuple2<Str *, Str *> ss(nullptr, nullptr);
ASSERT_EQ_FMT(0b11, ss.header_.field_mask, "%d");
ASSERT_EQ_FMT(0b11, FIELD_MASK(ss.header_), "%d");

// 8 + 4 on 64 bit
Tuple2<Str *, int> si(nullptr, 42);
ASSERT_EQ_FMT(0b01, si.header_.field_mask, "%d");
ASSERT_EQ_FMT(0b01, FIELD_MASK(si.header_), "%d");

// 4 + 8 on 64 bit
Tuple2<int, Str *> is(42, nullptr);
ASSERT_EQ_FMT(0b10, is.header_.field_mask, "%d");
ASSERT_EQ_FMT(0b10, FIELD_MASK(is.header_), "%d");

Tuple3<Str *, Str *, Str *> sss(nullptr, nullptr, nullptr);
ASSERT_EQ_FMT(0b111, sss.header_.field_mask, "%d");
ASSERT_EQ_FMT(0b111, FIELD_MASK(sss.header_), "%d");

Tuple3<int, Str *, Str *> iss(42, nullptr, nullptr);
ASSERT_EQ_FMT(0b110, iss.header_.field_mask, "%d");
ASSERT_EQ_FMT(0b110, FIELD_MASK(iss.header_), "%d");

// 4 + 4 + 8 + 8, so it's 0b110 not 0b1100
Tuple4<int, int, Str *, Str *> iiss(42, 42, nullptr, nullptr);
ASSERT_EQ_FMT(0b110, iiss.header_.field_mask, "%d");
ASSERT_EQ_FMT(0b110, FIELD_MASK(iiss.header_), "%d");

PASS();
}
Expand Down

0 comments on commit e3342ed

Please sign in to comment.