Title: [283062] trunk
Revision
283062
Author
commit-qu...@webkit.org
Date
2021-09-24 15:13:05 -0700 (Fri, 24 Sep 2021)

Log Message

[JSC] Add checkScriptSyntax function to jsc host environment
https://bugs.webkit.org/show_bug.cgi?id=230631

Patch by Rick Waldron <waldron.r...@gmail.com> on 2021-09-24
Reviewed by Yusuke Suzuki.

JSTests:

Updates tests that were using eval() to verify syntax.

* stress/arrow-function-syntax.js: Replace custom checkSyntax with checkScriptSyntax
* stress/async-iteration-for-await-of-syntax.js: Replace custom checkSyntax with checkScriptSyntax
* stress/async-iteration-syntax.js: Replace custom checkSyntax with checkScriptSyntax

Source/_javascript_Core:

Introduce a function called checkScriptSyntax() that performs the same
operation as checkModuleSyntax(), without the module specific semantics.
Updates tests that were using eval() to verify syntax.

* jsc.cpp:
(functionCheckScriptSyntax)

Modified Paths

Diff

Modified: trunk/JSTests/ChangeLog (283061 => 283062)


--- trunk/JSTests/ChangeLog	2021-09-24 22:11:41 UTC (rev 283061)
+++ trunk/JSTests/ChangeLog	2021-09-24 22:13:05 UTC (rev 283062)
@@ -1,3 +1,16 @@
+2021-09-24 Rick Waldron <waldron.r...@gmail.com>
+
+        [JSC] Add checkScriptSyntax function to jsc host environment
+        https://bugs.webkit.org/show_bug.cgi?id=230631
+
+        Reviewed by Yusuke Suzuki.
+
+        Updates tests that were using eval() to verify syntax.
+
+        * stress/arrow-function-syntax.js: Replace custom checkSyntax with checkScriptSyntax
+        * stress/async-iteration-for-await-of-syntax.js: Replace custom checkSyntax with checkScriptSyntax
+        * stress/async-iteration-syntax.js: Replace custom checkSyntax with checkScriptSyntax
+
 2021-09-23  Ross Kirsling  <ross.kirsl...@sony.com>
 
         [JSC] Handle syntactic production for `#x in expr` correctly

Modified: trunk/JSTests/stress/arrow-function-syntax.js (283061 => 283062)


--- trunk/JSTests/stress/arrow-function-syntax.js	2021-09-24 22:11:41 UTC (rev 283061)
+++ trunk/JSTests/stress/arrow-function-syntax.js	2021-09-24 22:13:05 UTC (rev 283062)
@@ -1,27 +1,6 @@
-function checkSyntax(src) {
-    try {
-        eval(src);
-    } catch (error) {
-        if (error instanceof SyntaxError)
-            throw new Error("Syntax Error: " + String(error) + "\n script: `" + src + "`");
-    }
-}
-
-function checkSyntaxError(src, message) {
-    var bError = false;
-    try {
-        eval(src);
-    } catch (error) {
-        bError = error instanceof SyntaxError && (String(error) === message || typeof message === 'undefined');
-    }
-    if (!bError) {
-        throw new Error("Expected syntax Error: " + message + "\n in script: `" + src + "`");
-    }
-}
-
-checkSyntax(`()=>42`);
-checkSyntax(`()=>42
+checkScriptSyntax(`()=>42`);
+checkScriptSyntax(`()=>42
 `);
-checkSyntax(`()=>42//Hello`);
-checkSyntax(`()=>42//Hello
+checkScriptSyntax(`()=>42//Hello`);
+checkScriptSyntax(`()=>42//Hello
 `);

Modified: trunk/JSTests/stress/async-iteration-for-await-of-syntax.js (283061 => 283062)


--- trunk/JSTests/stress/async-iteration-for-await-of-syntax.js	2021-09-24 22:11:41 UTC (rev 283061)
+++ trunk/JSTests/stress/async-iteration-for-await-of-syntax.js	2021-09-24 22:13:05 UTC (rev 283062)
@@ -4,16 +4,7 @@
   }
 };
 
