Skip to content

120 classes get their real base and real member types - #1379

Merged
andrewboudreau merged 2 commits into
cpp/layout-headergenfrom
cpp/subclass-migrations
Aug 10, 2026
Merged

120 classes get their real base and real member types#1379
andrewboudreau merged 2 commits into
cpp/layout-headergenfrom
cpp/subclass-migrations

Conversation

@andrewboudreau

Copy link
Copy Markdown
Collaborator

The migration half of #1377, split from the layout work it rests on. Stacked on #1378 — merging that first makes this diff the migrations alone.

253 files on top of #1378's 310. Together the two reconstruct #1377's tree exactly (same git tree hash), so the split dropped nothing.

What this is

120 hand-written .c destructors and methods become real C++ — classes deriving from their actual base with typed members, in place of a flattened struct and a stand-in. Among them:

Six migrations are in #1378 instead

ChiefChilly, Unagi, Wiggler D0 and D1, Goomboss and ChainChomp belong here by subject but live in the layout PR, because that half does not link without them — they call the renamed Vector3 destructors. Splitting them out would have left #1378 red.

Verified

gate result
rombuild.py -j16, full ROM 106/106 exact, 0 mismatching, 10,813 source-built, 87.88%
eligible.py identical to the unsplit #1377, and differs from main only by the intended rename pair
tools/ suite 265 passed, 3 skipped
langmode ratchet / duplicates PASS / none doubled

Enrollment does not move, and that is expected: a migration replaces the source of a function that was already enrolled, so the count stays while the source stops lying. The gain is in langmode_audit's shadow-declaration counts, not in source-built.

Original work is by the author of #1377; this split preserves the content, not the 37-commit history, which remains on that branch.

🤖 Generated with Claude Code

https://claude.ai/code/session_015AXm5k53WFPjCYcDHRDX3x

@tangos-validator

tangos-validator Bot commented Aug 10, 2026

Copy link
Copy Markdown

✅ PR validation — Passed

Committed merge introduces no reconstruction or attribution regression.

Full merge validation

Check Result
Committed test merge yes
Matched functions 11,176 / 11,347 (98.5%, +0)
Matched code bytes 2,078,800 / 2,211,124 (94.0%, +0)
Tracked source enrollment 10,785 functions, 1,936,196 bytes (87.57%, +0)
Perfect source moves 0 R100
Contributor credit 0 added, 0 changed, 0 lost
Relocation check 49 checked; 49 VERIFIED
Port reference check 393 checked; 0 stale
Module fidelity 106/106 exact; 100.000000% compared bytes
Code linked from verified source 10,813 functions, 1,943,084 bytes (87.88%)
Per-file link-check detail

All 49 changed file(s) compile to the ROM byte-for-byte with correct relocation targets.

