Binary expression operator overloads for +/==; Check allocation flow in ternary expressions; Cache empty array buffers; Sealed decorator for non-derivable internals

This commit is contained in:
dcodeIO
2018-03-23 12:45:29 +01:00
parent 9cc0fcd611
commit 4adb69f73a
18 changed files with 5074 additions and 267 deletions

View File

@ -1,14 +1,12 @@
const HEADER_SIZE: usize = sizeof<i32>();
@unmanaged
@sealed
export class ArrayBuffer {
readonly byteLength: i32;
constructor(length: i32) {
if (<u32>length > 0x7fffffff) {
throw new RangeError("Invalid array buffer length");
}
if (<u32>length > 0x7fffffff) throw new RangeError("Invalid array buffer length");
var buffer = allocate_memory(HEADER_SIZE + <usize>length);
store<i32>(buffer, length);
return changetype<ArrayBuffer>(buffer);
@ -21,9 +19,21 @@ export class ArrayBuffer {
if (end < 0) end = max(len + end, 0);
else end = min(end, len);
var newLen = max(end - begin, 0);
var buffer = allocate_memory(HEADER_SIZE + <usize>newLen);
store<i32>(buffer, newLen);
move_memory(buffer + HEADER_SIZE, changetype<usize>(this) + HEADER_SIZE + begin, newLen);
return changetype<ArrayBuffer>(buffer);
if (newLen) {
let buffer = allocate_memory(HEADER_SIZE + <usize>newLen);
store<i32>(buffer, newLen);
move_memory(buffer + HEADER_SIZE, changetype<usize>(this) + HEADER_SIZE + begin, newLen);
return changetype<ArrayBuffer>(buffer);
} else if (ArrayBuffer.EMPTY) {
return ArrayBuffer.EMPTY;
} else {
let buffer = allocate_memory(HEADER_SIZE);
store<i32>(buffer, 0);
ArrayBuffer.EMPTY = changetype<ArrayBuffer>(buffer);
return changetype<ArrayBuffer>(buffer);
}
}
/** @internal */
static EMPTY: ArrayBuffer | null = null;
}