-function checkSyntax(src) {
-    try {
-        eval(src);
-    } catch (error) {
-        if (error instanceof SyntaxError)
-            throw new Error("Syntax Error: " + String(error) + "\n script: `" + src + "`");
-    }
-}
-
-function checkSyntaxError(src, message) {
+function evalForSyntaxError(src, message) {
     var bError = false;
     try {
         eval(src);
@@ -26,17 +17,17 @@
 }
 
 (function checkSimpleAsyncGeneratorSloppyMode() {
-    checkSyntax('var a1 = async function*asyncGenWithName1(){ for await(const value of foo()) {} }');
-    checkSyntax('var a1 = async function asyncWithName1(){ for await(const value of foo()) {} }');
-    checkSyntax('var a1 = async function*asyncGenWithName1(){ for await(let value of foo()) {} }');
-    checkSyntax('var a1 = async function asyncWithName1(){ for await(let value of foo()) {} }');
+    checkScriptSyntax('var a1 = async function*asyncGenWithName1(){ for await(const value of foo()) {} }');
+    checkScriptSyntax('var a1 = async function asyncWithName1(){ for await(const value of foo()) {} }');
+    checkScriptSyntax('var a1 = async function*asyncGenWithName1(){ for await(let value of foo()) {} }');
+    checkScriptSyntax('var a1 = async function asyncWithName1(){ for await(let value of foo()) {} }');
 })();
 
 (function checkSimpleAsyncGeneratorStrictMode() {
-    checkSyntax('"use strict"; var a1 = async function*asyncGenWithName1(){ for await(const value of foo()) {}  }');
-    checkSyntax('"use strict"; var a1 = async function asyncWithName1(){ for await(const value of foo()) {} }');
-    checkSyntax('"use strict"; var a1 = async function*asyncGenWithName1(){ for await(let value of foo()) {} }');
-    checkSyntax('"use strict"; var a1 = async function asyncWithName1(){ for await(let value of foo()) {} }');
+    checkScriptSyntax('"use strict"; var a1 = async function*asyncGenWithName1(){ for await(const value of foo()) {}  }');
+    checkScriptSyntax('"use strict"; var a1 = async function asyncWithName1(){ for await(const value of foo()) {} }');
+    checkScriptSyntax('"use strict"; var a1 = async function*asyncGenWithName1(){ for await(let value of foo()) {} }');
+    checkScriptSyntax('"use strict"; var a1 = async function asyncWithName1(){ for await(let value of foo()) {} }');
 })();
 
 
@@ -79,7 +70,7 @@
 
     wrappers.forEach(wrapper => {
         expressions.forEach(exp => {
-            checkSyntax(wrapper.start + exp + wrapper.finish);
+            checkScriptSyntax(wrapper.start + exp + wrapper.finish);
         });
     })
 })();
