eliminate retainRelease and skippedRelease

This commit is contained in:
dcode
2019-05-25 19:16:09 +02:00
parent bd9d77e151
commit 3224925e47
37 changed files with 8521 additions and 5537 deletions

View File

@ -120,7 +120,11 @@ export class Array<T> extends ArrayBufferView {
@operator("{}=") private __unchecked_set(index: i32, value: T): void {
if (isManaged<T>()) {
let offset = this.dataStart + (<usize>index << alignof<T>());
store<usize>(offset, __retainRelease(load<usize>(offset), changetype<usize>(value)));
let oldRef: usize = load<usize>(offset);
if (changetype<usize>(value) != oldRef) {
store<usize>(offset, __retain(changetype<usize>(value)));
__release(oldRef);
}
} else {
store<T>(this.dataStart + (<usize>index << alignof<T>()), value);
}
@ -182,7 +186,11 @@ export class Array<T> extends ArrayBufferView {
ensureSize(changetype<usize>(this), newLength, alignof<T>());
if (isManaged<T>()) {
let offset = this.dataStart + (<usize>length << alignof<T>());
store<usize>(offset, __retainRelease(load<usize>(offset), changetype<usize>(value)));
let oldRef: usize = load<usize>(offset);
if (changetype<usize>(value) != oldRef) {
store<usize>(offset, __retain(changetype<usize>(value)));
__release(oldRef);
}
} else {
store<T>(this.dataStart + (<usize>length << alignof<T>()), value);
}