From 00303fdf30a0a6a56517aca66f0d9903b50ed6c0 Mon Sep 17 00:00:00 2001 From: dcodeIO Date: Fri, 1 Dec 2017 02:18:36 +0100 Subject: [PATCH] Keep builtins in assembly.d.ts, not really stdlib --- assembly.d.ts | 66 +++++++++++++++++++++++++++++++++++++++++++++-- src/compiler.ts | 3 +++ std/builtins.d.ts | 59 ------------------------------------------ 3 files changed, 67 insertions(+), 61 deletions(-) delete mode 100644 std/builtins.d.ts diff --git a/assembly.d.ts b/assembly.d.ts index 424aacb2..57527144 100644 --- a/assembly.d.ts +++ b/assembly.d.ts @@ -1,3 +1,5 @@ +// types + /** An 8-bit signed integer. */ declare type i8 = number; /** A 16-bit signed integer. */ @@ -25,16 +27,76 @@ declare type f32 = number; /** A 64-bit float. */ declare type f64 = number; +// builtins + +/** Performs the sign-agnostic count leading zero bits operation on a 32-bit or 64-bit integer. All zero bits are considered leading if the value is zero. */ +declare function clz(value: T): T; +/** Performs the sign-agnostic count tailing zero bits operation on a 32-bit or 64-bit integer. All zero bits are considered trailing if the value is zero. */ +declare function ctz(value: T): T; +/** Performs the sign-agnostic count number of one bits operation on a 32-bit or 64-bit integer. */ +declare function popcnt(value: T): T; +/** Performs the sign-agnostic rotate left operation on a 32-bit or 64-bit integer. */ +declare function rotl(value: T, shift: T): T; +/** Performs the sign-agnostic rotate right operation on a 32-bit or 64-bit integer. */ +declare function rotr(value: T, shift: T): T; + +/** Computes the absolute value of a 32-bit or 64-bit float. */ +declare function abs(value: T): T; +/** Performs the ceiling operation on a 32-bit or 64-bit float. */ +declare function ceil(value: T): T; +/** Composes a 32-bit or 64-bit float from the magnitude of `x` and the sign of `y`. */ +declare function copysign(x: T, y: T): T; +/** Performs the floor operation on a 32-bit or 64-bit float. */ +declare function floor(value: T): T; +/** Determines the maximum of two 32-bit or 64-bit floats. If either operand is `NaN`, returns `NaN`. */ +declare function max(left: T, right: T): T; +/** Determines the minimum of two 32-bit or 64-bit floats. If either operand is `NaN`, returns `NaN`. */ +declare function min(left: T, right: T): T; +/** Rounds to the nearest integer tied to even of a 32-bit or 64-bit float. */ +declare function nearest(value: T): T; +/** Reinterprets the bits of a value of type `T1` as type `T2`. Valid reinterpretations are i32 to/from f32 and i64 to/from f64. */ +declare function reinterpret(value: T1): T2; +/** Calculates the square root of a 32-bit or 64-bit float. */ +declare function sqrt(value: T): T; +/** Rounds to the nearest integer towards zero of a 32-bit or 64-bit float. */ +declare function trunc(value: T): T; + +/** Returns the current memory size in units of pages. One page is 64kb. */ +declare function current_memory(): i32; +/** Grows linear memory by a given unsigned delta of pages. One page is 64kb. Returns the previous memory size in units of pages or `-1` on failure. */ +declare function grow_memory(value: i32): i32; +/** Emits an unreachable operation that results in a runtime error when executed. */ +declare function unreachable(): void; + +/** Loads a value of the specified type from memory. */ +declare function load(offset: usize): T; +/** Stores a value of the specified type to memory. */ +declare function store(offset: usize, value: T): void; +/** Determines the byte size of the specified core or class type. Compiles to a constant. */ +declare function sizeof(): usize; + +/** NaN (not a number) as a 32-bit or 64-bit float depending on context. */ +declare const NaN: number; +/** Positive infinity as a 32-bit or 64-bit float depending on context. */ +declare const Infinity: number; + +/** Tests if a 32-bit or 64-bit float is NaN. */ +declare function isNaN(value: T): bool; +/** Tests if a 32-bit or 64-bit float is finite, that is not NaN or +/-Infinity. */ +declare function isFinite(value: T): bool; + +// internal decorators + /** A decorator marking a function or class as global. */ declare function global(name?: string): any; /** A decorator marking a function as ideally being inlined. */ declare function inline(): any; /** A decorator marking a class that manually manages its memory. */ declare function allocates(): any; - declare function operator(token: string, fn: any): any; -/// +// standard library + /// /// /// diff --git a/src/compiler.ts b/src/compiler.ts index 45c79fc5..64af551a 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -1352,6 +1352,9 @@ export class Compiler extends DiagnosticEmitter { sb.push(type.toString()); } functionInstance = functionPrototype.instances.get(sb.join(",")); + if (!functionInstance) { + // TODO: sizeof, load, store, see program.ts/initializeBuiltins + } } else { functionInstance = (element).resolveInclTypeArguments(expression.typeArguments, this.currentFunction.contextualTypeArguments, expression); // reports } diff --git a/std/builtins.d.ts b/std/builtins.d.ts deleted file mode 100644 index 2b844fc5..00000000 --- a/std/builtins.d.ts +++ /dev/null @@ -1,59 +0,0 @@ -/// - -/** Performs the sign-agnostic count leading zero bits operation on a 32-bit or 64-bit integer. All zero bits are considered leading if the value is zero. */ -declare function clz(value: T): T; -/** Performs the sign-agnostic count tailing zero bits operation on a 32-bit or 64-bit integer. All zero bits are considered trailing if the value is zero. */ -declare function ctz(value: T): T; -/** Performs the sign-agnostic count number of one bits operation on a 32-bit or 64-bit integer. */ -declare function popcnt(value: T): T; -/** Performs the sign-agnostic rotate left operation on a 32-bit or 64-bit integer. */ -declare function rotl(value: T, shift: T): T; -/** Performs the sign-agnostic rotate right operation on a 32-bit or 64-bit integer. */ -declare function rotr(value: T, shift: T): T; - -/** Computes the absolute value of a 32-bit or 64-bit float. */ -declare function abs(value: T): T; -/** Performs the ceiling operation on a 32-bit or 64-bit float. */ -declare function ceil(value: T): T; -/** Composes a 32-bit or 64-bit float from the magnitude of `x` and the sign of `y`. */ -declare function copysign(x: T, y: T): T; -/** Performs the floor operation on a 32-bit or 64-bit float. */ -declare function floor(value: T): T; -/** Determines the maximum of two 32-bit or 64-bit floats. If either operand is `NaN`, returns `NaN`. */ -declare function max(left: T, right: T): T; -/** Determines the minimum of two 32-bit or 64-bit floats. If either operand is `NaN`, returns `NaN`. */ -declare function min(left: T, right: T): T; -/** Rounds to the nearest integer tied to even of a 32-bit or 64-bit float. */ -declare function nearest(value: T): T; -/** Reinterprets the bits of a value of type `T1` as type `T2`. Valid reinterpretations are i32 to/from f32 and i64 to/from f64. */ -declare function reinterpret(value: T1): T2; -/** Calculates the square root of a 32-bit or 64-bit float. */ -declare function sqrt(value: T): T; -/** Rounds to the nearest integer towards zero of a 32-bit or 64-bit float. */ -declare function trunc(value: T): T; - -/** Returns the current memory size in units of pages. One page is 64kb. */ -declare function current_memory(): i32; -/** Grows linear memory by a given unsigned delta of pages. One page is 64kb. Returns the previous memory size in units of pages or `-1` on failure. */ -declare function grow_memory(value: i32): i32; -/** Emits an unreachable operation that results in a runtime error when executed. */ -declare function unreachable(): void; - -/** Loads a value of the specified type from memory. */ -declare function load(offset: usize): T; -/** Stores a value of the specified type to memory. */ -declare function store(offset: usize, value: T): void; -/** Determines the byte size of the specified core or class type. Compiles to a constant. */ -declare function sizeof(): usize; - -// standard library - -/** NaN (not a number) as a 32-bit or 64-bit float depending on context. */ -declare const NaN: number; -/** Positive infinity as a 32-bit or 64-bit float depending on context. */ -declare const Infinity: number; - -/** Tests if a 32-bit or 64-bit float is NaN. */ -declare function isNaN(value: T): bool; -/** Tests if a 32-bit or 64-bit float is finite, that is not NaN or +/-Infinity. */ -declare function isFinite(value: T): bool;