@@ -86,33 +77,33 @@
 
 
 (function checkSimpleAsyncGeneratorSyntaxErrorInSloppyMode() {
-    checkSyntaxError("var asyncGenFn = function () { for await(const value of foo()) {} }");
-    checkSyntaxError("var asyncGenFn = async function () { var arr = () => { for await(const value of foo()) {} } }");
-    checkSyntaxError("var asyncGenFn = function* () { for await(const value of foo()) {} }");
-    checkSyntaxError("var asyncGenFn = async function* () { var arr = () => { for await(const value of foo()) {} } }");
-    checkSyntaxError('var a1 = async function*asyncGenWithName1(){ for await(const value in foo()) {} }');
-    checkSyntaxError('var a1 = async function asyncWithName1(){ for await(const value in foo()) {} }');
-    checkSyntaxError('var a1 = async function asyncWithName1(){ for await (;;) {} }');
-    checkSyntaxError("var a1 = async function asyncWithName1(){ for await (let v = 4;;) {} }");
-    checkSyntaxError("var a1 = async function asyncWithName1(){ for await (let v of f();;) {} }");
-    checkSyntaxError("var a1 = async function asyncWithName1(){ for await (let v of boo;;) {} }");
-    checkSyntaxError("var a1 = async function asyncWithName1(){ for await (let v of boo of) {} }");
-    checkSyntaxError("async function asyncWithName1(){ for await (let v of boo in) {} }");
-    checkSyntaxError("async function asyncWithName1(){ for await (v in x + x ) {} }");
+    evalForSyntaxError("var asyncGenFn = function () { for await(const value of foo()) {} }");
+    evalForSyntaxError("var asyncGenFn = async function () { var arr = () => { for await(const value of foo()) {} } }");
+    evalForSyntaxError("var asyncGenFn = function* () { for await(const value of foo()) {} }");
+    evalForSyntaxError("var asyncGenFn = async function* () { var arr = () => { for await(const value of foo()) {} } }");
+    evalForSyntaxError('var a1 = async function*asyncGenWithName1(){ for await(const value in foo()) {} }');
+    evalForSyntaxError('var a1 = async function asyncWithName1(){ for await(const value in foo()) {} }');
+    evalForSyntaxError('var a1 = async function asyncWithName1(){ for await (;;) {} }');
+    evalForSyntaxError("var a1 = async function asyncWithName1(){ for await (let v = 4;;) {} }");
+    evalForSyntaxError("var a1 = async function asyncWithName1(){ for await (let v of f();;) {} }");
+    evalForSyntaxError("var a1 = async function asyncWithName1(){ for await (let v of boo;;) {} }");
+    evalForSyntaxError("var a1 = async function asyncWithName1(){ for await (let v of boo of) {} }");
+    evalForSyntaxError("async function asyncWithName1(){ for await (let v of boo in) {} }");
+    evalForSyntaxError("async function asyncWithName1(){ for await (v in x + x ) {} }");
 })();
 
 (function checkSimpleAsyncGeneratorSyntaxErrorInStrictMode() {
-    checkSyntaxError("'use strict'; var asyncGenFn = function () { for await(const value of foo()) {} }");
-    checkSyntaxError("'use strict'; var asyncGenFn = async function () { var arr = () => { for await(const value of foo()) {} } }");
-    checkSyntaxError("'use strict'; var asyncGenFn = function* () { for await(const value of foo()) {} }");
-    checkSyntaxError("'use strict'; var asyncGenFn = async function* () { var arr = () => { for await(const value of foo()) {} } }");
-    checkSyntaxError("'use strict'; var a1 = async function*asyncGenWithName1(){ for await(const value in foo()) {} }");
-    checkSyntaxError("'use strict'; var a1 = async function asyncWithName1(){ for await(const value in foo()) {} }");
-    checkSyntaxError("'use strict'; var a1 = async function asyncWithName1(){ for await (;;) {} }");
-    checkSyntaxError("'use strict'; var a1 = async function asyncWithName1(){ for await (let v = 4;;) {} }");
-    checkSyntaxError("'use strict'; var a1 = async function asyncWithName1(){ for await (let v of f();;) {} }");
-    checkSyntaxError("'use strict'; var a1 = async function asyncWithName1(){ for await (let v of boo;;) {} }");
-    checkSyntaxError("'use strict'; var a1 = async function asyncWithName1(){ for await (let v of boo of) {} }");
-    checkSyntaxError("'use strict'; async function asyncWithName1(){ for await (let v of boo in) {} }");
-    checkSyntaxError("'use strict'; async function asyncWithName1(){ for await (v in x + x ) {} }");
+    evalForSyntaxError("'use strict'; var asyncGenFn = function () { for await(const value of foo()) {} }");
+    evalForSyntaxError("'use strict'; var asyncGenFn = async function () { var arr = () => { for await(const value of foo()) {} } }");
+    evalForSyntaxError("'use strict'; var asyncGenFn = function* () { for await(const value of foo()) {} }");
+    evalForSyntaxError("'use strict'; var asyncGenFn = async function* () { var arr = () => { for await(const value of foo()) {} } }");
+    evalForSyntaxError("'use strict'; var a1 = async function*asyncGenWithName1(){ for await(const value in foo()) {} }");
+    evalForSyntaxError("'use strict'; var a1 = async function asyncWithName1(){ for await(const value in foo()) {} }");
+    evalForSyntaxError("'use strict'; var a1 = async function asyncWithName1(){ for await (;;) {} }");
+    evalForSyntaxError("'use strict'; var a1 = async function asyncWithName1(){ for await (let v = 4;;) {} }");
+    evalForSyntaxError("'use strict'; var a1 = async function asyncWithName1(){ for await (let v of f();;) {} }");
+    evalForSyntaxError("'use strict'; var a1 = async function asyncWithName1(){ for await (let v of boo;;) {} }");
+    evalForSyntaxError("'use strict'; var a1 = async function asyncWithName1(){ for await (let v of boo of) {} }");
+    evalForSyntaxError("'use strict'; async function asyncWithName1(){ for await (let v of boo in) {} }");
+    evalForSyntaxError("'use strict'; async function asyncWithName1(){ for await (v in x + x ) {} }");
 })();

Modified: trunk/JSTests/stress/async-iteration-syntax.js (283061 => 283062)


--- trunk/JSTests/stress/async-iteration-syntax.js	2021-09-24 22:11:41 UTC (rev 283061)
+++ trunk/JSTests/stress/async-iteration-syntax.js	2021-09-24 22:13:05 UTC (rev 283062)
@@ -4,16 +4,7 @@
   }
 };
 
-function checkSyntax(src) {
-    try {
-        eval(src);
-    } catch (error) {
-        if (error instanceof SyntaxError)
-            throw new Error("Syntax Error: " + String(error) + "\n script: `" + src + "`");
-    }
-}
-
-function checkSyntaxError(src, message) {
+function evalForSyntaxError(src, message) {
     var bError = false;
     try {
         eval(src);
@@ -26,44 +17,44 @@
 }
 
 (function checkSimpleAsyncGeneratorSloppyMode() {
-    checkSyntax('var a1 = async function*asyncGenWithName1(){}');
-    checkSyntax('var a2 = async function *asyncGenWithName2(){ yield 11; }');
-    checkSyntax('var a3 = async function * asyncGenWithName2(){ await p; yield 11; }');
-    checkSyntax('var d1 = async function*(){}');
-    checkSyntax('var d2 = async function* (){ yield 11; }');
-    checkSyntax('var d3 = async function * (){ await p; yield 11; }');
-    checkSyntax('async function* withName1(){  }');
-    checkSyntax('async function *withName2(){ yield 11; }');
-    checkSyntax('async function * withName3(){ await p; yield 11; }');
-    checkSyntax('class A { async * method() { } }');
-    checkSyntax('class B { async * method() {yield 11;} }');
-    checkSyntax('class C { async * method() {yield 11; await p;} }');
-    checkSyntax('class D { async * "method"() {yield 11; await p;} }');
-    checkSyntax('class F { async * 0() {yield 11; await p;} }');
-    checkSyntax('var obj = { async * method() {yield 11; await p;} }');
-    checkSyntax('({ async foo() {} })');
-    checkSyntax('({ async : 1 })');
+    checkScriptSyntax('var a1 = async function*asyncGenWithName1(){}');
+    checkScriptSyntax('var a2 = async function *asyncGenWithName2(){ yield 11; }');
+    checkScriptSyntax('var a3 = async function * asyncGenWithName2(){ await p; yield 11; }');
+    checkScriptSyntax('var d1 = async function*(){}');
+    checkScriptSyntax('var d2 = async function* (){ yield 11; }');
+    checkScriptSyntax('var d3 = async function * (){ await p; yield 11; }');
+    checkScriptSyntax('async function* withName1(){  }');
+    checkScriptSyntax('async function *withName2(){ yield 11; }');
+    checkScriptSyntax('async function * withName3(){ await p; yield 11; }');
+    checkScriptSyntax('class A { async * method() { } }');
+    checkScriptSyntax('class B { async * method() {yield 11;} }');
+    checkScriptSyntax('class C { async * method() {yield 11; await p;} }');
+    checkScriptSyntax('class D { async * "method"() {yield 11; await p;} }');
+    checkScriptSyntax('class F { async * 0() {yield 11; await p;} }');
+    checkScriptSyntax('var obj = { async * method() {yield 11; await p;} }');
+    checkScriptSyntax('({ async foo() {} })');
+    checkScriptSyntax('({ async : 1 })');
 })();
 
 (function checkSimpleAsyncGeneratorStrictMode() {
-    checkSyntax('"use strict"; var a1 = async function*asyncGenWithName1(){}');
-    checkSyntax('"use strict"; var a2 = async function *asyncGenWithName2(){ yield 11; }');
-    checkSyntax('"use strict"; var a3 = async function * asyncGenWithName2(){ await p; yield 11; }');
-    checkSyntax('"use strict"; var d1 = async function*(){}');
-    checkSyntax('"use strict"; var d2 = async function* (){ yield 11; }');
-    checkSyntax('"use strict"; var d3 = async function * (){ await p; yield 11; }');
-    checkSyntax('"use strict"; async function* withName1(){  }');
-    checkSyntax('"use strict"; async function *withName2(){ yield 11; }');
-    checkSyntax('"use strict"; async function * withName3(){ await p; yield 11; }');
-    checkSyntax('"use strict"; class A { async * method() { } }');
-    checkSyntax('"use strict"; class B { async * method() {yield 11;} }');
-    checkSyntax('"use strict"; class C { async * method() {yield 11; await p;} }');
-    checkSyntax('"use strict"; class D { async * "method"() {yield 11; await p;} }');
-    checkSyntax('"use strict"; class E { async * ["calc" + "ulate"]() {yield 11; await p;} }');
-    checkSyntax('"use strict"; class F { async * 0() {yield 11; await p;} }');
-    checkSyntax('"use strict"; var obj = { async * method() {yield 11; await p;} }');
-    checkSyntax('"use strict"; ({ async foo() {} })');
-    checkSyntax('"use strict"; ({ async : 1 })');
+    checkScriptSyntax('"use strict"; var a1 = async function*asyncGenWithName1(){}');
+    checkScriptSyntax('"use strict"; var a2 = async function *asyncGenWithName2(){ yield 11; }');
+    checkScriptSyntax('"use strict"; var a3 = async function * asyncGenWithName2(){ await p; yield 11; }');
+    checkScriptSyntax('"use strict"; var d1 = async function*(){}');
+    checkScriptSyntax('"use strict"; var d2 = async function* (){ yield 11; }');
+    checkScriptSyntax('"use strict"; var d3 = async function * (){ await p; yield 11; }');
+    checkScriptSyntax('"use strict"; async function* withName1(){  }');
+    checkScriptSyntax('"use strict"; async function *withName2(){ yield 11; }');
+    checkScriptSyntax('"use strict"; async function * withName3(){ await p; yield 11; }');
+    checkScriptSyntax('"use strict"; class A { async * method() { } }');
+    checkScriptSyntax('"use strict"; class B { async * method() {yield 11;} }');
+    checkScriptSyntax('"use strict"; class C { async * method() {yield 11; await p;} }');
+    checkScriptSyntax('"use strict"; class D { async * "method"() {yield 11; await p;} }');
+    checkScriptSyntax('"use strict"; class E { async * ["calc" + "ulate"]() {yield 11; await p;} }');
+    checkScriptSyntax('"use strict"; class F { async * 0() {yield 11; await p;} }');
+    checkScriptSyntax('"use strict"; var obj = { async * method() {yield 11; await p;} }');
+    checkScriptSyntax('"use strict"; ({ async foo() {} })');
+    checkScriptSyntax('"use strict"; ({ async : 1 })');
 })();
 
 
@@ -85,7 +76,7 @@
 
     wrappers.forEach(wrapper => {
         expressions.forEach(exp => {
-            checkSyntax(wrapper.start + exp + wrapper.finish);
+            checkScriptSyntax(wrapper.start + exp + wrapper.finish);
         });
     })
 })();
