move type operation section and remove deepcopy document (#19389)
ref #19173; because deepcopy is not fit for ORC/ARC which was used for spawn and spawn will be removed from compiler
This commit is contained in:
parent
7bdfeb7819
commit
342b74ef70
2 changed files with 26 additions and 40 deletions
|
|
@ -3902,6 +3902,18 @@ the operator is in scope (including if it is private).
|
||||||
Type bound operators are:
|
Type bound operators are:
|
||||||
`=destroy`, `=copy`, `=sink`, `=trace`, `=deepcopy`.
|
`=destroy`, `=copy`, `=sink`, `=trace`, `=deepcopy`.
|
||||||
|
|
||||||
|
These operations can be *overridden* instead of *overloaded*. This means that
|
||||||
|
the implementation is automatically lifted to structured types. For instance,
|
||||||
|
if the type `T` has an overridden assignment operator `=`, this operator is
|
||||||
|
also used for assignments of the type `seq[T]`.
|
||||||
|
|
||||||
|
Since these operations are bound to a type, they have to be bound to a
|
||||||
|
nominal type for reasons of simplicity of implementation; this means an
|
||||||
|
overridden `deepCopy` for `ref T` is really bound to `T` and not to `ref T`.
|
||||||
|
This also means that one cannot override `deepCopy` for both `ptr T` and
|
||||||
|
`ref T` at the same time, instead a distinct or object helper type has to be
|
||||||
|
used for one pointer type.
|
||||||
|
|
||||||
For more details on some of those procs, see
|
For more details on some of those procs, see
|
||||||
`Lifetime-tracking hooks <destructors.html#lifetimeminustracking-hooks>`_.
|
`Lifetime-tracking hooks <destructors.html#lifetimeminustracking-hooks>`_.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1192,51 +1192,25 @@ object inheritance syntax involving the `of` keyword:
|
||||||
the `vtptr` magic produced types bound to `ptr` types.
|
the `vtptr` magic produced types bound to `ptr` types.
|
||||||
|
|
||||||
|
|
||||||
Type bound operations
|
..
|
||||||
=====================
|
deepCopy
|
||||||
|
--------
|
||||||
|
`=deepCopy` is a builtin that is invoked whenever data is passed to
|
||||||
|
a `spawn`'ed proc to ensure memory safety. The programmer can override its
|
||||||
|
behaviour for a specific `ref` or `ptr` type `T`. (Later versions of the
|
||||||
|
language may weaken this restriction.)
|
||||||
|
|
||||||
There are 4 operations that are bound to a type:
|
The signature has to be:
|
||||||
|
|
||||||
1. Assignment
|
.. code-block:: nim
|
||||||
2. Moves
|
|
||||||
3. Destruction
|
|
||||||
4. Deep copying for communication between threads
|
|
||||||
|
|
||||||
These operations can be *overridden* instead of *overloaded*. This means that
|
|
||||||
the implementation is automatically lifted to structured types. For instance,
|
|
||||||
if the type `T` has an overridden assignment operator `=`, this operator is
|
|
||||||
also used for assignments of the type `seq[T]`.
|
|
||||||
|
|
||||||
Since these operations are bound to a type, they have to be bound to a
|
|
||||||
nominal type for reasons of simplicity of implementation; this means an
|
|
||||||
overridden `deepCopy` for `ref T` is really bound to `T` and not to `ref T`.
|
|
||||||
This also means that one cannot override `deepCopy` for both `ptr T` and
|
|
||||||
`ref T` at the same time, instead a distinct or object helper type has to be
|
|
||||||
used for one pointer type.
|
|
||||||
|
|
||||||
Assignments, moves and destruction are specified in
|
|
||||||
the `destructors <destructors.html>`_ document.
|
|
||||||
|
|
||||||
|
|
||||||
deepCopy
|
|
||||||
--------
|
|
||||||
|
|
||||||
`=deepCopy` is a builtin that is invoked whenever data is passed to
|
|
||||||
a `spawn`'ed proc to ensure memory safety. The programmer can override its
|
|
||||||
behaviour for a specific `ref` or `ptr` type `T`. (Later versions of the
|
|
||||||
language may weaken this restriction.)
|
|
||||||
|
|
||||||
The signature has to be:
|
|
||||||
|
|
||||||
.. code-block:: nim
|
|
||||||
|
|
||||||
proc `=deepCopy`(x: T): T
|
proc `=deepCopy`(x: T): T
|
||||||
|
|
||||||
This mechanism will be used by most data structures that support shared memory,
|
This mechanism will be used by most data structures that support shared memory,
|
||||||
like channels, to implement thread safe automatic memory management.
|
like channels, to implement thread safe automatic memory management.
|
||||||
|
|
||||||
The builtin `deepCopy` can even clone closures and their environments. See
|
The builtin `deepCopy` can even clone closures and their environments. See
|
||||||
the documentation of `spawn <#parallel-amp-spawn-spawn-statement>`_ for details.
|
the documentation of `spawn <#parallel-amp-spawn-spawn-statement>`_ for details.
|
||||||
|
|
||||||
|
|
||||||
Dynamic arguments for bindSym
|
Dynamic arguments for bindSym
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue