@@ -158,6 +158,11 @@ fn empty_array() array {
158158 return JS.makeEmptyArray ()
159159}
160160
161+ #function v_clone_for_array_value(value) {
162+ #if (value instanceof $ref || value instanceof voidptr || typeof value === 'function') return value;
163+ #return v_clone_value(value);
164+ #}
165+
161166fn (a &array) set_len (i int ) {
162167 #a.arr.arr.length=i
163168}
@@ -208,19 +213,22 @@ pub fn (a array) slice(start int, end int) array {
208213
209214pub fn (mut a array) insert (i int , val voidptr ) {
210215 #a.val.arr.make_copy()
211- #a.val.arr.arr.splice(i,0,val)
216+ #a.val.arr.arr.splice(i,0,v_clone_for_array_value(val))
217+ #a.val.arr.len.val = a.val.arr.arr.length
212218}
213219
214220pub fn (mut a array) insert_many (i int , val voidptr , size int ) {
215- #a.val.arr.arr.splice(i,0,...val.arr.slice(0,+size))
221+ #a.val.arr.make_copy()
222+ #a.val.arr.arr.splice(i,0,...val.arr.slice(0,+size).map(v_clone_for_array_value))
223+ #a.val.arr.len.val = a.val.arr.arr.length
216224}
217225
218226fn (mut a array) push (val voidptr ) {
219227 #a.val.arr.make_copy()
220- #if (arguments[2] && arguments[2].valueOf()) {a.val.arr.arr.push(...val)} else {
221- #a.val.arr.arr.push(val)
228+ #if (arguments[2] && arguments[2].valueOf()) {a.val.arr.arr.push(...val.map(v_clone_for_array_value) )} else {
229+ #a.val.arr.arr.push(v_clone_for_array_value( val) )
222230 #}
223- #a.val.arr.len.val += 1
231+ #a.val.arr.len.val = a.val.arr.arr.length
224232}
225233
226234fn v_filter (arr array, callback fn (voidptr ) bool ) array {
@@ -302,6 +310,7 @@ fn arr_copy(mut dst array, src array, count int) {
302310pub fn (mut a array) delete_many (i int , size int ) {
303311 #a.val.arr.make_copy()
304312 #a.val.arr.arr.splice(i.valueOf(),size.valueOf())
313+ #a.val.arr.len.val = a.val.arr.arr.length
305314}
306315
307316// prepend prepends one value to the array.
@@ -331,6 +340,7 @@ pub fn (mut a array) reverse_in_place() {
331340pub fn (mut a array) clear () {
332341 #a.val.arr.make_copy()
333342 #a.val.arr.arr.length = 0
343+ #a.val.arr.len.val = 0
334344}
335345
336346// reduce executes a given reducer function on each element of the array, resulting in a single output value.
@@ -350,7 +360,7 @@ pub fn (mut a array) pop() voidptr {
350360 mut res := unsafe { nil }
351361 #a.val.arr.make_copy()
352362 #res = a.val.arr.arr.pop()
353- #a.val.arr.len.val -= 1
363+ #a.val.arr.len.val = a.val.arr.arr.length
354364
355365 return res
356366}
0 commit comments