mirror of
https://github.com/fluencelabs/assemblyscript
synced 2025-06-25 12:41:50 +00:00
Fix implementation of Array#splice (#347)
This commit is contained in:
@ -369,19 +369,28 @@ export class Array<T> {
|
||||
return sliced;
|
||||
}
|
||||
|
||||
splice(start: i32, deleteCount: i32 = i32.MAX_VALUE): void {
|
||||
if (deleteCount < 1) return;
|
||||
var length = this.length_;
|
||||
if (start < 0) start = max(length + start, 0);
|
||||
if (start >= length) return;
|
||||
deleteCount = min(deleteCount, length - start);
|
||||
var buffer = this.buffer_;
|
||||
splice(start: i32, deleteCount: i32 = i32.MAX_VALUE): Array<T> {
|
||||
var length = this.length_;
|
||||
start = start < 0 ? max<i32>(length + start, 0) : min<i32>(start, length);
|
||||
deleteCount = max<i32>(min<i32>(deleteCount, length - start), 0);
|
||||
var buffer = this.buffer_;
|
||||
var spliced = new Array<T>(deleteCount);
|
||||
var source = changetype<usize>(buffer) + HEADER_SIZE + (<usize>start << alignof<T>());
|
||||
memory.copy(
|
||||
changetype<usize>(buffer) + HEADER_SIZE + (<usize>start << alignof<T>()),
|
||||
changetype<usize>(buffer) + HEADER_SIZE + (<usize>(start + deleteCount) << alignof<T>()),
|
||||
changetype<usize>(spliced.buffer_) + HEADER_SIZE,
|
||||
source,
|
||||
<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;
|
||||
return spliced;
|
||||
}
|
||||
|
||||
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;
|
||||
some(callbackfn: (element: T, index: i32, array?: Array<T>) => bool): bool;
|
||||
unshift(element: T): i32;
|
||||
slice(from: i32, to?: i32): T[];
|
||||
splice(start: i32, deleteCount?: i32): void;
|
||||
slice(from: i32, to?: i32): Array<T>;
|
||||
splice(start: i32, deleteCount?: i32): Array<T>;
|
||||
sort(comparator?: (a: T, b: T) => i32): this;
|
||||
join(separator?: string): string;
|
||||
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
|
||||
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) {
|
||||
memcpy(dest, src, n);
|
||||
return;
|
||||
|
Reference in New Issue
Block a user