mirror of
https://github.com/fluencelabs/assemblyscript
synced 2025-04-25 15:12:12 +00:00
287 lines
8.4 KiB
JavaScript
287 lines
8.4 KiB
JavaScript
/** @module std/portable *//***/
|
|
|
|
var globalScope = typeof window !== "undefined" && window || typeof global !== "undefined" && global || self;
|
|
|
|
globalScope.ASC_TARGET = 0; // JS
|
|
globalScope.ASC_NO_ASSERT = false;
|
|
globalScope.ASC_MEMORY_BASE = 0;
|
|
globalScope.ASC_OPTIMIZE_LEVEL = 3;
|
|
globalScope.ASC_SHRINK_LEVEL = 0;
|
|
globalScope.ASC_FEATURE_MUTABLE_GLOBAL = false;
|
|
globalScope.ASC_FEATURE_SIGN_EXTENSION = false;
|
|
globalScope.ASC_FEATURE_BULK_MEMORY = false;
|
|
globalScope.ASC_FEATURE_SIMD = false;
|
|
globalScope.ASC_FEATURE_THREADS = false;
|
|
|
|
var F64 = new Float64Array(1);
|
|
var U64 = new Uint32Array(F64.buffer);
|
|
|
|
Object.defineProperties(
|
|
globalScope["i8"] = function i8(value) { return value << 24 >> 24; }
|
|
, {
|
|
"MIN_VALUE": { value: -128, writable: false },
|
|
"MAX_VALUE": { value: 127, writable: false }
|
|
});
|
|
|
|
Object.defineProperties(
|
|
globalScope["i16"] = function i16(value) { return value << 16 >> 16; }
|
|
, {
|
|
"MIN_VALUE": { value: -32768, writable: false },
|
|
"MAX_VALUE": { value: 32767, writable: false }
|
|
});
|
|
|
|
Object.defineProperties(
|
|
globalScope["i32"] = globalScope["isize"] = function i32(value) { return value | 0; }
|
|
, {
|
|
"MIN_VALUE": { value: -2147483648, writable: false },
|
|
"MAX_VALUE": { value: 2147483647, writable: false }
|
|
});
|
|
|
|
Object.defineProperties(
|
|
globalScope["u8"] = function u8(value) { return value & 0xff; }
|
|
, {
|
|
"MIN_VALUE": { value: 0, writable: false },
|
|
"MAX_VALUE": { value: 255, writable: false }
|
|
});
|
|
|
|
Object.defineProperties(
|
|
globalScope["u16"] = function u16(value) { return value & 0xffff; }
|
|
, {
|
|
"MIN_VALUE": { value: 0, writable: false },
|
|
"MAX_VALUE": { value: 65535, writable: false }
|
|
});
|
|
|
|
Object.defineProperties(
|
|
globalScope["u32"] = globalScope["usize"] = function u32(value) { return value >>> 0; }
|
|
, {
|
|
"MIN_VALUE": { value: 0, writable: false },
|
|
"MAX_VALUE": { value: 4294967295, writable: false }
|
|
});
|
|
|
|
Object.defineProperties(
|
|
globalScope["bool"] = function bool(value) { return !!value; }
|
|
, {
|
|
"MIN_VALUE": { value: false, writable: false },
|
|
"MAX_VALUE": { value: true, writable: false }
|
|
});
|
|
|
|
Object.defineProperties(
|
|
globalScope["f32"] = function f32(value) { return Math.fround(value); }
|
|
, {
|
|
"EPSILON": { value: Math.fround(1.1920929e-07), writable: false },
|
|
"MIN_VALUE": { value: Math.fround(1.4012985e-45), writable: false },
|
|
"MAX_VALUE": { value: Math.fround(3.4028235e+38), writable: false },
|
|
"MIN_NORMAL_VALUE": { value: Math.fround(1.17549435e-38), writable: false },
|
|
"MIN_SAFE_INTEGER": { value: -16777215, writable: false },
|
|
"MAX_SAFE_INTEGER": { value: 16777215, writable: false }
|
|
});
|
|
|
|
Object.defineProperties(
|
|
globalScope["f64"] = function f64(value) { return +value; }
|
|
, {
|
|
"EPSILON": { value: 2.2204460492503131e-16, writable: false },
|
|
"MIN_VALUE": { value: 5e-324, writable: false },
|
|
"MAX_VALUE": { value: 1.7976931348623157e+308, writable: false },
|
|
"MIN_NORMAL_VALUE": { value: 2.2250738585072014e-308 , writable: false },
|
|
"MIN_SAFE_INTEGER": { value: -9007199254740991, writable: false },
|
|
"MAX_SAFE_INTEGER": { value: 9007199254740991, writable: false }
|
|
});
|
|
|
|
globalScope["clz"] = Math.clz32;
|
|
|
|
globalScope["ctz"] = function ctz(value) {
|
|
var c = Math.clz32(value & -value);
|
|
return value ? 31 - c : c;
|
|
};
|
|
|
|
globalScope["popcnt"] = function popcnt(value) {
|
|
value -= value >>> 1 & 0x55555555;
|
|
value = (value & 0x33333333) + (value >>> 2 & 0x33333333);
|
|
return (((value + (value >>> 4)) & 0x0F0F0F0F) * 0x01010101) >>> 24;
|
|
};
|
|
|
|
globalScope["rotl"] = function rotl(value, shift) {
|
|
shift &= 31;
|
|
return (value << shift) | (value >>> (32 - shift));
|
|
};
|
|
|
|
globalScope["rotr"] = function rotr(value, shift) {
|
|
shift &= 31;
|
|
return (value >>> shift) | (value << (32 - shift));
|
|
};
|
|
|
|
globalScope["abs"] = Math.abs;
|
|
|
|
globalScope["max"] = Math.max;
|
|
|
|
globalScope["min"] = Math.min;
|
|
|
|
globalScope["ceil"] = Math.ceil;
|
|
|
|
globalScope["floor"] = Math.floor;
|
|
|
|
// Adopt code from https://github.com/rfk/wasm-polyfill
|
|
globalScope["nearest"] = function nearest(value) {
|
|
if (Math.abs(value - Math.trunc(value)) === 0.5) {
|
|
return 2.0 * Math.round(value * 0.5);
|
|
}
|
|
return Math.round(value);
|
|
};
|
|
|
|
globalScope["select"] = function select(ifTrue, ifFalse, condition) {
|
|
return condition ? ifTrue : ifFalse;
|
|
};
|
|
|
|
globalScope["sqrt"] = Math.sqrt;
|
|
|
|
globalScope["trunc"] = Math.trunc;
|
|
|
|
globalScope["copysign"] = function copysign(x, y) {
|
|
return Math.abs(x) * Math.sign(y);
|
|
};
|
|
|
|
globalScope["bswap"] = function bswap(value) {
|
|
var a = value >> 8 & 0x00FF00FF;
|
|
var b = (value & 0x00FF00FF) << 8;
|
|
value = a | b;
|
|
a = value >> 16 & 0x0000FFFF;
|
|
b = (value & 0x0000FFFF) << 16;
|
|
return a | b;
|
|
};
|
|
|
|
globalScope["bswap16"] = function bswap16(value) {
|
|
return ((value << 8) & 0xFF00) | ((value >> 8) & 0x00FF) | (value & 0xFFFF0000);
|
|
};
|
|
|
|
function UnreachableError() {
|
|
if (Error.captureStackTrace) {
|
|
Error.captureStackTrace(this, UnreachableError);
|
|
} else {
|
|
this.stack = this.name + ": " + this.message + "\n" + new Error().stack;
|
|
}
|
|
}
|
|
UnreachableError.prototype = Object.create(Error.prototype);
|
|
UnreachableError.prototype.name = "UnreachableError";
|
|
UnreachableError.prototype.message = "unreachable";
|
|
|
|
globalScope["unreachable"] = function unreachable() {
|
|
throw new UnreachableError();
|
|
};
|
|
|
|
function AssertionError(message) {
|
|
this.message = message || "assertion failed";
|
|
if (Error.captureStackTrace) {
|
|
Error.captureStackTrace(this, AssertionError);
|
|
} else {
|
|
this.stack = this.name + ": " + this.message + "\n" + new Error().stack;
|
|
}
|
|
}
|
|
AssertionError.prototype = Object.create(Error.prototype);
|
|
AssertionError.prototype.name = "AssertionError";
|
|
|
|
globalScope["assert"] = function assert(isTrueish, message) {
|
|
if (isTrueish) return isTrueish;
|
|
throw new AssertionError(message);
|
|
};
|
|
|
|
globalScope["changetype"] = function changetype(value) {
|
|
return value;
|
|
};
|
|
|
|
globalScope["parseI32"] = function parseI32(str, radix) {
|
|
return parseInt(str, undefined) | 0;
|
|
};
|
|
|
|
String["fromCharCodes"] = function fromCharCodes(arr) {
|
|
return String.fromCharCode.apply(String, arr);
|
|
};
|
|
|
|
String["fromCodePoints"] = function fromCodePoints(arr) {
|
|
return String.fromCodePoint.apply(String, arr);
|
|
};
|
|
|
|
globalScope["isInteger"] = Number.isInteger;
|
|
|
|
globalScope["isFloat"] = function isFloat(arg) {
|
|
return typeof arg === "number";
|
|
};
|
|
|
|
globalScope["isReference"] = function isReference(arg) {
|
|
return typeof arg === "object" || typeof arg === "string";
|
|
};
|
|
|
|
globalScope["isString"] = function isString(arg) {
|
|
return typeof arg === "string" || arg instanceof String;
|
|
};
|
|
|
|
globalScope["isArray"] = Array.isArray;
|
|
globalScope["isArrayLike"] = function isArrayLike(expr) {
|
|
return expr
|
|
&& typeof expr === 'object'
|
|
&& typeof expr.length === 'number'
|
|
&& expr.length >= 0
|
|
&& Math.trunc(expr.length) === expr.length;
|
|
}
|
|
|
|
globalScope["isDefined"] = function isDefined(expr) {
|
|
return typeof expr !== "undefined";
|
|
}
|
|
|
|
globalScope["isConstant"] = function isConstant(expr) {
|
|
return false;
|
|
};
|
|
|
|
globalScope["unchecked"] = function unchecked(expr) {
|
|
return expr;
|
|
};
|
|
|
|
globalScope["fmod"] = function fmod(x, y) {
|
|
return x % y;
|
|
};
|
|
|
|
globalScope["fmodf"] = function fmodf(x, y) {
|
|
return Math.fround(x % y);
|
|
};
|
|
|
|
globalScope["JSMath"] = Math;
|
|
globalScope["JSMath"].signbit = function signbit(x) {
|
|
F64[0] = x; return Boolean((U64[1] >>> 31) & (x == x));
|
|
}
|
|
|
|
globalScope["memory"] = (() => {
|
|
var HEAP = new Uint8Array(0);
|
|
var HEAP_OFFSET = 0;
|
|
return {
|
|
allocate: globalScope["__memory_allocate"] || function allocate(size) {
|
|
if (!(size >>>= 0)) return 0;
|
|
if (HEAP_OFFSET + size > HEAP.length) {
|
|
var oldHeap = HEAP;
|
|
HEAP = new Uint8Array(Math.max(65536, HEAP.length + size, HEAP.length * 2));
|
|
HEAP.set(oldHeap);
|
|
}
|
|
var ptr = HEAP_OFFSET;
|
|
if ((HEAP_OFFSET += size) & 7) HEAP_OFFSET = (HEAP_OFFSET | 7) + 1;
|
|
return ptr;
|
|
},
|
|
fill: globalScope["__memory_fill"] || function fill(dest, value, size) {
|
|
HEAP.fill(value, dest, dest + size);
|
|
},
|
|
free: globalScope["__memory_free"] || function free(ptr) { },
|
|
copy: globalScope["__memory_copy"] || function copy(dest, src, size) {
|
|
HEAP.copyWithin(dest, src, src + size);
|
|
},
|
|
reset: globalScope["__memory_reset"] || function reset() {
|
|
HEAP = new Uint8Array(0);
|
|
HEAP_OFFSET = 0;
|
|
}
|
|
};
|
|
})();
|
|
|
|
globalScope["store"] = globalScope["__store"] || function store(ptr, value, offset) {
|
|
HEAP[(ptr | 0) + (offset | 0)] = value;
|
|
};
|
|
|
|
globalScope["load"] = globalScope["__load"] || function load(ptr, offset) {
|
|
return HEAP[(ptr | 0) + (offset | 0)];
|
|
};
|