Skip to content

Commit 83e0927

Browse files
committed
Merge remote-tracking branch 'origin/master' into release
2 parents ecfbade + a5cdf31 commit 83e0927

File tree

7 files changed

+1949
-1945
lines changed

7 files changed

+1949
-1945
lines changed

std/assembly/string.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -637,7 +637,7 @@ export namespace String {
637637
export function byteLength(str: string, nullTerminated: bool = false): i32 {
638638
var strOff = changetype<usize>(str);
639639
var strEnd = strOff + <usize>changetype<BLOCK>(changetype<usize>(str) - BLOCK_OVERHEAD).rtSize;
640-
var bufLen = nullTerminated ? 1 : 0;
640+
var bufLen = i32(nullTerminated);
641641
while (strOff < strEnd) {
642642
let c1 = <u32>load<u16>(strOff);
643643
if (c1 < 128) {
@@ -661,12 +661,13 @@ export namespace String {
661661
export function encode(str: string, nullTerminated: bool = false): ArrayBuffer {
662662
var strOff = changetype<usize>(str);
663663
var strEnd = changetype<usize>(str) + <usize>changetype<BLOCK>(changetype<usize>(str) - BLOCK_OVERHEAD).rtSize;
664-
var buf = __alloc(UTF8.byteLength(str, nullTerminated), idof<ArrayBuffer>());
664+
var bufLen = <usize>UTF8.byteLength(str, nullTerminated);
665+
var buf = __alloc(bufLen, idof<ArrayBuffer>());
666+
var bufEnd = buf + bufLen - usize(nullTerminated);
665667
var bufOff = buf;
666-
while (strOff < strEnd) {
668+
while (bufOff < bufEnd) {
667669
let c1 = <u32>load<u16>(strOff);
668670
if (c1 < 128) {
669-
if (nullTerminated && !c1) break;
670671
store<u8>(bufOff, c1);
671672
bufOff += 1; strOff += 2;
672673
} else if (c1 < 2048) {
@@ -692,12 +693,9 @@ export namespace String {
692693
strOff += 2; bufOff += 3;
693694
}
694695
}
696+
assert(strOff <= strEnd);
695697
if (nullTerminated) {
696-
assert(strOff <= strEnd);
697-
buf = __realloc(buf, bufOff - buf + 1);
698698
store<u8>(bufOff, 0);
699-
} else {
700-
assert(strOff == strEnd);
701699
}
702700
return changetype<ArrayBuffer>(buf); // retains
703701
}

std/assembly/typedarray.ts

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1734,27 +1734,26 @@ function REVERSE<TArray extends ArrayBufferView, T>(array: TArray): TArray {
17341734
// @ts-ignore: decorator
17351735
@inline
17361736
function WRAP<TArray extends ArrayBufferView, T>(buffer: ArrayBuffer, byteOffset: i32 = 0, length: i32 = -1): TArray {
1737+
var byteLength: i32;
17371738
var bufferByteLength = buffer.byteLength;
1738-
if (<u32>byteOffset >= <u32>bufferByteLength) {
1739+
const mask = sizeof<T>() - 1;
1740+
if (i32(<u32>byteOffset > <u32>bufferByteLength) | (byteOffset & mask)) {
17391741
throw new RangeError(E_INDEXOUTOFRANGE);
17401742
}
1741-
var byteLength: i32;
17421743
if (length < 0) {
17431744
if (length == -1) {
1744-
const mask = <i32>(1 << alignof<T>() - 1);
1745-
if (buffer.byteLength & mask) {
1745+
if (bufferByteLength & mask) {
17461746
throw new RangeError(E_INVALIDLENGTH);
1747-
} else {
1748-
byteLength = buffer.byteLength;
17491747
}
1748+
byteLength = bufferByteLength - byteOffset;
17501749
} else {
17511750
throw new RangeError(E_INVALIDLENGTH);
17521751
}
17531752
} else {
17541753
byteLength = length << alignof<T>();
1755-
}
1756-
if (byteOffset + byteLength > buffer.byteLength) {
1757-
throw new RangeError(E_INVALIDLENGTH);
1754+
if (byteOffset + byteLength > bufferByteLength) {
1755+
throw new RangeError(E_INVALIDLENGTH);
1756+
}
17581757
}
17591758
var out = __alloc(offsetof<TArray>(), idof<TArray>());
17601759
store<usize>(out, __retain(changetype<usize>(buffer)), offsetof<TArray>("buffer"));

0 commit comments

Comments
 (0)