@@ -7,7 +7,6 @@ use std::ops::Deref;
77use bevy_app:: App ;
88use bevy_asset:: { AssetServer , Handle } ;
99use bevy_ecs:: { entity:: Entity , prelude:: AppTypeRegistry , schedule:: Schedules , world:: World } ;
10- use bevy_reflect:: ReflectRef ;
1110use bevy_mod_scripting_bindings:: {
1211 DynamicScriptFunctionMut , FunctionInfo , GlobalNamespace , InteropError , PartialReflectExt ,
1312 ReflectReference , ScriptComponentRegistration , ScriptQueryBuilder , ScriptQueryResult ,
@@ -729,6 +728,10 @@ impl ReflectReference {
729728 /// Iterates over the reference, if the reference is an appropriate container type.
730729 /// Uses `from_reflect` to create fully reflected clones that can be used with all operations.
731730 ///
731+ /// For Maps, returns an iterator function that returns [key, value] pairs.
732+ /// For Sets, returns an iterator function that returns individual values.
733+ /// For other containers (Lists, Arrays), returns an iterator function that returns individual elements.
734+ ///
732735 /// Returns an "next" iterator function that returns fully reflected values (Box<dyn Reflect>).
733736 ///
734737 /// The iterator function should be called until it returns `nil` to signal the end of the iteration.
@@ -745,10 +748,8 @@ impl ReflectReference {
745748 profiling:: function_scope!( "iter" ) ;
746749 let world = ctxt. world ( ) ?;
747750 let mut len = reference. len ( world. clone ( ) ) ?. unwrap_or_default ( ) ;
748- // Check if this is a Map type
749- let is_map = reference. with_reflect ( world. clone ( ) , |r| {
750- matches ! ( r. reflect_ref( ) , ReflectRef :: Map ( _) )
751- } ) ?;
751+ let is_map = reference. is_map ( world. clone ( ) ) ?;
752+ let is_set = reference. is_set ( world. clone ( ) ) ?;
752753
753754 if is_map {
754755 // Use special map iterator that clones values
@@ -770,6 +771,21 @@ impl ReflectReference {
770771 }
771772 } ;
772773 Ok ( iter_function. into_dynamic_script_function_mut ( ) )
774+ } else if is_set {
775+ // Use special set iterator that clones values upfront for efficient iteration
776+ let mut set_iter = reference. into_set_iter ( world. clone ( ) ) ?;
777+ let iter_function = move || {
778+ if len == 0 {
779+ return Ok ( ScriptValue :: Unit ) ;
780+ }
781+ len -= 1 ;
782+ let world = ThreadWorldContainer . try_get_world ( ) ?;
783+ match set_iter. next_cloned ( world. clone ( ) ) ? {
784+ Some ( value_ref) => ReflectReference :: into_script_ref ( value_ref, world) ,
785+ None => Ok ( ScriptValue :: Unit ) ,
786+ }
787+ } ;
788+ Ok ( iter_function. into_dynamic_script_function_mut ( ) )
773789 } else {
774790 // Use cloning iterator for lists/arrays
775791 let mut infinite_iter = reference. into_iter_infinite ( ) ;
@@ -780,10 +796,7 @@ impl ReflectReference {
780796 len -= 1 ;
781797 let world = ThreadWorldContainer . try_get_world ( ) ?;
782798 match infinite_iter. next_cloned ( world. clone ( ) ) ? {
783- Some ( value_ref) => {
784- // Convert the cloned value to a script value
785- ReflectReference :: into_script_ref ( value_ref, world)
786- }
799+ Some ( value_ref) => ReflectReference :: into_script_ref ( value_ref, world) ,
787800 None => Ok ( ScriptValue :: Unit ) ,
788801 }
789802 } ;
0 commit comments