This is an automated email from the ASF dual-hosted git repository.

tqchen pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm-ffi.git


The following commit(s) were added to refs/heads/main by this push:
     new 55b4fad0 [Rust] Index Array in place; add Array::from_vec; rename 
Optional::is_some and UnchangedOr::value_or_unchanged (#929)
55b4fad0 is described below

commit 55b4fad05c39996f506c170985da2381134ef362
Author: Tianqi Chen <[email protected]>
AuthorDate: Thu Nov 5 09:13:46 2026 -0500

    [Rust] Index Array in place; add Array::from_vec; rename Optional::is_some 
and UnchangedOr::value_or_unchanged (#929)
    
    Fixes one unsound API and aligns several names with Rust conventions.
    
    - **`Array` indexing.** `Index<usize> for Array<T>` returned
    `&AnyView<'static>`. Because `AnyView` is `Copy`, `arr[i]` could copy
    out a view that outlives the array, in safe code. It now returns `&T`,
    borrowed from the array's cell. Every cell of an `Array<T>` holds a `T`,
    checked when the array is built, so indexing only debug-checks the type,
    like `Vec`'s `[]` next to `get`. The hidden unsafe `RefFromAny` trait
    (`ref_from_any(cell) -> &Self`) marks the types an FFI `Any` cell stores
    in place: `Any`, `String`, `Bytes`, `i64`, `f64`, `Array`, `Map`,
    `List`, and every `#[derive(ObjectRef)]` type. The derive asserts at
    compile time that the reference type is exactly its `ObjectArc`.
    - **`Array::new()` / `Array::from_vec`.** `Array::new()` creates an
    empty array, like `List::new()` and `Map::new()`.
    `Array::from_vec(items)` and `From<Vec<T>>` build one from items.
    - **`Optional::is_some`.** Renamed from `has_value`, next to `is_none`.
    - **`UnchangedOr::value_or_unchanged`.** Renamed from `value_or`,
    matching C++ `ValueOrUnchanged`. `value_or_else` is removed; use
    `into_option().unwrap_or_else(..)`.
    - **`Tensor::data_as_slice_mut`.** Allows `clippy::mut_from_ref` on this
    one function: returning `&mut` from `&self` is intentional and covered
    by its documented safety contract.
    - **`Map::contains_key`.** Returns `Result<bool>`: a lookup that fails
    in the C++ runtime is reported as `Err`, like `Map::get`, instead of
    panicking.
---
 docs/guides/rust_lang_guide.rst                    |  30 ++--
 rust/tvm-ffi-macros/src/object_macros.rs           |  19 +++
 rust/tvm-ffi/src/any.rs                            |   4 +-
 rust/tvm-ffi/src/collections/array.rs              |  64 +++++--
 rust/tvm-ffi/src/collections/list.rs               |  11 ++
 rust/tvm-ffi/src/collections/map.rs                |  31 ++--
 rust/tvm-ffi/src/collections/tensor.rs             |   2 +-
 rust/tvm-ffi/src/extra/structural_map.rs           |  20 +--
 rust/tvm-ffi/src/extra/structural_mutate.rs        |  76 ++++-----
 rust/tvm-ffi/src/extra/structural_visit.rs         |  68 ++++----
 rust/tvm-ffi/src/extra/structural_walk.rs          |  18 +-
 rust/tvm-ffi/src/extra/unchanged.rs                |  35 ++--
 rust/tvm-ffi/src/lib.rs                            |  18 +-
 rust/tvm-ffi/src/macros.rs                         |   4 +-
 rust/tvm-ffi/src/object.rs                         |   2 +-
 rust/tvm-ffi/src/optional.rs                       |   8 +-
 rust/tvm-ffi/src/reflection/unsafe_init.rs         |   2 +-
 rust/tvm-ffi/src/type_traits.rs                    |  55 ++++++
 rust/tvm-ffi/tests/test_array.rs                   |  22 +--
 rust/tvm-ffi/tests/test_big_int.rs                 |   8 +-
 rust/tvm-ffi/tests/test_cast.rs                    |   2 +-
 rust/tvm-ffi/tests/test_error.rs                   |   2 +-
 rust/tvm-ffi/tests/test_function.rs                |   4 +-
 rust/tvm-ffi/tests/test_list.rs                    |   8 +-
 rust/tvm-ffi/tests/test_map.rs                     |  12 +-
 rust/tvm-ffi/tests/test_match_any.rs               |   8 +-
 rust/tvm-ffi/tests/test_object.rs                  |   4 +-
 rust/tvm-ffi/tests/test_object_reflection.rs       |   2 +-
 rust/tvm-ffi/tests/test_optional.rs                |   8 +-
 rust/tvm-ffi/tests/test_rs_object.rs               |   4 +-
 rust/tvm-ffi/tests/test_structural_mutate.rs       | 184 ++++++++++++---------
 rust/tvm-ffi/tests/test_structural_visit.rs        | 123 ++++++++------
 rust/tvm-ffi/tests/test_structural_visit_base.rs   |  94 +++++------
 .../tests/test_structural_visitor_alignment.rs     |   4 +-
 rust/tvm-ffi/tests/test_tensor_view.rs             |   4 +-
 35 files changed, 561 insertions(+), 399 deletions(-)

diff --git a/docs/guides/rust_lang_guide.rst b/docs/guides/rust_lang_guide.rst
index e780bf06..829d3b66 100644
--- a/docs/guides/rust_lang_guide.rst
+++ b/docs/guides/rust_lang_guide.rst
@@ -89,7 +89,7 @@ the value it borrows. A number and a built-in array 
illustrate owning and borrow
    let number = Any::from(3_i64);
    assert_eq!(number.try_as::<i64>(), Some(3));
 
-   let value = Any::from(Array::new(vec![1_i64, 2, 3]));
+   let value = Any::from(Array::from_vec(vec![1_i64, 2, 3]));
    let view = AnyView::from(&value); // Borrow the value without a new 
reference.
    assert_eq!(view.downcast_ref::<ArrayObj>().unwrap().size, 3);
 
@@ -122,7 +122,7 @@ element type to ``T``. Named reference types implement 
|rs-objectrefcore|_ for s
    use tvm_ffi::collections::array::ArrayObj;
    use tvm_ffi::{Array, ObjectRefCore};
 
-   let array = Array::new(vec![1_i64, 2, 3]);
+   let array = Array::from_vec(vec![1_i64, 2, 3]);
    assert_eq!(array.downcast_ref::<ArrayObj>().unwrap().size, 3);
    assert_eq!(array.get(1).unwrap(), 2); // A method of the named type.
 
@@ -498,7 +498,7 @@ arm whose type matches the value runs:
    for value in [
        Any::from(42_i64),
        Any::from(tvm_ffi::String::from("hi")),
-       Any::from(Array::new(vec![1_i64, 2, 3])),
+       Any::from(Array::from_vec(vec![1_i64, 2, 3])),
        Any::from(1.5_f64),
    ] {
        println!("{}", kind(&value));
@@ -555,10 +555,10 @@ them. Let's describe nested arrays, with a separator 
between items:
        }
    }
 
-   let value = Any::from(Array::new(vec![
+   let value = Any::from(Array::from_vec(vec![
        Any::from(1_i64),
        Any::from(tvm_ffi::String::from("a")),
-       Any::from(Array::new(vec![2_i64, 3])),
+       Any::from(Array::from_vec(vec![2_i64, 3])),
    ]));
    let text = Describer.dispatch(AnyView::from(&value), ", ").unwrap();
    println!("{text}");
@@ -661,7 +661,7 @@ Walk handlers may take an optional trailing 
``DefRegionKind`` argument:
        }
    }
 
-   let values = Array::new(vec![1_i64, 2, 3]);
+   let values = Array::from_vec(vec![1_i64, 2, 3]);
    let mut probe = Probe::default();
    structural_walk(&values, &mut probe, WalkOrder::PreOrder)?;
    assert_eq!(probe.total, 6);
@@ -682,7 +682,7 @@ take a trailing ``DefRegionKind`` argument:
 
    use tvm_ffi::{structural_walk, Array, DefRegionKind, Object, WalkOrder, 
WalkResult};
 
-   let values = Array::new(vec![1_i64, 2, 3]);
+   let values = Array::from_vec(vec![1_i64, 2, 3]);
 
    let mut total = 0;
    structural_walk(
@@ -725,7 +725,7 @@ propagate errors with ``?``:
 
    use tvm_ffi::{structural_walk, Array, WalkOrder, WalkResult};
 
-   let values = Array::new(vec![1_i64, 2, 3]);
+   let values = Array::from_vec(vec![1_i64, 2, 3]);
    let found = structural_walk(
        &values,
        |value: i64| {
@@ -765,7 +765,7 @@ dispatchers and closures.
        }
    }
 
-   let values = Array::new(vec![1_i64, 2]);
+   let values = Array::from_vec(vec![1_i64, 2]);
    let mut visitor = Stats::default();
    structural_visit(&values, &mut visitor)?;
    assert_eq!(visitor.total, 3);
@@ -810,7 +810,7 @@ argument tuple and return type supply the engine signature 
directly:
        }
    }
 
-   let values = Array::new(vec![1_i64, 2]);
+   let values = Array::from_vec(vec![1_i64, 2]);
    let mut depth = Depth::default();
    structural_visit(&values, &mut depth)?;
    assert_eq!(depth.max, 2);
@@ -868,7 +868,7 @@ catch-all and should therefore come last:
 
    let mut increment = Increment::default();
    let mapped = structural_map(
-       Array::new(vec![1_i64, 2]),
+       Array::from_vec(vec![1_i64, 2]),
        &mut increment,
        WalkOrder::PostOrder,
    )?;
@@ -958,7 +958,7 @@ Base implementations delegate to the corresponding 
``StructuralVisitorObj`` or
    }
 
    let mut mutator = Stats::default();
-   let mutated = structural_mutate(Array::new(vec![1_i64, 2]), &mut mutator)?;
+   let mutated = structural_mutate(Array::from_vec(vec![1_i64, 2]), &mut 
mutator)?;
    let mutated = Array::<i64>::try_from(mutated)?;
    assert_eq!(mutated.iter().collect::<Vec<_>>(), vec![2, 3]);
    assert_eq!(mutator.integers, 2);
@@ -967,7 +967,7 @@ Base implementations delegate to the corresponding 
``StructuralVisitorObj`` or
 ``mutator.default_mutate(self, value)`` runs default descent. Both return
 ``Result<UnchangedOr<Any>>`` and preserve the capability's permission. For a 
local owning
 ``Any``, pass ``&mut owned`` and resolve the returned change with
-``change.value_or(owned)`` after the borrow ends. These calls inherit the 
definition
+``change.value_or_unchanged(owned)`` after the borrow ends. These calls 
inherit the definition
 region established by the defining node or reflected field; handlers query it
 with ``mutator.def_region_kind()``. Reserve ``with_def_region_kind`` on either 
view
 for hooks that establish a definition region according to their node's 
semantics.
@@ -1014,7 +1014,7 @@ other handler consumes it:
    }
 
    let mut increment = Increment::default();
-   let mutated = structural_mutate(Array::new(vec![1_i64, 2]), &mut 
increment)?;
+   let mutated = structural_mutate(Array::from_vec(vec![1_i64, 2]), &mut 
increment)?;
    let mutated = Array::<i64>::try_from(mutated)?;
    assert_eq!(mutated.iter().collect::<Vec<_>>(), vec![2, 3]);
    assert_eq!(increment.integers, 2);
@@ -1043,7 +1043,7 @@ while retaining typed scalar replacements:
        }
    }
 
-   let mutated = structural_mutate(Array::new(vec![1_i64, 2]), Increment)?;
+   let mutated = structural_mutate(Array::from_vec(vec![1_i64, 2]), 
Increment)?;
    let mutated = Array::<i64>::try_from(mutated)?;
    assert_eq!(mutated.iter().collect::<Vec<_>>(), vec![2, 3]);
 
diff --git a/rust/tvm-ffi-macros/src/object_macros.rs 
b/rust/tvm-ffi-macros/src/object_macros.rs
index e51745dc..76cc3492 100644
--- a/rust/tvm-ffi-macros/src/object_macros.rs
+++ b/rust/tvm-ffi-macros/src/object_macros.rs
@@ -555,6 +555,25 @@ pub(crate) fn expand_object_ref(
             }
         }
 
