Skip to content

Commit da7a771

Browse files
committed
get rid of leaked abstraction 2
1 parent 96c9156 commit da7a771

File tree

5 files changed

+6
-124
lines changed

5 files changed

+6
-124
lines changed

assets/tests/iter/vec.lua

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
11
local res_type = world.get_type_by_name("TestResourceWithVariousFields")
22
local res = world.get_resource(res_type)
33

4-
local iterated_vals = {}
5-
local iterator = res.vec_usize:iter()
6-
local result = iterator()
7-
while result ~= nil do
8-
iterated_vals[#iterated_vals + 1] = result
9-
result = iterator()
4+
iterated_vals = {}
5+
for v in pairs(res.vec_usize) do
6+
iterated_vals[#iterated_vals + 1] = v
107
end
11-
128
assert(#iterated_vals == 5, "Length is not 5")
139
assert(iterated_vals[1] == 1, "First value is not 1")
1410
assert(iterated_vals[2] == 2, "Second value is not 2")

assets/tests/iter/vec.rhai

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,9 @@ let res_type = world.get_type_by_name.call("TestResourceWithVariousFields");
22
let res = world.get_resource.call(res_type);
33

44
let iterated_vals = [];
5-
let iterator = res.vec_usize.iter();
65

7-
loop {
8-
let result = iterator.next();
9-
10-
if result == () {
11-
break;
12-
}
13-
14-
iterated_vals.push(result);
6+
for v in res.vec_usize {
7+
iterated_vals.push(v);
158
}
169

1710
assert(iterated_vals.len == 5, "Length is not 5");

crates/bevy_mod_scripting_bindings/src/reference.rs

Lines changed: 1 addition & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -989,49 +989,9 @@ pub struct ReflectMapRefIter {
989989

990990
#[profiling::all_functions]
991991
impl ReflectMapRefIter {
992-
/// Returns the next map entry as a (key, value) tuple.
993-
/// Returns Ok(None) when there are no more entries.
994-
pub fn next_ref(&mut self, world: WorldGuard) -> Result<Option<(ReflectReference, ReflectReference)>, InteropError> {
995-
let idx = self.index;
996-
self.index += 1;
997-
998-
// Access the map and get the entry at index
999-
self.base.with_reflect(world.clone(), |reflect| {
1000-
match reflect.reflect_ref() {
1001-
ReflectRef::Map(map) => {
1002-
if let Some((key, value)) = map.get_at(idx) {
1003-
let allocator = world.allocator();
1004-
let mut allocator_guard = allocator.write();
1005-
1006-
let key_ref = ReflectReference::new_allocated_boxed_parial_reflect(
1007-
key.to_dynamic(),
1008-
&mut *allocator_guard
1009-
)?;
1010-
1011-
let value_ref = ReflectReference::new_allocated_boxed_parial_reflect(
1012-
value.to_dynamic(),
1013-
&mut *allocator_guard
1014-
)?;
1015-
1016-
drop(allocator_guard);
1017-
Ok(Some((key_ref, value_ref)))
1018-
} else {
1019-
Ok(None)
1020-
}
1021-
}
1022-
_ => Err(InteropError::unsupported_operation(
1023-
reflect.get_represented_type_info().map(|ti| ti.type_id()),
1024-
None,
1025-
"map iteration on non-map type".to_owned(),
1026-
))
1027-
}
1028-
})?
1029-
}
1030-
1031992
/// Returns the next map entry as a (key, value) tuple, cloning the values.
993+
/// Uses `from_reflect` to create fully reflected clones that can be used with all operations.
1032994
/// Returns Ok(None) when there are no more entries.
1033-
/// This uses `from_reflect` to clone the actual values instead of creating dynamic references.
1034-
/// Returns fully reflected values (Box<dyn Reflect>) like `map_get_clone` does.
1035995
pub fn next_cloned(&mut self, world: WorldGuard) -> Result<Option<(ReflectReference, ReflectReference)>, InteropError> {
1036996
let idx = self.index;
1037997
self.index += 1;

crates/languages/bevy_mod_scripting_lua/src/bindings/reference.rs

Lines changed: 0 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -348,50 +348,6 @@ impl UserData for LuaReflectReference {
348348
}
349349
});
350350

351-
m.add_method("pairs", |lua, s: &LuaReflectReference, _args: ()| {
352-
profiling::function_scope!("pairs");
353-
let world = ThreadWorldContainer
354-
.try_get_world()
355-
.map_err(IntoMluaError::to_lua_error)?;
356-
357-
let iter_func = world
358-
.lookup_function([TypeId::of::<ReflectReference>()], "iter")
359-
.map_err(|f| {
360-
InteropError::missing_function(f, TypeId::of::<ReflectReference>().into())
361-
})
362-
.map_err(IntoMluaError::to_lua_error)?;
363-
364-
let result = iter_func
365-
.call(vec![ScriptValue::Reference(s.clone().into())], LUA_CALLER_CONTEXT)
366-
.map_err(IntoMluaError::to_lua_error)?;
367-
368-
match result {
369-
ScriptValue::FunctionMut(func) => {
370-
lua.create_function_mut(move |lua, _args: ()| {
371-
let result = func
372-
.call(vec![], LUA_CALLER_CONTEXT)
373-
.map_err(IntoMluaError::to_lua_error)?;
374-
375-
// If the result is a List with 2 elements, unpack it into multiple return values
376-
match result {
377-
ScriptValue::List(ref items) if items.len() == 2 => {
378-
// Return as tuple (key, value) which Lua unpacks automatically
379-
let key = LuaScriptValue(items[0].clone()).into_lua(lua)?;
380-
let value = LuaScriptValue(items[1].clone()).into_lua(lua)?;
381-
Ok((key, value))
382-
}
383-
_ => {
384-
// Single value or Unit - return as-is
385-
let val = LuaScriptValue(result).into_lua(lua)?;
386-
Ok((val, mlua::Value::Nil))
387-
}
388-
}
389-
})
390-
}
391-
_ => Err(mlua::Error::RuntimeError("iter function did not return a FunctionMut".to_string()))
392-
}
393-
});
394-
395351
m.add_method("ipairs", |lua, s: &LuaReflectReference, _args: ()| {
396352
profiling::function_scope!("ipairs");
397353
let world = ThreadWorldContainer

crates/languages/bevy_mod_scripting_rhai/src/bindings/reference.rs

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -621,29 +621,6 @@ impl CustomType for RhaiReflectReference {
621621
}
622622
_ => Err(InteropError::invariant("iter function did not return a FunctionMut").into_rhai_error())
623623
}
624-
})
625-
.with_fn("iter_clone", |self_: Self| {
626-
let world = ThreadWorldContainer
627-
.try_get_world()
628-
.map_err(IntoRhaiError::into_rhai_error)?;
629-
630-
let iter_func = world
631-
.lookup_function([TypeId::of::<ReflectReference>()], "iter_clone")
632-
.map_err(|f| {
633-
InteropError::missing_function(f, TypeId::of::<ReflectReference>().into())
634-
})
635-
.map_err(IntoRhaiError::into_rhai_error)?;
636-
637-
let result = iter_func
638-
.call(vec![ScriptValue::Reference(self_.0)], RHAI_CALLER_CONTEXT)
639-
.map_err(IntoRhaiError::into_rhai_error)?;
640-
641-
match result {
642-
ScriptValue::FunctionMut(iter_fn) => {
643-
Ok(Dynamic::from(RhaiIterator { iter_fn }))
644-
}
645-
_ => Err(InteropError::invariant("iter_clone function did not return a FunctionMut").into_rhai_error())
646-
}
647624
});
648625
}
649626
}

0 commit comments

Comments
 (0)