File Symbol Result Slots checked
src/_ZN10BulletBillD1Ev.cpp _ZN10BulletBillD1Ev ✅ verified 1
src/_ZN10CheepCheepD1Ev.cpp _ZN10CheepCheepD1Ev ✅ verified 1
src/_ZN10KingBobOmbD1Ev.cpp _ZN10KingBobOmbD1Ev ✅ verified 1
src/_ZN10KoopaShellD1Ev.cpp _ZN10KoopaShellD1Ev ✅ verified 1
src/_ZN10ModelAnim2D1Ev.cpp _ZN10ModelAnim2D1Ev ✅ verified 1
src/_ZN10MrBlizzardD1Ev.cpp _ZN10MrBlizzardD1Ev ✅ verified 1
src/_ZN10PyramidTopD1Ev.cpp _ZN10PyramidTopD1Ev ✅ verified 1
src/_ZN10SlidingIceD1Ev.cpp _ZN10SlidingIceD1Ev ✅ verified 1
src/_ZN11CannonHatchD1Ev.cpp _ZN11CannonHatchD1Ev ✅ verified 1
src/_ZN11PyramidStepD1Ev.cpp _ZN11PyramidStepD1Ev ✅ verified 1
src/_ZN12SwitchPillarD1Ev.cpp _ZN12SwitchPillarD1Ev ✅ verified 1
src/_ZN12WaterSuctionD1Ev.cpp _ZN12WaterSuctionD1Ev ✅ verified 1
src/_ZN13FortressTowerD1Ev.cpp _ZN13FortressTowerD1Ev ✅ verified 1
src/_ZN13MontyMoleRockD1Ev.cpp _ZN13MontyMoleRockD1Ev ✅ verified 1
src/_ZN13PoleBillboardD1Ev.cpp _ZN13PoleBillboardD1Ev ✅ verified 1
src/_ZN13QuestionBlockD1Ev.cpp _ZN13QuestionBlockD1Ev ✅ verified 1
src/_ZN13TTC_MovingBarD1Ev.cpp _ZN13TTC_MovingBarD1Ev ✅ verified 1
src/_ZN14ArrowSignRightD1Ev.cpp _ZN14ArrowSignRightD1Ev ✅ verified 1
src/_ZN14BlueCoinSwitchD1Ev.cpp _ZN14BlueCoinSwitchD1Ev ✅ verified 1
src/_ZN14KnockDownPlankD1Ev.cpp _ZN14KnockDownPlankD1Ev ✅ verified 1
src/_ZN14MovingBarSmallD1Ev.cpp _ZN14MovingBarSmallD1Ev ✅ verified 1
src/_ZN14SquarePathLiftD1Ev.cpp _ZN14SquarePathLiftD1Ev ✅ verified 1
src/_ZN14TtcMovingCubeAD1Ev.cpp _ZN14TtcMovingCubeAD1Ev ✅ verified 1
src/_ZN15ChainChompFenceD1Ev.cpp _ZN15ChainChompFenceD1Ev ✅ verified 1
src/_ZN15FireSeaElevatorD1Ev.cpp _ZN15FireSeaElevatorD1Ev ✅ verified 1
src/_ZN15RotatingFirebarD1Ev.cpp _ZN15RotatingFirebarD1Ev ✅ verified 1
src/_ZN15TtcRotatingGearD1Ev.cpp _ZN15TtcRotatingGearD1Ev ✅ verified 1
src/_ZN16RotatingCogSmallD1Ev.cpp _ZN16RotatingCogSmallD1Ev ✅ verified 1
src/_ZN17BowserPuzzlePieceD1Ev.cpp _ZN17BowserPuzzlePieceD1Ev ✅ verified 1
src/_ZN17SlidingPlatformWfD1Ev.cpp _ZN17SlidingPlatformWfD1Ev ✅ verified 1
src/_ZN19RotatingPlatformLllD1Ev.cpp _ZN19RotatingPlatformLllD1Ev ✅ verified 1
src/_ZN19RotatingPlatformWdwD1Ev.cpp _ZN19RotatingPlatformWdwD1Ev ✅ verified 1
src/_ZN3HUDD1Ev.cpp _ZN3HUDD1Ev ✅ verified 1
src/_ZN5SharkD1Ev.cpp _ZN5SharkD1Ev ✅ verified 1
src/_ZN5StumpD1Ev.cpp _ZN5StumpD1Ev ✅ verified 1
src/_ZN7MinimapD1Ev.cpp _ZN7MinimapD1Ev ✅ verified 1
src/_ZN8IceBlockD1Ev.cpp _ZN8IceBlockD1Ev ✅ verified 1
src/_ZN8IceSheetD1Ev.cpp _ZN8IceSheetD1Ev ✅ verified 1
src/_ZN8MetalNetD1Ev.cpp _ZN8MetalNetD1Ev ✅ verified 1
src/_ZN8PathLiftD1Ev.cpp _ZN8PathLiftD1Ev ✅ verified 1
src/_ZN8ShipWingD1Ev.cpp _ZN8ShipWingD1Ev ✅ verified 1
src/_ZN8SquasherD1Ev.cpp _ZN8SquasherD1Ev ✅ verified 1
src/_ZN8WallSignD1Ev.cpp _ZN8WallSignD1Ev ✅ verified 1
src/_ZN9HugeCoverD1Ev.cpp _ZN9HugeCoverD1Ev ✅ verified 1
src/_ZN9ModelAnimD1Ev.cpp _ZN9ModelAnimD1Ev ✅ verified 1
src/_ZN9SeesawBobD1Ev.cpp _ZN9SeesawBobD1Ev ✅ verified 1
src/_ZN9ShipWaterD1Ev.cpp _ZN9ShipWaterD1Ev ✅ verified 1
src/_ZN9TinyCoverD1Ev.cpp _ZN9TinyCoverD1Ev ✅ verified 1
src/_ZN9TowerStepD1Ev.cpp _ZN9TowerStepD1Ev ✅ verified 1

