mirror of
https://github.com/fluencelabs/assemblyscript
synced 2025-06-12 06:21:29 +00:00
Rename lib prefix to '~lib' (parens aren't valid); Add built-in alignof<T>; Prepare for ArrayBufferView
This commit is contained in:
@ -3,7 +3,7 @@ const HEADER_SIZE: usize = sizeof<i32>();
|
||||
@sealed
|
||||
export class ArrayBuffer {
|
||||
|
||||
readonly byteLength: i32;
|
||||
readonly byteLength: i32; // capped to [0, 0x7fffffff]
|
||||
|
||||
constructor(length: i32) {
|
||||
if (<u32>length > 0x7fffffff) throw new RangeError("Invalid array buffer length");
|
||||
@ -19,21 +19,20 @@ export class ArrayBuffer {
|
||||
if (end < 0) end = max(len + end, 0);
|
||||
else end = min(end, len);
|
||||
var newLen = max(end - begin, 0);
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
||||
/** @internal */
|
||||
static EMPTY: ArrayBuffer | null = null;
|
||||
// TODO: built-in isView?
|
||||
// TODO: built-in transfer?
|
||||
}
|
||||
|
||||
/** @internal */
|
||||
export declare interface ArrayBufferView<T> {
|
||||
readonly buffer: ArrayBuffer;
|
||||
readonly byteOffset: i32;
|
||||
readonly byteLength: i32;
|
||||
readonly length: i32;
|
||||
}
|
||||
|
@ -52,6 +52,8 @@ export declare function store<T>(offset: usize, value: void, constantOffset?: us
|
||||
|
||||
export declare function sizeof<T>(): usize; // | u32 / u64
|
||||
|
||||
export declare function alignof<T>(): usize; // | u32 / u64
|
||||
|
||||
export declare function offsetof<T>(fieldName?: string): usize; // | u32 / u64
|
||||
|
||||
export declare function select<T>(ifTrue: T, ifFalse: T, condition: bool): T;
|
||||
|
@ -1,30 +1,19 @@
|
||||
class TypedArray<T> {
|
||||
/** @internal */
|
||||
abstract class TypedArray<T> /* implements ArrayBufferView<T> */ {
|
||||
|
||||
readonly buffer: ArrayBuffer;
|
||||
readonly byteOffset: i32;
|
||||
readonly byteLength: i32;
|
||||
get length(): i32 { return this.byteLength / sizeof<T>(); }
|
||||
get length(): i32 { return this.byteLength >> alignof<T>(); }
|
||||
|
||||
constructor(length: i32) {
|
||||
var byteLength = length * sizeof<T>();
|
||||
const maxLength = <u32>0x7fffffff >> alignof<T>();
|
||||
if (<u32>length > maxLength) throw new RangeError("Invalid typed array length");
|
||||
var byteLength = length << alignof<T>();
|
||||
this.buffer = new ArrayBuffer(byteLength);
|
||||
this.byteOffset = 0;
|
||||
this.byteLength = byteLength;
|
||||
}
|
||||
|
||||
@operator("[]")
|
||||
private __get(index: i32): T {
|
||||
var offset = this.byteOffset;
|
||||
assert(<u32>index < <u32>this.byteLength / sizeof<T>());
|
||||
return load<T>(changetype<usize>(this.buffer) + (offset + index) * sizeof<T>(), 4);
|
||||
}
|
||||
|
||||
@operator("[]=")
|
||||
private __set(index: i32, value: T): void {
|
||||
var offset = this.byteOffset;
|
||||
assert(<u32>index < <u32>(this.byteLength / sizeof<T>()));
|
||||
store<T>(changetype<usize>(this.buffer) + (offset + index) * sizeof<T>(), value, 4);
|
||||
}
|
||||
}
|
||||
|
||||
// export class Int8Array extends TypedArray<i8> {
|
||||
|
Reference in New Issue
Block a user