remove interp global variable!

Finish removing references to the 'interp' global variable from the
command module, encapsulating all reference via command_context.

Eliminates use of the global entirely, so it can be removed.  Hurrah!
__archive__
Zachary T Welch 2009-11-29 18:50:48 -08:00
parent cbc894ed7b
commit 8fc5a9a5e9
3 changed files with 22 additions and 20 deletions

View File

@ -47,7 +47,6 @@
/* nice short description of source file */ /* nice short description of source file */
#define __THIS__FILE__ "command.c" #define __THIS__FILE__ "command.c"
Jim_Interp *interp = NULL;
static int run_command(struct command_context *context, static int run_command(struct command_context *context,
struct command *c, const char *words[], unsigned num_words); struct command *c, const char *words[], unsigned num_words);
@ -159,7 +158,7 @@ static const char **script_command_args_alloc(
return words; return words;
} }
static struct command_context *current_command_context(void) static struct command_context *current_command_context(Jim_Interp *interp)
{ {
/* grab the command context from the associated data */ /* grab the command context from the associated data */
struct command_context *cmd_ctx = Jim_GetAssocData(interp, "context"); struct command_context *cmd_ctx = Jim_GetAssocData(interp, "context");
@ -188,7 +187,7 @@ static int script_command_run(Jim_Interp *interp,
if (capture) if (capture)
state = command_log_capture_start(interp); state = command_log_capture_start(interp);
struct command_context *cmd_ctx = current_command_context(); struct command_context *cmd_ctx = current_command_context(interp);
int retval = run_command(cmd_ctx, c, (const char **)words, nwords); int retval = run_command(cmd_ctx, c, (const char **)words, nwords);
command_log_capture_finish(state); command_log_capture_finish(state);
@ -327,8 +326,10 @@ command_new_error:
static int command_unknown(Jim_Interp *interp, int argc, Jim_Obj *const *argv); static int command_unknown(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
static int register_command_handler(struct command *c) static int register_command_handler(struct command_context *cmd_ctx,
struct command *c)
{ {
Jim_Interp *interp = cmd_ctx->interp;
const char *ocd_name = alloc_printf("ocd_%s", c->name); const char *ocd_name = alloc_printf("ocd_%s", c->name);
if (NULL == ocd_name) if (NULL == ocd_name)
return JIM_ERR; return JIM_ERR;
@ -377,11 +378,11 @@ struct command* register_command(struct command_context *context,
int retval = ERROR_OK; int retval = ERROR_OK;
if (NULL != cr->jim_handler && NULL == parent) if (NULL != cr->jim_handler && NULL == parent)
{ {
retval = Jim_CreateCommand(interp, cr->name, retval = Jim_CreateCommand(context->interp, cr->name,
cr->jim_handler, cr->jim_handler_data, NULL); cr->jim_handler, cr->jim_handler_data, NULL);
} }
else if (NULL != cr->handler || NULL != parent) else if (NULL != cr->handler || NULL != parent)
retval = register_command_handler(command_root(c)); retval = register_command_handler(context, command_root(c));
if (ERROR_OK != retval) if (ERROR_OK != retval)
{ {
@ -615,6 +616,7 @@ int command_run_line(struct command_context *context, char *line)
* happen when the Jim Tcl interpreter is provided by eCos for * happen when the Jim Tcl interpreter is provided by eCos for
* instance. * instance.
*/ */
Jim_Interp *interp = context->interp;
Jim_DeleteAssocData(interp, "context"); Jim_DeleteAssocData(interp, "context");
retcode = Jim_SetAssocData(interp, "context", NULL, context); retcode = Jim_SetAssocData(interp, "context", NULL, context);
if (retcode == JIM_OK) if (retcode == JIM_OK)
@ -977,7 +979,7 @@ static int command_unknown(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
} }
script_debug(interp, cmd_name, argc, argv); script_debug(interp, cmd_name, argc, argv);
struct command_context *cmd_ctx = current_command_context(); struct command_context *cmd_ctx = current_command_context(interp);
struct command *c = cmd_ctx->commands; struct command *c = cmd_ctx->commands;
int remaining = command_unknown_find(argc, argv, c, &c, true); int remaining = command_unknown_find(argc, argv, c, &c, true);
// if nothing could be consumed, then it's really an unknown command // if nothing could be consumed, then it's really an unknown command
@ -1021,7 +1023,7 @@ static int command_unknown(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
static int jim_command_mode(Jim_Interp *interp, int argc, Jim_Obj *const *argv) static int jim_command_mode(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
{ {
struct command_context *cmd_ctx = current_command_context(); struct command_context *cmd_ctx = current_command_context(interp);
enum command_mode mode; enum command_mode mode;
if (argc > 1) if (argc > 1)
{ {
@ -1054,7 +1056,7 @@ static int jim_command_type(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
if (1 == argc) if (1 == argc)
return JIM_ERR; return JIM_ERR;
struct command_context *cmd_ctx = current_command_context(); struct command_context *cmd_ctx = current_command_context(interp);
struct command *c = cmd_ctx->commands; struct command *c = cmd_ctx->commands;
int remaining = command_unknown_find(argc - 1, argv + 1, c, &c, true); int remaining = command_unknown_find(argc - 1, argv + 1, c, &c, true);
// if nothing could be consumed, then it's an unknown command // if nothing could be consumed, then it's an unknown command
@ -1276,11 +1278,12 @@ struct command_context* command_init(const char *startup_tcl)
#if !BUILD_ECOSBOARD #if !BUILD_ECOSBOARD
Jim_InitEmbedded(); Jim_InitEmbedded();
/* Create an interpreter */ /* Create an interpreter */
interp = context->interp = Jim_CreateInterp(); context->interp = Jim_CreateInterp();
/* Add all the Jim core commands */ /* Add all the Jim core commands */
Jim_RegisterCoreCommands(interp); Jim_RegisterCoreCommands(context->interp);
#endif #endif
Jim_Interp *interp = context->interp;
#if defined(_MSC_VER) #if defined(_MSC_VER)
/* WinXX - is generic, the forward /* WinXX - is generic, the forward
* looking problem is this: * looking problem is this:
@ -1347,17 +1350,16 @@ int command_context_mode(struct command_context *cmd_ctx, enum command_mode mode
return ERROR_OK; return ERROR_OK;
} }
void process_jim_events(void) void process_jim_events(struct command_context *cmd_ctx)
{ {
#if !BUILD_ECOSBOARD #if !BUILD_ECOSBOARD
static int recursion = 0; static int recursion = 0;
if (recursion)
return;
if (!recursion) recursion++;
{ Jim_ProcessEvents(cmd_ctx->interp, JIM_ALL_EVENTS | JIM_DONT_WAIT);
recursion++; recursion--;
Jim_ProcessEvents (interp, JIM_ALL_EVENTS | JIM_DONT_WAIT);
recursion--;
}
#endif #endif
} }

View File

@ -351,7 +351,7 @@ int command_run_linef(struct command_context *context, const char *format, ...)
__attribute__ ((format (PRINTF_ATTRIBUTE_FORMAT, 2, 3))); __attribute__ ((format (PRINTF_ATTRIBUTE_FORMAT, 2, 3)));
void command_output_text(struct command_context *context, const char *data); void command_output_text(struct command_context *context, const char *data);
void process_jim_events(void); void process_jim_events(struct command_context *cmd_ctx);
#define ERROR_COMMAND_CLOSE_CONNECTION (-600) #define ERROR_COMMAND_CLOSE_CONNECTION (-600)
#define ERROR_COMMAND_SYNTAX_ERROR (-601) #define ERROR_COMMAND_SYNTAX_ERROR (-601)

View File

@ -386,7 +386,7 @@ int server_loop(struct command_context *command_context)
} }
target_call_timer_callbacks(); target_call_timer_callbacks();
process_jim_events (); process_jim_events(command_context);
if (retval == 0) if (retval == 0)
{ {