mirror of
https://github.com/fluencelabs/assemblyscript
synced 2025-04-26 15:32:16 +00:00
Fix implementation of Array#splice (#347)
This commit is contained in:
parent
1149abf824
commit
3c5c2cef80
@ -369,19 +369,28 @@ export class Array<T> {
|
|||||||
return sliced;
|
return sliced;
|
||||||
}
|
}
|
||||||
|
|
||||||
splice(start: i32, deleteCount: i32 = i32.MAX_VALUE): void {
|
splice(start: i32, deleteCount: i32 = i32.MAX_VALUE): Array<T> {
|
||||||
if (deleteCount < 1) return;
|
var length = this.length_;
|
||||||
var length = this.length_;
|
start = start < 0 ? max<i32>(length + start, 0) : min<i32>(start, length);
|
||||||
if (start < 0) start = max(length + start, 0);
|
deleteCount = max<i32>(min<i32>(deleteCount, length - start), 0);
|
||||||
if (start >= length) return;
|
var buffer = this.buffer_;
|
||||||
deleteCount = min(deleteCount, length - start);
|
var spliced = new Array<T>(deleteCount);
|
||||||
var buffer = this.buffer_;
|
var source = changetype<usize>(buffer) + HEADER_SIZE + (<usize>start << alignof<T>());
|
||||||
memory.copy(
|
memory.copy(
|
||||||
changetype<usize>(buffer) + HEADER_SIZE + (<usize>start << alignof<T>()),
|
changetype<usize>(spliced.buffer_) + HEADER_SIZE,
|
||||||
changetype<usize>(buffer) + HEADER_SIZE + (<usize>(start + deleteCount) << alignof<T>()),
|
source,
|
||||||
<usize>deleteCount << alignof<T>()
|
<usize>deleteCount << alignof<T>()
|
||||||
);
|
);
|
||||||
|
var offset = start + deleteCount;
|
||||||
|
if (length != offset) {
|
||||||
|
memory.copy(
|
||||||
|
source,
|
||||||
|
changetype<usize>(buffer) + HEADER_SIZE + (<usize>offset << alignof<T>()),
|
||||||
|
<usize>(length - offset) << alignof<T>()
|
||||||
|
);
|
||||||
|
}
|
||||||
this.length_ = length - deleteCount;
|
this.length_ = length - deleteCount;
|
||||||
|
return spliced;
|
||||||
}
|
}
|
||||||
|
|
||||||
reverse(): Array<T> {
|
reverse(): Array<T> {
|
||||||
|
4
std/assembly/index.d.ts
vendored
4
std/assembly/index.d.ts
vendored
@ -572,8 +572,8 @@ declare class Array<T> {
|
|||||||
shift(): T;
|
shift(): T;
|
||||||
some(callbackfn: (element: T, index: i32, array?: Array<T>) => bool): bool;
|
some(callbackfn: (element: T, index: i32, array?: Array<T>) => bool): bool;
|
||||||
unshift(element: T): i32;
|
unshift(element: T): i32;
|
||||||
slice(from: i32, to?: i32): T[];
|
slice(from: i32, to?: i32): Array<T>;
|
||||||
splice(start: i32, deleteCount?: i32): void;
|
splice(start: i32, deleteCount?: i32): Array<T>;
|
||||||
sort(comparator?: (a: T, b: T) => i32): this;
|
sort(comparator?: (a: T, b: T) => i32): this;
|
||||||
join(separator?: string): string;
|
join(separator?: string): string;
|
||||||
reverse(): T[];
|
reverse(): T[];
|
||||||
|
@ -144,7 +144,7 @@ export function memcpy(dest: usize, src: usize, n: usize): void { // see: musl/s
|
|||||||
|
|
||||||
// this function will go away once `memory.copy` becomes an intrinsic
|
// this function will go away once `memory.copy` becomes an intrinsic
|
||||||
export function memmove(dest: usize, src: usize, n: usize): void { // see: musl/src/string/memmove.c
|
export function memmove(dest: usize, src: usize, n: usize): void { // see: musl/src/string/memmove.c
|
||||||
if (dest == src) return;
|
if (dest === src) return;
|
||||||
if (src + n <= dest || dest + n <= src) {
|
if (src + n <= dest || dest + n <= src) {
|
||||||
memcpy(dest, src, n);
|
memcpy(dest, src, n);
|
||||||
return;
|
return;
|
||||||
|
4
std/portable/index.d.ts
vendored
4
std/portable/index.d.ts
vendored
@ -373,8 +373,8 @@ declare class Array<T> {
|
|||||||
shift(): T;
|
shift(): T;
|
||||||
some(callbackfn: (element: T, index: i32, array?: Array<T>) => bool): bool;
|
some(callbackfn: (element: T, index: i32, array?: Array<T>) => bool): bool;
|
||||||
unshift(element: T): i32;
|
unshift(element: T): i32;
|
||||||
slice(from?: i32, to?: i32): T[];
|
slice(from?: i32, to?: i32): Array<T>;
|
||||||
splice(start: i32, deleteCount?: i32): void;
|
splice(start: i32, deleteCount?: i32): Array<T>;
|
||||||
sort(comparator?: (a: T, b: T) => i32): this;
|
sort(comparator?: (a: T, b: T) => i32): this;
|
||||||
join(separator?: string): string;
|
join(separator?: string): string;
|
||||||
reverse(): T[];
|
reverse(): T[];
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -330,6 +330,60 @@ assert(internalCapacity<i32>(arr) == 5);
|
|||||||
assert(arr[0] == 44);
|
assert(arr[0] == 44);
|
||||||
assert(arr[1] == 42);
|
assert(arr[1] == 42);
|
||||||
|
|
||||||
|
// Array#splice ////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
var sarr: i32[] = [1, 2, 3, 4, 5];
|
||||||
|
assert(isArraysEqual<i32>(sarr.splice(0), <i32[]>[1, 2, 3, 4, 5]));
|
||||||
|
assert(isArraysEqual<i32>(sarr, <i32[]>[]));
|
||||||
|
|
||||||
|
sarr = <i32[]>[1, 2, 3, 4, 5];
|
||||||
|
assert(isArraysEqual<i32>(sarr.splice(2), <i32[]>[3, 4, 5]));
|
||||||
|
assert(isArraysEqual<i32>(sarr, <i32[]>[1, 2]));
|
||||||
|
|
||||||
|
sarr = <i32[]>[1, 2, 3, 4, 5];
|
||||||
|
assert(isArraysEqual<i32>(sarr.splice(2, 2), <i32[]>[3, 4]));
|
||||||
|
assert(isArraysEqual<i32>(sarr, <i32[]>[1, 2, 5]));
|
||||||
|
|
||||||
|
sarr = <i32[]>[1, 2, 3, 4, 5];
|
||||||
|
assert(isArraysEqual<i32>(sarr.splice(0, 1), <i32[]>[1]));
|
||||||
|
assert(isArraysEqual<i32>(sarr, <i32[]>[2, 3, 4, 5]));
|
||||||
|
|
||||||
|
sarr = <i32[]>[1, 2, 3, 4, 5];
|
||||||
|
assert(isArraysEqual<i32>(sarr.splice(-1), <i32[]>[5]));
|
||||||
|
assert(isArraysEqual<i32>(sarr, <i32[]>[1, 2, 3, 4]));
|
||||||
|
|
||||||
|
sarr = <i32[]>[1, 2, 3, 4, 5];
|
||||||
|
assert(isArraysEqual<i32>(sarr.splice(-2), <i32[]>[4, 5]));
|
||||||
|
assert(isArraysEqual<i32>(sarr, <i32[]>[1, 2, 3]));
|
||||||
|
|
||||||
|
sarr = <i32[]>[1, 2, 3, 4, 5];
|
||||||
|
assert(isArraysEqual<i32>(sarr.splice(-2, 1), <i32[]>[4]));
|
||||||
|
assert(isArraysEqual<i32>(sarr, <i32[]>[1, 2, 3, 5]));
|
||||||
|
|
||||||
|
sarr = <i32[]>[1, 2, 3, 4, 5];
|
||||||
|
assert(isArraysEqual<i32>(sarr.splice(-7, 1), <i32[]>[1]));
|
||||||
|
assert(isArraysEqual<i32>(sarr, <i32[]>[2, 3, 4, 5]));
|
||||||
|
|
||||||
|
sarr = <i32[]>[1, 2, 3, 4, 5];
|
||||||
|
assert(isArraysEqual<i32>(sarr.splice(-2, -1), <i32[]>[]));
|
||||||
|
assert(isArraysEqual<i32>(sarr, <i32[]>[1, 2, 3, 4, 5]));
|
||||||
|
|
||||||
|
sarr = <i32[]>[1, 2, 3, 4, 5];
|
||||||
|
assert(isArraysEqual<i32>(sarr.splice(1, -2), <i32[]>[]));
|
||||||
|
assert(isArraysEqual<i32>(sarr, <i32[]>[1, 2, 3, 4, 5]));
|
||||||
|
|
||||||
|
sarr = <i32[]>[1, 2, 3, 4, 5];
|
||||||
|
assert(isArraysEqual<i32>(sarr.splice(4, 0), <i32[]>[]));
|
||||||
|
assert(isArraysEqual<i32>(sarr, <i32[]>[1, 2, 3, 4, 5]));
|
||||||
|
|
||||||
|
sarr = <i32[]>[1, 2, 3, 4, 5];
|
||||||
|
assert(isArraysEqual<i32>(sarr.splice(7, 0), <i32[]>[]));
|
||||||
|
assert(isArraysEqual<i32>(sarr, <i32[]>[1, 2, 3, 4, 5]));
|
||||||
|
|
||||||
|
sarr = <i32[]>[1, 2, 3, 4, 5];
|
||||||
|
assert(isArraysEqual<i32>(sarr.splice(7, 5), <i32[]>[]));
|
||||||
|
assert(isArraysEqual<i32>(sarr, <i32[]>[1, 2, 3, 4, 5]));
|
||||||
|
|
||||||
// Array#findIndex /////////////////////////////////////////////////////////////////////////////////
|
// Array#findIndex /////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
arr[0] = 0;
|
arr[0] = 0;
|
||||||
|
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user