diff --git a/src/Debug/debugger.cpp b/src/Debug/debugger.cpp index edfc9f75b..7984dd05f 100644 --- a/src/Debug/debugger.cpp +++ b/src/Debug/debugger.cpp @@ -386,23 +386,23 @@ void Debugger::printValue(const StackValue *v, const uint32_t idx, switch (v->value_type) { case I32: - snprintf(buff, 255, R"("type":"i32","value":)" FMT(PRIi32), + snprintf(buff, 255, R"("type":"i32","value":)" FMT(PRIu32), v->value.uint32); break; case I64: - snprintf(buff, 255, R"("type":"i64","value":)" FMT(PRIi64), + snprintf(buff, 255, R"("type":"i64","value":)" FMT(PRIu64), v->value.uint64); break; case F32: - snprintf(buff, 255, R"("type":"F32","value":")" FMT(PRIx32) "\"", + snprintf(buff, 255, R"("type":"F32","value":")" FMT(PRIu32) "\"", v->value.uint32); break; case F64: - snprintf(buff, 255, R"("type":"F64","value":")" FMT(PRIx64) "\"", + snprintf(buff, 255, R"("type":"F64","value":")" FMT(PRIu64) "\"", v->value.uint64); break; default: - snprintf(buff, 255, R"("type":"%02x","value":")" FMT(PRIx64) "\"", + snprintf(buff, 255, R"("type":"%02x","value":")" FMT(PRIu64) "\"", v->value_type, v->value.uint64); } this->channel->write(R"({"idx":%d,%s}%s)", idx, buff, end ? "" : ","); @@ -429,7 +429,7 @@ void Debugger::handleInvoke(Module *m, uint8_t *interruptData) const { const uint32_t fidx = read_LEB_32(&interruptData); if (fidx >= m->function_count) { - debug("no function available for fidx %" PRIi32 "\n", fidx); + debug("no function available for fidx %" PRIu32 "\n", fidx); return; } @@ -619,12 +619,12 @@ void Debugger::dumpLocals(const Module *m) const { switch (v->value_type) { case I32: snprintf(_value_str, 255, - R"("type":"i32","value":)" FMT(PRIi32), + R"("type":"i32","value":)" FMT(PRIu32), v->value.uint32); break; case I64: snprintf(_value_str, 255, - R"("type":"i64","value":)" FMT(PRIi64), + R"("type":"i64","value":)" FMT(PRIu64), v->value.uint64); break; case F32: @@ -637,7 +637,7 @@ void Debugger::dumpLocals(const Module *m) const { break; default: snprintf(_value_str, 255, - R"("type":"%02x","value":")" FMT(PRIx64) "\"", + R"("type":"%02x","value":")" FMT(PRIu64) "\"", v->value_type, v->value.uint64); } diff --git a/tests/latch/latch-0.5.1.tgz b/tests/latch/latch-0.5.1.tgz index 0415d34c7..c6036e38c 100644 Binary files a/tests/latch/latch-0.5.1.tgz and b/tests/latch/latch-0.5.1.tgz differ diff --git a/tests/latch/package-lock.json b/tests/latch/package-lock.json index 88852dbfb..79adc3c87 100644 --- a/tests/latch/package-lock.json +++ b/tests/latch/package-lock.json @@ -8,7 +8,7 @@ "name": "warduino-testsuite", "version": "1.0.0", "devDependencies": { - "latch": "file:./latch-0.4.1.tgz", + "latch": "file:latch-0.5.1.tgz", "mqtt": "^4.3.7", "serialport": "^10.4.0", "typescript": "^4.5.5" @@ -247,6 +247,82 @@ "url": "https://opencollective.com/serialport/donate" } }, + "node_modules/@thi.ng/checks": { + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/@thi.ng/checks/-/checks-3.9.5.tgz", + "integrity": "sha512-hxSqs6DtE/RDkzWSa3xqbYEwqAhicqKcWRZSvUmQ9I2NEDrR+qBUj6icjXMtS51k+Mp3FRiTQ0FDCI8FbOBBmw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/postspectacular" + }, + { + "type": "patreon", + "url": "https://patreon.com/thing_umbrella" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/thi.ng" + } + ], + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@thi.ng/errors": { + "version": "2.6.14", + "resolved": "https://registry.npmjs.org/@thi.ng/errors/-/errors-2.6.14.tgz", + "integrity": "sha512-dSqLPZh5wOe329Ks2pJqoDmtjSv2g4KpXEP5/IQ5J9qvrEyNrRBCuaKHUKYUltQ1OUHGd9L5hBqGJl65Hlnu+g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/postspectacular" + }, + { + "type": "patreon", + "url": "https://patreon.com/thing_umbrella" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/thi.ng" + } + ], + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@thi.ng/leb128": { + "version": "3.1.90", + "resolved": "https://registry.npmjs.org/@thi.ng/leb128/-/leb128-3.1.90.tgz", + "integrity": "sha512-HR6dQnGPB3P9F+ILHkFw2cyse+aPOEHNS8loUOQ7uapGmZ4ummp+rsg/ZXQ6Bwqa+MZBHODBoeKrrUrARgcDYQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/postspectacular" + }, + { + "type": "patreon", + "url": "https://patreon.com/thing_umbrella" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/thi.ng" + } + ], + "license": "Apache-2.0", + "dependencies": { + "@thi.ng/checks": "^3.9.5", + "@thi.ng/errors": "^2.6.14" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", @@ -276,20 +352,20 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", - "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", + "version": "25.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", + "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "undici-types": "~7.16.0" + "undici-types": ">=7.24.0 <7.24.7" } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", "bin": { @@ -300,9 +376,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", "dev": true, "license": "MIT", "dependencies": { @@ -383,9 +459,9 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", "dev": true, "license": "MIT", "dependencies": { @@ -527,9 +603,9 @@ } }, "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -574,9 +650,9 @@ "license": "ISC" }, "node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", "dev": true, "license": "MIT", "engines": { @@ -590,7 +666,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -696,14 +772,23 @@ "url": "https://opencollective.com/js-sdsl" } }, + "node_modules/json-with-bigint": { + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.8.tgz", + "integrity": "sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==", + "dev": true, + "license": "MIT" + }, "node_modules/latch": { - "version": "0.4.1", - "resolved": "file:latch-0.4.1.tgz", - "integrity": "sha512-GvpSRSwFcXl6t5h2gKyVbCB65QMJhzDhhSR+Yrl7H+AtApqJqYowl0vaDIUVrDgRvq/VBASZNYwy33TCuuxWlg==", + "version": "0.5.1", + "resolved": "file:latch-0.5.1.tgz", + "integrity": "sha512-eS8vjO9PVDfrdsx+F49wY2q2yLHSSWHzlgeQPIb6L7jG55fqvWCIbq3OrbB2HzO98LizPd4MCGi2kr+BJksPBQ==", "dev": true, "dependencies": { + "@thi.ng/leb128": "^3.1.75", "ansi-colors": "^4.1.3", "ieee754": "^1.2.1", + "json-with-bigint": "^3.5.8", "ora": "^8.0.1", "source-map": "^0.7.4", "ts-node": "^10.5.0", @@ -784,9 +869,9 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -957,9 +1042,9 @@ "license": "MIT" }, "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", "dev": true, "license": "MIT", "dependencies": { @@ -1145,13 +1230,13 @@ } }, "node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -1224,6 +1309,7 @@ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -1233,12 +1319,11 @@ } }, "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/util-deprecate": { "version": "1.0.2", @@ -1262,9 +1347,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "version": "7.5.11", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz", + "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==", "dev": true, "license": "MIT", "engines": { diff --git a/tests/latch/package.json b/tests/latch/package.json index fd5c16702..5351cfb90 100644 --- a/tests/latch/package.json +++ b/tests/latch/package.json @@ -8,7 +8,7 @@ "comptest": "npx ts-node ./src/comp.test.ts" }, "devDependencies": { - "latch": "file:./latch-0.5.1.tgz", + "latch": "file:latch-0.5.1.tgz", "mqtt": "^4.3.7", "serialport": "^10.4.0", "typescript": "^4.5.5" diff --git a/tests/latch/src/r3.test.ts b/tests/latch/src/r3.test.ts new file mode 100644 index 000000000..5e0020b0e --- /dev/null +++ b/tests/latch/src/r3.test.ts @@ -0,0 +1,36 @@ +import {EmulatorSpecification, Framework, Kind, Message, StyleType, Suite, TestScenario} from 'latch'; +import * as fs from 'fs'; +import * as path from 'path'; + +const framework = Framework.getImplementation(); +framework.reporter.style(StyleType.github); + +// TODO disclaimer: file is currently disabled until latch supports AS compilation + +const suite: Suite = framework.suite('End-to-end tests: R3 benchmark suite'); + +suite.testee('emulator [:8530]', new EmulatorSpecification(8530)); + +const scenarios: TestScenario[] = []; +const r3Directory = path.resolve(__dirname, '../static/r3'); +console.error(r3Directory) + +if (fs.existsSync(r3Directory)) { + fs.readdirSync(r3Directory) + .filter((file: string) => file.endsWith('.wat')) + .forEach((wasmFile: string) => { + scenarios.push({ + title: `R3: ${wasmFile}`, + program: path.join(r3Directory, wasmFile), + dependencies: [], + steps: [{ + title: `Run ${wasmFile}`, + instruction: {kind: Kind.Request, value: Message.run} + }] + }); + }); +} + +suite.tests(scenarios); + +framework.analyse([suite]); diff --git a/tests/latch/src/spec.test.ts b/tests/latch/src/spec.test.ts index 71cbdb81f..c8e9eae78 100644 --- a/tests/latch/src/spec.test.ts +++ b/tests/latch/src/spec.test.ts @@ -1,15 +1,4 @@ -import { - ArduinoSpecification, - EmulatorSpecification, - Framework, HybridScheduler, - invoke, - Invoker, - StyleType, - returns, - Step, - TestScenario, - WASM -} from 'latch'; +import {EmulatorSpecification, Framework, invoke, returns, Step, StyleType, TestScenario, WASM} from 'latch'; import {readdirSync} from 'fs'; import {basename} from 'path'; import {find, parseArguments, parseAsserts, parseResult} from "./util/spec.util"; @@ -65,7 +54,7 @@ spec.testee('emulator [:8500]', new EmulatorSpecification(8500)); //spec.testee('esp wrover', new ArduinoSpecification('/dev/ttyUSB0', 'esp32:esp32:esp32wrover'), new HybridScheduler()); spec.tests(tests); -framework.run([spec]); +framework.analyse([spec]); // Helper function @@ -75,8 +64,8 @@ function createTest(module: string, asserts: string[]): TestScenario { for (const assert of asserts) { const cursor = {value: 0}; const func: string = find(/invoke "([^"]+)"/, assert); - const args: WASM.Value[] = parseArguments(assert.replace(`(invoke "${func} "`, ''), cursor); - const result: WASM.Value | undefined = parseResult(assert.slice(cursor.value)); + const args: WASM.Value[] = parseArguments(assert.replace(`(invoke "${func} "`, ''), cursor); + const result: WASM.Value | undefined = parseResult(assert.slice(cursor.value)); steps.push({ title: assert, diff --git a/tests/latch/src/util/spec.util.ts b/tests/latch/src/util/spec.util.ts index 94c5a63c9..963a1d5b6 100644 --- a/tests/latch/src/util/spec.util.ts +++ b/tests/latch/src/util/spec.util.ts @@ -1,11 +1,12 @@ import {WASM} from "latch"; import {readFileSync} from "fs"; +import Value = WASM.Value; interface Cursor { value: number; } -export function parseResult(input: string): WASM.Value | undefined { +export function parseResult(input: string): WASM.Value | undefined { let cursor = 0; let delta: number = consume(input, cursor, /\(/d); if (delta === 0) { @@ -14,27 +15,39 @@ export function parseResult(input: string): WASM.Value | undefined { cursor += delta; delta = consume(input, cursor, /^[^.)]*/d); - const type: WASM.Type = WASM.typing.get(input.slice(cursor, cursor + delta)) ?? WASM.Type.i64; + let type: WASM.Type = WASM.typing.get(input.slice(cursor, cursor + delta)) ?? WASM.Integer.i64; cursor += delta + consume(input, cursor + delta); - let value; delta = consume(input, cursor, /^[^)]*/d); - if (type === WASM.Type.f32 || type === WASM.Type.f64) { - value = parseHexFloat(input.slice(cursor, cursor + delta)); - } else { - value = parseInteger(input.slice(cursor, cursor + delta)); - } + return parseValue(input.slice(cursor, cursor + delta), type); +} - if (value === undefined) { - return value; +function parseValue(input: string, type: WASM.Type): Value | undefined { + let value: number | bigint; + switch (type) { + case WASM.Float.f32: + case WASM.Float.f64: + value = parseHexFloat(input); + break; + case WASM.Integer.u32: + case WASM.Integer.i32: + case WASM.Integer.u64: + case WASM.Integer.i64: + value = parseInteger(input); + break; + default: + return undefined; } + type = typeof value !== 'bigint' && isNaN(value) ? WASM.Special.nan + : typeof value !== 'bigint' && value === Infinity ? WASM.Special.infinity + : type; return {type, value}; } -export function parseArguments(input: string, index: Cursor): WASM.Value[] { - const args: WASM.Value[] = []; +export function parseArguments(input: string, index: Cursor): WASM.Value[] { + const args: WASM.Value[] = []; let cursor: number = consume(input, 0, /invoke "[^"]+"/d); while (cursor < input.length) { @@ -45,19 +58,14 @@ export function parseArguments(input: string, index: Cursor): WASM.Value[] { cursor += delta; delta = consume(input, cursor, /^[^.)]*/d); - const type: WASM.Type = WASM.typing.get(input.slice(cursor + delta - 3, cursor + delta)) ?? WASM.Type.i64; + const type: WASM.Type = WASM.typing.get(input.slice(cursor + delta - 3, cursor + delta)) ?? WASM.Integer.i64; cursor += delta + consume(input, cursor + delta, /^[^)]*const /d); delta = consume(input, cursor, /^[^)]*/d); - let maybe: number | undefined; - if (type === WASM.Type.f32 || type === WASM.Type.f64) { - maybe = parseHexFloat(input.slice(cursor, cursor + delta)); - } else { - maybe = parseInteger(input.slice(cursor, cursor + delta)); - } + let maybe = parseValue(input.slice(cursor, cursor + delta), type); if (maybe !== undefined) { - args.push({type, value: maybe}); + args.push(maybe); } cursor += consume(input, cursor, /\)/d); @@ -131,14 +139,15 @@ function parseHexFloat(input: string): number { return mantissa * Math.pow(2, exponent); } -function parseInteger(hex: string, bytes: number = 4): number { +function parseInteger(hex: string, bytes: number = 4): bigint | number { if (!hex.includes('0x')) { - return parseInt(hex); + const n: number = parseInt(hex); + return typeof n !== 'bigint' && isNaN(n) ? NaN : typeof n !== 'bigint' && n === Infinity ? Infinity : BigInt(n); } - const mask = parseInt('0x80' + '00'.repeat(bytes - 1), 16); - let integer = parseInt(hex, 16); + const mask = BigInt(parseInt('0x80' + '00'.repeat(bytes - 1), 16)); + let integer = BigInt(parseInt(hex, 16)); if (integer >= mask) { - integer = integer - mask * 2; + integer = integer - mask * 2n; } return integer; }