@@ -92,31 +83,31 @@
 
 
 (function checkSimpleAsyncGeneratorSyntaxErrorInSloppyMode() {
-    checkSyntaxError("var asyncGenFn = async function *await() {}");
-    checkSyntaxError("var asyncGenFn = async function*(await) {}");
-    checkSyntaxError("var asyncGenFn = async function *withName(await) {}");
-    checkSyntaxError("async function *asyncGeneratorFunctionDeclaration(await) {}");
-    checkSyntaxError("var asyncGenFn = *async function () {}");
-    checkSyntaxError("var asyncGenFn = *async function withName() {}");
-    checkSyntaxError("*async function asyncGeneratorFunctionDeclaration(await) {}");
-    checkSyntaxError("var obj = { *async asyncGeneratorMethod() {} };");
-    checkSyntaxError("var obj = { async asyncGeneratorMethod*() {} };");
-    checkSyntaxError("class A { get async* ttt() {} }");
-    checkSyntaxError("class B { get *async ttt() {} }");
-    checkSyntaxError('({ async = 1 })');
+    evalForSyntaxError("var asyncGenFn = async function *await() {}");
+    evalForSyntaxError("var asyncGenFn = async function*(await) {}");
+    evalForSyntaxError("var asyncGenFn = async function *withName(await) {}");
+    evalForSyntaxError("async function *asyncGeneratorFunctionDeclaration(await) {}");
+    evalForSyntaxError("var asyncGenFn = *async function () {}");
+    evalForSyntaxError("var asyncGenFn = *async function withName() {}");
+    evalForSyntaxError("*async function asyncGeneratorFunctionDeclaration(await) {}");
+    evalForSyntaxError("var obj = { *async asyncGeneratorMethod() {} };");
+    evalForSyntaxError("var obj = { async asyncGeneratorMethod*() {} };");
+    evalForSyntaxError("class A { get async* ttt() {} }");
+    evalForSyntaxError("class B { get *async ttt() {} }");
+    evalForSyntaxError('({ async = 1 })');
 })();
 
 (function checkSimpleAsyncGeneratorSyntaxErrorInStrictMode() {
-    checkSyntaxError("'use strict'; var asyncGenFn = async function *await() {}");
-    checkSyntaxError("'use strict'; var asyncGenFn = async function*(await) {}");
-    checkSyntaxError("'use strict'; var asyncGenFn = async function *withName(await) {}");
-    checkSyntaxError("'use strict'; async function *asyncGeneratorFunctionDeclaration(await) {}");
-    checkSyntaxError("'use strict'; var asyncGenFn = *async function () {}");
-    checkSyntaxError("'use strict'; var asyncGenFn = *async function withName() {}");
-    checkSyntaxError("'use strict'; *async function asyncGeneratorFunctionDeclaration(await) {}");
-    checkSyntaxError("'use strict'; var obj = { *async asyncGeneratorMethod() {} };");
-    checkSyntaxError("'use strict'; var obj = { async asyncGeneratorMethod*() {} };");
-    checkSyntaxError("'use strict'; class A { get async* ttt() {} }");
-    checkSyntaxError("'use strict'; class B { get *async ttt() {} }");
-    checkSyntaxError("'use strict'; ({ async = 1 })");
+    evalForSyntaxError("'use strict'; var asyncGenFn = async function *await() {}");
+    evalForSyntaxError("'use strict'; var asyncGenFn = async function*(await) {}");
+    evalForSyntaxError("'use strict'; var asyncGenFn = async function *withName(await) {}");
+    evalForSyntaxError("'use strict'; async function *asyncGeneratorFunctionDeclaration(await) {}");
+    evalForSyntaxError("'use strict'; var asyncGenFn = *async function () {}");
+    evalForSyntaxError("'use strict'; var asyncGenFn = *async function withName() {}");
+    evalForSyntaxError("'use strict'; *async function asyncGeneratorFunctionDeclaration(await) {}");
+    evalForSyntaxError("'use strict'; var obj = { *async asyncGeneratorMethod() {} };");
+    evalForSyntaxError("'use strict'; var obj = { async asyncGeneratorMethod*() {} };");
+    evalForSyntaxError("'use strict'; class A { get async* ttt() {} }");
+    evalForSyntaxError("'use strict'; class B { get *async ttt() {} }");
+    evalForSyntaxError("'use strict'; ({ async = 1 })");
 })();

Modified: trunk/Source/_javascript_Core/ChangeLog (283061 => 283062)


--- trunk/Source/_javascript_Core/ChangeLog	2021-09-24 22:11:41 UTC (rev 283061)
+++ trunk/Source/_javascript_Core/ChangeLog	2021-09-24 22:13:05 UTC (rev 283062)
@@ -1,3 +1,17 @@
+2021-09-24 Rick Waldron <waldron.r...@gmail.com>
+
+        [JSC] Add checkScriptSyntax function to jsc host environment
+        https://bugs.webkit.org/show_bug.cgi?id=230631
+
+        Reviewed by Yusuke Suzuki.
+
+        Introduce a function called checkScriptSyntax() that performs the same
+        operation as checkModuleSyntax(), without the module specific semantics.
+        Updates tests that were using eval() to verify syntax.
+
+        * jsc.cpp:
+        (functionCheckScriptSyntax)
+
 2021-09-23  Philip Chimento  <pchime...@igalia.com>
 
         Various tweaks in preparation for Temporal.Instant

Modified: trunk/Source/_javascript_Core/jsc.cpp (283061 => 283062)


--- trunk/Source/_javascript_Core/jsc.cpp	2021-09-24 22:11:41 UTC (rev 283061)
+++ trunk/Source/_javascript_Core/jsc.cpp	2021-09-24 22:13:05 UTC (rev 283062)
@@ -328,6 +328,7 @@
 static JSC_DECLARE_HOST_FUNCTION(functionFinalizationRegistryDeadCount);
 static JSC_DECLARE_HOST_FUNCTION(functionIs32BitPlatform);
 static JSC_DECLARE_HOST_FUNCTION(functionCheckModuleSyntax);
