Skip to content

[RFC] OOP - Destructors #117

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 96 additions & 0 deletions considered/rfc-oop-destructors.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
- Feature Name: Standard OOP model
- Start Date: May 5th 2020
- RFC PR:
- RFC Issue:

Summary
=======

Motivation
==========

Guide-level explanation
=======================

Record, tagged records and class records can declare destructors. The
destructor is identifed by the `Destructor` attribute, e.g.:

.. code-block:: ada

package P is
type T is tagged null record;
for T'Destructor use My_Destructor;

procedure My_Destructor (Self : in out T);

type T2 is new T with null record
with Destructor => My_Destructor;

procedure My_Destructor (Self : in out T2);
end P;

The destruction sequence works in the following way:
Copy link
Member

@raph-amiard raph-amiard Jan 17, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it is not necessary, and even potentially dangerous to describe the destruction semantics in these terms, because we don't want to define finalization semantics twice. We should just explain how this maps to the Finalizable aspect.

- If a type has an explicit destructor, it is first called.
- If a type has components hierarchy, wether or not it has an explicit
destructor, the destructor sequence is called on each components.
- If a type is in a tagged hierarchy, wether or not it has an explicit
destructor, the parent destructor sequence is called.

Destructors are called at the same place as when Ada finalization is run.


Reference-level explanation
===========================


Rationale and alternatives
==========================

Drawbacks
=========


Prior art
=========

Unresolved questions
====================

Future possibilities
====================

We need a scoped syntax for the destructor. One option is to piggy back on
a separate RFC being written that allows to define attributes directly in
the form of type'attribute name. For example, specifying Write could be done
in the following way:

.. code-block:: ada

type T is null record;

procedure S'Write(
Stream : not null access Ada.Streams.Root_Stream_Type'Class;
Item : in T);

Using this gives us a new un-scoped notation:

.. code-block:: ada

package P is
type T is tagged null record;

procedure T'Destructor (Self : in out T);

end P;

And this can be easily extended to a scoped notation for Destructor as well as
other attributes:

.. code-block:: ada

package P is
type T is tagged record
procedure T'Destructor (Self : in out T);
end record;
end P;