The private worker commits a test merge, builds the stock ROM profile, compares every executable module, measures matched and source-built code, checks contributor lineage, and verifies affected relocations. The mod profile is opt-in and is not part of this merge gate.

@andrewboudreau
andrewboudreau force-pushed the cpp/subclass-migrations branch from 814c3e6 to 695ef88 Compare August 10, 2026 16:10
@andrewboudreau
andrewboudreau force-pushed the cpp/subclass-migrations branch from 695ef88 to fa6c85b Compare August 10, 2026 16:37
andrewboudreau added a commit that referenced this pull request Aug 10, 2026
The D0 half of #1379, split off so each PR clears the validator's 200-file cap.
Stacked on #1379, which carries the class definitions these need.

D0 is vtable slot 17 (or 1, for classes rooted below Actor): destroy, then return
the object to the actor heap. Each of these was a hand-written .c file spelling
out what the compiler emits anyway -- store the vtable, call the member
destructors in reverse declaration order, chain to the base, call
Memory::Deallocate. Declaring the class properly lets the compiler emit all of
it, and the deallocation comes from the inline operator delete rather than
anything in the file.

Not in arm9: those D0s need an operator delete the arm9 classes do not have in
scope, which is a separate problem and is not attempted here.

VERIFIED

rombuild -j16, full ROM: 106/106 exact, 0 mismatching, 10,813 source-built,
87.88%. eligible.py differs from main only by the rename pair #1378 introduces.
tools suite 265 passed. langmode ratchet PASS. No duplicate stems.

Enrollment does not move: a D0 was already enrolled from its .c file, so the
count stays while the source stops hand-spelling the mangled name.

Original work is by the author of #1377; this split preserves the content, not
the 37-commit history, which remains on that branch.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015AXm5k53WFPjCYcDHRDX3x
@andrewboudreau
andrewboudreau changed the base branch from cpp/platform-enemy-layout to cpp/layout-headergen August 10, 2026 16:38
@andrewboudreau
andrewboudreau force-pushed the cpp/subclass-migrations branch from 4930609 to 59d996f Compare August 10, 2026 17:17
andrewboudreau added a commit that referenced this pull request Aug 10, 2026
The D0 half of #1379, split off so each PR clears the validator's 200-file cap.
Stacked on #1379, which carries the class definitions these need.

D0 is vtable slot 17 (or 1, for classes rooted below Actor): destroy, then return
the object to the actor heap. Each of these was a hand-written .c file spelling
out what the compiler emits anyway -- store the vtable, call the member
destructors in reverse declaration order, chain to the base, call
Memory::Deallocate. Declaring the class properly lets the compiler emit all of
it, and the deallocation comes from the inline operator delete rather than
anything in the file.

Not in arm9: those D0s need an operator delete the arm9 classes do not have in
scope, which is a separate problem and is not attempted here.

VERIFIED

rombuild -j16, full ROM: 106/106 exact, 0 mismatching, 10,813 source-built,
87.88%. eligible.py differs from main only by the rename pair #1378 introduces.
tools suite 265 passed. langmode ratchet PASS. No duplicate stems.

Enrollment does not move: a D0 was already enrolled from its .c file, so the
count stays while the source stops hand-spelling the mangled name.

Original work is by the author of #1377; this split preserves the content, not
the 37-commit history, which remains on that branch.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015AXm5k53WFPjCYcDHRDX3x
@andrewboudreau
andrewboudreau force-pushed the cpp/subclass-migrations branch from 59d996f to 9cdf3f6 Compare August 10, 2026 17:56
andrewboudreau added a commit that referenced this pull request Aug 10, 2026
The D0 half of #1379, split off so each PR clears the validator's 200-file cap.
Stacked on #1379, which carries the class definitions these need.

D0 is vtable slot 17 (or 1, for classes rooted below Actor): destroy, then return
the object to the actor heap. Each of these was a hand-written .c file spelling
out what the compiler emits anyway -- store the vtable, call the member
destructors in reverse declaration order, chain to the base, call
Memory::Deallocate. Declaring the class properly lets the compiler emit all of
it, and the deallocation comes from the inline operator delete rather than
anything in the file.

