88#include "dict.h"
99#include "functions.h"
1010#include "module.h"
11+ #include "server.h"
1112
1213typedef struct scriptingEngineImpl {
1314 /* Engine specific context */
@@ -76,6 +77,14 @@ size_t scriptingEngineManagerGetMemoryUsage(void) {
7677 return dictMemUsage (engineMgr .engines ) + sizeof (engineMgr );
7778}
7879
80+ static inline void scriptingEngineInitializeEngineMethods (scriptingEngine * engine , engineMethods * methods ) {
81+ if (methods -> version < 3 ) {
82+ memcpy (& engine -> impl .methods , methods , sizeof (engineMethodsV1 ));
83+ } else {
84+ engine -> impl .methods = * methods ;
85+ }
86+ }
87+
7988/* Registers a new scripting engine in the engine manager.
8089 *
8190 * - `engine_name`: the name of the scripting engine. This name will match
@@ -111,11 +120,11 @@ int scriptingEngineManagerRegister(const char *engine_name,
111120 .module = engine_module ,
112121 .impl = {
113122 .ctx = engine_ctx ,
114- .methods = * engine_methods ,
115123 },
116124 .client = c ,
117125 .module_ctx = engine_module ? moduleAllocateContext () : NULL ,
118126 };
127+ scriptingEngineInitializeEngineMethods (e , engine_methods );
119128
120129 dictAdd (engineMgr .engines , engine_name_sds , e );
121130
@@ -329,6 +338,13 @@ debuggerEnableRet scriptingEngineCallDebuggerEnable(scriptingEngine *engine,
329338 subsystemType type ,
330339 const debuggerCommand * * commands ,
331340 size_t * commands_len ) {
341+ if (engine -> impl .methods .version < 3 ) {
342+ serverLog (LL_WARNING , "Scripting engine '%s' uses ABI version '%lu', which does not support debugger API" ,
343+ scriptingEngineGetName (engine ),
344+ (unsigned long )engine -> impl .methods .version );
345+ return VMSE_DEBUG_NOT_SUPPORTED ;
346+ }
347+
332348 if (engine -> impl .methods .debugger_enable == NULL ||
333349 engine -> impl .methods .debugger_disable == NULL ||
334350 engine -> impl .methods .debugger_start == NULL ||
@@ -349,6 +365,9 @@ debuggerEnableRet scriptingEngineCallDebuggerEnable(scriptingEngine *engine,
349365
350366void scriptingEngineCallDebuggerDisable (scriptingEngine * engine ,
351367 subsystemType type ) {
368+ serverAssert (engine -> impl .methods .version >= 3 );
369+ serverAssert (engine -> impl .methods .debugger_disable != NULL );
370+
352371 engineSetupModuleCtx (engine , NULL );
353372 engine -> impl .methods .debugger_disable (
354373 engine -> module_ctx ,
@@ -360,6 +379,9 @@ void scriptingEngineCallDebuggerDisable(scriptingEngine *engine,
360379void scriptingEngineCallDebuggerStart (scriptingEngine * engine ,
361380 subsystemType type ,
362381 robj * source ) {
382+ serverAssert (engine -> impl .methods .version >= 3 );
383+ serverAssert (engine -> impl .methods .debugger_start != NULL );
384+
363385 engineSetupModuleCtx (engine , NULL );
364386 engine -> impl .methods .debugger_start (
365387 engine -> module_ctx ,
@@ -371,6 +393,9 @@ void scriptingEngineCallDebuggerStart(scriptingEngine *engine,
371393
372394void scriptingEngineCallDebuggerEnd (scriptingEngine * engine ,
373395 subsystemType type ) {
396+ serverAssert (engine -> impl .methods .version >= 3 );
397+ serverAssert (engine -> impl .methods .debugger_end != NULL );
398+
374399 engineSetupModuleCtx (engine , NULL );
375400 engine -> impl .methods .debugger_end (
376401 engine -> module_ctx ,
@@ -450,6 +475,11 @@ int scriptingEngineDebuggerEnable(client *c, scriptingEngine *engine, sds *err)
450475 * to properly shut down a client debugging session, see scriptingEngineDebuggerEndSession()
451476 * for more information. */
452477void scriptingEngineDebuggerDisable (client * c ) {
478+ if (ds .engine == NULL ) {
479+ /* No debug session enabled. */
480+ return ;
481+ }
482+
453483 ds .commands = NULL ;
454484 ds .commands_len = 0 ;
455485 c -> flag .lua_debug = 0 ;
@@ -569,6 +599,8 @@ int scriptingEngineDebuggerStartSession(client *c) {
569599/* End a debugging session after the EVAL call with debugging enabled
570600 * returned. */
571601void scriptingEngineDebuggerEndSession (client * c ) {
602+ serverAssert (ds .active );
603+
572604 /* Emit the remaining logs and an <endsession> mark. */
573605 scriptingEngineDebuggerLog (sdsnew ("<endsession>" ));
574606 scriptingEngineDebuggerFlushLogs ();
0 commit comments