From e69be0cc6f669f8da95581da7a3f897ada6f633c Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 22 May 2022 22:57:47 -0700 Subject: [PATCH] Scripting: Add reset menu opiton --- src/core/thread.c | 6 ++-- src/platform/qt/ScriptingController.cpp | 46 +++++++++++++++++-------- src/platform/qt/ScriptingController.h | 3 ++ src/platform/qt/ScriptingView.cpp | 1 + src/platform/qt/ScriptingView.ui | 6 ++++ 5 files changed, 44 insertions(+), 18 deletions(-) diff --git a/src/core/thread.c b/src/core/thread.c index ee46569cd..530ee6f6f 100644 --- a/src/core/thread.c +++ b/src/core/thread.c @@ -273,7 +273,7 @@ static THREAD_ENTRY _mCoreThreadRun(void* context) { } #ifdef ENABLE_SCRIPTING // startCallback could add a script context - if (!scriptContext) { + if (scriptContext != threadContext->scriptContext) { scriptContext = threadContext->scriptContext; if (scriptContext) { _mCoreThreadAddCallbacks(threadContext); @@ -294,7 +294,7 @@ static THREAD_ENTRY _mCoreThreadRun(void* context) { #ifdef ENABLE_SCRIPTING // resetCallback could add a script context - if (!scriptContext) { + if (scriptContext != threadContext->scriptContext) { scriptContext = threadContext->scriptContext; if (scriptContext) { _mCoreThreadAddCallbacks(threadContext); @@ -351,7 +351,7 @@ static THREAD_ENTRY _mCoreThreadRun(void* context) { } } #ifdef ENABLE_SCRIPTING - if (!scriptContext) { + if (scriptContext != threadContext->scriptContext) { scriptContext = threadContext->scriptContext; if (scriptContext) { _mCoreThreadAddCallbacks(threadContext); diff --git a/src/platform/qt/ScriptingController.cpp b/src/platform/qt/ScriptingController.cpp index 8585a33f7..2113df29f 100644 --- a/src/platform/qt/ScriptingController.cpp +++ b/src/platform/qt/ScriptingController.cpp @@ -13,10 +13,6 @@ using namespace QGBA; ScriptingController::ScriptingController(QObject* parent) : QObject(parent) { - mScriptContextInit(&m_scriptContext); - mScriptContextAttachStdlib(&m_scriptContext); - mScriptContextRegisterEngines(&m_scriptContext); - m_logger.p = this; m_logger.log = [](mLogger* log, int, enum mLogLevel level, const char* format, va_list args) { Logger* logger = static_cast(log); @@ -37,17 +33,7 @@ ScriptingController::ScriptingController(QObject* parent) } }; - mScriptContextAttachLogger(&m_scriptContext, &m_logger); - mScriptContextSetTextBufferFactory(&m_scriptContext, &ScriptingController::createTextBuffer, this); - - HashTableEnumerate(&m_scriptContext.engines, [](const char* key, void* engine, void* context) { - ScriptingController* self = static_cast(context); - self->m_engines[QString::fromUtf8(key)] = static_cast(engine); - }, this); - - if (m_engines.count() == 1) { - m_activeEngine = *m_engines.begin(); - } + init(); } ScriptingController::~ScriptingController() { @@ -99,6 +85,18 @@ void ScriptingController::clearController() { m_controller.reset(); } +void ScriptingController::reset() { + CoreController::Interrupter interrupter(m_controller); + mScriptContextDetachCore(&m_scriptContext); + mScriptContextDeinit(&m_scriptContext); + m_engines.clear(); + m_activeEngine = nullptr; + init(); + if (m_controller && m_controller->hasStarted()) { + mScriptContextAttachCore(&m_scriptContext, m_controller->thread()->core); + } +} + void ScriptingController::runCode(const QString& code) { VFileDevice vf(code.toUtf8()); load(vf, "*prompt"); @@ -110,3 +108,21 @@ mScriptTextBuffer* ScriptingController::createTextBuffer(void* context) { emit self->textBufferCreated(buffer); return buffer->textBuffer(); } + +void ScriptingController::init() { + mScriptContextInit(&m_scriptContext); + mScriptContextAttachStdlib(&m_scriptContext); + mScriptContextRegisterEngines(&m_scriptContext); + + mScriptContextAttachLogger(&m_scriptContext, &m_logger); + mScriptContextSetTextBufferFactory(&m_scriptContext, &ScriptingController::createTextBuffer, this); + + HashTableEnumerate(&m_scriptContext.engines, [](const char* key, void* engine, void* context) { + ScriptingController* self = static_cast(context); + self->m_engines[QString::fromUtf8(key)] = static_cast(engine); + }, this); + + if (m_engines.count() == 1) { + m_activeEngine = *m_engines.begin(); + } +} diff --git a/src/platform/qt/ScriptingController.h b/src/platform/qt/ScriptingController.h index d7603f4a4..0ccd9f67d 100644 --- a/src/platform/qt/ScriptingController.h +++ b/src/platform/qt/ScriptingController.h @@ -42,9 +42,12 @@ signals: public slots: void clearController(); + void reset(); void runCode(const QString& code); private: + void init(); + static mScriptTextBuffer* createTextBuffer(void* context); struct Logger : mLogger { diff --git a/src/platform/qt/ScriptingView.cpp b/src/platform/qt/ScriptingView.cpp index b870d0e61..46857d219 100644 --- a/src/platform/qt/ScriptingView.cpp +++ b/src/platform/qt/ScriptingView.cpp @@ -29,6 +29,7 @@ ScriptingView::ScriptingView(ScriptingController* controller, QWidget* parent) connect(m_ui.buffers, &QListWidget::currentRowChanged, this, &ScriptingView::selectBuffer); connect(m_ui.load, &QAction::triggered, this, &ScriptingView::load); + connect(m_ui.reset, &QAction::triggered, controller, &ScriptingController::reset); } void ScriptingView::submitRepl() { diff --git a/src/platform/qt/ScriptingView.ui b/src/platform/qt/ScriptingView.ui index a0cf7ed1a..3b30ba9b2 100644 --- a/src/platform/qt/ScriptingView.ui +++ b/src/platform/qt/ScriptingView.ui @@ -80,6 +80,7 @@ File + @@ -89,6 +90,11 @@ Load script... + + + &Reset + +