diff --git a/asconfig.json b/asconfig.json index c474a40..384cc2b 100644 --- a/asconfig.json +++ b/asconfig.json @@ -20,6 +20,7 @@ } }, "options": { - "transform": [] + "transform": [], + "exportRuntime": true } } diff --git a/assembly/nfa/nfa.ts b/assembly/nfa/nfa.ts index ee12e83..b0ff21e 100644 --- a/assembly/nfa/nfa.ts +++ b/assembly/nfa/nfa.ts @@ -24,9 +24,11 @@ export enum MatchResult { Ignore, } +let _stateId: u32 = 0; + /* eslint @typescript-eslint/no-empty-function: ["error", { "allow": ["constructors", "methods"] }] */ export class State { - constructor(public transitions: State[] = []) {} + constructor(public transitions: State[] = [], public id: u32 = _stateId++) {} matches(input: string, position: u32): MatchResult { return MatchResult.Ignore; @@ -40,7 +42,7 @@ export class GroupStartMarkerState extends State { // captures from the path through the NFA that reaches the end are flagged flagged: bool = false; - constructor(next: State, public id: i32) { + constructor(next: State, public groupId: i32) { super(); this.transitions.push(next); } diff --git a/assembly/regexp.ts b/assembly/regexp.ts index e180bc8..51a5506 100644 --- a/assembly/regexp.ts +++ b/assembly/regexp.ts @@ -9,14 +9,16 @@ import { walker as astWalker, expandRepetitions } from "./parser/walker"; function recursiveBacktrackingSearch( state: State, input: string, - visited: State[] = [], + visited: u32[] = [], position: i32 = 0 ): string | null { // prevent endless loops when following epsilon transitions - if (visited.includes(state)) { - return null; + for (let i = 0, len = visited.length; i < len; i++) { + if (visited[i] == state.id) { + return null; + } } - visited.push(state); + visited.push(state.id); const matches = state.matches(input, position); if (matches == MatchResult.Match) { @@ -92,11 +94,11 @@ function filterCaptures(groupMarkers: GroupStartMarkerState[]): string[] { return []; } const values = [first(groupMarkers).capture]; - let currrentId = first(groupMarkers).id; + let currrentId = first(groupMarkers).groupId; for (let i = 0; i < groupMarkers.length; i++) { const gm = groupMarkers[i]; - if (gm.id != currrentId) { - currrentId = gm.id; + if (gm.groupId != currrentId) { + currrentId = gm.groupId; values.push(gm.capture); } else { if (gm.flagged) { diff --git a/benchmark/benchmark.js b/benchmark/benchmark.js index 6f9f369..73c58fb 100644 --- a/benchmark/benchmark.js +++ b/benchmark/benchmark.js @@ -1,6 +1,6 @@ global.TextDecoder = require("text-encoding").TextDecoder; const fs = require("fs"); -const loader = require("@assemblyscript/loader/umd/index"); +const loader = require("@assemblyscript/loader"); const Benchmark = require("benchmark"); const suite = new Benchmark.Suite(); @@ -10,10 +10,8 @@ wasmModule = loader.instantiateSync( { env: { log: () => { - const { __getString, __release } = wasmModule.exports; - str = __getString(strPtr); - console.log(str); - __release(strPtr); + const { __getString } = wasmModule.exports; + console.log(__getString(strPtr)); }, }, } @@ -21,19 +19,13 @@ wasmModule = loader.instantiateSync( // the executeRegExp exported function is ex function executeRegex(regexStr, valueStr, untilNull = false) { - const { - executeRegExp, - __newString, - __retain, - __release, - } = wasmModule.exports; + const { executeRegExp, __newString, __pin, __unpin } = wasmModule.exports; // create the regexp - const regexPtr = __retain(__newString(regexStr)); - const strPtr = __retain(__newString(valueStr)); + const regexPtr = __pin(__newString(regexStr)); + const strPtr = __newString(valueStr); executeRegExp(regexPtr, strPtr, untilNull ? -1 : 5); - __release(regexPtr); - __release(strPtr); + __unpin(regexPtr); } // add tests diff --git a/package-lock.json b/package-lock.json index 3121e19..b577051 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,13 +9,13 @@ "version": "0.1.0", "license": "MIT", "devDependencies": { - "@as-pect/cli": "^5.0.1", - "@assemblyscript/loader": "^0.17.5", + "@as-pect/cli": "^6.0.0", + "@assemblyscript/loader": "^0.18.0", "@types/node": "^14.14.13", "@typescript-eslint/eslint-plugin": "^4.14.1", "@typescript-eslint/parser": "^4.14.1", "asbuild": "0.0.10", - "assemblyscript": "0.17.5", + "assemblyscript": "^0.18.0", "benchmark": "^2.1.4", "eslint": "^7.18.0", "husky": "^4.2.5", @@ -27,21 +27,25 @@ } }, "node_modules/@as-pect/assembly": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@as-pect/assembly/-/assembly-5.0.1.tgz", - "integrity": "sha512-8tkBALZa8jjUmBoz67gRyl8X501IWzkyRl7rxIcJq6HycudlmL8zfxtZL4x70gtvK4nDcb885FmrnnknH5L+hQ==", - "dev": true + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@as-pect/assembly/-/assembly-6.0.0.tgz", + "integrity": "sha512-B1bBMg2onl+RomWLlsWfrHdB8d4Xu7GOJn5eMwI4gjXvDKfbNXeSrL1gdkL7oZAHCf04XJ0XRWdUXfPdqTZdGA==", + "dev": true, + "peerDependencies": { + "assemblyscript": "^0.18.7" + } }, "node_modules/@as-pect/cli": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@as-pect/cli/-/cli-5.0.1.tgz", - "integrity": "sha512-ceQFmeBpBqqbs8yJnyG2ZRfyaOUg8df7UFjoX8d++rlMOLHW0ZP/QByXZgmCpYo1aLP1wwvB2so6zUj2NeWECw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@as-pect/cli/-/cli-6.0.0.tgz", + "integrity": "sha512-YlRP56oflSwal03VXG/e08Ov8RsTvSYRajXh8Bb3HTLJaaoQhoodgHkQJPTZQy1rhIvJvYRN1uqZkZdppB8M/A==", "dev": true, + "license": "MIT", "dependencies": { - "@as-pect/assembly": "^5.0.1", - "@as-pect/core": "^5.0.1", - "@as-pect/csv-reporter": "^5.0.1", - "@as-pect/json-reporter": "^5.0.1", + "@as-pect/assembly": "^6.0.0", + "@as-pect/core": "^6.0.0", + "@as-pect/csv-reporter": "^6.0.0", + "@as-pect/json-reporter": "^6.0.0", "chalk": "^4.1.0", "glob": "^7.1.6" }, @@ -50,46 +54,52 @@ "aspect": "bin/asp" }, "optionalDependencies": { - "@as-pect/csv-reporter": "^5.0.1", - "@as-pect/json-reporter": "^5.0.1" + "@as-pect/csv-reporter": "^6.0.0", + "@as-pect/json-reporter": "^6.0.0" + }, + "peerDependencies": { + "assemblyscript": "^0.18.7" } }, "node_modules/@as-pect/core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@as-pect/core/-/core-5.0.1.tgz", - "integrity": "sha512-xG9UPngMZSXqfrvmRaeLuM/HVGsXQ1ftCuAqcBfx4HSoCEfrvda0XchEwO7ftWSuNv2tkfBscANGn4vOEjBcMg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@as-pect/core/-/core-6.0.0.tgz", + "integrity": "sha512-48KVLSZvUbIk0tjhwE6AIrnPICdWoziex0fmmvoXHHnNOoXv5lZPYwS/CjZcl8SAQlIgj6Qe692yo85BfCxE9g==", "dev": true, "dependencies": { - "@as-pect/assembly": "^5.0.1", - "@as-pect/snapshots": "^5.0.1", + "@as-pect/assembly": "^6.0.0", + "@as-pect/snapshots": "^6.0.0", "chalk": "^4.1.0", "long": "^4.0.0" + }, + "peerDependencies": { + "assemblyscript": "^0.18.7" } }, "node_modules/@as-pect/csv-reporter": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@as-pect/csv-reporter/-/csv-reporter-5.0.1.tgz", - "integrity": "sha512-XbzbVqXrB7Wds5yYgWiqFe9fNnYMZJQRdZafd7iETlkHhhfZgtYvLbYsdJfMeLMZSdhKInA91y+GkDi0fHEmDQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@as-pect/csv-reporter/-/csv-reporter-6.0.0.tgz", + "integrity": "sha512-2SrSN0UstjUlFCW7L/Z33tufTfWDOwPAZZ8WJNiiWbOgPSh0ML899DabR8UbH7eVQe1aeyS2LCSjhVKtmb7uSg==", "dev": true, "optional": true, "dependencies": { - "@as-pect/core": "^5.0.1" + "@as-pect/core": "^6.0.0" } }, "node_modules/@as-pect/json-reporter": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@as-pect/json-reporter/-/json-reporter-5.0.1.tgz", - "integrity": "sha512-pE3GFihSSgNCSVvJtOWJiZfzIOARALPj/U3c5j5D9ZcCG8N1lb/Ge2doOEb9cuVpVKymi5+e6+GCH8+PU3W5bA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@as-pect/json-reporter/-/json-reporter-6.0.0.tgz", + "integrity": "sha512-MW+bocR8Ys859oZwMighOY5ZWv0MDUGs1FToLwXOXk93EzlOyToDZ2ntEODpZW2zU8xX5rLv6zU/n1yr263i1g==", "dev": true, "optional": true, "dependencies": { - "@as-pect/core": "^5.0.1" + "@as-pect/core": "^6.0.0" } }, "node_modules/@as-pect/snapshots": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@as-pect/snapshots/-/snapshots-5.0.1.tgz", - "integrity": "sha512-+fQbJ2FfYcILPphKILFQmxf9Fbck4TmmQTLEJS0MbIv3tt2LeyTk5n8y/+JMAQ3pTb029EJjjAX8g1b83cCVig==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@as-pect/snapshots/-/snapshots-6.0.0.tgz", + "integrity": "sha512-5OMKJWYm3cfEX28TroY9j5CIhwO6q/300GShrxpDaNYva/HgA8iPY4dGdbiI4xcCf8xaHuBq2HQi0kYS+1wqjQ==", "dev": true, "dependencies": { "diff": "^5.0.0", @@ -97,9 +107,9 @@ } }, "node_modules/@assemblyscript/loader": { - "version": "0.17.7", - "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.17.7.tgz", - "integrity": "sha512-b3EESdpAEA7XqrnCBmkiM7bGX8r8M++6igAjy1LrflK4L3H78tCpXlKaams7/OEbwaycmyZL05vf7Yo8xCWBWA==", + "version": "0.18.9", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.18.9.tgz", + "integrity": "sha512-E49ZYGudAsDZG78mj59/OysLHait0igAm0PPx/Q21aT6qtgJC4RWYo8kaY/w6OV5TndX6ugEa9RDBSyx0lGDnQ==", "dev": true }, "node_modules/@babel/code-frame": { @@ -840,17 +850,21 @@ } }, "node_modules/assemblyscript": { - "version": "0.17.5", - "resolved": "https://registry.npmjs.org/assemblyscript/-/assemblyscript-0.17.5.tgz", - "integrity": "sha512-L+542VRdiC/XhIi5R/nKNDO5q1Vw1FFrWMxiR+EU20BMjL/KC1XvNheZYB22Ug9jEnjl9r/+zeZbfcQTOmzCwA==", + "version": "0.18.9", + "resolved": "https://registry.npmjs.org/assemblyscript/-/assemblyscript-0.18.9.tgz", + "integrity": "sha512-OYZiVY3DlZ5ZnvLHQkyjqnoXZO7xUHHkRDlPprP7w3907tMDrKCtp4uInm0/hUpHLlzcS7W7/BkvZXu28zOuSA==", "dev": true, "dependencies": { - "binaryen": "98.0.0-nightly.20201109", + "binaryen": "98.0.0-nightly.20210106", "long": "^4.0.0" }, "bin": { "asc": "bin/asc", "asinit": "bin/asinit" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/assemblyscript" } }, "node_modules/astral-regex": { @@ -894,9 +908,9 @@ } }, "node_modules/binaryen": { - "version": "98.0.0-nightly.20201109", - "resolved": "https://registry.npmjs.org/binaryen/-/binaryen-98.0.0-nightly.20201109.tgz", - "integrity": "sha512-iRarAqdH5lMWlMBzrDuJgLYJR2g4QXk93iYE2zpr6gEZkb/jCgDpPUXdhuN11Ge1zZ/6By4DwA1mmifcx7FWaw==", + "version": "98.0.0-nightly.20210106", + "resolved": "https://registry.npmjs.org/binaryen/-/binaryen-98.0.0-nightly.20210106.tgz", + "integrity": "sha512-iunAgesqT9PXVYCc72FA4h0sCCKLifruT6NuUH63xqlFJGpChhZLgOtyIb/fIgTibN5Pd692cxfBViyCWFsJ9Q==", "dev": true, "bin": { "wasm-opt": "bin/wasm-opt" @@ -3011,6 +3025,10 @@ "nearley-test": "bin/nearley-test.js", "nearley-unparse": "bin/nearley-unparse.js", "nearleyc": "bin/nearleyc.js" + }, + "funding": { + "type": "individual", + "url": "https://nearley.js.org/#give-to-nearley" } }, "node_modules/neo-async": { @@ -10190,61 +10208,62 @@ }, "dependencies": { "@as-pect/assembly": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@as-pect/assembly/-/assembly-5.0.1.tgz", - "integrity": "sha512-8tkBALZa8jjUmBoz67gRyl8X501IWzkyRl7rxIcJq6HycudlmL8zfxtZL4x70gtvK4nDcb885FmrnnknH5L+hQ==", - "dev": true + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@as-pect/assembly/-/assembly-6.0.0.tgz", + "integrity": "sha512-B1bBMg2onl+RomWLlsWfrHdB8d4Xu7GOJn5eMwI4gjXvDKfbNXeSrL1gdkL7oZAHCf04XJ0XRWdUXfPdqTZdGA==", + "dev": true, + "requires": {} }, "@as-pect/cli": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@as-pect/cli/-/cli-5.0.1.tgz", - "integrity": "sha512-ceQFmeBpBqqbs8yJnyG2ZRfyaOUg8df7UFjoX8d++rlMOLHW0ZP/QByXZgmCpYo1aLP1wwvB2so6zUj2NeWECw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@as-pect/cli/-/cli-6.0.0.tgz", + "integrity": "sha512-YlRP56oflSwal03VXG/e08Ov8RsTvSYRajXh8Bb3HTLJaaoQhoodgHkQJPTZQy1rhIvJvYRN1uqZkZdppB8M/A==", "dev": true, "requires": { - "@as-pect/assembly": "^5.0.1", - "@as-pect/core": "^5.0.1", - "@as-pect/csv-reporter": "^5.0.1", - "@as-pect/json-reporter": "^5.0.1", + "@as-pect/assembly": "^6.0.0", + "@as-pect/core": "^6.0.0", + "@as-pect/csv-reporter": "^6.0.0", + "@as-pect/json-reporter": "^6.0.0", "chalk": "^4.1.0", "glob": "^7.1.6" } }, "@as-pect/core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@as-pect/core/-/core-5.0.1.tgz", - "integrity": "sha512-xG9UPngMZSXqfrvmRaeLuM/HVGsXQ1ftCuAqcBfx4HSoCEfrvda0XchEwO7ftWSuNv2tkfBscANGn4vOEjBcMg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@as-pect/core/-/core-6.0.0.tgz", + "integrity": "sha512-48KVLSZvUbIk0tjhwE6AIrnPICdWoziex0fmmvoXHHnNOoXv5lZPYwS/CjZcl8SAQlIgj6Qe692yo85BfCxE9g==", "dev": true, "requires": { - "@as-pect/assembly": "^5.0.1", - "@as-pect/snapshots": "^5.0.1", + "@as-pect/assembly": "^6.0.0", + "@as-pect/snapshots": "^6.0.0", "chalk": "^4.1.0", "long": "^4.0.0" } }, "@as-pect/csv-reporter": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@as-pect/csv-reporter/-/csv-reporter-5.0.1.tgz", - "integrity": "sha512-XbzbVqXrB7Wds5yYgWiqFe9fNnYMZJQRdZafd7iETlkHhhfZgtYvLbYsdJfMeLMZSdhKInA91y+GkDi0fHEmDQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@as-pect/csv-reporter/-/csv-reporter-6.0.0.tgz", + "integrity": "sha512-2SrSN0UstjUlFCW7L/Z33tufTfWDOwPAZZ8WJNiiWbOgPSh0ML899DabR8UbH7eVQe1aeyS2LCSjhVKtmb7uSg==", "dev": true, "optional": true, "requires": { - "@as-pect/core": "^5.0.1" + "@as-pect/core": "^6.0.0" } }, "@as-pect/json-reporter": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@as-pect/json-reporter/-/json-reporter-5.0.1.tgz", - "integrity": "sha512-pE3GFihSSgNCSVvJtOWJiZfzIOARALPj/U3c5j5D9ZcCG8N1lb/Ge2doOEb9cuVpVKymi5+e6+GCH8+PU3W5bA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@as-pect/json-reporter/-/json-reporter-6.0.0.tgz", + "integrity": "sha512-MW+bocR8Ys859oZwMighOY5ZWv0MDUGs1FToLwXOXk93EzlOyToDZ2ntEODpZW2zU8xX5rLv6zU/n1yr263i1g==", "dev": true, "optional": true, "requires": { - "@as-pect/core": "^5.0.1" + "@as-pect/core": "^6.0.0" } }, "@as-pect/snapshots": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@as-pect/snapshots/-/snapshots-5.0.1.tgz", - "integrity": "sha512-+fQbJ2FfYcILPphKILFQmxf9Fbck4TmmQTLEJS0MbIv3tt2LeyTk5n8y/+JMAQ3pTb029EJjjAX8g1b83cCVig==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@as-pect/snapshots/-/snapshots-6.0.0.tgz", + "integrity": "sha512-5OMKJWYm3cfEX28TroY9j5CIhwO6q/300GShrxpDaNYva/HgA8iPY4dGdbiI4xcCf8xaHuBq2HQi0kYS+1wqjQ==", "dev": true, "requires": { "diff": "^5.0.0", @@ -10252,9 +10271,9 @@ } }, "@assemblyscript/loader": { - "version": "0.17.7", - "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.17.7.tgz", - "integrity": "sha512-b3EESdpAEA7XqrnCBmkiM7bGX8r8M++6igAjy1LrflK4L3H78tCpXlKaams7/OEbwaycmyZL05vf7Yo8xCWBWA==", + "version": "0.18.9", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.18.9.tgz", + "integrity": "sha512-E49ZYGudAsDZG78mj59/OysLHait0igAm0PPx/Q21aT6qtgJC4RWYo8kaY/w6OV5TndX6ugEa9RDBSyx0lGDnQ==", "dev": true }, "@babel/code-frame": { @@ -10871,12 +10890,12 @@ } }, "assemblyscript": { - "version": "0.17.5", - "resolved": "https://registry.npmjs.org/assemblyscript/-/assemblyscript-0.17.5.tgz", - "integrity": "sha512-L+542VRdiC/XhIi5R/nKNDO5q1Vw1FFrWMxiR+EU20BMjL/KC1XvNheZYB22Ug9jEnjl9r/+zeZbfcQTOmzCwA==", + "version": "0.18.9", + "resolved": "https://registry.npmjs.org/assemblyscript/-/assemblyscript-0.18.9.tgz", + "integrity": "sha512-OYZiVY3DlZ5ZnvLHQkyjqnoXZO7xUHHkRDlPprP7w3907tMDrKCtp4uInm0/hUpHLlzcS7W7/BkvZXu28zOuSA==", "dev": true, "requires": { - "binaryen": "98.0.0-nightly.20201109", + "binaryen": "98.0.0-nightly.20210106", "long": "^4.0.0" } }, @@ -10915,9 +10934,9 @@ } }, "binaryen": { - "version": "98.0.0-nightly.20201109", - "resolved": "https://registry.npmjs.org/binaryen/-/binaryen-98.0.0-nightly.20201109.tgz", - "integrity": "sha512-iRarAqdH5lMWlMBzrDuJgLYJR2g4QXk93iYE2zpr6gEZkb/jCgDpPUXdhuN11Ge1zZ/6By4DwA1mmifcx7FWaw==", + "version": "98.0.0-nightly.20210106", + "resolved": "https://registry.npmjs.org/binaryen/-/binaryen-98.0.0-nightly.20210106.tgz", + "integrity": "sha512-iunAgesqT9PXVYCc72FA4h0sCCKLifruT6NuUH63xqlFJGpChhZLgOtyIb/fIgTibN5Pd692cxfBViyCWFsJ9Q==", "dev": true }, "bottleneck": { diff --git a/package.json b/package.json index a754a20..5132269 100644 --- a/package.json +++ b/package.json @@ -21,13 +21,13 @@ "author": "colin.eberhardt@gmail.com", "license": "MIT", "devDependencies": { - "@as-pect/cli": "^5.0.1", - "@assemblyscript/loader": "^0.17.5", + "@as-pect/cli": "^6.0.0", + "@assemblyscript/loader": "^0.18.0", "@types/node": "^14.14.13", "@typescript-eslint/eslint-plugin": "^4.14.1", "@typescript-eslint/parser": "^4.14.1", "asbuild": "0.0.10", - "assemblyscript": "0.17.5", + "assemblyscript": "^0.18.0", "benchmark": "^2.1.4", "eslint": "^7.18.0", "husky": "^4.2.5",