Not in arm9: those D0s need an operator delete the arm9 classes do not have in
scope, which is a separate problem and is not attempted here.

VERIFIED

rombuild -j16, full ROM: 106/106 exact, 0 mismatching, 10,813 source-built,
87.88%. eligible.py differs from main only by the rename pair #1378 introduces.
tools suite 265 passed. langmode ratchet PASS. No duplicate stems.

Enrollment does not move: a D0 was already enrolled from its .c file, so the
count stays while the source stops hand-spelling the mangled name.

Original work is by the author of #1377; this split preserves the content, not
the 37-commit history, which remains on that branch.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015AXm5k53WFPjCYcDHRDX3x
andrewboudreau and others added 2 commits August 10, 2026 12:59
The migration half of #1377, split from the layout work it rests on, with the D0
deleting destructors split off again on top so each PR clears the validator's
200-file cap. Stacked on #1378; the D0s are the PR above this one.

131 files. Hand-written .c destructors and methods become real C++ -- classes
deriving from their actual base with typed members, in place of a flattened
struct and a stand-in. Among them: DonutBlock as the worked example for the
shadow-struct classes, thirty Platform subclasses unblocked by the 0x320
correction in #1378, and the array-member classes -- Wiggler's eight, Goomboss's
three, ChainChomp's seven links, PathLift's Model[3], RotatingFirebar's one
collision cylinder per flame.

Six migrations that belong here by subject are in #1378 instead, because that
half does not link without them: ChiefChilly, Unagi, Wiggler D0 and D1, Goomboss
and ChainChomp all call the renamed Vector3 destructors.

VERIFIED

rombuild -j16, full ROM: 106/106 exact, 0 mismatching, 10,813 source-built,
87.88%. eligible.py differs from main only by the rename pair #1378 introduces.
tools suite 265 passed. langmode ratchet PASS. No duplicate stems.
pr_linkcheck: no new WRONG or NO-REPRO.

Enrollment does not move, and that is expected: a migration replaces the source
of a function that was already enrolled, so the count stays while the source
stops lying.

Original work is by the author of #1377; this split preserves the content, not
the 37-commit history, which remains on that branch.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015AXm5k53WFPjCYcDHRDX3x
No content change. This PR's base moved from cpp/platform-enemy-layout to
cpp/layout-headergen when the layout half was split in two, and the relay keys on
head SHA -- retargeting alone does not re-submit, so the check still showed the
431-file count from the old base. This empty commit changes the head so the
validator measures the 131 files this PR actually adds.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015AXm5k53WFPjCYcDHRDX3x
@andrewboudreau
andrewboudreau force-pushed the cpp/subclass-migrations branch from 9cdf3f6 to bf09e1e Compare August 10, 2026 18:01
andrewboudreau added a commit that referenced this pull request Aug 10, 2026
The D0 half of #1379, split off so each PR clears the validator's 200-file cap.
Stacked on #1379, which carries the class definitions these need.

D0 is vtable slot 17 (or 1, for classes rooted below Actor): destroy, then return
the object to the actor heap. Each of these was a hand-written .c file spelling
out what the compiler emits anyway -- store the vtable, call the member
destructors in reverse declaration order, chain to the base, call
Memory::Deallocate. Declaring the class properly lets the compiler emit all of
it, and the deallocation comes from the inline operator delete rather than
anything in the file.

Not in arm9: those D0s need an operator delete the arm9 classes do not have in
scope, which is a separate problem and is not attempted here.

VERIFIED

rombuild -j16, full ROM: 106/106 exact, 0 mismatching, 10,813 source-built,
87.88%. eligible.py differs from main only by the rename pair #1378 introduces.
tools suite 265 passed. langmode ratchet PASS. No duplicate stems.

Enrollment does not move: a D0 was already enrolled from its .c file, so the
count stays while the source stops hand-spelling the mangled name.

Original work is by the author of #1377; this split preserves the content, not
the 37-commit history, which remains on that branch.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015AXm5k53WFPjCYcDHRDX3x
@andrewboudreau
andrewboudreau merged commit fab29a9 into cpp/layout-headergen Aug 10, 2026
3 checks passed
@andrewboudreau
andrewboudreau deleted the cpp/subclass-migrations branch August 10, 2026 18:17
andrewboudreau added a commit that referenced this pull request Aug 10, 2026
* 59 classes get their real base and real member types