+static JSC_DECLARE_HOST_FUNCTION(functionCheckScriptSyntax);
 static JSC_DECLARE_HOST_FUNCTION(functionPlatformSupportsSamplingProfiler);
 static JSC_DECLARE_HOST_FUNCTION(functionGenerateHeapSnapshot);
 static JSC_DECLARE_HOST_FUNCTION(functionGenerateHeapSnapshotForGCDebugging);
@@ -598,6 +599,7 @@
         addFunction(vm, "is32BitPlatform", functionIs32BitPlatform, 0);
 
         addFunction(vm, "checkModuleSyntax", functionCheckModuleSyntax, 1);
+        addFunction(vm, "checkScriptSyntax", functionCheckScriptSyntax, 1);
 
         addFunction(vm, "platformSupportsSamplingProfiler", functionPlatformSupportsSamplingProfiler, 0);
         addFunction(vm, "generateHeapSnapshot", functionGenerateHeapSnapshot, 0);
@@ -2617,6 +2619,28 @@
     return JSValue::encode(jsNumber(stopWatch.getElapsedMS()));
 }
 
+JSC_DEFINE_HOST_FUNCTION(functionCheckScriptSyntax, (JSGlobalObject* globalObject, CallFrame* callFrame))
+{
+    VM& vm = globalObject->vm();
+    auto scope = DECLARE_THROW_SCOPE(vm);
+
+    String source = callFrame->argument(0).toWTFString(globalObject);
+    RETURN_IF_EXCEPTION(scope, encodedJSValue());
+
+    StopWatch stopWatch;
+    stopWatch.start();
+
+    ParserError error;
+
+    bool validSyntax = checkSyntax(vm, jscSource(source, { }), error);
+    RETURN_IF_EXCEPTION(scope, encodedJSValue());
+    stopWatch.stop();
+
+    if (!validSyntax)
+        throwException(globalObject, scope, jsNontrivialString(vm, toString("SyntaxError: ", error.message(), ":", error.line())));
+    return JSValue::encode(jsNumber(stopWatch.getElapsedMS()));
+}
+
 JSC_DEFINE_HOST_FUNCTION(functionPlatformSupportsSamplingProfiler, (JSGlobalObject*, CallFrame*))
 {
 #if ENABLE(SAMPLING_PROFILER)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to