This commit is contained in:
dcode
2019-03-14 05:11:03 +01:00
parent 6163a73ab5
commit a5e14a0eaa
24 changed files with 739 additions and 102 deletions

View File

@ -95,6 +95,7 @@ export class Array<T> extends ArrayBufferView {
if (start < end) {
memory.fill(
dataStart + <usize>start,
// @ts-ignore: cast
<u8>value,
<usize>(end - start)
);
@ -268,6 +269,7 @@ export class Array<T> extends ArrayBufferView {
base + sizeof<T>(),
<usize>lastIndex << alignof<T>()
);
// @ts-ignore: cast
store<T>(base + (<usize>lastIndex << alignof<T>()), <T>null);
this.length_ = lastIndex;
return element;
@ -375,6 +377,7 @@ export class Array<T> extends ArrayBufferView {
join(separator: string = ","): string {
if (isInteger<T>()) {
// @ts-ignore: type
if (value instanceof bool) return this.join_bool(separator);
return this.join_int(separator);
}
@ -400,6 +403,7 @@ export class Array<T> extends ArrayBufferView {
var value: bool;
for (let i = 0; i < lastIndex; ++i) {
value = load<bool>(dataStart + i);
// @ts-ignore: cast
valueLen = 4 + <i32>(!value);
memory.copy(
result + (<usize>offset << 1),
@ -417,6 +421,7 @@ export class Array<T> extends ArrayBufferView {
}
}
value = load<bool>(dataStart + <usize>lastIndex);
// @ts-ignore: cast
valueLen = 4 + <i32>(!value);
memory.copy(
result + (<usize>offset << 1),
@ -440,6 +445,7 @@ export class Array<T> extends ArrayBufferView {
if (!lastIndex) return changetype<string>(itoa<T>(load<T>(dataStart)));
var sepLen = separator.length;
// @ts-ignore: cast
const valueLen = (sizeof<T>() <= 4 ? 10 : 20) + <i32>isSigned<T>();
var estLen = (valueLen + sepLen) * lastIndex + valueLen;
var result = runtime.alloc(estLen << 1);
@ -471,6 +477,7 @@ export class Array<T> extends ArrayBufferView {
var lastIndex = this.length_ - 1;
if (lastIndex < 0) return "";
var dataStart = this.dataStart;
// @ts-ignore: type
if (!lastIndex) return changetype<string>(dtoa(load<T>(dataStart)));
const valueLen = MAX_DOUBLE_LENGTH;
@ -481,6 +488,7 @@ export class Array<T> extends ArrayBufferView {
var value: T;
for (let i = 0; i < lastIndex; ++i) {
value = load<T>(dataStart + (<usize>i << alignof<T>()));
// @ts-ignore: type
offset += dtoa_stream(result, offset, value);
if (sepLen) {
memory.copy(
@ -492,6 +500,7 @@ export class Array<T> extends ArrayBufferView {
}
}
value = load<T>(dataStart + (<usize>lastIndex << alignof<T>()));
// @ts-ignore: type
offset += dtoa_stream(result, offset, value);
if (estLen > offset) {
let trimmed = changetype<string>(result).substring(0, offset);
@ -557,14 +566,17 @@ export class Array<T> extends ArrayBufferView {
var value: T;
if (!lastIndex) {
value = load<T>(base);
// @ts-ignore: type
return value ? value.join(separator) : "";
}
for (let i = 0; i < lastIndex; ++i) {
value = load<T>(base + (<usize>i << alignof<T>()));
// @ts-ignore: type
if (value) result += value.join(separator);
if (sepLen) result += separator;
}
value = load<T>(base + (<usize>lastIndex << alignof<T>()));
// @ts-ignore: type
if (value) result += value.join(separator);
return result; // registered by concatenation (FIXME: lots of garbage)
}