From 047218a222e41d07d84129cee10f19127dd0cb37 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Fri, 4 Oct 2024 14:53:15 -0400 Subject: [PATCH 1/6] add pointer to constructors Signed-off-by: martinvuyk --- stdlib/src/memory/pointer.mojo | 12 ++++++++++++ stdlib/src/memory/unsafe_pointer.mojo | 12 ++++++++++++ stdlib/test/memory/test_reference.mojo | 7 +++++++ stdlib/test/memory/test_unsafepointer.mojo | 7 +++++++ 4 files changed, 38 insertions(+) diff --git a/stdlib/src/memory/pointer.mojo b/stdlib/src/memory/pointer.mojo index 8ecdeb094e..2eb3d17e52 100644 --- a/stdlib/src/memory/pointer.mojo +++ b/stdlib/src/memory/pointer.mojo @@ -311,6 +311,18 @@ struct Pointer[ """ self._value = _mlir_value + @always_inline + fn __init__( + inout self, *, ref [lifetime, address_space._value.value]to: type + ): + """Create a pointer with the input value. + + Args: + to: The value to construct a pointer to. + """ + self = Self(__mlir_op.`lit.ref.to_pointer`(__get_mvalue_as_litref(to))) + + @deprecated("Use constructor Pointer(to=arg) instead.") @staticmethod @always_inline("nodebug") fn address_of( diff --git a/stdlib/src/memory/unsafe_pointer.mojo b/stdlib/src/memory/unsafe_pointer.mojo index a1cecd775f..727ccfee26 100644 --- a/stdlib/src/memory/unsafe_pointer.mojo +++ b/stdlib/src/memory/unsafe_pointer.mojo @@ -113,6 +113,17 @@ struct UnsafePointer[ """ self.address = value + @always_inline + fn __init__( + inout self, *, ref [lifetime, address_space._value.value]to: type + ): + """Create a pointer with the input value. + + Args: + to: The value to construct a pointer to. + """ + self = Self(__mlir_op.`lit.ref.to_pointer`(__get_mvalue_as_litref(to))) + @always_inline fn __init__(inout self, other: UnsafePointer[type, address_space, *_, **_]): """Exclusivity parameter cast a pointer. @@ -137,6 +148,7 @@ struct UnsafePointer[ # Factory methods # ===-------------------------------------------------------------------===# + @deprecated("Use constructor UnsafePointer(to=arg) instead.") @staticmethod @always_inline("nodebug") fn address_of( diff --git a/stdlib/test/memory/test_reference.mojo b/stdlib/test/memory/test_reference.mojo index 44d448e791..271269e1f1 100644 --- a/stdlib/test/memory/test_reference.mojo +++ b/stdlib/test/memory/test_reference.mojo @@ -41,7 +41,14 @@ def test_str(): assert_true(str(a_ref).startswith("0x")) +def test_pointer_to(): + var local = 1 + assert_not_equal(0, int(UnsafePointer(to=local))) + _ = local + + def main(): test_copy_reference_explicitly() test_equality() test_str() + test_pointer_to() diff --git a/stdlib/test/memory/test_unsafepointer.mojo b/stdlib/test/memory/test_unsafepointer.mojo index 86b735004f..a52be419e7 100644 --- a/stdlib/test/memory/test_unsafepointer.mojo +++ b/stdlib/test/memory/test_unsafepointer.mojo @@ -116,6 +116,12 @@ def test_address_of(): _ = local +def test_pointer_to(): + var local = 1 + assert_not_equal(0, int(UnsafePointer(to=local))) + _ = local + + def test_explicit_copy_of_pointer_address(): var local = 1 var ptr = UnsafePointer[Int].address_of(local) @@ -288,6 +294,7 @@ def test_load_and_store_simd(): def main(): test_address_of() + test_pointer_to() test_refitem() test_refitem_offset() From e5d69499723b518c9e0d7f0a954187b16d4eddcc Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Fri, 4 Oct 2024 15:17:03 -0400 Subject: [PATCH 2/6] what is happening Signed-off-by: martinvuyk --- stdlib/src/memory/pointer.mojo | 5 ++--- stdlib/src/memory/unsafe_pointer.mojo | 1 - stdlib/test/memory/test_reference.mojo | 4 ++-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/stdlib/src/memory/pointer.mojo b/stdlib/src/memory/pointer.mojo index 2eb3d17e52..4a3cd66b7d 100644 --- a/stdlib/src/memory/pointer.mojo +++ b/stdlib/src/memory/pointer.mojo @@ -311,7 +311,7 @@ struct Pointer[ """ self._value = _mlir_value - @always_inline + @always_inline("nodebug") fn __init__( inout self, *, ref [lifetime, address_space._value.value]to: type ): @@ -320,9 +320,8 @@ struct Pointer[ Args: to: The value to construct a pointer to. """ - self = Self(__mlir_op.`lit.ref.to_pointer`(__get_mvalue_as_litref(to))) + self = Self(_mlir_value=__get_mvalue_as_litref(to)) - @deprecated("Use constructor Pointer(to=arg) instead.") @staticmethod @always_inline("nodebug") fn address_of( diff --git a/stdlib/src/memory/unsafe_pointer.mojo b/stdlib/src/memory/unsafe_pointer.mojo index 727ccfee26..5544fd9534 100644 --- a/stdlib/src/memory/unsafe_pointer.mojo +++ b/stdlib/src/memory/unsafe_pointer.mojo @@ -148,7 +148,6 @@ struct UnsafePointer[ # Factory methods # ===-------------------------------------------------------------------===# - @deprecated("Use constructor UnsafePointer(to=arg) instead.") @staticmethod @always_inline("nodebug") fn address_of( diff --git a/stdlib/test/memory/test_reference.mojo b/stdlib/test/memory/test_reference.mojo index 271269e1f1..202e4c405b 100644 --- a/stdlib/test/memory/test_reference.mojo +++ b/stdlib/test/memory/test_reference.mojo @@ -11,7 +11,7 @@ # limitations under the License. # ===----------------------------------------------------------------------=== # # RUN: %mojo %s -from testing import assert_equal, assert_true +from testing import assert_equal, assert_true, assert_not_equal def test_copy_reference_explicitly(): @@ -43,7 +43,7 @@ def test_str(): def test_pointer_to(): var local = 1 - assert_not_equal(0, int(UnsafePointer(to=local))) + assert_not_equal(0, int(Pointer(to=local))) _ = local From bb6c06ff3bfb6d1009ed4a5d075b138e05163bf0 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Fri, 4 Oct 2024 16:41:24 -0400 Subject: [PATCH 3/6] leave Pointer constructor as fixme Signed-off-by: martinvuyk --- stdlib/src/memory/pointer.mojo | 21 +++++++++++---------- stdlib/test/memory/test_reference.mojo | 8 +++++--- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/stdlib/src/memory/pointer.mojo b/stdlib/src/memory/pointer.mojo index 4a3cd66b7d..c0b23391d6 100644 --- a/stdlib/src/memory/pointer.mojo +++ b/stdlib/src/memory/pointer.mojo @@ -311,16 +311,17 @@ struct Pointer[ """ self._value = _mlir_value - @always_inline("nodebug") - fn __init__( - inout self, *, ref [lifetime, address_space._value.value]to: type - ): - """Create a pointer with the input value. - - Args: - to: The value to construct a pointer to. - """ - self = Self(_mlir_value=__get_mvalue_as_litref(to)) + # FIXME + # @always_inline("nodebug") + # fn __init__( + # inout self, *, ref [lifetime, address_space._value.value]to: type + # ): + # """Create a pointer with the input value. + + # Args: + # to: The value to construct a pointer to. + # """ + # self = Self(_mlir_value=__get_mvalue_as_litref(to)) @staticmethod @always_inline("nodebug") diff --git a/stdlib/test/memory/test_reference.mojo b/stdlib/test/memory/test_reference.mojo index 202e4c405b..e1dfcb2ef5 100644 --- a/stdlib/test/memory/test_reference.mojo +++ b/stdlib/test/memory/test_reference.mojo @@ -42,9 +42,11 @@ def test_str(): def test_pointer_to(): - var local = 1 - assert_not_equal(0, int(Pointer(to=local))) - _ = local + # FIXME + ... + # var local = 1 + # assert_not_equal(0, int(Pointer(to=local))) + # _ = local def main(): From 2ce86b847ac2ed7bad8d7411cb2f02e3177755a4 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Mon, 2 Dec 2024 22:45:00 -0300 Subject: [PATCH 4/6] fix change lifetime to origin Signed-off-by: martinvuyk --- stdlib/src/memory/pointer.mojo | 4 ++-- stdlib/src/memory/unsafe_pointer.mojo | 13 +------------ .../{test_reference.mojo => test_pointer.mojo} | 4 ++-- 3 files changed, 5 insertions(+), 16 deletions(-) rename stdlib/test/memory/{test_reference.mojo => test_pointer.mojo} (98%) diff --git a/stdlib/src/memory/pointer.mojo b/stdlib/src/memory/pointer.mojo index 7b2c550bff..dbc57249fa 100644 --- a/stdlib/src/memory/pointer.mojo +++ b/stdlib/src/memory/pointer.mojo @@ -339,10 +339,10 @@ struct Pointer[ """ self._value = _mlir_value - # FIXME + # FIXME(#3617) # @always_inline("nodebug") # fn __init__( - # inout self, *, ref [lifetime, address_space._value.value]to: type + # inout self, *, ref [origin, address_space._value.value]to: type # ): # """Create a pointer with the input value. diff --git a/stdlib/src/memory/unsafe_pointer.mojo b/stdlib/src/memory/unsafe_pointer.mojo index f961970df0..5fbf6be019 100644 --- a/stdlib/src/memory/unsafe_pointer.mojo +++ b/stdlib/src/memory/unsafe_pointer.mojo @@ -115,18 +115,7 @@ struct UnsafePointer[ @always_inline fn __init__( - inout self, *, ref [lifetime, address_space._value.value]to: type - ): - """Create a pointer with the input value. - - Args: - to: The value to construct a pointer to. - """ - self = Self(__mlir_op.`lit.ref.to_pointer`(__get_mvalue_as_litref(to))) - - @always_inline - fn __init__( - inout self, *, ref [lifetime, address_space._value.value]to: type + inout self, *, ref [origin, address_space._value.value]to: type ): """Create a pointer with the input value. diff --git a/stdlib/test/memory/test_reference.mojo b/stdlib/test/memory/test_pointer.mojo similarity index 98% rename from stdlib/test/memory/test_reference.mojo rename to stdlib/test/memory/test_pointer.mojo index e1dfcb2ef5..342279f483 100644 --- a/stdlib/test/memory/test_reference.mojo +++ b/stdlib/test/memory/test_pointer.mojo @@ -42,11 +42,11 @@ def test_str(): def test_pointer_to(): - # FIXME - ... + # FIXME(#3617) # var local = 1 # assert_not_equal(0, int(Pointer(to=local))) # _ = local + ... def main(): From 6f5acc209bacfb86da8b022d03ddb65db3097745 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Fri, 28 Feb 2025 15:47:34 -0300 Subject: [PATCH 5/6] update after fix Signed-off-by: martinvuyk --- mojo/stdlib/src/memory/pointer.mojo | 19 ++++++++----------- mojo/stdlib/src/memory/unsafe_pointer.mojo | 8 +++----- mojo/stdlib/test/memory/test_pointer.mojo | 7 ++----- .../test/memory/test_unsafepointer.mojo | 3 +-- 4 files changed, 14 insertions(+), 23 deletions(-) diff --git a/mojo/stdlib/src/memory/pointer.mojo b/mojo/stdlib/src/memory/pointer.mojo index 9aa0a84732..4618617d99 100644 --- a/mojo/stdlib/src/memory/pointer.mojo +++ b/mojo/stdlib/src/memory/pointer.mojo @@ -341,17 +341,14 @@ struct Pointer[ """ self._value = _mlir_value - # FIXME(#3617) - # @always_inline("nodebug") - # fn __init__( - # inout self, *, ref [origin, address_space._value.value]to: type - # ): - # """Create a pointer with the input value. - - # Args: - # to: The value to construct a pointer to. - # """ - # self = Self(_mlir_value=__get_mvalue_as_litref(to)) + @always_inline("nodebug") + fn __init__(out self, *, ref [origin, address_space._value.value]to: type): + """Constructs a Pointer from a reference to a value. + + Args: + to: The value to construct a pointer to. + """ + self = Self(_mlir_value=__get_mvalue_as_litref(to)) @staticmethod @always_inline("nodebug") diff --git a/mojo/stdlib/src/memory/unsafe_pointer.mojo b/mojo/stdlib/src/memory/unsafe_pointer.mojo index 3ca4a7b740..c20b990f3f 100644 --- a/mojo/stdlib/src/memory/unsafe_pointer.mojo +++ b/mojo/stdlib/src/memory/unsafe_pointer.mojo @@ -128,11 +128,9 @@ struct UnsafePointer[ """ self.address = value - @always_inline - fn __init__( - inout self, *, ref [origin, address_space._value.value]to: type - ): - """Create a pointer with the input value. + @always_inline("nodebug") + fn __init__(out self, *, ref [origin, address_space._value.value]to: type): + """Constructs a Pointer from a reference to a value. Args: to: The value to construct a pointer to. diff --git a/mojo/stdlib/test/memory/test_pointer.mojo b/mojo/stdlib/test/memory/test_pointer.mojo index aa9989d4c7..13b9ce9037 100644 --- a/mojo/stdlib/test/memory/test_pointer.mojo +++ b/mojo/stdlib/test/memory/test_pointer.mojo @@ -42,11 +42,8 @@ def test_str(): def test_pointer_to(): - # FIXME(#3617) - # var local = 1 - # assert_not_equal(0, int(Pointer(to=local))) - # _ = local - ... + var local = 1 + assert_not_equal(0, Pointer(to=local)[]) def main(): diff --git a/mojo/stdlib/test/memory/test_unsafepointer.mojo b/mojo/stdlib/test/memory/test_unsafepointer.mojo index 4a69cec8c0..f86429d03b 100644 --- a/mojo/stdlib/test/memory/test_unsafepointer.mojo +++ b/mojo/stdlib/test/memory/test_unsafepointer.mojo @@ -103,8 +103,7 @@ def test_address_of(): def test_pointer_to(): var local = 1 - assert_not_equal(0, int(UnsafePointer(to=local))) - _ = local + assert_not_equal(0, UnsafePointer(to=local)[]) def test_explicit_copy_of_pointer_address(): From 73ed11fee00ad3cae58d70436bd1310ef006634b Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Fri, 28 Feb 2025 15:56:37 -0300 Subject: [PATCH 6/6] rename test_reference Signed-off-by: martinvuyk --- mojo/stdlib/test/memory/test_reference.mojo | 56 --------------------- 1 file changed, 56 deletions(-) delete mode 100644 mojo/stdlib/test/memory/test_reference.mojo diff --git a/mojo/stdlib/test/memory/test_reference.mojo b/mojo/stdlib/test/memory/test_reference.mojo deleted file mode 100644 index aa9989d4c7..0000000000 --- a/mojo/stdlib/test/memory/test_reference.mojo +++ /dev/null @@ -1,56 +0,0 @@ -# ===----------------------------------------------------------------------=== # -# Copyright (c) 2025, Modular Inc. All rights reserved. -# -# Licensed under the Apache License v2.0 with LLVM Exceptions: -# https://llvm.org/LICENSE.txt -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ===----------------------------------------------------------------------=== # -# RUN: %mojo %s -from testing import assert_equal, assert_true, assert_not_equal - - -def test_copy_reference_explicitly(): - var a = List[Int](1, 2, 3) - - var b = Pointer.address_of(a) - var c = b.copy() - - c[][0] = 4 - assert_equal(a[0], 4) - assert_equal(b[][0], 4) - assert_equal(c[][0], 4) - - -def test_equality(): - var a = List[Int](1, 2, 3) - var b = List[Int](4, 5, 6) - - assert_true(Pointer.address_of(a) == Pointer.address_of(a)) - assert_true(Pointer.address_of(b) == Pointer.address_of(b)) - assert_true(Pointer.address_of(a) != Pointer.address_of(b)) - - -def test_str(): - var a = Int(42) - var a_ref = Pointer.address_of(a) - assert_true(String(a_ref).startswith("0x")) - - -def test_pointer_to(): - # FIXME(#3617) - # var local = 1 - # assert_not_equal(0, int(Pointer(to=local))) - # _ = local - ... - - -def main(): - test_copy_reference_explicitly() - test_equality() - test_str() - test_pointer_to()