The migration half of #1377, split from the layout work it rests on, with the D0
deleting destructors split off again on top so each PR clears the validator's
200-file cap. Stacked on #1378; the D0s are the PR above this one.

131 files. Hand-written .c destructors and methods become real C++ -- classes
deriving from their actual base with typed members, in place of a flattened
struct and a stand-in. Among them: DonutBlock as the worked example for the
shadow-struct classes, thirty Platform subclasses unblocked by the 0x320
correction in #1378, and the array-member classes -- Wiggler's eight, Goomboss's
three, ChainChomp's seven links, PathLift's Model[3], RotatingFirebar's one
collision cylinder per flame.

Six migrations that belong here by subject are in #1378 instead, because that
half does not link without them: ChiefChilly, Unagi, Wiggler D0 and D1, Goomboss
and ChainChomp all call the renamed Vector3 destructors.

VERIFIED

rombuild -j16, full ROM: 106/106 exact, 0 mismatching, 10,813 source-built,
87.88%. eligible.py differs from main only by the rename pair #1378 introduces.
tools suite 265 passed. langmode ratchet PASS. No duplicate stems.
pr_linkcheck: no new WRONG or NO-REPRO.

Enrollment does not move, and that is expected: a migration replaces the source
of a function that was already enrolled, so the count stays while the source
stops lying.

Original work is by the author of #1377; this split preserves the content, not
the 37-commit history, which remains on that branch.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015AXm5k53WFPjCYcDHRDX3x

* Re-request validation against the retargeted base

No content change. This PR's base moved from cpp/platform-enemy-layout to
cpp/layout-headergen when the layout half was split in two, and the relay keys on
head SHA -- retargeting alone does not re-submit, so the check still showed the
431-file count from the old base. This empty commit changes the head so the
validator measures the 131 files this PR actually adds.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015AXm5k53WFPjCYcDHRDX3x

* 61 deleting destructors become real C++

The D0 half of #1379, split off so each PR clears the validator's 200-file cap.
Stacked on #1379, which carries the class definitions these need.

D0 is vtable slot 17 (or 1, for classes rooted below Actor): destroy, then return
the object to the actor heap. Each of these was a hand-written .c file spelling
out what the compiler emits anyway -- store the vtable, call the member
destructors in reverse declaration order, chain to the base, call
Memory::Deallocate. Declaring the class properly lets the compiler emit all of
it, and the deallocation comes from the inline operator delete rather than
anything in the file.

Not in arm9: those D0s need an operator delete the arm9 classes do not have in
scope, which is a separate problem and is not attempted here.

VERIFIED

rombuild -j16, full ROM: 106/106 exact, 0 mismatching, 10,813 source-built,
87.88%. eligible.py differs from main only by the rename pair #1378 introduces.
tools suite 265 passed. langmode ratchet PASS. No duplicate stems.

Enrollment does not move: a D0 was already enrolled from its .c file, so the
count stays while the source stops hand-spelling the mangled name.

Original work is by the author of #1377; this split preserves the content, not
the 37-commit history, which remains on that branch.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015AXm5k53WFPjCYcDHRDX3x

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
andrewboudreau added a commit that referenced this pull request Aug 10, 2026
* 59 classes get their real base and real member types

The migration half of #1377, split from the layout work it rests on, with the D0
deleting destructors split off again on top so each PR clears the validator's
200-file cap. Stacked on #1378; the D0s are the PR above this one.

131 files. Hand-written .c destructors and methods become real C++ -- classes
deriving from their actual base with typed members, in place of a flattened
struct and a stand-in. Among them: DonutBlock as the worked example for the
shadow-struct classes, thirty Platform subclasses unblocked by the 0x320
correction in #1378, and the array-member classes -- Wiggler's eight, Goomboss's
three, ChainChomp's seven links, PathLift's Model[3], RotatingFirebar's one
collision cylinder per flame.

Six migrations that belong here by subject are in #1378 instead, because that
half does not link without them: ChiefChilly, Unagi, Wiggler D0 and D1, Goomboss
and ChainChomp all call the renamed Vector3 destructors.

VERIFIED

rombuild -j16, full ROM: 106/106 exact, 0 mismatching, 10,813 source-built,
87.88%. eligible.py differs from main only by the rename pair #1378 introduces.
tools suite 265 passed. langmode ratchet PASS. No duplicate stems.
pr_linkcheck: no new WRONG or NO-REPRO.

Enrollment does not move, and that is expected: a migration replaces the source
of a function that was already enrolled, so the count stays while the source
stops lying.

Original work is by the author of #1377; this split preserves the content, not
the 37-commit history, which remains on that branch.


Claude-Session: https://claude.ai/code/session_015AXm5k53WFPjCYcDHRDX3x

* Re-request validation against the retargeted base

No content change. This PR's base moved from cpp/platform-enemy-layout to
cpp/layout-headergen when the layout half was split in two, and the relay keys on
head SHA -- retargeting alone does not re-submit, so the check still showed the
431-file count from the old base. This empty commit changes the head so the
validator measures the 131 files this PR actually adds.


Claude-Session: https://claude.ai/code/session_015AXm5k53WFPjCYcDHRDX3x

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
andrewboudreau added a commit that referenced this pull request Aug 10, 2026
* 59 classes get their real base and real member types

The migration half of #1377, split from the layout work it rests on, with the D0
deleting destructors split off again on top so each PR clears the validator's
200-file cap. Stacked on #1378; the D0s are the PR above this one.

131 files. Hand-written .c destructors and methods become real C++ -- classes
deriving from their actual base with typed members, in place of a flattened
struct and a stand-in. Among them: DonutBlock as the worked example for the
shadow-struct classes, thirty Platform subclasses unblocked by the 0x320
correction in #1378, and the array-member classes -- Wiggler's eight, Goomboss's
three, ChainChomp's seven links, PathLift's Model[3], RotatingFirebar's one
collision cylinder per flame.

Six migrations that belong here by subject are in #1378 instead, because that
half does not link without them: ChiefChilly, Unagi, Wiggler D0 and D1, Goomboss
and ChainChomp all call the renamed Vector3 destructors.

VERIFIED

rombuild -j16, full ROM: 106/106 exact, 0 mismatching, 10,813 source-built,
87.88%. eligible.py differs from main only by the rename pair #1378 introduces.
tools suite 265 passed. langmode ratchet PASS. No duplicate stems.
pr_linkcheck: no new WRONG or NO-REPRO.

Enrollment does not move, and that is expected: a migration replaces the source
of a function that was already enrolled, so the count stays while the source
stops lying.

Original work is by the author of #1377; this split preserves the content, not
the 37-commit history, which remains on that branch.


Claude-Session: https://claude.ai/code/session_015AXm5k53WFPjCYcDHRDX3x

* Re-request validation against the retargeted base

No content change. This PR's base moved from cpp/platform-enemy-layout to
cpp/layout-headergen when the layout half was split in two, and the relay keys on
head SHA -- retargeting alone does not re-submit, so the check still showed the
431-file count from the old base. This empty commit changes the head so the
validator measures the 131 files this PR actually adds.


Claude-Session: https://claude.ai/code/session_015AXm5k53WFPjCYcDHRDX3x

* 61 deleting destructors become real C++

The D0 half of #1379, split off so each PR clears the validator's 200-file cap.
Stacked on #1379, which carries the class definitions these need.

D0 is vtable slot 17 (or 1, for classes rooted below Actor): destroy, then return
the object to the actor heap. Each of these was a hand-written .c file spelling
out what the compiler emits anyway -- store the vtable, call the member
destructors in reverse declaration order, chain to the base, call
Memory::Deallocate. Declaring the class properly lets the compiler emit all of
it, and the deallocation comes from the inline operator delete rather than
anything in the file.

Not in arm9: those D0s need an operator delete the arm9 classes do not have in
scope, which is a separate problem and is not attempted here.

VERIFIED

rombuild -j16, full ROM: 106/106 exact, 0 mismatching, 10,813 source-built,
87.88%. eligible.py differs from main only by the rename pair #1378 introduces.
tools suite 265 passed. langmode ratchet PASS. No duplicate stems.

Enrollment does not move: a D0 was already enrolled from its .c file, so the
count stays while the source stops hand-spelling the mangled name.

Original work is by the author of #1377; this split preserves the content, not
the 37-commit history, which remains on that branch.


Claude-Session: https://claude.ai/code/session_015AXm5k53WFPjCYcDHRDX3x

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant