- 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)