deprecate unsafeAddr; extend addr (#19373)
* deprecate unsafeAddr; extend addr addr is now available for all addressable locations, unsafeAddr is deprecated and become an alias for addr * follow @Vindaar's advice * change the signature of addr * unsafeAddr => addr (stdlib) * Update changelog.md * unsafeAddr => addr (tests) * Revert "unsafeAddr => addr (stdlib)" This reverts commit ab83c99c507048a8396e636bf22d55fdd84d7d1c. * doc changes; thanks to @konsumlamm Co-authored-by: konsumlamm <44230978+konsumlamm@users.noreply.github.com> Co-authored-by: konsumlamm <44230978+konsumlamm@users.noreply.github.com>
This commit is contained in:
parent
a95399143f
commit
d102b2f54c
30 changed files with 69 additions and 66 deletions
|
|
@ -3502,8 +3502,9 @@ location is `T`, the `addr` operator result is of the type `ptr T`. An
|
|||
address is always an untraced reference. Taking the address of an object that
|
||||
resides on the stack is **unsafe**, as the pointer may live longer than the
|
||||
object on the stack and can thus reference a non-existing object. One can get
|
||||
the address of variables, but one can't use it on variables declared through
|
||||
`let` statements:
|
||||
the address of variables. For easier interoperability with other compiled languages
|
||||
such as C, retrieving the address of a `let` variable, a parameter,
|
||||
or a `for` loop variable can be accomplished too:
|
||||
|
||||
.. code-block:: nim
|
||||
|
||||
|
|
@ -3515,24 +3516,18 @@ the address of variables, but one can't use it on variables declared through
|
|||
# --> ref 0x7fff6b71b670 --> 0x10bb81050"Hello"
|
||||
echo cast[ptr string](t3)[]
|
||||
# --> Hello
|
||||
# The following line doesn't compile:
|
||||
# The following line also works
|
||||
echo repr(addr(t1))
|
||||
# Error: expression has no address
|
||||
|
||||
|
||||
The unsafeAddr operator
|
||||
-----------------------
|
||||
|
||||
For easier interoperability with other compiled languages such as C, retrieving
|
||||
the address of a `let` variable, a parameter, or a `for` loop variable can
|
||||
be accomplished by using the `unsafeAddr` operation:
|
||||
The `unsafeAddr` operator is a deprecated alias for the `addr` operator:
|
||||
|
||||
.. code-block:: nim
|
||||
|
||||
let myArray = [1, 2, 3]
|
||||
foreignProcThatTakesAnAddr(unsafeAddr myArray)
|
||||
|
||||
|
||||
Procedures
|
||||
==========
|
||||
|
||||
|
|
|
|||
|
|
@ -603,7 +603,7 @@ has `source` as the owner. A path expression `e` is defined recursively:
|
|||
- Object field access `e.field` is a path expression.
|
||||
- `system.toOpenArray(e, ...)` is a path expression.
|
||||
- Pointer dereference `e[]` is a path expression.
|
||||
- An address `addr e`, `unsafeAddr e` is a path expression.
|
||||
- An address `addr e` is a path expression.
|
||||
- A type conversion `T(e)` is a path expression.
|
||||
- A cast expression `cast[T](e)` is a path expression.
|
||||
- `f(e, ...)` is a path expression if `f`'s return type is a view type.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue