From 8bbfdb20213171e7b1d4fedee777076242ed5ee1 Mon Sep 17 00:00:00 2001 From: LanderlYoung Date: Fri, 10 Dec 2021 20:59:19 +0800 Subject: [PATCH] fix issue - Exception when using promised with QuickJs backend #66 (#68) --- .github/workflows/unit_tests.yml | 2 +- backend/QuickJs/QjsEngine.cc | 1 + test/src/EngineTest.cc | 27 ++++++++++++++++++++++++++- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml index 594f1dc9..644e9a57 100644 --- a/.github/workflows/unit_tests.yml +++ b/.github/workflows/unit_tests.yml @@ -236,4 +236,4 @@ jobs: run: | cd build # exclude failed tests - node UnitTests.js '--gtest_filter=-ThreadPool.*:EngineScopeTest.ExitEngine:EngineScopeTest.TwoThreads:EngineScopeTest.ThreadLocal:MessageQueue.Interrupt:MessageQueue.Shutdown:MessageQueue.ShutdownNow:MessageQueue.FullAndPostInsideLoopQueue:ReferenceTest.WeakGc:ReferenceTest.WeakGc:ReferenceTest.GlobalNotClear:ReferenceTest.GlobalOnEngineDestroy:ReferenceTest.WeakOnEngineDestroy:ReferenceTest.WeakNotClrear:ManagedObjectTest.EngineDispose:ManagedObjectTest.FunctionCallback:PressureTest.All' + node UnitTests.js '--gtest_filter=-ThreadPool.*:EngineScopeTest.ExitEngine:EngineScopeTest.TwoThreads:EngineScopeTest.ThreadLocal:MessageQueue.Interrupt:MessageQueue.Shutdown:MessageQueue.ShutdownNow:MessageQueue.FullAndPostInsideLoopQueue:ReferenceTest.WeakGc:ReferenceTest.WeakGc:ReferenceTest.GlobalNotClear:ReferenceTest.GlobalOnEngineDestroy:ReferenceTest.WeakOnEngineDestroy:ReferenceTest.WeakNotClrear:ManagedObjectTest.EngineDispose:ManagedObjectTest.FunctionCallback:PressureTest.All:EngineTest.JsPromiseTest' diff --git a/backend/QuickJs/QjsEngine.cc b/backend/QuickJs/QjsEngine.cc index a590662c..cd9fd9ee 100644 --- a/backend/QuickJs/QjsEngine.cc +++ b/backend/QuickJs/QjsEngine.cc @@ -196,6 +196,7 @@ void QjsEngine::scheduleTick() { [](auto& m) { auto eng = static_cast(m.ptr0); JSContext* ctx = nullptr; + EngineScope scope(eng); while (JS_ExecutePendingJob(eng->runtime_, &ctx) > 0) { } eng->tickScheduled_ = false; diff --git a/test/src/EngineTest.cc b/test/src/EngineTest.cc index f864f935..8d409361 100644 --- a/test/src/EngineTest.cc +++ b/test/src/EngineTest.cc @@ -133,4 +133,29 @@ TEST_F(EngineTest, LuaBuiltIns) { #endif -} // namespace script::test \ No newline at end of file +#ifdef SCRIPTX_LANG_JAVASCRIPT +TEST_F(EngineTest, JsPromiseTest) { + EngineScope scope(engine); + + int value = 0; + auto setValue = Function::newFunction([&value](int val) { value = val; }); + engine->set("setValue", setValue); + engine->eval( + u8R"( + const promise = new Promise((resolve, reject) => { + resolve('Ok'); + }); + + promise.then(x => { + console.log(x); + setValue(1); + }); + )"); + + engine->messageQueue()->shutdown(true); + engine->messageQueue()->loopQueue(utils::MessageQueue::LoopType::kLoopAndWait); + EXPECT_EQ(value, 1); +} +#endif + +} // namespace script::test