@@ -740,15 +740,15 @@ list_insert(list_T *l, listitem_T *ni, listitem_T *item)
740740 * It does nothing if "maxdepth" is 0.
741741 * Returns FAIL when out of memory.
742742 */
743- static int
743+ static void
744744list_flatten (list_T * list , long maxdepth )
745745{
746746 listitem_T * item ;
747747 listitem_T * tofree ;
748748 int n ;
749749
750750 if (maxdepth == 0 )
751- return OK ;
751+ return ;
752752 CHECK_LIST_MATERIALIZE (list );
753753
754754 n = 0 ;
@@ -757,15 +757,15 @@ list_flatten(list_T *list, long maxdepth)
757757 {
758758 fast_breakcheck ();
759759 if (got_int )
760- return FAIL ;
760+ return ;
761761
762762 if (item -> li_tv .v_type == VAR_LIST )
763763 {
764764 listitem_T * next = item -> li_next ;
765765
766766 vimlist_remove (list , item , item );
767767 if (list_extend (list , item -> li_tv .vval .v_list , next ) == FAIL )
768- return FAIL ;
768+ return ;
769769 clear_tv (& item -> li_tv );
770770 tofree = item ;
771771
@@ -787,15 +787,13 @@ list_flatten(list_T *list, long maxdepth)
787787 item = item -> li_next ;
788788 }
789789 }
790-
791- return OK ;
792790}
793791
794792/*
795- * "flatten(list[, {maxdepth}] )" function
793+ * "flatten()" and "flattennew( )" functions
796794 */
797- void
798- f_flatten (typval_T * argvars , typval_T * rettv )
795+ static void
796+ flatten_common (typval_T * argvars , typval_T * rettv , int make_copy )
799797{
800798 list_T * l ;
801799 long maxdepth ;
@@ -822,10 +820,48 @@ f_flatten(typval_T *argvars, typval_T *rettv)
822820 }
823821
824822 l = argvars [0 ].vval .v_list ;
825- if (l != NULL && !value_check_lock (l -> lv_lock ,
826- (char_u * )N_ ("flatten() argument" ), TRUE)
827- && list_flatten (l , maxdepth ) == OK )
828- copy_tv (& argvars [0 ], rettv );
823+ rettv -> v_type = VAR_LIST ;
824+ rettv -> vval .v_list = l ;
825+ if (l == NULL )
826+ return ;
827+
828+ if (make_copy )
829+ {
830+ l = list_copy (l , TRUE, get_copyID ());
831+ rettv -> vval .v_list = l ;
832+ if (l == NULL )
833+ return ;
834+ }
835+ else
836+ {
837+ if (value_check_lock (l -> lv_lock ,
838+ (char_u * )N_ ("flatten() argument" ), TRUE))
839+ return ;
840+ ++ l -> lv_refcount ;
841+ }
842+
843+ list_flatten (l , maxdepth );
844+ }
845+
846+ /*
847+ * "flatten(list[, {maxdepth}])" function
848+ */
849+ void
850+ f_flatten (typval_T * argvars , typval_T * rettv )
851+ {
852+ if (in_vim9script ())
853+ emsg (_ (e_cannot_use_flatten_in_vim9_script ));
854+ else
855+ flatten_common (argvars , rettv , FALSE);
856+ }
857+
858+ /*
859+ * "flattennew(list[, {maxdepth}])" function
860+ */
861+ void
862+ f_flattennew (typval_T * argvars , typval_T * rettv )
863+ {
864+ flatten_common (argvars , rettv , TRUE);
829865}
830866
831867/*
0 commit comments