diff --git a/std/assembly/array.ts b/std/assembly/array.ts index ccbd9e6b..1771618b 100644 --- a/std/assembly/array.ts +++ b/std/assembly/array.ts @@ -35,6 +35,8 @@ export class Array extends ArrayBufferView { // length is modified in a way that a null value would exist. Otherwise, the compiler wouldn't be // able to guarantee type-safety anymore. For lack of a better word, such an array is "holey". + // Also note that capacity, not length, indicates the actual retained contents. + private length_: i32; static isArray(value: U): bool { @@ -244,19 +246,24 @@ export class Array extends ArrayBufferView { var last = end < 0 ? max(len + end, 0) : min(end, len); var count = min(last - from, len - to); - if (from < to && to < (from + count)) { - from += count - 1; - to += count - 1; - while (count) { - store(dataStart + (to << alignof()), load(dataStart + (from << alignof()))); - --from, --to, --count; - } + if (isManaged()) { + // TODO: retain/release + consider intersection, only releasing what's removed + ERROR("not implemented"); } else { - memory.copy( - dataStart + (to << alignof()), - dataStart + (from << alignof()), - count << alignof() - ); + if (from < to && to < (from + count)) { + from += count - 1; + to += count - 1; + while (count) { + store(dataStart + (to << alignof()), load(dataStart + (from << alignof()))); + --from, --to, --count; + } + } else { + memory.copy( + dataStart + (to << alignof()), + dataStart + (from << alignof()), + count << alignof() + ); + } } return this; } diff --git a/tests/compiler/assert-nonnull.optimized.wat b/tests/compiler/assert-nonnull.optimized.wat index aad21ac7..416aa0f0 100644 --- a/tests/compiler/assert-nonnull.optimized.wat +++ b/tests/compiler/assert-nonnull.optimized.wat @@ -64,7 +64,7 @@ if i32.const 24 i32.const 136 - i32.const 97 + i32.const 99 i32.const 45 call $~lib/builtins/abort unreachable @@ -78,7 +78,7 @@ if i32.const 184 i32.const 136 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -105,7 +105,7 @@ if i32.const 184 i32.const 136 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/assert-nonnull.untouched.wat b/tests/compiler/assert-nonnull.untouched.wat index 8383cf20..57d33b37 100644 --- a/tests/compiler/assert-nonnull.untouched.wat +++ b/tests/compiler/assert-nonnull.untouched.wat @@ -106,7 +106,7 @@ if i32.const 24 i32.const 136 - i32.const 97 + i32.const 99 i32.const 45 call $~lib/builtins/abort unreachable @@ -120,7 +120,7 @@ if i32.const 184 i32.const 136 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -168,7 +168,7 @@ if i32.const 184 i32.const 136 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/retain-release-sanity.optimized.wat b/tests/compiler/retain-release-sanity.optimized.wat index 1880dc5f..c87cc3af 100644 --- a/tests/compiler/retain-release-sanity.optimized.wat +++ b/tests/compiler/retain-release-sanity.optimized.wat @@ -2015,7 +2015,7 @@ if i32.const 424 i32.const 376 - i32.const 266 + i32.const 273 i32.const 20 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/retain-release-sanity.untouched.wat b/tests/compiler/retain-release-sanity.untouched.wat index c0006def..4567ba53 100644 --- a/tests/compiler/retain-release-sanity.untouched.wat +++ b/tests/compiler/retain-release-sanity.untouched.wat @@ -3782,7 +3782,7 @@ if i32.const 424 i32.const 376 - i32.const 266 + i32.const 273 i32.const 20 call $~lib/builtins/abort unreachable @@ -3824,7 +3824,7 @@ if i32.const 472 i32.const 376 - i32.const 56 + i32.const 58 i32.const 20 call $~lib/builtins/abort unreachable @@ -3855,7 +3855,7 @@ if i32.const 472 i32.const 376 - i32.const 56 + i32.const 58 i32.const 20 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/array-access.optimized.wat b/tests/compiler/std/array-access.optimized.wat index d2c34e06..e480a43b 100644 --- a/tests/compiler/std/array-access.optimized.wat +++ b/tests/compiler/std/array-access.optimized.wat @@ -26,7 +26,7 @@ if i32.const 24 i32.const 136 - i32.const 97 + i32.const 99 i32.const 45 call $~lib/builtins/abort unreachable @@ -40,7 +40,7 @@ if i32.const 184 i32.const 136 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -63,7 +63,7 @@ if i32.const 184 i32.const 136 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/array-access.untouched.wat b/tests/compiler/std/array-access.untouched.wat index 07739465..cc1f1ae2 100644 --- a/tests/compiler/std/array-access.untouched.wat +++ b/tests/compiler/std/array-access.untouched.wat @@ -43,7 +43,7 @@ if i32.const 24 i32.const 136 - i32.const 97 + i32.const 99 i32.const 45 call $~lib/builtins/abort unreachable @@ -57,7 +57,7 @@ if i32.const 184 i32.const 136 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -85,7 +85,7 @@ if i32.const 184 i32.const 136 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -134,7 +134,7 @@ if i32.const 24 i32.const 136 - i32.const 97 + i32.const 99 i32.const 45 call $~lib/builtins/abort unreachable @@ -148,7 +148,7 @@ if i32.const 184 i32.const 136 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -374,7 +374,7 @@ if i32.const 24 i32.const 136 - i32.const 97 + i32.const 99 i32.const 45 call $~lib/builtins/abort unreachable @@ -388,7 +388,7 @@ if i32.const 184 i32.const 136 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/array-literal.optimized.wat b/tests/compiler/std/array-literal.optimized.wat index 461dad0a..3bdd0d17 100644 --- a/tests/compiler/std/array-literal.optimized.wat +++ b/tests/compiler/std/array-literal.optimized.wat @@ -47,7 +47,7 @@ if i32.const 136 i32.const 192 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -68,7 +68,7 @@ if i32.const 136 i32.const 192 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/array-literal.untouched.wat b/tests/compiler/std/array-literal.untouched.wat index c84d58e3..a42ca1e6 100644 --- a/tests/compiler/std/array-literal.untouched.wat +++ b/tests/compiler/std/array-literal.untouched.wat @@ -70,7 +70,7 @@ if i32.const 136 i32.const 192 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -102,7 +102,7 @@ if i32.const 136 i32.const 192 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/array.optimized.wat b/tests/compiler/std/array.optimized.wat index 36b34767..921ccc02 100644 --- a/tests/compiler/std/array.optimized.wat +++ b/tests/compiler/std/array.optimized.wat @@ -2367,7 +2367,7 @@ if i32.const 176 i32.const 488 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -2521,7 +2521,7 @@ if i32.const 176 i32.const 488 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -2858,7 +2858,7 @@ if i32.const 872 i32.const 488 - i32.const 266 + i32.const 273 i32.const 20 call $~lib/builtins/abort unreachable @@ -2905,7 +2905,7 @@ call $~lib/rt/pure/__release i32.const 272 i32.const 488 - i32.const 213 + i32.const 215 i32.const 59 call $~lib/builtins/abort unreachable @@ -3144,7 +3144,7 @@ if i32.const 872 i32.const 488 - i32.const 327 + i32.const 334 i32.const 20 call $~lib/builtins/abort unreachable @@ -3985,7 +3985,7 @@ if i32.const 176 i32.const 488 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -5397,7 +5397,7 @@ if i32.const 176 i32.const 488 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -5911,7 +5911,7 @@ if i32.const 272 i32.const 488 - i32.const 45 + i32.const 47 i32.const 61 call $~lib/builtins/abort unreachable @@ -6187,7 +6187,7 @@ call $~lib/rt/pure/__release i32.const 4040 i32.const 488 - i32.const 112 + i32.const 114 i32.const 38 call $~lib/builtins/abort unreachable @@ -6443,7 +6443,7 @@ if i32.const 4040 i32.const 488 - i32.const 97 + i32.const 99 i32.const 45 call $~lib/builtins/abort unreachable @@ -6457,7 +6457,7 @@ if i32.const 176 i32.const 488 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -6636,7 +6636,7 @@ if i32.const 176 i32.const 488 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/array.untouched.wat b/tests/compiler/std/array.untouched.wat index d3c50dca..b1e44bc6 100644 --- a/tests/compiler/std/array.untouched.wat +++ b/tests/compiler/std/array.untouched.wat @@ -4243,7 +4243,7 @@ if i32.const 176 i32.const 488 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -4448,7 +4448,7 @@ if i32.const 176 i32.const 488 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -4856,7 +4856,7 @@ if i32.const 176 i32.const 488 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -4877,7 +4877,7 @@ if i32.const 872 i32.const 488 - i32.const 266 + i32.const 273 i32.const 20 call $~lib/builtins/abort unreachable @@ -4933,7 +4933,7 @@ block i32.const 272 i32.const 488 - i32.const 213 + i32.const 215 i32.const 59 call $~lib/builtins/abort unreachable @@ -5296,7 +5296,7 @@ if i32.const 872 i32.const 488 - i32.const 327 + i32.const 334 i32.const 20 call $~lib/builtins/abort unreachable @@ -6337,7 +6337,7 @@ if i32.const 176 i32.const 488 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -8288,7 +8288,7 @@ if i32.const 176 i32.const 488 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -9390,7 +9390,7 @@ if i32.const 272 i32.const 488 - i32.const 45 + i32.const 47 i32.const 61 call $~lib/builtins/abort unreachable @@ -9669,7 +9669,7 @@ if i32.const 272 i32.const 488 - i32.const 45 + i32.const 47 i32.const 61 call $~lib/builtins/abort unreachable @@ -9739,7 +9739,7 @@ block i32.const 4040 i32.const 488 - i32.const 112 + i32.const 114 i32.const 38 call $~lib/builtins/abort unreachable @@ -10033,7 +10033,7 @@ if i32.const 4040 i32.const 488 - i32.const 97 + i32.const 99 i32.const 45 call $~lib/builtins/abort unreachable @@ -10047,7 +10047,7 @@ if i32.const 176 i32.const 488 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -10161,7 +10161,7 @@ if i32.const 272 i32.const 488 - i32.const 45 + i32.const 47 i32.const 61 call $~lib/builtins/abort unreachable @@ -10246,7 +10246,7 @@ block i32.const 4040 i32.const 488 - i32.const 112 + i32.const 114 i32.const 38 call $~lib/builtins/abort unreachable @@ -10534,7 +10534,7 @@ if i32.const 4040 i32.const 488 - i32.const 97 + i32.const 99 i32.const 45 call $~lib/builtins/abort unreachable @@ -10548,7 +10548,7 @@ if i32.const 176 i32.const 488 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -10853,7 +10853,7 @@ if i32.const 176 i32.const 488 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -11356,7 +11356,7 @@ if i32.const 272 i32.const 488 - i32.const 45 + i32.const 47 i32.const 61 call $~lib/builtins/abort unreachable @@ -11632,7 +11632,7 @@ block i32.const 4040 i32.const 488 - i32.const 112 + i32.const 114 i32.const 38 call $~lib/builtins/abort unreachable @@ -11898,7 +11898,7 @@ if i32.const 4040 i32.const 488 - i32.const 97 + i32.const 99 i32.const 45 call $~lib/builtins/abort unreachable @@ -11912,7 +11912,7 @@ if i32.const 176 i32.const 488 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/static-array.optimized.wat b/tests/compiler/std/static-array.optimized.wat index 86f53a41..da87c808 100644 --- a/tests/compiler/std/static-array.optimized.wat +++ b/tests/compiler/std/static-array.optimized.wat @@ -37,7 +37,7 @@ if i32.const 320 i32.const 376 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -624,7 +624,7 @@ if i32.const 320 i32.const 376 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -668,7 +668,7 @@ if i32.const 320 i32.const 376 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -712,7 +712,7 @@ if i32.const 320 i32.const 376 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/static-array.untouched.wat b/tests/compiler/std/static-array.untouched.wat index ec02fc8a..b061cafb 100644 --- a/tests/compiler/std/static-array.untouched.wat +++ b/tests/compiler/std/static-array.untouched.wat @@ -59,7 +59,7 @@ if i32.const 320 i32.const 376 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -1999,7 +1999,7 @@ if i32.const 320 i32.const 376 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -2067,7 +2067,7 @@ if i32.const 320 i32.const 376 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -2135,7 +2135,7 @@ if i32.const 320 i32.const 376 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/string.optimized.wat b/tests/compiler/std/string.optimized.wat index c262311a..bcc96242 100644 --- a/tests/compiler/std/string.optimized.wat +++ b/tests/compiler/std/string.optimized.wat @@ -4018,7 +4018,7 @@ if i32.const 2296 i32.const 2248 - i32.const 97 + i32.const 99 i32.const 45 call $~lib/builtins/abort unreachable @@ -4032,7 +4032,7 @@ if i32.const 232 i32.const 2248 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/string.untouched.wat b/tests/compiler/std/string.untouched.wat index 47f6e9b0..fd7f3f21 100644 --- a/tests/compiler/std/string.untouched.wat +++ b/tests/compiler/std/string.untouched.wat @@ -6331,7 +6331,7 @@ if i32.const 2296 i32.const 2248 - i32.const 97 + i32.const 99 i32.const 45 call $~lib/builtins/abort unreachable @@ -6345,7 +6345,7 @@ if i32.const 232 i32.const 2248 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/typedarray.optimized.wat b/tests/compiler/std/typedarray.optimized.wat index 12954972..93e7c6aa 100644 --- a/tests/compiler/std/typedarray.optimized.wat +++ b/tests/compiler/std/typedarray.optimized.wat @@ -3354,7 +3354,7 @@ if i32.const 336 i32.const 512 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -3605,7 +3605,7 @@ if i32.const 336 i32.const 512 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/typedarray.untouched.wat b/tests/compiler/std/typedarray.untouched.wat index c3820f81..c24bf736 100644 --- a/tests/compiler/std/typedarray.untouched.wat +++ b/tests/compiler/std/typedarray.untouched.wat @@ -5439,7 +5439,7 @@ if i32.const 336 i32.const 512 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable @@ -5766,7 +5766,7 @@ if i32.const 336 i32.const 512 - i32.const 100 + i32.const 102 i32.const 61 call $~lib/builtins/abort unreachable