+        // The handle is exactly its object pointer, which an FFI cell's
+        // payload word holds, so an `Array` cell can lend `&Self` in place.
+        const _: () = {
+            type ContainerType = <#struct_name as 
#tvm_ffi_crate::object::ObjectRefCore>::ContainerType;
+            assert!(
+                ::core::mem::size_of::<#struct_name>()
+                    == 
::core::mem::size_of::<#tvm_ffi_crate::object::ObjectArc<ContainerType>>()
+                    && ::core::mem::offset_of!(#struct_name, #data_id) == 0,
+                "an ObjectRef must consist of its ObjectArc alone"
+            );
+        };
+
+        unsafe impl #tvm_ffi_crate::type_traits::RefFromAny for #struct_name {
+            #[inline(always)]
+            unsafe fn ref_from_any(cell: 
&#tvm_ffi_crate::tvm_ffi_sys::TVMFFIAny) -> &Self {
+                &*(::core::ptr::addr_of!(cell.data_union) as *const Self)
+            }
+        }
+
         impl ::std::convert::From<&#struct_name> for #struct_name {
             #[inline]
             fn from(value: &#struct_name) -> Self {
diff --git a/rust/tvm-ffi/src/any.rs b/rust/tvm-ffi/src/any.rs
index f9b24672..a853822f 100644
--- a/rust/tvm-ffi/src/any.rs
+++ b/rust/tvm-ffi/src/any.rs
@@ -34,7 +34,7 @@ use tvm_ffi_sys::{TVMFFIAny, TVMFFIAnyViewToOwnedAny};
 /// ```
 /// use tvm_ffi::{Any, AnyView, Array};
 ///
-/// let array = Array::new(vec![1_i64, 2, 3]);
+/// let array = Array::from_vec(vec![1_i64, 2, 3]);
 /// let view = AnyView::from(&array);
 /// assert_eq!(view.try_as::<Array<i64>>().unwrap().len(), 3);
 ///
@@ -327,7 +327,7 @@ impl Any {
     ///
     /// ```
     /// use tvm_ffi::{collections::array::ArrayObj, Any, Array};
-    /// let value = Any::from(Array::new(vec![1_i64, 2]));
+    /// let value = Any::from(Array::from_vec(vec![1_i64, 2]));
     /// assert_eq!(value.downcast_ref::<ArrayObj>().unwrap().size, 2);
     /// ```
     ///
diff --git a/rust/tvm-ffi/src/collections/array.rs 
b/rust/tvm-ffi/src/collections/array.rs
index f7fb613b..07249398 100644
--- a/rust/tvm-ffi/src/collections/array.rs
+++ b/rust/tvm-ffi/src/collections/array.rs
@@ -24,7 +24,7 @@ use crate::any::TryFromTemp;
 use crate::collections::list::seq_cells;
 use crate::derive::Object;
 use crate::object::{Object, ObjectArc};
-use crate::type_traits::ContainerElement;
+use crate::type_traits::{ContainerElement, RefFromAny};
 use crate::{Any, AnyCompatible, AnyView, ObjectCoreWithExtraItems, 
ObjectRefCore};
 use tvm_ffi_sys::TVMFFITypeIndex as TypeIndex;
 use tvm_ffi_sys::{TVMFFIAny, TVMFFIObject};
@@ -63,7 +63,7 @@ unsafe impl ObjectCoreWithExtraItems for ArrayObj {
 /// ```
 /// use tvm_ffi::Array;
 ///
-/// let array = Array::new(vec![1_i64, 2, 3]);
+/// let array = Array::from_vec(vec![1_i64, 2, 3]);
 /// assert_eq!(array.len(), 3);
 /// assert_eq!(array.get(1)?, 2);
 /// assert!(array.get(3).is_err());
@@ -89,7 +89,13 @@ impl<T: ContainerElement + Clone> Debug for Array<T> {
 
 impl<T: ContainerElement + Clone> Default for Array<T> {
     fn default() -> Self {
-        Self::new(vec![])
+        Self::new()
+    }
+}
+
+impl<T: ContainerElement + Clone> From<Vec<T>> for Array<T> {
+    fn from(items: Vec<T>) -> Self {
+        Self::from_vec(items)
     }
 }
 
@@ -113,7 +119,18 @@ unsafe impl<T: ContainerElement + Clone> ObjectRefCore for 
Array<T> {
 }
 
 impl<T: ContainerElement + Clone> Array<T> {
-    /// Create an array holding `items`.
+    /// Create an empty array.
+    ///
+    /// # Returns
+    ///
+    /// The empty array.
+    ///
+    /// See also [`Array::from_vec`].
+    pub fn new() -> Self {
+        Self::from_vec(Vec::new())
+    }
+
+    /// Create an array holding `items`, like `Array::from(items)`.
     ///
     /// # Arguments
     ///
@@ -122,7 +139,16 @@ impl<T: ContainerElement + Clone> Array<T> {
     /// # Returns
     ///
     /// The array.
-    pub fn new(items: Vec<T>) -> Self {
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use tvm_ffi::Array;
+    ///
+    /// let array = Array::from_vec(vec![1_i64, 2, 3]);
+    /// assert_eq!(array[1], 2);
+    /// ```
+    pub fn from_vec(items: Vec<T>) -> Self {
         let capacity = items.len();
         Self::new_with_capacity(items, capacity)
     }
@@ -234,10 +260,12 @@ impl<T: ContainerElement + Clone> Array<T> {
 
 // --- Index Implementation ---
 
-impl<T: ContainerElement + Clone> std::ops::Index<usize> for Array<T> {
-    type Output = AnyView<'static>;
+/// Lends `&T` from the array's cell in place. Every cell of an `Array<T>`
+/// holds a `T` (checked when the array is built), so only a debug check runs.
+impl<T: ContainerElement + Clone + RefFromAny> std::ops::Index<usize> for 
Array<T> {
+    type Output = T;
 
-    fn index(&self, index: usize) -> &Self::Output {
+    fn index(&self, index: usize) -> &T {
         let container = self.as_container();
         let len = container.size as usize;
         if index >= len {
@@ -247,8 +275,9 @@ impl<T: ContainerElement + Clone> std::ops::Index<usize> 
for Array<T> {
             );
         }
         unsafe {
-            let ptr = (container.data as *const AnyView<'static>).add(index);
-            &*ptr
+            let cell = &*(container.data as *const TVMFFIAny).add(index);
+            debug_assert!(T::container_check_any_strict(cell));
+            T::ref_from_any(cell)
         }
     }
 }
@@ -287,7 +316,7 @@ impl<'a, T: ContainerElement + Clone> IntoIterator for &'a 
Array<T> {
 impl<T: ContainerElement + Clone> FromIterator<T> for Array<T> {
     fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
         let items: Vec<T> = iter.into_iter().collect();
-        Self::new(items)
+        Self::from_vec(items)
     }
 }
 
@@ -391,7 +420,18 @@ where
         for cell in cells {
             items.push(T::container_try_cast_from_any_view(cell)?);
         }
-        Ok(Array::new(items))
+        Ok(Array::from_vec(items))
+    }
+}
+
+// The cell's payload word is the single object pointer of the handle.
+unsafe impl<T> crate::type_traits::RefFromAny for Array<T>
+where
+    T: ContainerElement + Clone,
+{
+    #[inline(always)]
+    unsafe fn ref_from_any(cell: &TVMFFIAny) -> &Self {
+        &*(core::ptr::addr_of!(cell.data_union) as *const Self)
     }
 }
 
diff --git a/rust/tvm-ffi/src/collections/list.rs 
b/rust/tvm-ffi/src/collections/list.rs
index 40a0c8b4..dea75f18 100644
--- a/rust/tvm-ffi/src/collections/list.rs
+++ b/rust/tvm-ffi/src/collections/list.rs
@@ -656,6 +656,17 @@ unsafe impl<T: ContainerElement> AnyCompatible for List<T> 
{
     }
 }
 
+// The cell's payload word is the single object pointer of the handle.
+unsafe impl<T> crate::type_traits::RefFromAny for List<T>
+where
+    T: ContainerElement,
+{
+    #[inline(always)]
+    unsafe fn ref_from_any(cell: &TVMFFIAny) -> &Self {
+        &*(core::ptr::addr_of!(cell.data_union) as *const Self)
+    }
+}
+
 impl<T: ContainerElement> TryFrom<Any> for List<T> {
     type Error = Error;
 
diff --git a/rust/tvm-ffi/src/collections/map.rs 
b/rust/tvm-ffi/src/collections/map.rs
index a82664fa..2c9b11c1 100644
--- a/rust/tvm-ffi/src/collections/map.rs
+++ b/rust/tvm-ffi/src/collections/map.rs
@@ -230,21 +230,18 @@ where
         }
     }
 
-    /// Returns `true` if `key` is present in the map.
-    ///
-    /// Panics if the lookup fails in the C++ runtime (e.g. `key` is not
-    /// hashable); use [`Map::get`] when such failures must be recovered from.
+    /// Returns `Ok(true)` if `key` is present in the map, or `Err` if the 
lookup
+    /// fails in the C++ runtime (e.g. `key` is not hashable), like
+    /// [`Map::get`].
     /// Passing a `key` whose *type* does not match the map's key type is
-    /// **undefined** (currently reads as `false`; see [`Map::get`]); debug 
builds
-    /// assert against it.
-    pub fn contains_key(&self, key: &K) -> bool {
-        let present = self
-            .try_contains_key(key)
-            .expect("ffi.MapCount call failed");
+    /// **undefined** (currently reads as `Ok(false)`; see [`Map::get`]); debug
+    /// builds assert against it.
+    pub fn contains_key(&self, key: &K) -> Result<bool> {
+        let present = self.try_contains_key(key)?;
         if !present {
             self.debug_assert_key_type();
         }
-        present
+        Ok(present)
     }
 
     /// Looks up `key`, returning `Ok(None)` if absent, or `Err` if the lookup
@@ -574,6 +571,18 @@ where
     }
 }
 
+// The cell's payload word is the single object pointer of the handle.
+unsafe impl<K, V> crate::type_traits::RefFromAny for Map<K, V>
+where
+    K: ContainerElement,
+    V: ContainerElement,
+{
+    #[inline(always)]
+    unsafe fn ref_from_any(cell: &TVMFFIAny) -> &Self {
+        &*(core::ptr::addr_of!(cell.data_union) as *const Self)
+    }
+}
+
 impl<K, V> TryFrom<Any> for Map<K, V>
 where
     K: ContainerElement,
diff --git a/rust/tvm-ffi/src/collections/tensor.rs 
b/rust/tvm-ffi/src/collections/tensor.rs
index 32cbf488..ae3003af 100644
--- a/rust/tvm-ffi/src/collections/tensor.rs
+++ b/rust/tvm-ffi/src/collections/tensor.rs
@@ -179,7 +179,7 @@ impl Tensor {
     /// # Safety contract (caller responsibility)
     /// If the `Tensor` has been cloned (via `ObjectArc`), the caller must
     /// ensure no other clone is concurrently reading the data.
-    #[allow(clippy::wrong_self_convention)]
+    #[allow(clippy::wrong_self_convention, clippy::mut_from_ref)]
     pub fn data_as_slice_mut<T: AsDLDataType>(&self) -> Result<&mut [T]> {
         let dtype = T::DL_DATA_TYPE;
         if self.dtype() != dtype {
diff --git a/rust/tvm-ffi/src/extra/structural_map.rs 
b/rust/tvm-ffi/src/extra/structural_map.rs
index 50fe8677..eb7cece9 100644
--- a/rust/tvm-ffi/src/extra/structural_map.rs
+++ b/rust/tvm-ffi/src/extra/structural_map.rs
@@ -21,12 +21,12 @@
 
 use super::structural_common::raw_ffi_any_same_as;
 use super::structural_mutate::{
-    IntoMutateResult, MutationView, StructuralMutateEngine, 
StructuralMutatorView,
-    with_mutation_error_context,
+    with_mutation_error_context, IntoMutateResult, MutationView, 
StructuralMutateEngine,
+    StructuralMutatorView,
 };
 use super::structural_visit::DefRegionKind;
 use super::structural_walk::WalkOrder;
-use super::unchanged::{UnchangedOr, is_unchanged};
+use super::unchanged::{is_unchanged, UnchangedOr};
 use crate::{Any, AnyView, Dispatcher, IntoDispatcher, Result};
 use std::borrow::BorrowMut;
 
@@ -192,7 +192,7 @@ where
 /// ```
 /// use tvm_ffi::{structural_map, Array, WalkOrder};
 ///
-/// let root = Array::new(vec![1_i64, 2, 3]);
+/// let root = Array::from_vec(vec![1_i64, 2, 3]);
 /// let mapped = structural_map(root.clone(), |value: i64| value + 1, 
WalkOrder::PostOrder)?;
 /// let mapped = Array::<i64>::try_from(mapped)?;
 /// assert_eq!(mapped.iter().collect::<Vec<_>>(), vec![2, 3, 4]);
@@ -204,12 +204,12 @@ where
     R: Into<Any>,
     O: BorrowMut<D>,
     for<'v> H: IntoDispatcher<
-            (AnyView<'v>, DefRegionKind),
-            Option<Result<UnchangedOr<Any>>>,
-            M,
-            Target = D,
-            Output = O,
-        >,
+        (AnyView<'v>, DefRegionKind),
+        Option<Result<UnchangedOr<Any>>>,
+        M,
+        Target = D,
+        Output = O,
+    >,
     for<'s, 'v> &'s mut D:
         Dispatcher<(AnyView<'v>, DefRegionKind), 
Option<Result<UnchangedOr<Any>>>>,
 {
diff --git a/rust/tvm-ffi/src/extra/structural_mutate.rs 
b/rust/tvm-ffi/src/extra/structural_mutate.rs
index 3b3e4c18..5527531f 100644
--- a/rust/tvm-ffi/src/extra/structural_mutate.rs
+++ b/rust/tvm-ffi/src/extra/structural_mutate.rs
@@ -44,7 +44,7 @@
 // Local Perf note comments explain individual implementation choices.
 
 use std::cell::{RefCell, UnsafeCell};
-use std::collections::{HashMap, hash_map::Entry};
+use std::collections::{hash_map::Entry, HashMap};
 use std::ffi::c_void;
 use std::marker::PhantomData;
 
@@ -58,7 +58,7 @@ use std::rc::Rc;
 pub use super::structural_map::*;
 
 use super::dispatch::Dispatcher;
-use crate::any::{Any, AnyView, is_plain_inline};
+use crate::any::{is_plain_inline, Any, AnyView};
 use crate::error::{Error, Result, TYPE_ERROR};
 use crate::function::Function;
 use crate::object::{self, Object, ObjectArc, ObjectCore};
@@ -79,7 +79,7 @@ use super::structural_common::{
     with_structural_field_error_context, with_visit_error_context,
 };
 use super::structural_visit::{
-    DefRegionKind, field_def_region, for_each_field_info, 
free_var_child_region,
+    field_def_region, for_each_field_info, free_var_child_region, 
DefRegionKind,
 };
 use super::unchanged::is_unchanged;
 pub use super::unchanged::{Unchanged, UnchangedOr};
@@ -669,7 +669,7 @@ impl<T: object::ObjectRefCore> MutationView<'_, T> {
     /// #         Ok(second)
     /// #     }
     /// # }
-    /// # let pair = MyPairObj::new(Object::new(), Array::new(vec![1_i64]), 
Array::new(vec![2_i64]));
+    /// # let pair = MyPairObj::new(Object::new(), 
Array::from_vec(vec![1_i64]), Array::from_vec(vec![2_i64]));
     /// # structural_mutate(MyPair::from(pair), Pass)?;
     /// # Ok::<(), tvm_ffi::Error>(())
     /// ```
@@ -931,16 +931,16 @@ impl<Base: StructuralMutatorBase> 
StructuralMutateEngine<Base> {
         R: Into<Any>,
         O: BorrowMut<D>,
         for<'v, 'c, 'r> H: IntoDispatcher<
-                (MutationView<'v>, &'c mut StructuralMutatorView<'r, D, Base>),
-                Option<Result<UnchangedOr<Any>>>,
-                M,
-                Target = D,
-                Output = O,
-            >,
+            (MutationView<'v>, &'c mut StructuralMutatorView<'r, D, Base>),
+            Option<Result<UnchangedOr<Any>>>,
+            M,
+            Target = D,
+            Output = O,
+        >,
         for<'s, 'v, 'c, 'r> &'s mut D: crate::Dispatcher<
-                (MutationView<'v>, &'c mut StructuralMutatorView<'r, D, Base>),
-                Option<Result<UnchangedOr<Any>>>,
-            >,
+            (MutationView<'v>, &'c mut StructuralMutatorView<'r, D, Base>),
+            Option<Result<UnchangedOr<Any>>>,
+        >,
     {
         let mut storage = dispatcher.into_dispatcher();
         Self::run_mutator::<D, true>(root.into(), storage.borrow_mut())
@@ -1266,9 +1266,9 @@ impl<Base: StructuralMutatorBase> 
StructuralMutateEngine<Base> {
     fn vtable<D, const CALLBACK_CONTEXT: bool>() -> &'static 
StructuralMutatorVTable
     where
         for<'s, 'v, 'c, 'r> &'s mut D: Dispatcher<
-                (MutationView<'v>, &'c mut StructuralMutatorView<'r, D, Base>),
-                Option<Result<UnchangedOr<Any>>>,
-            >,
+            (MutationView<'v>, &'c mut StructuralMutatorView<'r, D, Base>),
+            Option<Result<UnchangedOr<Any>>>,
+        >,
     {
         &StructuralMutatorVTable {
             mutate: Self::rust_vtable_mutate::<D, false, CALLBACK_CONTEXT>,
@@ -1291,9 +1291,9 @@ impl<Base: StructuralMutatorBase> 
StructuralMutateEngine<Base> {
     ) -> TVMFFIAny
     where
         for<'s, 'v, 'c, 'r> &'s mut D: Dispatcher<
-                (MutationView<'v>, &'c mut StructuralMutatorView<'r, D, Base>),
-                Option<Result<UnchangedOr<Any>>>,
-            >,
+            (MutationView<'v>, &'c mut StructuralMutatorView<'r, D, Base>),
+            Option<Result<UnchangedOr<Any>>>,
+        >,
     {
         let context = (*Self::from_handle(runtime)).dispatcher;
         let raw = *value.as_raw_ffi_any();
@@ -1429,9 +1429,9 @@ impl<Base: StructuralMutatorBase> 
StructuralMutateEngine<Base> {
     ) -> Result<Any>
     where
         for<'s, 'v, 'c, 'r> &'s mut D: Dispatcher<
-                (MutationView<'v>, &'c mut StructuralMutatorView<'r, D, Base>),
-                Option<Result<UnchangedOr<Any>>>,
-            >,
+            (MutationView<'v>, &'c mut StructuralMutatorView<'r, D, Base>),
+            Option<Result<UnchangedOr<Any>>>,
+        >,
     {
         let mut base = Base::new()?;
         let type_index = Base::type_index();
@@ -2054,7 +2054,7 @@ impl StructuralMutatorObj {
 ///     }
 /// }
 ///
-/// let root = Array::new(vec![Array::new(vec![1_i64, 2]), 
Array::new(vec![3_i64])]);
+/// let root = Array::from_vec(vec![Array::from_vec(vec![1_i64, 2]), 
Array::from_vec(vec![3_i64])]);
 /// let result = Array::<Array<i64>>::try_from(structural_mutate(root, 
Double)?)?;
 /// assert_eq!(result.get(0)?.iter().collect::<Vec<_>>(), vec![2, 4]);
 /// # Ok::<(), tvm_ffi::Error>(())
@@ -2064,22 +2064,22 @@ where
     R: Into<Any>,
     O: BorrowMut<D>,
     for<'v, 'c, 'r> H: IntoDispatcher<
-            (
-                MutationView<'v>,
-                &'c mut StructuralMutatorView<'r, D, StructuralMutatorObj>,
-            ),
-            Option<Result<UnchangedOr<Any>>>,
-            M,
-            Target = D,
-            Output = O,
-        >,
+        (
+            MutationView<'v>,
+            &'c mut StructuralMutatorView<'r, D, StructuralMutatorObj>,
+        ),
+        Option<Result<UnchangedOr<Any>>>,
+        M,
+        Target = D,
+        Output = O,
+    >,
     for<'s, 'v, 'c, 'r> &'s mut D: crate::Dispatcher<
-            (
-                MutationView<'v>,
-                &'c mut StructuralMutatorView<'r, D, StructuralMutatorObj>,
-            ),
-            Option<Result<UnchangedOr<Any>>>,
-        >,
+        (
+            MutationView<'v>,
+            &'c mut StructuralMutatorView<'r, D, StructuralMutatorObj>,
+        ),
+        Option<Result<UnchangedOr<Any>>>,
+    >,
 {
     StructuralMutateEngine::mutate_root(root, dispatcher)
 }
diff --git a/rust/tvm-ffi/src/extra/structural_visit.rs 
b/rust/tvm-ffi/src/extra/structural_visit.rs
index a1eed071..551873e5 100644
--- a/rust/tvm-ffi/src/extra/structural_visit.rs
+++ b/rust/tvm-ffi/src/extra/structural_visit.rs
@@ -487,16 +487,16 @@ impl<Base: StructuralVisitorBase> 
StructuralVisitEngine<Base> {
         R: Into<AnyView<'input>>,
         O: BorrowMut<D>,
         for<'v, 'c, 'r> H: IntoDispatcher<
-                (AnyView<'v>, &'c mut StructuralVisitorView<'r, D, Base>),
-                Option<Result<Option<VisitInterrupt>>>,
-                M,
-                Target = D,
-                Output = O,
-            >,
+            (AnyView<'v>, &'c mut StructuralVisitorView<'r, D, Base>),
+            Option<Result<Option<VisitInterrupt>>>,
+            M,
+            Target = D,
+            Output = O,
+        >,
         for<'s, 'v, 'c, 'r> &'s mut D: crate::Dispatcher<
-                (AnyView<'v>, &'c mut StructuralVisitorView<'r, D, Base>),
-                Option<Result<Option<VisitInterrupt>>>,
-            >,
+            (AnyView<'v>, &'c mut StructuralVisitorView<'r, D, Base>),
+            Option<Result<Option<VisitInterrupt>>>,
+        >,
     {
         let mut storage = dispatcher.into_dispatcher();
         let root = root.into();
@@ -1061,9 +1061,9 @@ impl<Base: StructuralVisitorBase> 
StructuralVisitEngine<Base> {
     fn vtable<D>() -> &'static StructuralVisitorVTable
     where
         for<'s, 'v, 'c, 'r> &'s mut D: crate::Dispatcher<
-                (AnyView<'v>, &'c mut StructuralVisitorView<'r, D, Base>),
-                Option<Result<Option<VisitInterrupt>>>,
-            >,
+            (AnyView<'v>, &'c mut StructuralVisitorView<'r, D, Base>),
+            Option<Result<Option<VisitInterrupt>>>,
+        >,
     {
         &StructuralVisitorVTable {
             visit: Self::rust_vtable_visit_raw::<D>,
@@ -1083,9 +1083,9 @@ impl<Base: StructuralVisitorBase> 
StructuralVisitEngine<Base> {
     ) -> TVMFFIAny
     where
         for<'s, 'v, 'c, 'r> &'s mut D: crate::Dispatcher<
-                (AnyView<'v>, &'c mut StructuralVisitorView<'r, D, Base>),
-                Option<Result<Option<VisitInterrupt>>>,
-            >,
+            (AnyView<'v>, &'c mut StructuralVisitorView<'r, D, Base>),
+            Option<Result<Option<VisitInterrupt>>>,
+        >,
     {
         let context = (*Self::from_handle(runtime)).dispatcher;
         let raw = *value.as_raw_ffi_any();
@@ -1154,9 +1154,9 @@ impl<Base: StructuralVisitorBase> 
StructuralVisitEngine<Base> {
     pub(super) fn run_visitor_raw<D>(root: TVMFFIAny, dispatch: &mut D) -> 
TVMFFIAny
     where
         for<'s, 'v, 'c, 'r> &'s mut D: crate::Dispatcher<
-                (AnyView<'v>, &'c mut StructuralVisitorView<'r, D, Base>),
-                Option<Result<Option<VisitInterrupt>>>,
-            >,
+            (AnyView<'v>, &'c mut StructuralVisitorView<'r, D, Base>),
+            Option<Result<Option<VisitInterrupt>>>,
+        >,
     {
         let base = match Base::new() {
             Ok(base) => base,
@@ -1235,7 +1235,7 @@ impl<Base: StructuralVisitorBase> 
StructuralVisitEngine<Base> {
 ///     }
 /// }
 ///
-/// let root = Array::new(vec![1_i64, 2, 3]);
+/// let root = Array::from_vec(vec![1_i64, 2, 3]);
 /// let mut sum = Sum(0);
 /// assert!(structural_visit(&root, &mut sum)?.is_none());
 /// assert_eq!(sum.0, 6);
@@ -1250,22 +1250,22 @@ where
     R: Into<AnyView<'input>>,
     O: BorrowMut<D>,
     for<'v, 'c, 'r> H: IntoDispatcher<
-            (
-                AnyView<'v>,
-                &'c mut StructuralVisitorView<'r, D, StructuralVisitorObj>,
-            ),
-            Option<Result<Option<VisitInterrupt>>>,
-            M,
-            Target = D,
-            Output = O,
-        >,
+        (
+            AnyView<'v>,
+            &'c mut StructuralVisitorView<'r, D, StructuralVisitorObj>,
+        ),
+        Option<Result<Option<VisitInterrupt>>>,
+        M,
+        Target = D,
+        Output = O,
+    >,
     for<'s, 'v, 'c, 'r> &'s mut D: crate::Dispatcher<
-            (
-                AnyView<'v>,
-                &'c mut StructuralVisitorView<'r, D, StructuralVisitorObj>,
-            ),
-            Option<Result<Option<VisitInterrupt>>>,
-        >,
+        (
+            AnyView<'v>,
+            &'c mut StructuralVisitorView<'r, D, StructuralVisitorObj>,
+        ),
+        Option<Result<Option<VisitInterrupt>>>,
+    >,
 {
     StructuralVisitEngine::visit_root(root, dispatcher)
 }
diff --git a/rust/tvm-ffi/src/extra/structural_walk.rs 
b/rust/tvm-ffi/src/extra/structural_walk.rs
index 432bd70b..acbbf2ea 100644
--- a/rust/tvm-ffi/src/extra/structural_walk.rs
+++ b/rust/tvm-ffi/src/extra/structural_walk.rs
@@ -23,8 +23,8 @@
 //! the non-unwinding native callback boundary aborts the process.
 
 use super::structural_visit::{
-    DefRegionKind, StructuralVisitEngine, StructuralVisitorView, 
VisitInterrupt,
-    visit_result_from_any,
+    visit_result_from_any, DefRegionKind, StructuralVisitEngine, 
StructuralVisitorView,
+    VisitInterrupt,
 };
 use crate::{Any, AnyView, Dispatcher, IntoDispatcher, Result};
 use std::borrow::BorrowMut;
@@ -245,7 +245,7 @@ where
 /// ```
 /// use tvm_ffi::{structural_walk, Array, WalkOrder, WalkResult};
 ///
-/// let root = Array::new(vec![1_i64, 2, 3]);
+/// let root = Array::from_vec(vec![1_i64, 2, 3]);
 /// let mut integers = Vec::new();
 /// structural_walk(&root, |value: i64| {
 ///     integers.push(value);
@@ -261,12 +261,12 @@ pub fn structural_walk<'input, R, M, H, D, O>(
 ) -> Result<Option<VisitInterrupt>>
 where
     for<'v> H: IntoDispatcher<
-            (AnyView<'v>, DefRegionKind),
-            Option<Result<WalkResult>>,
-            M,
-            Target = D,
-            Output = O,
-        >,
+        (AnyView<'v>, DefRegionKind),
+        Option<Result<WalkResult>>,
+        M,
+        Target = D,
+        Output = O,
+    >,
     for<'s, 'v> &'s mut D: Dispatcher<(AnyView<'v>, DefRegionKind), 
Option<Result<WalkResult>>>,
     R: Into<AnyView<'input>>,
     O: BorrowMut<D>,
diff --git a/rust/tvm-ffi/src/extra/unchanged.rs 
b/rust/tvm-ffi/src/extra/unchanged.rs
index 94260680..4ee304e4 100644
--- a/rust/tvm-ffi/src/extra/unchanged.rs
+++ b/rust/tvm-ffi/src/extra/unchanged.rs
@@ -54,8 +54,8 @@ pub struct Unchanged;
 /// one FFI value. `UnchangedOr<Any>` converts with `.into()` from
 /// [`Unchanged`], from a managed reference or scalar, and from a typed
 /// `UnchangedOr<T>`. `T` is an FFI value type or [`Any`]. Converting the
-/// wrapper into `Any` keeps the marker; use [`value_or`](Self::value_or) or
-/// [`value_or_else`](Self::value_or_else) when an actual value is needed.
+/// wrapper into `Any` keeps the marker; use 
[`value_or_unchanged`](Self::value_or_unchanged) or
+/// [`into_option`](Self::into_option) when an actual value is needed.
 ///
 /// # Examples
 ///
@@ -70,8 +70,8 @@ pub struct Unchanged;
 ///     }
 /// }
 ///
-/// assert_eq!(double_even(4).value_or(4), 8);
-/// assert_eq!(double_even(3).value_or(3), 3);
+/// assert_eq!(double_even(4).value_or_unchanged(4), 8);
+/// assert_eq!(double_even(3).value_or_unchanged(3), 3);
 /// ```
 #[repr(transparent)]
 pub struct UnchangedOr<T: ContainerElement = Any> {
@@ -141,7 +141,7 @@ impl<T: ContainerElement> UnchangedOr<T> {
     ///
     /// ```
     /// use tvm_ffi::{Array, UnchangedOr};
-    /// let original = Array::new(vec![1_i64]);
+    /// let original = Array::from_vec(vec![1_i64]);
     /// 
assert!(UnchangedOr::changed(original.clone()).unchanged_or_same_as(&original));
     /// ```
     ///
@@ -178,34 +178,19 @@ impl<T: ContainerElement> UnchangedOr<T> {
 
     /// Move out the replacement, or `original` when the result is unchanged.
     ///
-    /// `original` is taken even when it is not returned; use
-    /// [`value_or_else`](Self::value_or_else) to produce it only when needed.
+    /// `original` is the value the callback was given; to produce it only when
+    /// needed, use `into_option().unwrap_or_else(..)`.
     ///
     /// # Arguments
     ///
-    /// * `original` - The original value.
+    /// * `original` - The original value, kept when the result is unchanged.
     ///
     /// # Returns
     ///
     /// The replacement, or `original`.
     #[inline]
-    pub fn value_or(self, original: T) -> T {
-        self.value_or_else(|| original)
-    }
-
-    /// Move out the replacement, or materialize the original only if this 
result is
-    /// unchanged.
-    ///
-    /// # Arguments
-    ///
-    /// * `original` - Produces the original value; called only when unchanged.
-    ///
-    /// # Returns
-    ///
-    /// The replacement, or the result of `original`.
-    #[inline]
-    pub fn value_or_else(self, original: impl FnOnce() -> T) -> T {
-        self.into_option().unwrap_or_else(original)
+    pub fn value_or_unchanged(self, original: T) -> T {
+        self.into_option().unwrap_or(original)
     }
 
     /// Convert only the replacement, preserving an unchanged result.
diff --git a/rust/tvm-ffi/src/lib.rs b/rust/tvm-ffi/src/lib.rs
index a8d3544f..8394fe52 100644
--- a/rust/tvm-ffi/src/lib.rs
+++ b/rust/tvm-ffi/src/lib.rs
@@ -50,23 +50,23 @@ pub use crate::collections::shape::Shape;
 pub use crate::collections::tensor::{CPUNDAlloc, NDAllocator, Tensor, 
TensorView};
 pub use crate::device::{current_stream, with_stream};
 pub use crate::dtype::DLDataTypeExt;
+pub use crate::error::{Error, ErrorKind, Result};
 pub use crate::error::{
     ATTRIBUTE_ERROR, INDEX_ERROR, INTERNAL_ERROR, KEY_ERROR, OVERFLOW_ERROR, 
RUNTIME_ERROR,
     TYPE_ERROR, VALUE_ERROR, ZERO_DIVISION_ERROR,
 };
-pub use crate::error::{Error, ErrorKind, Result};
 pub use crate::extra::dispatch::{Dispatcher, IntoDispatcher};
 pub use crate::extra::module::Module;
 pub use crate::extra::structural_map::structural_map;
 pub use crate::extra::structural_mutate::{
-    InplaceMode, MutationView, StructuralMutateEngine, StructuralMutatorBase, 
StructuralMutatorObj,
-    StructuralMutatorView, StructuralVarRemap, structural_mutate,
+    structural_mutate, InplaceMode, MutationView, StructuralMutateEngine, 
StructuralMutatorBase,
+    StructuralMutatorObj, StructuralMutatorView, StructuralVarRemap,
 };
 pub use crate::extra::structural_visit::{
-    DefRegionKind, StructuralVisitEngine, StructuralVisitorBase, 
StructuralVisitorObj,
-    StructuralVisitorView, VisitInterrupt, VisitInterruptObj, structural_visit,
+    structural_visit, DefRegionKind, StructuralVisitEngine, 
StructuralVisitorBase,
+    StructuralVisitorObj, StructuralVisitorView, VisitInterrupt, 
VisitInterruptObj,
 };
-pub use crate::extra::structural_walk::{IntoWalkResult, WalkOrder, WalkResult, 
structural_walk};
+pub use crate::extra::structural_walk::{structural_walk, IntoWalkResult, 
WalkOrder, WalkResult};
 pub use crate::extra::unchanged::{Unchanged, UnchangedOr};
 pub use crate::function::Function;
 pub use crate::object::ObjectRefCast;
@@ -75,8 +75,8 @@ pub use crate::object::{
 };
 pub use crate::optional::{Optional, OptionalCompatible};
 pub use crate::reflection::{
-    FieldFlags, FieldGetter, ObjectDef, SEqHashKind, ShallowCopy, 
TypeAttrColumn, UnsafeInit,
-    get_type_attr,
+    get_type_attr, FieldFlags, FieldGetter, ObjectDef, SEqHashKind, 
ShallowCopy, TypeAttrColumn,
+    UnsafeInit,
 };
 pub use crate::rvalue_ref::RValueRef;
 pub use crate::static_init::run_static_init_blocks;
@@ -190,7 +190,7 @@ pub use tvm_ffi_macros::dispatch;
 /// }
 ///
 /// assert_eq!(kind(&Any::from(42_i64)), "integer 42");
-/// assert_eq!(kind(&Any::from(Array::new(vec![1_i64, 2, 3]))), "array of 3 
items");
+/// assert_eq!(kind(&Any::from(Array::from_vec(vec![1_i64, 2, 3]))), "array of 
3 items");
 /// assert_eq!(kind(&Any::from(1.5_f64)), "something else");
 /// ```
 pub use tvm_ffi_macros::match_any;
diff --git a/rust/tvm-ffi/src/macros.rs b/rust/tvm-ffi/src/macros.rs
index 36bbe615..0c5d2ef6 100644
--- a/rust/tvm-ffi/src/macros.rs
+++ b/rust/tvm-ffi/src/macros.rs
@@ -252,7 +252,9 @@ macro_rules! attach_context {
                     line!(),
                     $crate::function_name!()
                 );
-                Err($crate::error::Error::with_appended_backtrace(error, 
&context))
+                Err($crate::error::Error::with_appended_backtrace(
+                    error, &context,
+                ))
             }
         }
     }};
diff --git a/rust/tvm-ffi/src/object.rs b/rust/tvm-ffi/src/object.rs
index 73086ed4..189275ab 100644
--- a/rust/tvm-ffi/src/object.rs
+++ b/rust/tvm-ffi/src/object.rs
@@ -303,7 +303,7 @@ pub trait ObjectRefCast: ObjectRefCore + AnyCompatible {
     ///
     /// ```
     /// use tvm_ffi::{object::ObjectRef, Array, ObjectRefCast};
-    /// let object: ObjectRef = Array::new(vec![1_i64]).try_cast()?;
+    /// let object: ObjectRef = Array::from_vec(vec![1_i64]).try_cast()?;
     /// let array: Array<i64> = object.try_cast()?;
     /// assert_eq!(array.len(), 1);
     /// # Ok::<(), tvm_ffi::Error>(())
diff --git a/rust/tvm-ffi/src/optional.rs b/rust/tvm-ffi/src/optional.rs
index 111eaace..41ff757f 100644
--- a/rust/tvm-ffi/src/optional.rs
+++ b/rust/tvm-ffi/src/optional.rs
@@ -130,14 +130,14 @@ impl<T: OptionalCompatible> Optional<T> {
 
     /// Whether a value is present.
     #[inline]
-    pub fn has_value(&self) -> bool {
+    pub fn is_some(&self) -> bool {
         self.data.type_index() != TypeIndex::kTVMFFINone as i32
     }
 
     /// Whether the optional is `nullopt`.
     #[inline]
     pub fn is_none(&self) -> bool {
-        !self.has_value()
+        !self.is_some()
     }
 
     /// Decodes the value in place, cloning it out (ref-counted `inc_ref` for
@@ -150,7 +150,7 @@ impl<T: OptionalCompatible> Optional<T> {
     /// Takes the value out, consuming self (moves the payload, no `inc_ref`).
     #[inline]
     pub fn into_option(self) -> Option<T> {
-        if self.has_value() {
+        if self.is_some() {
             // Move the value out of the owning `Any` without dropping it, then
             // transfer ownership of the payload into `T` (no inc/dec ref).
             let mut raw = unsafe { Any::into_raw_ffi_any(self.data) };
@@ -180,7 +180,7 @@ impl Optional<String> {
     /// `&String`.
     #[inline]
     pub fn as_str(&self) -> Option<&str> {
-        if self.has_value() {
+        if self.is_some() {
             // SAFETY: an engaged `Optional<String>` cell is byte-identical to 
a
             // `String` (both are `#[repr(transparent)]` over the 16-byte 
cell),
             // and the borrow is tied to `&self`.
diff --git a/rust/tvm-ffi/src/reflection/unsafe_init.rs 
b/rust/tvm-ffi/src/reflection/unsafe_init.rs
index 4a16ee19..10a04f6b 100644
--- a/rust/tvm-ffi/src/reflection/unsafe_init.rs
+++ b/rust/tvm-ffi/src/reflection/unsafe_init.rs
@@ -202,7 +202,7 @@ mod tests {
             device_type: DLDeviceType::kDLCPU,
             device_id: 0,
         };
-        assert!(!is_undefined(Array::<i64>::new(vec![])));
+        assert!(!is_undefined(Array::<i64>::new()));
         assert!(!is_undefined(String::from("")));
         assert!(!is_undefined(BigInt::from(0_i64)));
         assert!(!is_undefined(cpu));
diff --git a/rust/tvm-ffi/src/type_traits.rs b/rust/tvm-ffi/src/type_traits.rs
index 7f6bef87..0d41244f 100644
--- a/rust/tvm-ffi/src/type_traits.rs
+++ b/rust/tvm-ffi/src/type_traits.rs
@@ -218,6 +218,61 @@ pub trait ContainerElement: container_element_ops::Ops {}
 impl<T: AnyCompatible> ContainerElement for T {}
 impl ContainerElement for Any {}
 
+/// Types whose value an FFI `Any` cell stores in place, so `&Self` can be
+/// borrowed from the cell, as [`crate::Array`] indexing does.
+///
+/// # Safety
+///
+/// For a cell that passes `container_check_any_strict` for `Self`,
+/// `ref_from_any` must return a reference into that cell that is a valid
+/// `Self` for as long as the cell is borrowed.
+#[doc(hidden)]
+pub unsafe trait RefFromAny: ContainerElement {
+    /// Borrow the value stored in `cell`.
+    ///
+    /// # Safety
+    ///
+    /// `cell` must hold a `Self`.
+    unsafe fn ref_from_any(cell: &TVMFFIAny) -> &Self;
+}
+
+// The whole cell is the value.
+unsafe impl RefFromAny for Any {
+    #[inline(always)]
+    unsafe fn ref_from_any(cell: &TVMFFIAny) -> &Self {
+        &*(cell as *const TVMFFIAny as *const Any)
+    }
+}
+
+unsafe impl RefFromAny for crate::String {
+    #[inline(always)]
+    unsafe fn ref_from_any(cell: &TVMFFIAny) -> &Self {
+        &*(cell as *const TVMFFIAny as *const crate::String)
+    }
+}
+
+unsafe impl RefFromAny for crate::string::Bytes {
+    #[inline(always)]
+    unsafe fn ref_from_any(cell: &TVMFFIAny) -> &Self {
+        &*(cell as *const TVMFFIAny as *const crate::string::Bytes)
+    }
+}
+
+// The payload word holds the value in its own representation.
+unsafe impl RefFromAny for i64 {
+    #[inline(always)]
+    unsafe fn ref_from_any(cell: &TVMFFIAny) -> &Self {
+        &cell.data_union.v_int64
+    }
+}
+
+unsafe impl RefFromAny for f64 {
+    #[inline(always)]
+    unsafe fn ref_from_any(cell: &TVMFFIAny) -> &Self {
+        &cell.data_union.v_float64
+    }
+}
+
 mod container_element_ops {
     use super::{Any, AnyCompatible, AnyView, TVMFFIAny};
 
diff --git a/rust/tvm-ffi/tests/test_array.rs b/rust/tvm-ffi/tests/test_array.rs
index a76e8f13..d99e4339 100644
--- a/rust/tvm-ffi/tests/test_array.rs
+++ b/rust/tvm-ffi/tests/test_array.rs
@@ -41,16 +41,16 @@ fn test_array_core_and_iteration() {
     let t1 = create_tensor(10.0, &[1, 2]);
     let t2 = create_tensor(20.0, &[3, 4, 5]);
 
-    let array = Array::new(vec![t1.clone(), t2.clone()]);
+    let array = Array::from_vec(vec![t1.clone(), t2.clone()]);
 
     // Core Accessors
     assert_eq!(array.len(), 2);
     assert!(!array.is_empty());
 
     // Value Integrity
-    assert_eq!(get_val(&Tensor::try_from(array[0]).unwrap()), 10.0);
-    assert_eq!(Tensor::try_from(array[0]).unwrap().ndim(), 2);
-    assert_eq!(Tensor::try_from(array[1]).unwrap().ndim(), 3);
+    assert_eq!(get_val(&array[0]), 10.0);
+    assert_eq!(array[0].ndim(), 2);
+    assert_eq!(array[1].ndim(), 3);
 
     // Iteration
     let vals: Vec<f32> = array.iter().map(|t| get_val(&t)).collect();
@@ -59,7 +59,7 @@ fn test_array_core_and_iteration() {
 
 #[test]
 fn test_array_any_conversions() {
-    let array = Array::new(vec![
+    let array = Array::from_vec(vec![
         create_tensor(1.0, &[1]),
         create_tensor(2.0, &[1]),
         create_tensor(3.0, &[1]),
@@ -80,10 +80,10 @@ fn test_array_any_conversions() {
 
 #[test]
 fn test_array_with_any_elements() {
-    let array = Array::new(vec![
+    let array = Array::from_vec(vec![
         Any::from(7i64),
         Any::from(String::from("value")),
-        Any::from(Array::new(vec![1i64, 2])),
+        Any::from(Array::from_vec(vec![1i64, 2])),
     ]);
 
     assert_eq!(i64::try_from(array.get(0).unwrap()).unwrap(), 7);
@@ -107,7 +107,7 @@ fn test_array_with_any_elements() {
     let by_reference = 
i64::try_from(array_size.call_tuple((&round_trip,)).unwrap()).unwrap();
     assert_eq!((by_value, by_reference), (3, 3));
 
-    let widened = Array::<Any>::try_from(Any::from(Array::new(vec![3i64, 
4]))).unwrap();
+    let widened = Array::<Any>::try_from(Any::from(Array::from_vec(vec![3i64, 
4]))).unwrap();
     assert_eq!(
         widened
             .iter()
@@ -120,7 +120,7 @@ fn test_array_with_any_elements() {
 #[test]
 fn test_array_recursive_type_checking() {
     // 1. Create an Array of Shapes
-    let shape_array = Array::new(vec![Shape::from(vec![1, 2]), 
Shape::from(vec![3])]);
+    let shape_array = Array::from_vec(vec![Shape::from(vec![1, 2]), 
Shape::from(vec![3])]);
 
     // 2. Wrap it in Any
     let any_val = Any::from(shape_array);
@@ -144,11 +144,11 @@ fn test_array_recursive_type_checking() {
 #[test]
 fn test_array_parametric_heterogeneity() {
     // Verify Array works with different ObjectRefCore types
-    let shape_array = Array::new(vec![Shape::from(vec![1, 2, 3]), 
Shape::from(vec![10])]);
+    let shape_array = Array::from_vec(vec![Shape::from(vec![1, 2, 3]), 
Shape::from(vec![10])]);
     assert_eq!(shape_array.get(0).unwrap().as_slice(), &[1, 2, 3]);
     assert_eq!(shape_array.get(1).unwrap().as_slice(), &[10]);
 
-    let function_array = Array::new(vec![
+    let function_array = Array::from_vec(vec![
         Function::get_global("ffi.String").unwrap(),
         Function::get_global("ffi.Bytes").unwrap(),
     ]);
diff --git a/rust/tvm-ffi/tests/test_big_int.rs 
b/rust/tvm-ffi/tests/test_big_int.rs
index fcca28bf..3aa12994 100644
--- a/rust/tvm-ffi/tests/test_big_int.rs
+++ b/rust/tvm-ffi/tests/test_big_int.rs
@@ -457,7 +457,7 @@ fn test_big_int_function_round_trip() {
 #[test]
 fn test_big_int_containers() {
     let values = vec![wide(), BigInt::from(-1i64), BigInt::from(u64::MAX)];
-    let array = Array::new(values.clone());
+    let array = Array::from_vec(values.clone());
     assert_eq!(array.len(), 3);
     for (i, value) in values.iter().enumerate() {
         assert_eq!(array.get(i).unwrap(), *value);
@@ -475,7 +475,7 @@ fn test_big_int_containers() {
         .collect();
     assert_eq!(map.len(), 3);
     for (i, value) in values.iter().enumerate() {
-        assert!(map.contains_key(value));
+        assert!(map.contains_key(value).unwrap());
         assert_eq!(map.get(value).unwrap(), Some(i as i64));
     }
     assert_eq!(map.get(&BigInt::from(1u128 << 64)).unwrap(), None);
@@ -485,7 +485,7 @@ fn test_big_int_containers() {
 fn test_big_int_optional() {
     assert_eq!(std::mem::size_of::<Optional<BigInt>>(), 16);
     let some = Optional::some(wide());
-    assert!(some.has_value());
+    assert!(some.is_some());
     assert_eq!(some.get(), Some(wide()));
     let none = Optional::<BigInt>::none();
     assert!(none.is_none());
@@ -505,7 +505,7 @@ fn test_big_int_optional() {
 
 #[test]
 fn test_big_int_structural_traversal() {
-    let root = Array::new(vec![Any::from(1i64), Any::from(wide())]);
+    let root = Array::from_vec(vec![Any::from(1i64), Any::from(wide())]);
     let wide_pointer = root
         .get(1)
         .unwrap()
diff --git a/rust/tvm-ffi/tests/test_cast.rs b/rust/tvm-ffi/tests/test_cast.rs
index 7717e07e..b53b57b1 100644
--- a/rust/tvm-ffi/tests/test_cast.rs
+++ b/rust/tvm-ffi/tests/test_cast.rs
@@ -202,7 +202,7 @@ fn test_generated_borrow_and_upcast_conversions() {
 
 #[test]
 fn test_cast_checks_parameterized_container_type() {
-    assert!(Array::new(vec![1_i64, 2_i64])
+    assert!(Array::from_vec(vec![1_i64, 2_i64])
         .try_cast::<Array<f32>>()
         .is_err());
 }
diff --git a/rust/tvm-ffi/tests/test_error.rs b/rust/tvm-ffi/tests/test_error.rs
index 1413340d..1ce3054a 100644
--- a/rust/tvm-ffi/tests/test_error.rs
+++ b/rust/tvm-ffi/tests/test_error.rs
@@ -60,7 +60,7 @@ fn test_error_with_context() {
     let result = error_fn1(false).unwrap();
     assert_eq!(result, 1);
 
-    let payload = 
object::ObjectRef::try_from(Any::from(Array::new(vec![7i64]))).unwrap();
+    let payload = 
object::ObjectRef::try_from(Any::from(Array::from_vec(vec![7i64]))).unwrap();
     for shared in [false, true] {
         let error = Error::new_with_cause_and_extra_context(
             RUNTIME_ERROR,
diff --git a/rust/tvm-ffi/tests/test_function.rs 
b/rust/tvm-ffi/tests/test_function.rs
index 42e0dfab..c0baff4d 100644
--- a/rust/tvm-ffi/tests/test_function.rs
+++ b/rust/tvm-ffi/tests/test_function.rs
@@ -129,12 +129,12 @@ fn test_function_rvalue_ref_arguments() {
         Ok(AnyView::from(&value).debug_strong_count().unwrap() as i64)
     });
 
-    let moved = Array::new(vec![1i64, 2]);
+    let moved = Array::from_vec(vec![1i64, 2]);
     assert_eq!(AnyView::from(&moved).debug_strong_count(), Some(1));
     let count = 
i64::try_from(strong_count.call_tuple((RValueRef::new(moved),)).unwrap()).unwrap();
     assert_eq!(count, 1);
 
-    let borrowed = Array::new(vec![3i64, 4]);
+    let borrowed = Array::from_vec(vec![3i64, 4]);
     assert_eq!(AnyView::from(&borrowed).debug_strong_count(), Some(1));
     let count = 
i64::try_from(strong_count.call_tuple((&borrowed,)).unwrap()).unwrap();
     assert_eq!(count, 2);
diff --git a/rust/tvm-ffi/tests/test_list.rs b/rust/tvm-ffi/tests/test_list.rs
index b6b2765c..830c1b9c 100644
--- a/rust/tvm-ffi/tests/test_list.rs
+++ b/rust/tvm-ffi/tests/test_list.rs
@@ -122,7 +122,7 @@ fn test_list_growth_stays_with_runtime() {
 
 #[test]
 fn test_list_releases_elements() {
-    let array = Array::new(vec![1i64]);
+    let array = Array::from_vec(vec![1i64]);
     let probe = Any::from(array.clone());
     let base = probe.debug_strong_count().unwrap();
 
@@ -132,7 +132,7 @@ fn test_list_releases_elements() {
     list.insert(0, array.clone()).unwrap();
     assert_eq!(probe.debug_strong_count().unwrap(), base + 3);
 
-    list.set(0, Array::new(vec![2i64])).unwrap();
+    list.set(0, Array::from_vec(vec![2i64])).unwrap();
     assert_eq!(probe.debug_strong_count().unwrap(), base + 2);
     drop(list.remove(1).unwrap());
     assert_eq!(probe.debug_strong_count().unwrap(), base + 1);
@@ -357,7 +357,7 @@ fn test_list_of_any_and_objects() {
     let list: List<Any> = List::new();
     list.push(Any::from(1i64)).unwrap();
     list.push(Any::from(String::from("two"))).unwrap();
-    list.push(Any::from(Array::new(vec![3i64]))).unwrap();
+    list.push(Any::from(Array::from_vec(vec![3i64]))).unwrap();
     assert_eq!(list.len(), 3);
     assert_eq!(i64::try_from(list.get(0).unwrap()).unwrap(), 1);
     let nested: Array<i64> = list.get(2).unwrap().try_into().unwrap();
@@ -409,7 +409,7 @@ fn test_list_mismatched_element_is_reported() {
 #[test]
 fn test_list_conversion_copies() {
     // An `ffi.Array` converts into a new list.
-    let array = Array::new(vec![1i64, 2]);
+    let array = Array::from_vec(vec![1i64, 2]);
     let list: List<i64> = Any::from(array.clone()).try_into().unwrap();
     list.push(3).unwrap();
     assert_eq!(list.len(), 3);
diff --git a/rust/tvm-ffi/tests/test_map.rs b/rust/tvm-ffi/tests/test_map.rs
index d163e00b..bc78b742 100644
--- a/rust/tvm-ffi/tests/test_map.rs
+++ b/rust/tvm-ffi/tests/test_map.rs
@@ -48,8 +48,8 @@ fn test_map_basic_lookup() {
     assert_eq!(map.get(&3).unwrap(), Some(30));
     assert_eq!(map.get(&99).unwrap(), None);
 
-    assert!(map.contains_key(&1));
-    assert!(!map.contains_key(&99));
+    assert!(map.contains_key(&1).unwrap());
+    assert!(!map.contains_key(&99).unwrap());
 }
 
 #[test]
@@ -110,7 +110,7 @@ fn test_map_string_keys() {
     assert_eq!(map.get(&String::from("a")).unwrap(), Some(1));
     assert_eq!(map.get(&String::from("c")).unwrap(), Some(3));
     assert_eq!(map.get(&String::from("z")).unwrap(), None);
-    assert!(map.contains_key(&String::from("b")));
+    assert!(map.contains_key(&String::from("b")).unwrap());
 }
 
 #[test]
@@ -131,7 +131,7 @@ fn test_map_with_any_values() {
     let empty = Map::<String, Any>::default();
     assert!(empty.is_empty());
 
-    let array = Array::new(vec![1i64, 2, 3]);
+    let array = Array::from_vec(vec![1i64, 2, 3]);
     let array_base_count = AnyView::from(&array).debug_strong_count().unwrap();
     let map: Map<String, Any> = [
         (String::from("number"), Any::from(7i64)),
@@ -142,8 +142,8 @@ fn test_map_with_any_values() {
     .collect();
 
     assert_eq!(map.len(), 3);
-    assert!(map.contains_key(&String::from("number")));
-    assert!(!map.contains_key(&String::from("missing")));
+    assert!(map.contains_key(&String::from("number")).unwrap());
+    assert!(!map.contains_key(&String::from("missing")).unwrap());
     assert_eq!(format!("{map:?}"), "Map<String, Any>[3]");
     assert_eq!(AnyView::from(&array).debug_strong_count().unwrap(), 2);
     assert_eq!(
diff --git a/rust/tvm-ffi/tests/test_match_any.rs 
b/rust/tvm-ffi/tests/test_match_any.rs
index 438accee..db9f3bc3 100644
--- a/rust/tvm-ffi/tests/test_match_any.rs
+++ b/rust/tvm-ffi/tests/test_match_any.rs
@@ -66,7 +66,7 @@ fn matches_concrete_object_containers_in_source_order() {
 
     use tvm_ffi::collections::array::ArrayObj;
     use tvm_ffi::{ObjectArc, ObjectRefCore};
-    let source = Array::new(vec![1_i64, 2, 3]);
+    let source = Array::from_vec(vec![1_i64, 2, 3]);
     let count = || ObjectArc::strong_count(<Array<i64> as 
ObjectRefCore>::data(&source));
     let size = match_any! {
         &source {
@@ -336,16 +336,16 @@ fn 
parameterized_containers_use_complete_conversion_semantics() {
 
     assert_eq!(selected, "float array");
     use tvm_ffi::{List, MutationView};
-    let values = Array::new(vec![257_i64]);
+    let values = Array::from_vec(vec![257_i64]);
     assert_eq!(
         match_any!(&values { Array<u8>(_) => 0, Array<i64>(_) => 1, _ => 2 }),
         1
     );
-    assert!(!match_any!(Array::new(vec![true]) { Array<i64>(_) => true, _ => 
false }));
+    assert!(!match_any!(Array::from_vec(vec![true]) { Array<i64>(_) => true, _ 
=> false }));
     assert!(!match_any!(&values { List<i64>(_) => true, _ => false }));
     let list = [257_i64].into_iter().collect::<List<i64>>();
     assert!(!match_any!(&list { Array<i64>(_) => true, List<u8>(_) => true, _ 
=> false }));
-    let nested = Array::new(vec![Array::new(vec![Some(257_i64)])]);
+    let nested = Array::from_vec(vec![Array::from_vec(vec![Some(257_i64)])]);
     assert_eq!(
         match_any!(&nested {
             Array<Array<Option<u8>>>(_) => 0,
diff --git a/rust/tvm-ffi/tests/test_object.rs 
b/rust/tvm-ffi/tests/test_object.rs
index cc95d975..2a87493a 100644
--- a/rust/tvm-ffi/tests/test_object.rs
+++ b/rust/tvm-ffi/tests/test_object.rs
@@ -280,9 +280,9 @@ fn test_object_arc_option_size() {
 fn test_object_reference_identity() {
     fn assert_hash<T: Hash>(_value: &T) {}
 
-    let first = Array::new(vec![1i64]);
+    let first = Array::from_vec(vec![1i64]);
     let alias = first.clone();
-    let second = Array::new(vec![1i64]);
+    let second = Array::from_vec(vec![1i64]);
 
     assert!(first.same_as(&alias));
     assert!(!first.same_as(&second));
diff --git a/rust/tvm-ffi/tests/test_object_reflection.rs 
b/rust/tvm-ffi/tests/test_object_reflection.rs
index b431d5b7..34612517 100644
--- a/rust/tvm-ffi/tests/test_object_reflection.rs
+++ b/rust/tvm-ffi/tests/test_object_reflection.rs
@@ -122,7 +122,7 @@ fn point3(x: i64, z: i64) -> Point3 {
         data: ObjectArc::new(Point3Obj {
             base: point_obj(x, 0.5, "p3"),
             z,
-            tags: Array::new(vec!["a".into(), "b".into()]),
+            tags: Array::from_vec(vec!["a".into(), "b".into()]),
             r#type: Some(point(1, 2.0, "inner")),
         }),
     }
diff --git a/rust/tvm-ffi/tests/test_optional.rs 
b/rust/tvm-ffi/tests/test_optional.rs
index d69e7d4e..51dbc0a7 100644
--- a/rust/tvm-ffi/tests/test_optional.rs
+++ b/rust/tvm-ffi/tests/test_optional.rs
@@ -56,7 +56,7 @@ fn object_option_uses_nullable_pointer_layout() {
     );
     let none: Option<Array<i64>> = None;
     assert!(none.is_none());
-    let some = Some(Array::new(vec![1i64, 2, 3]));
+    let some = Some(Array::from_vec(vec![1i64, 2, 3]));
     assert_eq!(some.as_ref().expect("engaged").len(), 3);
 }
 
@@ -91,7 +91,7 @@ fn pod_roundtrip_all_supported_types() {
     fn check<T: OptionalCompatible + PartialEq + Copy + std::fmt::Debug>(val: 
T) {
         let ty = std::any::type_name::<T>();
         let some = Optional::<T>::some(val);
-        assert!(some.has_value(), "engaged has_value for {ty}");
+        assert!(some.is_some(), "engaged is_some for {ty}");
         assert_eq!(some.get(), Some(val), "engaged roundtrip for {ty}");
 
         let none = Optional::<T>::none();
@@ -115,7 +115,7 @@ fn pod_roundtrip_all_supported_types() {
 fn roundtrip_get_set() {
     let mut o = Optional::<i32>::some(42);
     assert_eq!(o.get(), Some(42));
-    assert!(o.has_value());
+    assert!(o.is_some());
 
     o.set(None);
     assert_eq!(o.get(), None);
@@ -182,7 +182,7 @@ fn string_byte_image_matches_ffi_any() {
 fn string_roundtrip_and_as_str() {
     // small (inline) string
     let s = Optional::<String>::some(String::from("hi"));
-    assert!(s.has_value());
+    assert!(s.is_some());
     assert_eq!(s.as_str(), Some("hi"));
     assert_eq!(s.get().as_deref(), Some("hi"));
 
diff --git a/rust/tvm-ffi/tests/test_rs_object.rs 
b/rust/tvm-ffi/tests/test_rs_object.rs
index 4f2e5775..b8c50ef2 100644
--- a/rust/tvm-ffi/tests/test_rs_object.rs
+++ b/rust/tvm-ffi/tests/test_rs_object.rs
@@ -206,7 +206,7 @@ fn point(x: i64, label: &str) -> RsPoint {
 }
 
 fn point3(x: i64, z: i64) -> RsPoint3 {
-    let tags = Array::new(vec!["a".into(), "b".into()]);
+    let tags = Array::from_vec(vec!["a".into(), "b".into()]);
     RsPoint3Obj::new(RsPointObj::new(Object::new(), x, "p3"), z, tags, 
7).into()
 }
 
@@ -484,7 +484,7 @@ fn test_init_constructs_the_type_from_its_fields() {
     // The fields of the parent come first, as for a C++ type.
     let init = type_attr_function(RsPoint3Obj::type_index(), "__ffi_init__");
     let label = || tvm_ffi::String::from("l");
-    let tags = Array::<tvm_ffi::String>::new(vec!["a".into()]);
+    let tags = Array::<tvm_ffi::String>::from_vec(vec!["a".into()]);
     let p3 = init
         .call_tuple((1_i64, label(), 2_i64, tags.clone(), 3_i64))
         .unwrap();
diff --git a/rust/tvm-ffi/tests/test_structural_mutate.rs 
b/rust/tvm-ffi/tests/test_structural_mutate.rs
index 503fe295..22ab5ad4 100644
--- a/rust/tvm-ffi/tests/test_structural_mutate.rs
+++ b/rust/tvm-ffi/tests/test_structural_mutate.rs
@@ -103,7 +103,7 @@ impl<'s, 'v, 'c, 'r>
                     let result =
                         mutator.mutate(self, 
MutationView::borrowed(AnyView::from(&key)))?;
                     assert_eq!(
-                        RemapNode::try_from(result.value_or_else(|| 
key.clone()))?
+                        
RemapNode::try_from(result.into_option().unwrap_or_else(|| key.clone()))?
                             .data
                             .value,
                         8
@@ -152,11 +152,11 @@ impl RecursiveEntryMutator {
     ) -> Result<UnchangedOr<Any>> {
         if value.as_any_view().type_index() == TypeIndex::kTVMFFINone as i32 {
             if self.use_owned_value {
-                let value = Array::new(vec![1i64]);
+                let value = Array::from_vec(vec![1i64]);
                 self.owned_value_pointer = Some(array_pointer(&value) as 
usize);
                 let mut owner: Any = value.into();
                 let change = mutator.mutate(self, &mut owner)?;
-                Ok(UnchangedOr::changed(change.value_or(owner)))
+                Ok(UnchangedOr::changed(change.value_or_unchanged(owner)))
             } else {
                 mutator.mutate(self, 
MutationView::borrowed(AnyView::from(&1i64)))
             }
@@ -284,7 +284,7 @@ fn dict_item(dict: &Any, key: i64) -> i64 {
 
 #[test]
 fn unique_array_is_reused_while_shared_array_uses_copy_on_write() {
-    let unique = Array::new(vec![1i64, 2, 3]);
+    let unique = Array::from_vec(vec![1i64, 2, 3]);
     let unique_pointer = array_pointer(&unique);
     let mapped = structural_map(unique, &mut IncrementIntegers, 
WalkOrder::PostOrder)
         .and_then(Array::<i64>::try_from)
@@ -292,7 +292,7 @@ fn 
unique_array_is_reused_while_shared_array_uses_copy_on_write() {
     assert_eq!(array_pointer(&mapped), unique_pointer);
     assert_eq!(mapped.iter().collect::<Vec<_>>(), vec![2, 3, 4]);
 
-    let source = Array::new(vec![4i64, 5]);
+    let source = Array::from_vec(vec![4i64, 5]);
     let source_pointer = array_pointer(&source);
     let mapped = structural_map(source.clone(), &mut IncrementIntegers, 
WalkOrder::PostOrder)
         .and_then(Array::<i64>::try_from)
@@ -304,7 +304,7 @@ fn 
unique_array_is_reused_while_shared_array_uses_copy_on_write() {
 
 #[test]
 fn user_driven_mutator_controls_default_recursion_and_in_place_opt_in() {
-    let unique = Array::new(vec![1i64, 2]);
+    let unique = Array::from_vec(vec![1i64, 2]);
     let unique_pointer = array_pointer(&unique);
     let mutated = structural_mutate::<Array<i64>, _, _, _, _>(unique, 
ManualIncrement::default())
         .and_then(Array::<i64>::try_from)
@@ -312,7 +312,7 @@ fn 
user_driven_mutator_controls_default_recursion_and_in_place_opt_in() {
     assert_eq!(array_pointer(&mutated), unique_pointer);
     assert_eq!(mutated.iter().collect::<Vec<_>>(), vec![2, 3]);
 
-    let source = Array::new(vec![3i64]);
+    let source = Array::from_vec(vec![3i64]);
     let source_pointer = array_pointer(&source);
     let mutated = structural_mutate(source.clone(), ManualIncrement::default())
         .and_then(Array::<i64>::try_from)
@@ -342,9 +342,12 @@ fn 
user_driven_mutator_controls_default_recursion_and_in_place_opt_in() {
         }),
     });
     let mut dispatch = ManualIncrement::default();
-    let first = structural_mutate(Array::new(vec![key.clone(), key.clone()]), 
&mut dispatch)
-        .and_then(Array::<Any>::try_from)
-        .unwrap();
+    let first = structural_mutate(
+        Array::from_vec(vec![key.clone(), key.clone()]),
+        &mut dispatch,
+    )
+    .and_then(Array::<Any>::try_from)
+    .unwrap();
     let first_node = first.get(0).unwrap();
     assert_eq!(
         any_object_pointer(&first_node),
@@ -359,7 +362,7 @@ fn 
user_driven_mutator_controls_default_recursion_and_in_place_opt_in() {
     assert_eq!(RemapNode::try_from(second).unwrap().data.value, 8);
     for order in [WalkOrder::PreOrder, WalkOrder::PostOrder] {
         let first = structural_map(
-            Array::new(vec![key.clone(), key.clone()]),
+            Array::from_vec(vec![key.clone(), key.clone()]),
             &mut dispatch,
             order,
         )
@@ -529,7 +532,7 @@ fn 
default_mutation_mode_preserves_ownership_and_unchanged_results() {
     }
     for mode in [InplaceMode::Disallow, InplaceMode::Allow] {
         for increment in [false, true] {
-            let root = Array::new(vec![1_i64]);
+            let root = Array::from_vec(vec![1_i64]);
             let pointer = array_pointer(&root);
             let result = structural_mutate(root, &mut Controlled { mode, 
increment })
                 .and_then(Array::<i64>::try_from)
@@ -557,7 +560,7 @@ fn 
borrowed_capabilities_cannot_enable_low_level_default_reuse() {
                 return Ok((integer + 1).into());
             }
             assert_eq!(value.as_any_view().try_as::<bool>(), Some(true));
-            let source = Array::new(vec![1_i64]);
+            let source = Array::from_vec(vec![1_i64]);
             let pointer = array_pointer(&source);
             let value = MutationView::borrowed(AnyView::from(&source));
             assert_eq!(value.inplace_mode(), InplaceMode::Disallow);
@@ -568,7 +571,11 @@ fn 
borrowed_capabilities_cannot_enable_low_level_default_reuse() {
             let value = value.with_inplace_mode(InplaceMode::Allow);
             assert_eq!(value.inplace_mode(), InplaceMode::Disallow);
             let result = mutator.default_mutate(self, value)?;
-            let result = Array::<i64>::try_from(result.value_or_else(|| 
source.clone().into()))?;
+            let result = Array::<i64>::try_from(
+                result
+                    .into_option()
+                    .unwrap_or_else(|| source.clone().into()),
+            )?;
             assert_ne!(array_pointer(&result), pointer);
             assert_eq!(source.get(0).unwrap(), 1);
             assert_eq!(result.get(0).unwrap(), 2);
@@ -612,7 +619,7 @@ fn 
borrowed_capabilities_keep_their_mode_in_dispatch_adapters() {
             Unchanged.into_mutate_result()
         }
     }
-    let source = Array::new(vec![1_i64]);
+    let source = Array::from_vec(vec![1_i64]);
     let mut inspect = Inspect {
         source: &source,
         result: None,
@@ -643,7 +650,7 @@ fn owned_entry_mode_is_forwarded_by_generated_callbacks() {
             _: bool,
             mutator: &mut StructuralMutatorView<'_, Self>,
         ) -> Result<UnchangedOr<Any>> {
-            let child = Array::new(vec![1_i64]);
+            let child = Array::from_vec(vec![1_i64]);
             self.pointer = array_pointer(&child) as usize;
             mutator.with_def_region_kind(DefRegionKind::Pattern, |mutator| {
                 let mut owner: Any = child.into();
@@ -667,7 +674,7 @@ fn owned_entry_mode_is_forwarded_by_generated_callbacks() {
                     assert!(change.is_unchanged());
                 }
                 assert_eq!(owner.debug_strong_count(), Some(count));
-                let result = change.value_or(owner);
+                let result = change.value_or_unchanged(owner);
                 if let Some(alias) = alias {
                     assert_eq!(Array::<i64>::try_from(alias)?.get(0)?, 1);
                 }
@@ -783,9 +790,9 @@ fn 
consuming_callbacks_forward_permissions_without_temporary_owners() {
         (Allow, true, false),
         (Allow, false, true),
     ] {
-        let child = Array::new(vec![1_i64]);
+        let child = Array::from_vec(vec![1_i64]);
         let child_ptr = array_pointer(&child);
-        let root = Array::new(vec![child]);
+        let root = Array::from_vec(vec![child]);
         let root_ptr = array_pointer(&root);
         let original = shared.then(|| root.clone());
         let mut state = Forward {
@@ -816,8 +823,8 @@ fn 
consuming_callbacks_forward_permissions_without_temporary_owners() {
     let mut owner: Any = FieldNode {
         data: ObjectArc::new(FieldNodeObj {
             base: Object::new(),
-            a: Array::new(vec![1_i64]),
-            b: Array::new(vec![2_i64]).into(),
+            a: Array::from_vec(vec![1_i64]),
+            b: Array::from_vec(vec![2_i64]).into(),
         }),
     }
     .into();
@@ -894,7 +901,7 @@ fn 
consuming_default_descent_transfers_between_contexts_without_node_borrows() {
 
     for retain in [false, true] {
         for borrowed in [false, true] {
-            let root = Array::new(vec![1_i64]);
+            let root = Array::from_vec(vec![1_i64]);
             let pointer = array_pointer(&root);
             let result = if borrowed {
                 structural_mutate(root, &mut Outer { retain })
@@ -932,7 +939,7 @@ fn 
consuming_default_descent_preserves_unchanged_and_propagates_errors() {
         }
     }
     for fail in [false, true] {
-        let root = Array::new(vec![1_i64]);
+        let root = Array::from_vec(vec![1_i64]);
         let pointer = array_pointer(&root);
         let result = structural_mutate(root, Preserve(fail));
         if fail {
@@ -1061,7 +1068,7 @@ fn 
callback_errors_preserve_message_and_add_object_context() {
             child.clone(),
         ],
     );
-    let payload = 
ObjectRef::try_from(Any::from(Array::new(vec![7i64]))).unwrap();
+    let payload = 
ObjectRef::try_from(Any::from(Array::from_vec(vec![7i64]))).unwrap();
     let records = call_global("ffi.List", &[Any::new()]);
     let context = call_global(
         "ffi.MakeObjectFromPackedArgs",
@@ -1200,14 +1207,14 @@ fn 
callback_errors_preserve_message_and_add_object_context() {
 
     // The failing node may be a pre-order replacement or a post-order rebuilt 
parent.
     for order in [WalkOrder::PreOrder, WalkOrder::PostOrder] {
-        let root = Array::new(vec![0i64]);
+        let root = Array::from_vec(vec![0i64]);
         let mut failed_node = None;
         let error = structural_map(
             root.clone(),
             (
                 |value: Array<i64>| -> Result<Any> {
                     let value = if order == WalkOrder::PreOrder {
-                        Array::new(vec![1i64])
+                        Array::from_vec(vec![1i64])
                     } else {
                         value
                     };
@@ -1250,7 +1257,7 @@ fn 
callback_errors_preserve_message_and_add_object_context() {
 
 #[test]
 fn unique_map_reuses_nested_unique_value_storage() {
-    let child = Array::new(vec![1i64, 2]);
+    let child = Array::from_vec(vec![1i64, 2]);
     let child_pointer = array_pointer(&child);
     let source: Map<i64, Array<i64>> = [(1, child)].into_iter().collect();
     let source_pointer = map_pointer(&source);
@@ -1375,9 +1382,13 @@ impl GeneratedMapper {
 #[test]
 fn generated_map_dispatch_supports_kind_and_ordered_catch_all() {
     let mut mapper = GeneratedMapper::default();
-    let mapped = structural_map(Array::new(vec![1i64, 2]), &mut mapper, 
WalkOrder::PostOrder)
-        .and_then(Array::<i64>::try_from)
-        .unwrap();
+    let mapped = structural_map(
+        Array::from_vec(vec![1i64, 2]),
+        &mut mapper,
+        WalkOrder::PostOrder,
+    )
+    .and_then(Array::<i64>::try_from)
+    .unwrap();
 
     assert_eq!(mapped.iter().collect::<Vec<_>>(), vec![2, 3]);
     assert_eq!(
@@ -1430,7 +1441,7 @@ fn 
generated_stateless_mutate_dispatch_is_a_direct_callback() {
 
 #[test]
 fn 
generated_mutate_dispatch_defaults_unmatched_values_and_preserves_inplace_permit()
 {
-    let root = Array::new(vec![1i64, 2]);
+    let root = Array::from_vec(vec![1i64, 2]);
     let root_pointer = array_pointer(&root);
     let mut mutator = GeneratedLeafDispatch::default();
     let mutated = structural_mutate(root, &mut mutator)
@@ -1465,10 +1476,11 @@ impl GeneratedRecursiveDispatch {
             mutated.push(i64::try_from(
                 mutator
                     .mutate(self, 
MutationView::borrowed(AnyView::from(&value)))?
-                    .value_or_else(|| value.into()),
+                    .into_option()
+                    .unwrap_or_else(|| value.into()),
             )?);
         }
-        Ok(Array::new(mutated).into())
+        Ok(Array::from_vec(mutated).into())
     }
 
     fn mutate_integer(
@@ -1485,7 +1497,7 @@ impl GeneratedRecursiveDispatch {
 #[test]
 fn generated_mutate_dispatch_recurses_through_context() {
     let mut mutator = GeneratedRecursiveDispatch::default();
-    let mutated = structural_mutate(Array::new(vec![1i64, 2]), &mut mutator)
+    let mutated = structural_mutate(Array::from_vec(vec![1i64, 2]), &mut 
mutator)
         .and_then(Array::<i64>::try_from)
         .unwrap();
 
@@ -1523,7 +1535,7 @@ impl GeneratedDefaultingDispatch {
 #[test]
 fn generated_mutate_dispatch_can_default_recurse_from_a_typed_handler() {
     let mut mutator = GeneratedDefaultingDispatch::default();
-    let mutated = structural_mutate(Array::new(vec![1i64, 2]), &mut mutator)
+    let mutated = structural_mutate(Array::from_vec(vec![1i64, 2]), &mut 
mutator)
         .and_then(Array::<i64>::try_from)
         .unwrap();
 
@@ -1538,7 +1550,7 @@ fn pre_order_mapping_preserves_inplace_permission() {
         let root = match case {
             "inline" => Any::from(true),
             "retained" => call_global("ffi.List", &[Any::from(1_i64)]),
-            _ => Any::from(Array::new(vec![true])),
+            _ => Any::from(Array::from_vec(vec![true])),
         };
         let root_pointer = (case == "retained").then(|| 
any_object_pointer(&root));
         let alias = (case == "shared").then(|| root.clone());
@@ -1552,7 +1564,7 @@ fn pre_order_mapping_preserves_inplace_permission() {
                 retained = Some(Any::from(value));
                 Any::from(value)
             } else {
-                Array::new(vec![1_i64]).into()
+                Array::from_vec(vec![1_i64]).into()
             };
             pointer = any_object_pointer(&mapped);
             mapped
@@ -1581,7 +1593,7 @@ fn pre_order_mapping_preserves_inplace_permission() {
 
 #[test]
 fn closures_and_tuples_use_ordered_first_match() {
-    let root = Array::new(vec![1i64, 2]);
+    let root = Array::from_vec(vec![1i64, 2]);
     let mapped = structural_map(
         root,
         |integer: i64| Any::from(integer + 10),
@@ -1594,7 +1606,7 @@ fn closures_and_tuples_use_ordered_first_match() {
     let mut first_calls = 0;
     let mut later_calls = 0;
     let mapped = structural_map(
-        Array::new(vec![3i64]),
+        Array::from_vec(vec![3i64]),
         (
             |integer: i64| {
                 first_calls += 1;
@@ -1617,7 +1629,7 @@ fn closures_and_tuples_use_ordered_first_match() {
 #[test]
 fn callbacks_return_values_convertible_into_any() {
     let mapped = structural_map(
-        Array::new(vec![1i64, 2]),
+        Array::from_vec(vec![1i64, 2]),
         |integer: i64| integer + 10,
         WalkOrder::PostOrder,
     )
@@ -1626,7 +1638,7 @@ fn callbacks_return_values_convertible_into_any() {
     assert_eq!(mapped.iter().collect::<Vec<_>>(), vec![11, 12]);
 
     let mapped = structural_map(
-        Array::new(vec![1i64, 2]),
+        Array::from_vec(vec![1i64, 2]),
         |integer: i64| -> Result<i64> { Ok(integer + 20) },
         WalkOrder::PostOrder,
     )
@@ -1645,7 +1657,7 @@ fn callbacks_return_values_convertible_into_any() {
             (integer * 2).into_mutate_result()
         }
     }
-    let mutated = structural_mutate(Array::new(vec![1i64, 2]), Double)
+    let mutated = structural_mutate(Array::from_vec(vec![1i64, 2]), Double)
         .and_then(Array::<i64>::try_from)
         .unwrap();
     assert_eq!(mutated.iter().collect::<Vec<_>>(), vec![2, 4]);
@@ -1674,7 +1686,7 @@ fn recursive_mutate_returns_unchanged_or_a_replacement() {
     }
 
     // No rewrite: the public entry resolves unchanged to the original array.
-    let source = Array::new(vec![1i64, 2]);
+    let source = Array::from_vec(vec![1i64, 2]);
     let result = structural_mutate(source.clone(), ClampNegativeIntegers)
         .and_then(Array::<i64>::try_from)
         .unwrap();
@@ -1682,7 +1694,7 @@ fn recursive_mutate_returns_unchanged_or_a_replacement() {
     assert_eq!(array_pointer(&result), array_pointer(&source));
 
     // One rewrite: replace only the negative integer and keep the source 
intact.
-    let source = Array::new(vec![-1i64, 2]);
+    let source = Array::from_vec(vec![-1i64, 2]);
     let result = structural_mutate(source.clone(), ClampNegativeIntegers)
         .and_then(Array::<i64>::try_from)
         .unwrap();
@@ -1693,9 +1705,9 @@ fn recursive_mutate_returns_unchanged_or_a_replacement() {
 
 #[test]
 fn pre_order_unchanged_reuses_unmodified_subtrees() {
-    let unchanged = Array::new(vec![1i64, 2]);
-    let changed = Array::new(vec![-1i64, 2]);
-    let source = Array::new(vec![unchanged.clone(), changed.clone()]);
+    let unchanged = Array::from_vec(vec![1i64, 2]);
+    let changed = Array::from_vec(vec![-1i64, 2]);
+    let source = Array::from_vec(vec![unchanged.clone(), changed.clone()]);
 
     let mapped = structural_map(
         source.clone(),
@@ -1734,7 +1746,7 @@ fn pre_order_unchanged_reuses_unmodified_subtrees() {
 fn post_order_unchanged_preserves_descendant_rewrites() {
     for borrowed in [false, true] {
         for shared in [false, true] {
-            let root = Array::new(vec![1_i64]);
+            let root = Array::from_vec(vec![1_i64]);
             let pointer = array_pointer(&root);
             let alias = shared.then(|| root.clone());
             let callbacks = (
@@ -1796,7 +1808,7 @@ fn twelve_link_tuple_reaches_final_map_dispatch() {
 
 #[test]
 fn nested_tuple_chain_exceeds_flat_arity() {
-    let root = Array::new(vec![1i64, 2, 3]);
+    let root = Array::from_vec(vec![1i64, 2, 3]);
     let mut catch_all = 0;
     let mapped = structural_map(
         root,
@@ -1836,7 +1848,7 @@ fn nested_tuple_chain_exceeds_flat_arity() {
 
 #[test]
 fn callbacks_run_in_the_configured_order() {
-    let root = Array::new(vec![1i64, 2]);
+    let root = Array::from_vec(vec![1i64, 2]);
     let mut pre = Vec::new();
     structural_map(
         root.clone(),
@@ -1913,7 +1925,7 @@ fn map_keys_are_anchors_and_object_leaves_are_preserved() 
{
 
 #[test]
 fn callback_mutate_defaults_unmatched_values_and_preserves_root_permit() {
-    let root = Array::new(vec![1i64, 2]);
+    let root = Array::from_vec(vec![1i64, 2]);
     let root_pointer = array_pointer(&root);
     let mutated = structural_mutate(root, GeneratedStatelessDispatch)
         .and_then(Array::<i64>::try_from)
@@ -1948,14 +1960,14 @@ impl CallbackMutateStats {
 fn callback_mutator_carries_reusable_mutable_state() {
     let mut mutator = CallbackMutateStats::default();
 
-    let first = structural_mutate(Array::new(vec![1i64, 2]), &mut mutator)
+    let first = structural_mutate(Array::from_vec(vec![1i64, 2]), &mut mutator)
         .and_then(Array::<i64>::try_from)
         .unwrap();
     assert_eq!(first.iter().collect::<Vec<_>>(), vec![2, 3]);
     assert_eq!(mutator.integers, vec![1, 2]);
     assert_eq!(mutator.defaults, 1);
 
-    let second = structural_mutate(Array::new(vec![3i64]), &mut mutator)
+    let second = structural_mutate(Array::from_vec(vec![3i64]), &mut mutator)
         .and_then(Array::<i64>::try_from)
         .unwrap();
     assert_eq!(second.iter().collect::<Vec<_>>(), vec![4]);
@@ -1990,7 +2002,7 @@ impl CallbackMutateDepth {
 
 #[test]
 fn callback_mutator_state_can_change_around_recursive_reborrows() {
-    let root = Array::new(vec![Array::new(vec![1i64, 2])]);
+    let root = Array::from_vec(vec![Array::from_vec(vec![1i64, 2])]);
     let mut mutator = CallbackMutateDepth::default();
     let mutated = structural_mutate(root, &mut mutator)
         .and_then(Array::<Array<i64>>::try_from)
@@ -2007,7 +2019,7 @@ fn 
callback_mutator_state_can_change_around_recursive_reborrows() {
 
 #[test]
 fn callback_mutate_explicit_default_is_repeatable_copy_path() {
-    let root = Array::new(vec![1i64, 2]);
+    let root = Array::from_vec(vec![1i64, 2]);
     let root_pointer = array_pointer(&root);
     let defaults = Cell::new(0);
     struct Repeat<'a>(&'a Cell<i32>);
@@ -2024,10 +2036,12 @@ fn 
callback_mutate_explicit_default_is_repeatable_copy_path() {
             self.0.set(self.0.get() + 1);
             let first = mutator
                 .default_mutate(self, MutationView::borrowed(value))?
-                .value_or_else(|| value.into());
+                .into_option()
+                .unwrap_or_else(|| value.into());
             let second = mutator
                 .default_mutate(self, MutationView::borrowed(value))?
-                .value_or_else(|| value.into());
+                .into_option()
+                .unwrap_or_else(|| value.into());
             assert_ne!(any_object_pointer(&first), 
any_object_pointer(&second));
             Ok(UnchangedOr::changed(first))
         }
@@ -2051,14 +2065,14 @@ fn 
callback_mutate_match_is_final_and_same_fn_can_reenter() {
             _: Array<i64>,
             _: &mut StructuralMutatorView<'_, Self>,
         ) -> Result<UnchangedOr<Any>> {
-            Ok(Array::new(vec![10i64]).into())
+            Ok(Array::from_vec(vec![10i64]).into())
         }
         fn mutate_integer(&mut self, value: i64) -> Result<UnchangedOr<Any>> {
             self.0.set(self.0.get() + 1);
             Ok((value + 1).into())
         }
     }
-    let mutated = structural_mutate(Array::new(vec![1i64]), 
First(&integer_calls))
+    let mutated = structural_mutate(Array::from_vec(vec![1i64]), 
First(&integer_calls))
         .and_then(Array::<i64>::try_from)
         .unwrap();
     assert_eq!(mutated.iter().collect::<Vec<_>>(), vec![10]);
@@ -2077,7 +2091,7 @@ fn 
callback_mutate_match_is_final_and_same_fn_can_reenter() {
             mutator.default_mutate(self, MutationView::borrowed(value))
         }
     }
-    let mutated = structural_mutate(Array::new(vec![1i64, 2]), Reenter(&calls))
+    let mutated = structural_mutate(Array::from_vec(vec![1i64, 2]), 
Reenter(&calls))
         .and_then(Array::<i64>::try_from)
         .unwrap();
     assert_eq!(mutated.iter().collect::<Vec<_>>(), vec![1, 2]);
@@ -2127,7 +2141,7 @@ fn 
callback_mutate_supports_node_links_nested_tuples_and_reflection() {
 
 #[test]
 fn callback_mutate_distinguishes_borrowed_and_owned_children() {
-    let borrowed_child = Array::new(vec![1i64]);
+    let borrowed_child = Array::from_vec(vec![1i64]);
     let borrowed_pointer = array_pointer(&borrowed_child);
     struct Borrowed<'a>(&'a Array<i64>);
     #[dispatch(mutate, (MutationView<'_>, &mut StructuralMutatorView<'_, 
Self>), Result<UnchangedOr<Any>>)]
@@ -2160,11 +2174,11 @@ fn 
callback_mutate_distinguishes_borrowed_and_owned_children() {
             _: bool,
             mutator: &mut StructuralMutatorView<'_, Self>,
         ) -> Result<UnchangedOr<Any>> {
-            let child = Array::new(vec![1i64]);
+            let child = Array::from_vec(vec![1i64]);
             self.0.set(array_pointer(&child) as usize);
             let mut owner: Any = child.into();
             let change = mutator.mutate(self, MutationView::from(&mut owner))?;
-            Ok(UnchangedOr::changed(change.value_or(owner)))
+            Ok(UnchangedOr::changed(change.value_or_unchanged(owner)))
         }
         fn mutate_integer(&mut self, value: i64) -> Result<UnchangedOr<Any>> {
             Ok((value + 1).into())
@@ -2208,7 +2222,7 @@ fn 
nested_callback_mutate_restores_the_outer_active_mutator() {
             mutator.mutate(self, MutationView::borrowed(AnyView::from(&3i64)))
         }
     }
-    let mutated = structural_mutate(Array::new(vec![1i64]), Outer)
+    let mutated = structural_mutate(Array::from_vec(vec![1i64]), Outer)
         .and_then(Array::<i64>::try_from)
         .unwrap();
     assert_eq!(mutated.get(0).unwrap(), 4);
@@ -2216,7 +2230,7 @@ fn 
nested_callback_mutate_restores_the_outer_active_mutator() {
 
 #[test]
 fn map_entries_preserve_descent_and_callback_composition() {
-    let root = || Array::new(vec![1_i64]);
+    let root = || Array::from_vec(vec![1_i64]);
     let first = |value: Any| 
Array::<i64>::try_from(value).unwrap().get(0).unwrap();
     for order in [WalkOrder::PreOrder, WalkOrder::PostOrder] {
         let mut dispatch = IncrementIntegers;
@@ -2279,7 +2293,7 @@ fn mutation_descent_preserves_ownership_and_markers() {
         for case in 0..4 {
             // Unique, shared, retained alias, explicit copy descent.
             for increment in [false, true] {
-                let root = Array::new(vec![1_i64]);
+                let root = Array::from_vec(vec![1_i64]);
                 let pointer = array_pointer(&root);
                 let alias = (case == 1).then(|| root.clone());
                 let state = Ownership {
@@ -2378,11 +2392,13 @@ fn mutation_regions_retargeting_and_error_restore() {
                         assert_eq!(mutator.def_region_kind(), Pattern);
                         self.0.push((100, mutator.def_region_kind()));
                         {
-                            let array = Array::new(vec![5_i64]);
+                            let array = Array::from_vec(vec![5_i64]);
                             mutator
                                 .default_mutate(self, 
MutationView::borrowed(AnyView::from(&array)))
                                 .map(|result| {
-                                    
UnchangedOr::changed(result.value_or_else(|| array.into()))
+                                    UnchangedOr::changed(
+                                        result.into_option().unwrap_or_else(|| 
array.into()),
+                                    )
                                 })
                         }
                     })
@@ -2417,10 +2433,14 @@ fn mutation_regions_retargeting_and_error_restore() {
             if value.as_any_view().try_as::<bool>() == Some(false) {
                 return mutator.with_def_region_kind(Pattern, |mutator| {
                     self.0.push((100, mutator.def_region_kind()));
-                    let array = Array::new(vec![1_i64]);
+                    let array = Array::from_vec(vec![1_i64]);
                     mutator
                         .default_mutate(self, 
MutationView::borrowed(AnyView::from(&array)))
-                        .map(|result| 
UnchangedOr::changed(result.value_or_else(|| array.into())))
+                        .map(|result| {
+                            UnchangedOr::changed(
+                                result.into_option().unwrap_or_else(|| 
array.into()),
+                            )
+                        })
                 });
             }
             if let Some(x) = value.as_any_view().try_as::<i64>() {
@@ -2487,7 +2507,10 @@ fn mutation_regions_retargeting_and_error_restore() {
 
 #[test]
 fn mapping_preserves_post_recursion_state() {
-    let root = Array::new(vec![Array::new(vec![1_i64, 2]), Array::new(vec![3, 
4])]);
+    let root = Array::from_vec(vec![
+        Array::from_vec(vec![1_i64, 2]),
+        Array::from_vec(vec![3, 4]),
+    ]);
     for order in [WalkOrder::PreOrder, WalkOrder::PostOrder] {
         let ordinary = structural_map(root.clone(), |value: i64| value + 1, 
order).unwrap();
         let leaves = |value: &Any| {
@@ -2537,7 +2560,7 @@ fn mapping_preserves_primitive_replacement_descent() {
     for order in [WalkOrder::PreOrder, WalkOrder::PostOrder] {
         let callback = |value: i64| -> Any {
             if value == 0 {
-                Array::new(vec![1_i64, 2]).into()
+                Array::from_vec(vec![1_i64, 2]).into()
             } else {
                 (value + 10).into()
             }
@@ -2574,7 +2597,7 @@ fn dispatch_handlers_may_return_typed_results() {
             mutator.default_mutate(self, value)?.try_cast()
         }
     }
-    let mutated = structural_mutate(Array::new(vec![1i64, 2]), Typed)
+    let mutated = structural_mutate(Array::from_vec(vec![1i64, 2]), Typed)
         .and_then(Array::<i64>::try_from)
         .unwrap();
     assert_eq!(mutated.iter().collect::<Vec<_>>(), vec![10, 20]);
@@ -2582,11 +2605,14 @@ fn dispatch_handlers_may_return_typed_results() {
     struct KeepTyped;
     #[dispatch(mutate, (MutationView<'_>, &mut StructuralMutatorView<'_, 
Self>), Result<UnchangedOr<Any>>)]
     impl KeepTyped {
-        fn mutate_array(&mut self, _: MutationView<'_, Array<i64>>) -> 
Result<UnchangedOr<Array<i64>>> {
+        fn mutate_array(
+            &mut self,
+            _: MutationView<'_, Array<i64>>,
+        ) -> Result<UnchangedOr<Array<i64>>> {
             Ok(UnchangedOr::unchanged())
         }
     }
-    let source = Array::new(vec![1i64, 2]);
+    let source = Array::from_vec(vec![1i64, 2]);
     let kept = structural_mutate(source.clone(), KeepTyped)
         .and_then(Array::<i64>::try_from)
         .unwrap();
@@ -2596,9 +2622,13 @@ fn dispatch_handlers_may_return_typed_results() {
 #[test]
 fn map_callbacks_may_return_typed_results() {
     let mapped = structural_map(
-        Array::new(vec![1i64, 2]),
+        Array::from_vec(vec![1i64, 2]),
         |value: i64| -> Result<UnchangedOr<i64>> {
-            Ok(if value == 1 { UnchangedOr::changed(5) } else { 
UnchangedOr::unchanged() })
+            Ok(if value == 1 {
+                UnchangedOr::changed(5)
+            } else {
+                UnchangedOr::unchanged()
+            })
         },
         WalkOrder::PreOrder,
     )
diff --git a/rust/tvm-ffi/tests/test_structural_visit.rs 
b/rust/tvm-ffi/tests/test_structural_visit.rs
index 5052c2bb..ce608a59 100644
--- a/rust/tvm-ffi/tests/test_structural_visit.rs
+++ b/rust/tvm-ffi/tests/test_structural_visit.rs
@@ -111,7 +111,7 @@ fn 
default_descent_scopes_regions_and_restores_after_halts() {
             seen: vec![],
             regions: vec![],
         };
-        let result = structural_visit(&Array::new(vec![1_i64, 5]), &mut 
visitor);
+        let result = structural_visit(&Array::from_vec(vec![1_i64, 5]), &mut 
visitor);
 
         match outcome {
             Outcome::Finish => assert!(result.unwrap().is_none()),
@@ -194,7 +194,10 @@ fn 
default_descent_retargets_without_dispatching_the_container() {
             }
         }
     }
-    let root = Array::new(vec![Any::from(Array::new(vec![7_i64])), 
Any::from(99_i64)]);
+    let root = Array::from_vec(vec![
+        Any::from(Array::from_vec(vec![7_i64])),
+        Any::from(99_i64),
+    ]);
     let mut visitor = Probe::default();
     assert!(structural_visit(&root, &mut visitor).unwrap().is_none());
     assert_eq!(
@@ -392,7 +395,7 @@ fn 
public_reflection_access_uses_registered_field_and_type_attr() {
     drop(root);
     assert_eq!(selected.as_str(), "an owning C++ reflected field value");
 
-    let wrong_type = Array::new(vec![0i64]);
+    let wrong_type = Array::from_vec(vec![0i64]);
     assert!(getter.get_any(&**Array::data(&wrong_type)).is_err());
     assert!(FieldGetter::new(type_index, "missing").is_err());
 
@@ -404,7 +407,7 @@ fn 
public_reflection_access_uses_registered_field_and_type_attr() {
 
 #[test]
 fn plain_walk_uses_registered_array_hook() {
-    let root = Array::new(vec![1i64, 2, 3]);
+    let root = Array::from_vec(vec![1i64, 2, 3]);
     let mut integers = 0;
     assert!(structural_walk(
         &root,
@@ -610,7 +613,7 @@ fn handler_error_crosses_map_traversal() {
 
 #[test]
 fn interrupt_stops_without_running_remaining_callbacks() {
-    let root = Array::new(vec![1i64, 2, 3]);
+    let root = Array::from_vec(vec![1i64, 2, 3]);
     let mut integers = 0;
     let outcome = structural_walk(
         &root,
@@ -672,7 +675,7 @@ impl ManualRegionVisitor {
 
 #[test]
 fn manual_child_visit_can_override_def_region() {
-    let root = Array::new(vec![7i64, 8]);
+    let root = Array::from_vec(vec![7i64, 8]);
     let mut probe = ManualRegionVisitor::default();
     assert!(structural_visit(&root, &mut probe).unwrap().is_none());
     assert_eq!(probe.seen, vec![DefRegionKind::Simple, DefRegionKind::None]);
@@ -696,7 +699,7 @@ impl GeneratedLeafVisitor {
     ) -> Result<Option<VisitInterrupt>> {
         let kind = visitor.def_region_kind();
         if value == -1 {
-            let root = Array::new(vec![1_i64, 2]);
+            let root = Array::from_vec(vec![1_i64, 2]);
             assert!(
                 Dispatcher::dispatch_tuple(&mut *self, (AnyView::from(&root), 
&mut *visitor))
                     .is_none()
@@ -716,7 +719,7 @@ impl GeneratedLeafVisitor {
 
 #[test]
 fn generated_visitor_defaults_unmatched_values() {
-    let root = Array::new(vec![1i64, 2]);
+    let root = Array::from_vec(vec![1i64, 2]);
     let mut visitor = GeneratedLeafVisitor::default();
     assert!(structural_visit(&-1_i64, &mut visitor).unwrap().is_none());
     assert_eq!(visitor.integers, vec![(0, DefRegionKind::None)]);
@@ -769,7 +772,7 @@ impl GeneratedRecursiveVisitor {
 
 #[test]
 fn generated_visitor_can_drive_recursion_through_mut_self() {
-    let root = Array::new(vec![1i64, 2, 3]);
+    let root = Array::from_vec(vec![1i64, 2, 3]);
     let mut visitor = GeneratedRecursiveVisitor::default();
     let interrupt = structural_visit(&root, &mut visitor).unwrap().unwrap();
     assert_eq!(interrupt.value.try_as::<i64>().unwrap(), 2);
@@ -839,7 +842,7 @@ impl MissingWholeImpl {
 
 #[test]
 fn generated_dispatch_supports_pod_and_ordered_catch_all() {
-    let root = Array::new(vec![1i64, 2]);
+    let root = Array::from_vec(vec![1i64, 2]);
     let mut probe = GenericDispatchProbe::default();
     assert!(structural_walk(&root, &mut probe, WalkOrder::PreOrder)
         .unwrap()
@@ -847,7 +850,7 @@ fn generated_dispatch_supports_pod_and_ordered_catch_all() {
     assert_eq!(probe.integers, vec![1, 2]);
     assert_eq!(probe.objects, 1);
 
-    let floats = Array::new(vec![1.0f64, 2.0]);
+    let floats = Array::from_vec(vec![1.0f64, 2.0]);
     assert!(structural_walk(&floats, &mut probe, WalkOrder::PreOrder)
         .unwrap()
         .is_none());
@@ -921,7 +924,7 @@ impl StraddleVisitor {
 
 #[test]
 fn visitor_can_straddle_default_children() {
-    let root = Array::new(vec![1i64, 2]);
+    let root = Array::from_vec(vec![1i64, 2]);
     let mut probe = StraddleVisitor::default();
     assert!(structural_visit(&root, &mut probe).unwrap().is_none());
     assert_eq!(
@@ -957,7 +960,7 @@ impl OrderProbe {
 
 #[test]
 fn stateful_structural_walk_supports_post_order() {
-    let root = Array::new(vec![1i64, 2]);
+    let root = Array::from_vec(vec![1i64, 2]);
     let mut probe = OrderProbe::default();
     assert!(structural_walk(&root, &mut probe, WalkOrder::PostOrder)
         .unwrap()
@@ -967,8 +970,8 @@ fn stateful_structural_walk_supports_post_order() {
 
 #[test]
 fn nested_walk_restores_the_outer_active_visitor() {
-    let outer = Array::new(vec![10i64, 20]);
-    let inner = Array::new(vec![1i64, 2]);
+    let outer = Array::from_vec(vec![10i64, 20]);
+    let inner = Array::from_vec(vec![1i64, 2]);
     let mut entered_inner = false;
     let mut outer_values = Vec::new();
     let mut inner_values = Vec::new();
@@ -1004,7 +1007,7 @@ fn nested_walk_restores_the_outer_active_visitor() {
 
 #[test]
 fn interrupt_payload_is_returned_to_the_caller() {
-    let root = Array::new(vec![1i64, 2]);
+    let root = Array::from_vec(vec![1i64, 2]);
     let outcome = structural_walk(
         &root,
         |value: AnyView<'_>| {
@@ -1024,7 +1027,7 @@ fn interrupt_payload_is_returned_to_the_caller() {
 
 #[test]
 fn handler_errors_include_native_visit_path() {
-    let root = Array::new(vec![1i64]);
+    let root = Array::from_vec(vec![1i64]);
     let error = match structural_walk(
         &root,
         |value: AnyView<'_>| -> Result<WalkResult> {
@@ -1068,7 +1071,7 @@ fn visitor_errors_include_native_visit_path() {
         }
     }
 
-    let root = Array::new(vec![1i64]);
+    let root = Array::from_vec(vec![1i64]);
     let error = match structural_visit(&root, &mut FailingVisitor) {
         Err(error) => error,
         Ok(_) => panic!("visitor unexpectedly succeeded"),
@@ -1124,8 +1127,9 @@ fn 
visitor_interrupt_propagates_through_default_children() {
         }
     }
 
-    let root = Array::new(vec![1i64, 2, 3]);
-    let outcome = structural_visit::<&Array<i64>, _, _, _, _>(&root, &mut 
InterruptingVisitor).unwrap();
+    let root = Array::from_vec(vec![1i64, 2, 3]);
+    let outcome =
+        structural_visit::<&Array<i64>, _, _, _, _>(&root, &mut 
InterruptingVisitor).unwrap();
     let Some(interrupt) = outcome else {
         panic!("visitor traversal unexpectedly completed");
     };
@@ -1136,7 +1140,7 @@ fn 
visitor_interrupt_propagates_through_default_children() {
 fn closure_walk_receives_def_region_kind() {
     // C++: StructuralWalk<kPreOrder>(root,
     //          [&](const TVarObj* var, TVMFFIDefRegionKind kind) { ... })
-    let root = Array::new(vec![1i64, 2]);
+    let root = Array::from_vec(vec![1i64, 2]);
     let mut kinds = Vec::new();
     assert!(structural_walk(
         &root,
@@ -1155,7 +1159,7 @@ fn closure_walk_receives_def_region_kind() {
 
 #[test]
 fn closure_walk_supports_post_order_and_skip() {
-    let root = Array::new(vec![1i64, 2]);
+    let root = Array::from_vec(vec![1i64, 2]);
     let mut order_probe = Vec::new();
     assert!(structural_walk(
         &root,
@@ -1194,7 +1198,10 @@ fn closure_walk_supports_post_order_and_skip() {
 // ---------------------------------------------------------------------------
 #[test]
 fn chain_accepts_owned_object_ref_links() {
-    let root = Array::new(vec![Array::new(vec![1i64]), Array::new(vec![2i64, 
3])]);
+    let root = Array::from_vec(vec![
+        Array::from_vec(vec![1i64]),
+        Array::from_vec(vec![2i64, 3]),
+    ]);
     let mut lengths = Vec::new();
     assert!(structural_walk(
         &root,
@@ -1216,7 +1223,7 @@ fn chain_accepts_owned_object_ref_links() {
 
 #[test]
 fn chain_links_may_mix_def_region_arity() {
-    let root = Array::new(vec![1i64, 2]);
+    let root = Array::from_vec(vec![1i64, 2]);
     let mut kinds = Vec::new();
     let mut objects = 0;
     assert!(structural_walk(
@@ -1242,7 +1249,10 @@ fn chain_links_may_mix_def_region_arity() {
 
 #[test]
 fn chain_links_can_skip_children() {
-    let root = Array::new(vec![Array::new(vec![1i64]), 
Array::new(vec![2i64])]);
+    let root = Array::from_vec(vec![
+        Array::from_vec(vec![1i64]),
+        Array::from_vec(vec![2i64]),
+    ]);
     let mut arrays = 0;
     let mut integers = 0;
     assert!(structural_walk(
@@ -1267,7 +1277,7 @@ fn chain_links_can_skip_children() {
 
 #[test]
 fn chain_link_errors_include_native_visit_path() {
-    let root = Array::new(vec![1i64]);
+    let root = Array::from_vec(vec![1i64]);
     let error = match structural_walk(
         &root,
         (
@@ -1285,7 +1295,7 @@ fn chain_link_errors_include_native_visit_path() {
 
 #[test]
 fn chain_supports_post_order() {
-    let root = Array::new(vec![1i64, 2]);
+    let root = Array::from_vec(vec![1i64, 2]);
     let events = std::cell::RefCell::new(Vec::new());
     assert!(structural_walk(
         &root,
@@ -1321,7 +1331,7 @@ impl ObjectCounter {
 
 #[test]
 fn chain_splices_dispatch_walkers_between_closures() {
-    let root = Array::new(vec![1i64, 2]);
+    let root = Array::from_vec(vec![1i64, 2]);
     let mut counter = ObjectCounter::default();
     let mut integers = 0;
     assert!(structural_walk(
@@ -1340,7 +1350,7 @@ fn chain_splices_dispatch_walkers_between_closures() {
 
 #[test]
 fn chain_supports_full_arity() {
-    let root = Array::new(vec![1i64, 2, 3]);
+    let root = Array::from_vec(vec![1i64, 2, 3]);
     let mut integers = Vec::new();
     let mut objects = 0;
     let mut others = 0;
@@ -1383,7 +1393,7 @@ fn typed_lambda_walks_bare_and_as_single_link_tuple() {
     // A lone typed handler needs no tuple: unmatched values (the array
     // itself) advance normally. The 1-tuple spelling routes through the
     // chain impls instead and must agree.
-    let root = Array::new(vec![1i64, 2, 3]);
+    let root = Array::from_vec(vec![1i64, 2, 3]);
     let mut bare = 0;
     assert!(structural_walk(
         &root,
@@ -1411,7 +1421,7 @@ fn typed_lambda_walks_bare_and_as_single_link_tuple() {
 
 #[test]
 fn bare_node_lambda_takes_def_region_kind() {
-    let root = Array::new(vec![1i64, 2]);
+    let root = Array::from_vec(vec![1i64, 2]);
     let mut objects = 0;
     assert!(structural_walk(
         &root,
@@ -1461,7 +1471,7 @@ impl InheritedRegionProbe {
 
 #[test]
 fn def_region_is_inherited_through_containers() {
-    let root = Array::new(vec![Array::new(vec![1i64, 2])]);
+    let root = Array::from_vec(vec![Array::from_vec(vec![1i64, 2])]);
     let mut probe = InheritedRegionProbe {
         at_root: true,
         seen: Vec::new(),
@@ -1520,7 +1530,7 @@ fn reflected_fields_reach_typed_handlers() {
 
 #[test]
 fn nested_tuple_chain_exceeds_flat_arity() {
-    let root = Array::new(vec![1i64, 2, 3]);
+    let root = Array::from_vec(vec![1i64, 2, 3]);
     let mut integers = Vec::new();
     let mut objects = 0;
     let mut others = 0;
@@ -1570,7 +1580,7 @@ fn nested_tuple_chain_exceeds_flat_arity() {
 
 #[test]
 fn nested_tuple_first_match_order_is_flattened() {
-    let root = Array::new(vec![1i64, 2]);
+    let root = Array::from_vec(vec![1i64, 2]);
     let mut first = 0;
     let mut second = 0;
     assert!(structural_walk(
@@ -1630,7 +1640,7 @@ fn callback_visit_defaults_only_when_no_link_matches() {
             Ok(None)
         }
     }
-    let root = Array::new(vec![1i64, 2]);
+    let root = Array::from_vec(vec![1i64, 2]);
     let integers = Cell::new(0);
     assert!(structural_visit(&root, Integers(&integers),)
         .unwrap()
@@ -1674,7 +1684,7 @@ impl StatefulVisitStats {
 
 #[test]
 fn stateful_callback_visit_uses_ordinary_mutable_state() {
-    let root = Array::new(vec![1i64, 2, 3]);
+    let root = Array::from_vec(vec![1i64, 2, 3]);
     let mut visitor = StatefulVisitStats::default();
 
     assert!(structural_visit(&root, &mut visitor).unwrap().is_none());
@@ -1716,7 +1726,7 @@ impl StatefulVisitDepth {
 
 #[test]
 fn stateful_callback_visit_reborrows_visitor_during_recursion() {
-    let root = Array::new(vec![Array::new(vec![1i64, 2])]);
+    let root = Array::from_vec(vec![Array::from_vec(vec![1i64, 2])]);
     let mut visitor = StatefulVisitDepth::default();
 
     assert!(structural_visit(&root, &mut visitor).unwrap().is_none());
@@ -1743,7 +1753,7 @@ fn 
callback_visit_can_reenter_the_same_fn_through_visitor() {
             visitor.default_visit(self, &value)
         }
     }
-    let root = Array::new(vec![1i64, 2]);
+    let root = Array::from_vec(vec![1i64, 2]);
     let visits = Cell::new(0);
     assert!(structural_visit(&root, Reenter(&visits)).unwrap().is_none());
     assert_eq!(visits.get(), 3);
@@ -1775,7 +1785,7 @@ fn 
callback_visit_tuple_is_first_match_and_can_interrupt() {
             visitor.default_visit(self, &value)
         }
     }
-    let root = Array::new(vec![1i64, 2, 3]);
+    let root = Array::from_vec(vec![1i64, 2, 3]);
     let fallback = Cell::new(0);
     let interrupted = structural_visit(&root, 
Stop(&fallback)).unwrap().unwrap();
     assert_eq!(interrupted.value.try_as::<i64>().unwrap(), 2);
@@ -1818,7 +1828,10 @@ fn 
callback_visit_supports_node_links_and_nested_tuples() {
             visitor.default_visit(self, value)
         }
     }
-    let root = Array::new(vec![Any::from(Array::new(vec![1_i64])), 
Any::from(2_i64)]);
+    let root = Array::from_vec(vec![
+        Any::from(Array::from_vec(vec![1_i64])),
+        Any::from(2_i64),
+    ]);
     let seen = RefCell::new(Vec::new());
     assert!(structural_visit(&root, Nodes(&seen)).unwrap().is_none());
     assert_eq!(
@@ -1861,7 +1874,7 @@ fn callback_visit_with_overrides_child_def_region() {
             Ok(None)
         }
     }
-    let root = Array::new(vec![1i64, 2]);
+    let root = Array::from_vec(vec![1i64, 2]);
     let seen = RefCell::new(Vec::new());
     assert!(structural_visit(&root, Regions(&seen)).unwrap().is_none());
     assert_eq!(
@@ -1911,7 +1924,7 @@ fn 
nested_callback_visit_restores_the_outer_active_visitor() {
             visitor.default_visit(self, &value)
         }
     }
-    let aligned_root = Array::new(vec![3_i64, 4]);
+    let aligned_root = Array::from_vec(vec![3_i64, 4]);
     let mut borrowed = Aligned {
         checked: false,
         calls: 0,
@@ -1931,7 +1944,7 @@ fn 
nested_callback_visit_restores_the_outer_active_visitor() {
     for order in [WalkOrder::PreOrder, WalkOrder::PostOrder] {
         let observed = RefCell::new(Vec::new());
         structural_walk(
-            &Array::new(vec![Any::from(Array::new(vec![1_i64]))]),
+            &Array::from_vec(vec![Any::from(Array::from_vec(vec![1_i64]))]),
             |value: i64| {
                 observed.borrow_mut().push(value);
                 WalkResult::Advance
@@ -1984,8 +1997,8 @@ fn 
nested_callback_visit_restores_the_outer_active_visitor() {
             visitor.default_visit(self, &value)
         }
     }
-    let outer = Array::new(vec![10i64, 20]);
-    let inner = Array::new(vec![1i64, 2]);
+    let outer = Array::from_vec(vec![10i64, 20]);
+    let inner = Array::from_vec(vec![1i64, 2]);
     let entered_inner = Cell::new(false);
     let outer_values = RefCell::new(Vec::new());
     let inner_values = RefCell::new(Vec::new());
@@ -2006,7 +2019,7 @@ fn 
nested_callback_visit_restores_the_outer_active_visitor() {
 
 #[test]
 fn copied_views_forward_borrows_and_retain_only_explicit_owners() {
-    let root = Any::from(Array::new(vec![1_i64, 2]));
+    let root = Any::from(Array::from_vec(vec![1_i64, 2]));
     let view = AnyView::from(&root);
     struct Identity;
     #[dispatch(identity, (AnyView<'a>,), AnyView<'a>)]
@@ -2115,7 +2128,7 @@ fn 
managed_walk_preserves_observer_address_and_drop_on_all_exits() {
     fn run<const N: usize>(mode: usize) {
         let address = Cell::new(0);
         let drops = Cell::new(0);
-        let root = Array::new(vec![1_i64, 2]);
+        let root = Array::from_vec(vec![1_i64, 2]);
         let storage = Storage {
             _padding: [0_u8; N],
             address: &address,
@@ -2173,7 +2186,10 @@ fn 
managed_walk_preserves_observer_address_and_drop_on_all_exits() {
 
 #[test]
 fn visitor_preserves_post_recursion_state() {
-    let root = Array::new(vec![Array::new(vec![1_i64, 2]), Array::new(vec![3, 
4])]);
+    let root = Array::from_vec(vec![
+        Array::from_vec(vec![1_i64, 2]),
+        Array::from_vec(vec![3, 4]),
+    ]);
     #[derive(Default)]
     struct PostState {
         depth: usize,
@@ -2208,8 +2224,11 @@ fn visitor_preserves_post_recursion_state() {
 
 #[test]
 fn nested_walk_returns_one_owned_interrupt_payload_and_releases_it() {
-    let root = Array::new(vec![Array::new(vec![1_i64, 2]), 
Array::new(vec![3])]);
-    let payload = Any::from(Array::new(vec![42_i64]));
+    let root = Array::from_vec(vec![
+        Array::from_vec(vec![1_i64, 2]),
+        Array::from_vec(vec![3]),
+    ]);
+    let payload = Any::from(Array::from_vec(vec![42_i64]));
     for order in [WalkOrder::PreOrder, WalkOrder::PostOrder] {
         let mut visited = Vec::new();
         let interrupt = structural_walk(
@@ -2234,8 +2253,8 @@ fn 
nested_walk_returns_one_owned_interrupt_payload_and_releases_it() {
 
 #[test]
 fn nested_walk_error_keeps_context_and_releases_callback_owner() {
-    let root = Array::new(vec![Array::new(vec![1_i64, 2])]);
-    let owner = Any::from(Array::new(vec![42_i64]));
+    let root = Array::from_vec(vec![Array::from_vec(vec![1_i64, 2])]);
+    let owner = Any::from(Array::from_vec(vec![42_i64]));
     let callback_owner = owner.clone();
     let error = structural_walk(
         &root,
diff --git a/rust/tvm-ffi/tests/test_structural_visit_base.rs 
b/rust/tvm-ffi/tests/test_structural_visit_base.rs
index 2babc299..67680e8d 100644
--- a/rust/tvm-ffi/tests/test_structural_visit_base.rs
+++ b/rust/tvm-ffi/tests/test_structural_visit_base.rs
@@ -24,9 +24,9 @@ use tvm_ffi::tvm_ffi_sys::{
     TVMFFITypeMetadata, TVMFFITypeRegisterMetadata,
 };
 use tvm_ffi::{
-    Any, AnyView, Array, DefRegionKind, Dispatcher, Error, Function, 
IntoDispatcher, RUNTIME_ERROR,
-    Result, StructuralVisitEngine, StructuralVisitorBase, StructuralVisitorObj,
-    StructuralVisitorView, VisitInterrupt, dispatch, get_type_attr, 
structural_visit,
+    dispatch, get_type_attr, structural_visit, Any, AnyView, Array, 
DefRegionKind, Dispatcher,
+    Error, Function, IntoDispatcher, Result, StructuralVisitEngine, 
StructuralVisitorBase,
+    StructuralVisitorObj, StructuralVisitorView, VisitInterrupt, RUNTIME_ERROR,
 };
 
 thread_local! {
@@ -104,7 +104,7 @@ unsafe impl StructuralVisitorBase for CountingBase {
         (*runtime).defaults.set((*runtime).defaults.get() + 1);
         // A default with observable behavior: redirect 10 to children 11 and 
12.
         if value.try_as::<i64>() == Some(10) {
-            let children = Array::new(vec![11_i64, 12]);
+            let children = Array::from_vec(vec![11_i64, 12]);
             return StructuralVisitorObj::default_visit_raw(runtime.cast(), 
(&children).into());
         }
         if value.try_as::<i64>() == Some(-1) {
@@ -134,22 +134,22 @@ fn visit<'a, H, M, D, O>(root: impl Into<AnyView<'a>>, 
visitor: H) -> Result<Opt
 where
     O: std::borrow::BorrowMut<D>,
     for<'v, 'c, 'r> H: IntoDispatcher<
-            (
-                AnyView<'v>,
-                &'c mut StructuralVisitorView<'r, D, CountingBase>,
-            ),
-            Option<Result<Option<VisitInterrupt>>>,
-            M,
-            Target = D,
-            Output = O,
-        >,
+        (
+            AnyView<'v>,
+            &'c mut StructuralVisitorView<'r, D, CountingBase>,
+        ),
+        Option<Result<Option<VisitInterrupt>>>,
+        M,
+        Target = D,
+        Output = O,
+    >,
     for<'s, 'v, 'c, 'r> &'s mut D: Dispatcher<
-            (
-                AnyView<'v>,
-                &'c mut StructuralVisitorView<'r, D, CountingBase>,
-            ),
-            Option<Result<Option<VisitInterrupt>>>,
-        >,
+        (
+            AnyView<'v>,
+            &'c mut StructuralVisitorView<'r, D, CountingBase>,
+        ),
+        Option<Result<Option<VisitInterrupt>>>,
+    >,
 {
     StructuralVisitEngine::<CountingBase>::visit_root(root, visitor)
 }
@@ -180,7 +180,7 @@ impl Trace {
                 result
             }),
             1 => {
-                visitor.visit(self, &Array::new(vec![2_i64, 3]))?;
+                visitor.visit(self, &Array::from_vec(vec![2_i64, 3]))?;
                 // Resume the parent dispatcher after native recursion, then 
recurse again.
                 self.leaves.push((4, visitor.def_region_kind()));
                 visitor.visit(self, &5_i64)
@@ -201,7 +201,7 @@ fn 
larger_base_defaults_recurse_and_restore_dispatcher_and_region() {
         std::mem::size_of::<View<'_, Trace>>(),
         std::mem::size_of::<usize>()
     );
-    let root = Array::new(vec![0_i64, 1, 6]);
+    let root = Array::from_vec(vec![0_i64, 1, 6]);
     let mut trace = Trace::default();
     assert!(visit(&root, &mut trace).unwrap().is_none());
     use DefRegionKind::{None as Use, Pattern};
@@ -234,16 +234,12 @@ fn 
unmatched_scalar_uses_selected_default_and_owned_dispatcher() {
     DROPPED.with_borrow_mut(Vec::clear);
     assert!(visit(&10_i64, Empty).unwrap().is_none());
     DROPPED.with_borrow(|drops| assert_eq!(*drops, [3]));
-    assert!(
-        structural_visit(&Array::new(vec![1_i64]), Empty)
-            .unwrap()
-            .is_none()
-    );
-    assert!(
-        structural_visit(&Array::new(vec![1_i64]), &mut Empty)
-            .unwrap()
-            .is_none()
-    );
+    assert!(structural_visit(&Array::from_vec(vec![1_i64]), Empty)
+        .unwrap()
+        .is_none());
+    assert!(structural_visit(&Array::from_vec(vec![1_i64]), &mut Empty)
+        .unwrap()
+        .is_none());
 }
 
 #[test]
@@ -297,20 +293,18 @@ fn base_failure_and_owned_results_release_exactly_once() {
     }
     DROPPED.with_borrow_mut(Vec::clear);
     FAIL_INIT.set(true);
-    assert!(
-        visit(&1_i64, Unmatched)
-            .err()
-            .unwrap()
-            .to_string()
-            .contains("initialization failed")
-    );
+    assert!(visit(&1_i64, Unmatched)
+        .err()
+        .unwrap()
+        .to_string()
+        .contains("initialization failed"));
     FAIL_INIT.set(false);
     DROPPED.with_borrow(|drops| assert!(drops.is_empty()));
 
-    let payload = Any::from(Array::new(vec![42_i64]));
+    let payload = Any::from(Array::from_vec(vec![42_i64]));
     BASE_RESULT
         .with_borrow_mut(|slot| *slot = 
Some(Ok(Some(VisitInterrupt::with(payload.clone())))));
-    let result = visit(&Array::new(vec![-1_i64, 99]), Unmatched)
+    let result = visit(&Array::from_vec(vec![-1_i64, 99]), Unmatched)
         .unwrap()
         .unwrap();
     assert_eq!(payload.debug_strong_count(), Some(2));
@@ -321,7 +315,7 @@ fn base_failure_and_owned_results_release_exactly_once() {
     let error = Error::new(RUNTIME_ERROR, "base descent failed", "");
     let owner = Any::from(error.clone());
     BASE_RESULT.with_borrow_mut(|slot| *slot = Some(Err(error)));
-    let result = visit(&Array::new(vec![-1_i64, 99]), Unmatched)
+    let result = visit(&Array::from_vec(vec![-1_i64, 99]), Unmatched)
         .err()
         .unwrap();
     assert!(result.to_string().contains("base descent failed"));
@@ -365,7 +359,7 @@ fn 
callback_outcomes_preserve_reborrows_and_owners_through_specialized_defaults(
     }
     for fail in [false, true] {
         DROPPED.with_borrow_mut(Vec::clear);
-        let payload = Any::from(Array::new(vec![42_i64]));
+        let payload = Any::from(Array::from_vec(vec![42_i64]));
         let error = Error::new(RUNTIME_ERROR, "callback failed", "");
         let error_owner = Any::from(error.clone());
         let mut visitor = Halt {
@@ -377,18 +371,16 @@ fn 
callback_outcomes_preserve_reborrows_and_owners_through_specialized_defaults(
             }),
             seen: vec![],
         };
-        let result = visit(&Array::new(vec![10_i64, 100]), &mut visitor);
+        let result = visit(&Array::from_vec(vec![10_i64, 100]), &mut visitor);
         assert_eq!(visitor.seen, [10, 11, 99]);
         DROPPED.with_borrow(|drops| assert_eq!(*drops, [2]));
         if fail {
-            assert!(
-                result
-                    .as_ref()
-                    .err()
-                    .unwrap()
-                    .to_string()
-                    .contains("callback failed")
-            );
+            assert!(result
+                .as_ref()
+                .err()
+                .unwrap()
+                .to_string()
+                .contains("callback failed"));
         } else {
             assert_eq!(payload.debug_strong_count(), Some(2));
         }
diff --git a/rust/tvm-ffi/tests/test_structural_visitor_alignment.rs 
b/rust/tvm-ffi/tests/test_structural_visitor_alignment.rs
index da06c27a..93b541fc 100644
--- a/rust/tvm-ffi/tests/test_structural_visitor_alignment.rs
+++ b/rust/tvm-ffi/tests/test_structural_visitor_alignment.rs
@@ -106,7 +106,7 @@ impl RecordingVisitor {
 /// state flips to Recursive under "params" and back to None for the "body".
 #[test]
 fn records_values_and_def_region_modes() {
-    let root = Array::new(vec![10i64, 20]);
+    let root = Array::from_vec(vec![10i64, 20]);
     let mut visitor = RecordingVisitor::default();
 
     let outcome = structural_visit(&root, &mut visitor).unwrap();
@@ -127,7 +127,7 @@ fn records_values_and_def_region_modes() {
 /// halts at the marked value and the payload reaches the caller.
 #[test]
 fn stops_on_interrupt_with_payload() {
-    let root = Array::new(vec![10i64, 20]);
+    let root = Array::from_vec(vec![10i64, 20]);
     let mut visitor = RecordingVisitor {
         interrupt_on: Some(20),
         ..RecordingVisitor::default()
diff --git a/rust/tvm-ffi/tests/test_tensor_view.rs 
b/rust/tvm-ffi/tests/test_tensor_view.rs
index c0fe1409..51be6c43 100644
--- a/rust/tvm-ffi/tests/test_tensor_view.rs
+++ b/rust/tvm-ffi/tests/test_tensor_view.rs
@@ -37,7 +37,7 @@ fn dltensor(data: &mut [f32; 6], shape: &mut [i64; 2], 
strides: *mut i64) -> DLT
 fn describe() -> Function {
     Function::from_typed(|t: TensorView| -> Result<Array<i64>> {
         let first = unsafe { *(t.data_ptr() as *const f32) } as i64;
-        Ok(Array::new(vec![
+        Ok(Array::from_vec(vec![
             t.ndim() as i64,
             t.shape()[1],
             t.strides()[0],
@@ -48,7 +48,7 @@ fn describe() -> Function {
 
 fn call(f: &Function, arg: AnyView) -> Result<Vec<i64>> {
     let out = Array::<i64>::try_from(f.call_packed(&[arg])?)?;
-    (0..out.len()).map(|i| Ok(i64::try_from(out[i])?)).collect()
+    Ok((0..out.len()).map(|i| out[i]).collect())
 }
 
 #[test]

Reply via email to