diff --git a/deps/cjs-module-lexer/dist/lexer.js b/deps/cjs-module-lexer/dist/lexer.js index cb397040a42a7e..e1a05b5b260684 100644 --- a/deps/cjs-module-lexer/dist/lexer.js +++ b/deps/cjs-module-lexer/dist/lexer.js @@ -1 +1 @@ -"use strict";exports.init=init;exports.initSync=initSync;exports.parse=parse;let A;const B=1===new Uint8Array(new Uint16Array([1]).buffer)[0];function parse(I,C="@"){if(!A)throw new Error("Not initialized");const w=I.length+1,D=(A.__heap_base.value||A.__heap_base)+4*w-A.memory.buffer.byteLength;D>0&&A.memory.grow(Math.ceil(D/65536));const G=A.sa(w);(B?g:E)(I,new Uint16Array(A.memory.buffer,G,w));const S=A.parseCJS(G,I.length,0,0,0);if(S){const B=new Error(`Parse error ${C}${A.e()}:${I.slice(0,A.e()).split("\n").length}:${A.e()-I.lastIndexOf("\n",A.e()-1)}`);throw Object.assign(B,{idx:A.e()}),5!==S&&6!==S&&7!==S||Object.assign(B,{code:"ERR_LEXER_ESM_SYNTAX"}),B}let R=new Set,H=new Set,o=new Set;for(;A.rre();){const B=Q(I.slice(A.res(),A.ree()));B&&H.add(B)}for(;A.ru();)o.add(Q(I.slice(A.us(),A.ue())));for(;A.re();){let B=Q(I.slice(A.es(),A.ee()));void 0===B||o.has(B)||R.add(B)}return{exports:[...R],reexports:[...H]}}function Q(A){if('"'!==A[0]&&"'"!==A[0])return A;try{const B=(0,eval)(A);for(let A=0;A>>8}}function g(A,B){const Q=A.length;let E=0;for(;EA.charCodeAt(0))}let C;function init(){return C||(C=(async()=>{const B=await WebAssembly.compile(I()),{exports:Q}=await WebAssembly.instantiate(B);A=Q})())}function initSync(){if(A)return;const B=new WebAssembly.Module(I()),{exports:Q}=new WebAssembly.Instance(B);A=Q} \ No newline at end of file +"use strict";exports.init=init;exports.initSync=initSync;exports.parse=parse;let A;const B=1===new Uint8Array(new Uint16Array([1]).buffer)[0];function parse(E,g="@"){if(!A)throw new Error("Not initialized");const w=E.length+1,D=(A.__heap_base.value||A.__heap_base)+4*w-A.memory.buffer.byteLength;D>0&&A.memory.grow(Math.ceil(D/65536));const G=A.sa(w);(B?C:I)(E,new Uint16Array(A.memory.buffer,G,w));const S=A.parseCJS(G,E.length,0,0,0);if(S){const B=new Error(`Parse error ${g}${A.e()}:${E.slice(0,A.e()).split("\n").length}:${A.e()-E.lastIndexOf("\n",A.e()-1)}`);throw Object.assign(B,{idx:A.e()}),5!==S&&6!==S&&7!==S||Object.assign(B,{code:"ERR_LEXER_ESM_SYNTAX"}),B}let o=new Set,R=new Set,y=new Set;for(;A.rre();){const B=Q(E.slice(A.res(),A.ree()));B&&R.add(B)}for(;A.ru();)y.add(Q(E.slice(A.us(),A.ue())));for(;A.re();){let B=Q(E.slice(A.es(),A.ee()));void 0===B||y.has(B)||o.add(B)}return{exports:[...o],reexports:[...R]}}function Q(A){if('"'!==A[0]&&"'"!==A[0])return A;try{const B=function(A){const B=A[0];if('"'===B)try{return JSON.parse(A)}catch{}else if("'"===B&&A.length>1&&"'"===A[A.length-1]&&-1===A.indexOf('"'))try{return JSON.parse('"'+A.slice(1,-1)+'"')}catch{}let Q="",g={v:1};for(;g.v1114111)throw new SyntaxError;++B.v}while("}"!==A[B.v]);++B.v}else for(let E=0;E<4;++E)Q=16*Q+g(A[B.v]),++B.v;return String.fromCodePoint(Q)}(A,B);case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":return function(A,B,Q){let E=A<="3"?2:1,g=+A;do{if((A=B[Q.v])<"0"||A>"7")break;g=8*g+ +A,++Q.v,--E}while(E>0);return String.fromCodePoint(g)}(Q,A,B);default:return Q}}function g(A){if(A>="0"&&A<="9")return+A;if(A>="a"&&A<="f")return A.charCodeAt(0)-87;if(A>="A"&&A<="F")return A.charCodeAt(0)-55;throw new SyntaxError}function I(A,B){const Q=A.length;let E=0;for(;E>>8}}function C(A,B){const Q=A.length;let E=0;for(;EA.charCodeAt(0))}let D;function init(){return D||(D=(async()=>{const B=await WebAssembly.compile(w()),{exports:Q}=await WebAssembly.instantiate(B);A=Q})())}function initSync(){if(A)return;const B=new WebAssembly.Module(w()),{exports:Q}=new WebAssembly.Instance(B);A=Q} \ No newline at end of file diff --git a/deps/cjs-module-lexer/dist/lexer.mjs b/deps/cjs-module-lexer/dist/lexer.mjs index a6bbeffdf8a288..44a2f3eb0d1c35 100644 --- a/deps/cjs-module-lexer/dist/lexer.mjs +++ b/deps/cjs-module-lexer/dist/lexer.mjs @@ -1,2 +1,2 @@ -/* cjs-module-lexer 2.1.1 */ -let A;const B=1===new Uint8Array(new Uint16Array([1]).buffer)[0];export function parse(I,C="@"){if(!A)throw new Error("Not initialized");const w=I.length+1,D=(A.__heap_base.value||A.__heap_base)+4*w-A.memory.buffer.byteLength;D>0&&A.memory.grow(Math.ceil(D/65536));const G=A.sa(w);(B?g:E)(I,new Uint16Array(A.memory.buffer,G,w));const S=A.parseCJS(G,I.length,0,0,0);if(S){const B=new Error(`Parse error ${C}${A.e()}:${I.slice(0,A.e()).split("\n").length}:${A.e()-I.lastIndexOf("\n",A.e()-1)}`);throw Object.assign(B,{idx:A.e()}),5!==S&&6!==S&&7!==S||Object.assign(B,{code:"ERR_LEXER_ESM_SYNTAX"}),B}let R=new Set,H=new Set,o=new Set;for(;A.rre();){const B=Q(I.slice(A.res(),A.ree()));B&&H.add(B)}for(;A.ru();)o.add(Q(I.slice(A.us(),A.ue())));for(;A.re();){let B=Q(I.slice(A.es(),A.ee()));void 0===B||o.has(B)||R.add(B)}return{exports:[...R],reexports:[...H]}}function Q(A){if('"'!==A[0]&&"'"!==A[0])return A;try{const B=(0,eval)(A);for(let A=0;A>>8}}function g(A,B){const Q=A.length;let E=0;for(;EA.charCodeAt(0))}let C;export function init(){return C||(C=(async()=>{const B=await WebAssembly.compile(I()),{exports:Q}=await WebAssembly.instantiate(B);A=Q})())}export function initSync(){if(A)return;const B=new WebAssembly.Module(I()),{exports:Q}=new WebAssembly.Instance(B);A=Q} \ No newline at end of file +/* cjs-module-lexer 2.2.0 */ +let A;const B=1===new Uint8Array(new Uint16Array([1]).buffer)[0];export function parse(E,g="@"){if(!A)throw new Error("Not initialized");const w=E.length+1,D=(A.__heap_base.value||A.__heap_base)+4*w-A.memory.buffer.byteLength;D>0&&A.memory.grow(Math.ceil(D/65536));const G=A.sa(w);(B?C:I)(E,new Uint16Array(A.memory.buffer,G,w));const S=A.parseCJS(G,E.length,0,0,0);if(S){const B=new Error(`Parse error ${g}${A.e()}:${E.slice(0,A.e()).split("\n").length}:${A.e()-E.lastIndexOf("\n",A.e()-1)}`);throw Object.assign(B,{idx:A.e()}),5!==S&&6!==S&&7!==S||Object.assign(B,{code:"ERR_LEXER_ESM_SYNTAX"}),B}let o=new Set,R=new Set,y=new Set;for(;A.rre();){const B=Q(E.slice(A.res(),A.ree()));B&&R.add(B)}for(;A.ru();)y.add(Q(E.slice(A.us(),A.ue())));for(;A.re();){let B=Q(E.slice(A.es(),A.ee()));void 0===B||y.has(B)||o.add(B)}return{exports:[...o],reexports:[...R]}}function Q(A){if('"'!==A[0]&&"'"!==A[0])return A;try{const B=function(A){const B=A[0];if('"'===B)try{return JSON.parse(A)}catch{}else if("'"===B&&A.length>1&&"'"===A[A.length-1]&&-1===A.indexOf('"'))try{return JSON.parse('"'+A.slice(1,-1)+'"')}catch{}let Q="",g={v:1};for(;g.v1114111)throw new SyntaxError;++B.v}while("}"!==A[B.v]);++B.v}else for(let E=0;E<4;++E)Q=16*Q+g(A[B.v]),++B.v;return String.fromCodePoint(Q)}(A,B);case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":return function(A,B,Q){let E=A<="3"?2:1,g=+A;do{if((A=B[Q.v])<"0"||A>"7")break;g=8*g+ +A,++Q.v,--E}while(E>0);return String.fromCodePoint(g)}(Q,A,B);default:return Q}}function g(A){if(A>="0"&&A<="9")return+A;if(A>="a"&&A<="f")return A.charCodeAt(0)-87;if(A>="A"&&A<="F")return A.charCodeAt(0)-55;throw new SyntaxError}function I(A,B){const Q=A.length;let E=0;for(;E>>8}}function C(A,B){const Q=A.length;let E=0;for(;EA.charCodeAt(0))}let D;export function init(){return D||(D=(async()=>{const B=await WebAssembly.compile(w()),{exports:Q}=await WebAssembly.instantiate(B);A=Q})())}export function initSync(){if(A)return;const B=new WebAssembly.Module(w()),{exports:Q}=new WebAssembly.Instance(B);A=Q} \ No newline at end of file diff --git a/deps/cjs-module-lexer/lexer.js b/deps/cjs-module-lexer/lexer.js index 6807f0bffc2843..1614fd9e62d88f 100755 --- a/deps/cjs-module-lexer/lexer.js +++ b/deps/cjs-module-lexer/lexer.js @@ -55,7 +55,7 @@ function parseCJS (source, name = '@') { function decode (str) { if (str[0] === '"' || str[0] === '\'') { try { - const decoded = (0, eval)(str); + const decoded = scanStringLiteral(str); // Filter to exclude non-matching UTF-16 surrogate strings for (let i = 0; i < decoded.length; i++) { const surrogatePrefix = decoded.charCodeAt(i) & 0xFC00; @@ -1027,6 +1027,168 @@ function tryParseLiteralExports () { } } +// This function and it's callees are duplicated in src/lexer.js +function scanStringLiteral (source) { + const quote = source[0]; + + // try JSON.parse first for performance + if (quote === '"') { + try { + return JSON.parse(source); + } catch { + // ignored + } + } else if (quote === "'" && source.length > 1 && source[source.length - 1] === "'" && source.indexOf('"') === -1) { + try { + return JSON.parse('"' + source.slice(1, -1) + '"'); + } catch { + // ignored + } + } + + // fall back to doing it the hard way + let parsed = ''; + let index = { v: 1 }; + + while (index.v < source.length) { + const char = source[index.v]; + switch (char) { + case quote: { + return parsed; + } + case '\\': { + ++index.v; + parsed += scanEscapeSequence(source, index); + break; + } + case '\r': + case '\n': { + throw new SyntaxError(); + } + default: { + ++index.v; + parsed += char; + } + } + } + + throw new SyntaxError(); +} + +function scanEscapeSequence (source, index) { + if (index.v === source.length) { + throw new SyntaxError(); + } + const char = source[index.v]; + ++index.v; + switch (char) { + case '\r': { + if (source[index.v] === '\n') { + ++index.v; + } + // fall through + } + case '\n': + case '\u2028': + case '\u2029': { + return ''; + } + case 'r': { + return '\r'; + } + case 'n': { + return '\n'; + } + case 't': { + return '\t'; + } + case 'b': { + return '\b'; + } + case 'f': { + return '\f'; + } + case 'v': { + return '\v'; + } + case 'x': { + return scanHexEscapeSequence(source, index); + } + case 'u': { + return scanUnicodeEscapeSequence(source, index); + } + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': { + return scanOctalEscapeSequence(char, source, index); + } + default: { + return char; + } + } +} + +function scanHexEscapeSequence (source, index) { + const a = readHex(source[index.v]); + ++index.v; + const b = readHex(source[index.v]); + ++index.v; + return String.fromCodePoint(a * 16 + b); +} + +function scanUnicodeEscapeSequence (source, index) { + let result = 0; + if (source[index.v] === '{') { + ++index.v; + do { + result = result * 16 + readHex(source[index.v]); + if (result > 0x10FFFF) { + throw new SyntaxError(); + } + ++index.v; + } while (source[index.v] !== '}'); + ++index.v; + } else { + for (let i = 0; i < 4; ++i) { + result = result * 16 + readHex(source[index.v]); + ++index.v; + } + } + return String.fromCodePoint(result); +} + +function scanOctalEscapeSequence (char, source, index) { + let toRead = char <= '3' ? 2 : 1; + let result = +char; + do { + char = source[index.v]; + if (char < '0' || char > '7') { + break; + } + result = result * 8 + (+char); + ++index.v; + --toRead; + } while (toRead > 0); + return String.fromCodePoint(result); +} + +function readHex (char) { + if (char >= '0' && char <= '9') { + return +char; + } else if (char >= 'a' && char <= 'f') { + return char.charCodeAt(0) - 87; + } else if (char >= 'A' && char <= 'F') { + return char.charCodeAt(0) - 55; + } + throw new SyntaxError(); +} + + // --- Extracted from AcornJS --- //(https://github.com/acornjs/acorn/blob/master/acorn/src/identifier.js#L23 // diff --git a/deps/cjs-module-lexer/src/lexer.js b/deps/cjs-module-lexer/src/lexer.js index 6807f0bffc2843..1614fd9e62d88f 100755 --- a/deps/cjs-module-lexer/src/lexer.js +++ b/deps/cjs-module-lexer/src/lexer.js @@ -55,7 +55,7 @@ function parseCJS (source, name = '@') { function decode (str) { if (str[0] === '"' || str[0] === '\'') { try { - const decoded = (0, eval)(str); + const decoded = scanStringLiteral(str); // Filter to exclude non-matching UTF-16 surrogate strings for (let i = 0; i < decoded.length; i++) { const surrogatePrefix = decoded.charCodeAt(i) & 0xFC00; @@ -1027,6 +1027,168 @@ function tryParseLiteralExports () { } } +// This function and it's callees are duplicated in src/lexer.js +function scanStringLiteral (source) { + const quote = source[0]; + + // try JSON.parse first for performance + if (quote === '"') { + try { + return JSON.parse(source); + } catch { + // ignored + } + } else if (quote === "'" && source.length > 1 && source[source.length - 1] === "'" && source.indexOf('"') === -1) { + try { + return JSON.parse('"' + source.slice(1, -1) + '"'); + } catch { + // ignored + } + } + + // fall back to doing it the hard way + let parsed = ''; + let index = { v: 1 }; + + while (index.v < source.length) { + const char = source[index.v]; + switch (char) { + case quote: { + return parsed; + } + case '\\': { + ++index.v; + parsed += scanEscapeSequence(source, index); + break; + } + case '\r': + case '\n': { + throw new SyntaxError(); + } + default: { + ++index.v; + parsed += char; + } + } + } + + throw new SyntaxError(); +} + +function scanEscapeSequence (source, index) { + if (index.v === source.length) { + throw new SyntaxError(); + } + const char = source[index.v]; + ++index.v; + switch (char) { + case '\r': { + if (source[index.v] === '\n') { + ++index.v; + } + // fall through + } + case '\n': + case '\u2028': + case '\u2029': { + return ''; + } + case 'r': { + return '\r'; + } + case 'n': { + return '\n'; + } + case 't': { + return '\t'; + } + case 'b': { + return '\b'; + } + case 'f': { + return '\f'; + } + case 'v': { + return '\v'; + } + case 'x': { + return scanHexEscapeSequence(source, index); + } + case 'u': { + return scanUnicodeEscapeSequence(source, index); + } + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': { + return scanOctalEscapeSequence(char, source, index); + } + default: { + return char; + } + } +} + +function scanHexEscapeSequence (source, index) { + const a = readHex(source[index.v]); + ++index.v; + const b = readHex(source[index.v]); + ++index.v; + return String.fromCodePoint(a * 16 + b); +} + +function scanUnicodeEscapeSequence (source, index) { + let result = 0; + if (source[index.v] === '{') { + ++index.v; + do { + result = result * 16 + readHex(source[index.v]); + if (result > 0x10FFFF) { + throw new SyntaxError(); + } + ++index.v; + } while (source[index.v] !== '}'); + ++index.v; + } else { + for (let i = 0; i < 4; ++i) { + result = result * 16 + readHex(source[index.v]); + ++index.v; + } + } + return String.fromCodePoint(result); +} + +function scanOctalEscapeSequence (char, source, index) { + let toRead = char <= '3' ? 2 : 1; + let result = +char; + do { + char = source[index.v]; + if (char < '0' || char > '7') { + break; + } + result = result * 8 + (+char); + ++index.v; + --toRead; + } while (toRead > 0); + return String.fromCodePoint(result); +} + +function readHex (char) { + if (char >= '0' && char <= '9') { + return +char; + } else if (char >= 'a' && char <= 'f') { + return char.charCodeAt(0) - 87; + } else if (char >= 'A' && char <= 'F') { + return char.charCodeAt(0) - 55; + } + throw new SyntaxError(); +} + + // --- Extracted from AcornJS --- //(https://github.com/acornjs/acorn/blob/master/acorn/src/identifier.js#L23 // diff --git a/deps/cjs-module-lexer/src/package-lock.json b/deps/cjs-module-lexer/src/package-lock.json index f80411b7d9376d..61fd2b65fdfc51 100644 --- a/deps/cjs-module-lexer/src/package-lock.json +++ b/deps/cjs-module-lexer/src/package-lock.json @@ -1,12 +1,12 @@ { "name": "cjs-module-lexer", - "version": "2.1.1", + "version": "2.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cjs-module-lexer", - "version": "2.1.1", + "version": "2.2.0", "license": "MIT", "devDependencies": { "@babel/cli": "^7.5.5", @@ -86,7 +86,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", "dev": true, - "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.5", @@ -555,7 +554,6 @@ "url": "https://github.com/sponsors/ai" } ], - "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001489", "electron-to-chromium": "^1.4.411", diff --git a/deps/cjs-module-lexer/src/package.json b/deps/cjs-module-lexer/src/package.json index d6c84bdd4328a0..0e1bbf829f8acd 100755 --- a/deps/cjs-module-lexer/src/package.json +++ b/deps/cjs-module-lexer/src/package.json @@ -1,6 +1,6 @@ { "name": "cjs-module-lexer", - "version": "2.1.1", + "version": "2.2.0", "description": "Lexes CommonJS modules, returning their named exports metadata", "main": "lexer.js", "exports": { @@ -12,10 +12,10 @@ }, "types": "lexer.d.ts", "scripts": { - "test-js": "mocha -b -u tdd test/*.js", - "test-wasm": "cross-env WASM=1 mocha -b -u tdd test/*.js", - "test-wasm-sync": "cross-env WASM_SYNC=1 mocha -b -u tdd test/*.js", - "test": "npm run test-wasm ; npm run test-wasm-sync ; npm run test-js", + "test-js": "cross-env NODE_OPTIONS=--disallow-code-generation-from-strings mocha -b -u tdd test/*.js", + "test-wasm": "cross-env WASM=1 NODE_OPTIONS=--disallow-code-generation-from-strings mocha -b -u tdd test/*.js", + "test-wasm-sync": "cross-env WASM_SYNC=1 NODE_OPTIONS=--disallow-code-generation-from-strings mocha -b -u tdd test/*.js", + "test": "npm run test-wasm && npm run test-wasm-sync && npm run test-js", "bench": "node --expose-gc bench/index.mjs", "build": "node build.js ; babel dist/lexer.mjs -o dist/lexer.js ; terser dist/lexer.js -o dist/lexer.js", "build-wasm": "make lib/lexer.wasm ; node build.js", diff --git a/deps/cjs-module-lexer/src/src/lexer.js b/deps/cjs-module-lexer/src/src/lexer.js index 1fc557dd1ef17a..30bca50218e07a 100755 --- a/deps/cjs-module-lexer/src/src/lexer.js +++ b/deps/cjs-module-lexer/src/src/lexer.js @@ -47,7 +47,7 @@ export function parse (source, name = '@') { function decode (str) { if (str[0] === '"' || str[0] === '\'') { try { - const decoded = (0, eval)(str); + const decoded = scanStringLiteral(str); // Filter to exclude non-matching UTF-16 surrogate strings for (let i = 0; i < decoded.length; i++) { const surrogatePrefix = decoded.charCodeAt(i) & 0xFC00; @@ -74,6 +74,169 @@ function decode (str) { } } + +function scanStringLiteral (source) { + const quote = source[0]; + + // try JSON.parse first for performance + if (quote === '"') { + try { + return JSON.parse(source); + } catch { + // ignored + } + } else if (quote === "'" && source.length > 1 && source[source.length - 1] === "'" && source.indexOf('"') === -1) { + try { + return JSON.parse('"' + source.slice(1, -1) + '"'); + } catch { + // ignored + } + } + + // fall back to doing it the hard way + let parsed = ''; + let index = { v: 1 }; + + while (index.v < source.length) { + const char = source[index.v]; + switch (char) { + case quote: { + return parsed; + } + case '\\': { + ++index.v; + parsed += scanEscapeSequence(source, index); + break; + } + case '\r': + case '\n': { + throw new SyntaxError(); + } + default: { + ++index.v; + parsed += char; + } + } + } + + throw new SyntaxError(); +} + +function scanEscapeSequence (source, index) { + if (index.v === source.length) { + throw new SyntaxError(); + } + const char = source[index.v]; + ++index.v; + switch (char) { + case '\r': { + if (source[index.v] === '\n') { + ++index.v; + } + // fall through + } + case '\n': + case '\u2028': + case '\u2029': { + return ''; + } + case 'r': { + return '\r'; + } + case 'n': { + return '\n'; + } + case 't': { + return '\t'; + } + case 'b': { + return '\b'; + } + case 'f': { + return '\f'; + } + case 'v': { + return '\v'; + } + case 'x': { + return scanHexEscapeSequence(source, index); + } + case 'u': { + return scanUnicodeEscapeSequence(source, index); + } + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': { + return scanOctalEscapeSequence(char, source, index); + } + default: { + return char; + } + } +} + +function scanHexEscapeSequence (source, index) { + const a = readHex(source[index.v]); + ++index.v; + const b = readHex(source[index.v]); + ++index.v; + return String.fromCodePoint(a * 16 + b); +} + +function scanUnicodeEscapeSequence (source, index) { + let result = 0; + if (source[index.v] === '{') { + ++index.v; + do { + result = result * 16 + readHex(source[index.v]); + if (result > 0x10FFFF) { + throw new SyntaxError(); + } + ++index.v; + } while (source[index.v] !== '}'); + ++index.v; + } else { + for (let i = 0; i < 4; ++i) { + result = result * 16 + readHex(source[index.v]); + ++index.v; + } + } + return String.fromCodePoint(result); +} + +function scanOctalEscapeSequence (char, source, index) { + let toRead = char <= '3' ? 2 : 1; + let result = +char; + do { + char = source[index.v]; + if (char < '0' || char > '7') { + break; + } + result = result * 8 + (+char); + ++index.v; + --toRead; + } while (toRead > 0); + return String.fromCodePoint(result); +} + +function readHex (char) { + if (char >= '0' && char <= '9') { + return +char; + } else if (char >= 'a' && char <= 'f') { + return char.charCodeAt(0) - 87; + } else if (char >= 'A' && char <= 'F') { + return char.charCodeAt(0) - 55; + } + throw new SyntaxError(); +} + + + function copyBE (src, outBuf16) { const len = src.length; let i = 0; diff --git a/src/cjs_module_lexer_version.h b/src/cjs_module_lexer_version.h index 0aaa4cc5fcacdc..c734bdcc9ba184 100644 --- a/src/cjs_module_lexer_version.h +++ b/src/cjs_module_lexer_version.h @@ -2,5 +2,5 @@ // Refer to tools/dep_updaters/update-cjs-module-lexer.sh #ifndef SRC_CJS_MODULE_LEXER_VERSION_H_ #define SRC_CJS_MODULE_LEXER_VERSION_H_ -#define CJS_MODULE_LEXER_VERSION "2.1.1" +#define CJS_MODULE_LEXER_VERSION "2.2.0" #endif // SRC_CJS_MODULE_LEXER_VERSION_H_