Skip to content

Commit

Permalink
Revert "openocd: revert workarounds for 'expr' syntax change"
Browse files Browse the repository at this point in the history
This reverts commit 95603fa.
  • Loading branch information
Huckies committed Oct 17, 2023
1 parent 9023bfd commit 4c4c149
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 1 deletion.
14 changes: 13 additions & 1 deletion src/helper/command.c
Original file line number Diff line number Diff line change
Expand Up @@ -943,7 +943,19 @@ static int jim_command_dispatch(Jim_Interp *interp, int argc, Jim_Obj * const *a
if (!command_can_run(cmd_ctx, c, Jim_GetString(argv[0], NULL)))
return JIM_ERR;

target_call_timer_callbacks();
/*
* TODO: to be removed after v0.12.0
* workaround for https://sourceforge.net/p/openocd/tickets/362/
* After syntax change of "expr" in jimtcl 0.81
* the replacement of jimtcl "expr" with openocd version in
* https://review.openocd.org/6510/
* introduces too many target polling during math expressions with
* "expr" commands.
* After v0.12.0 replace the following two lines with
* target_call_timer_callbacks();
*/
if (strcmp(c->name, "expr"))
target_call_timer_callbacks_now();

/*
* Black magic of overridden current target:
Expand Down
60 changes: 60 additions & 0 deletions src/openocd.c
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,65 @@ static int openocd_register_commands(struct command_context *cmd_ctx)
return register_commands(cmd_ctx, NULL, openocd_command_handlers);
}

/*
* TODO: to be removed after v0.12.0
* workaround for syntax change of "expr" in jimtcl 0.81
* replace "expr" with openocd version that prints the deprecated msg
*/
struct jim_scriptobj {
void *token;
Jim_Obj *filename_obj;
int len;
int subst_flags;
int in_use;
int firstline;
int linenr;
int missing;
};

static int jim_expr_command(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
{
if (argc == 2)
return Jim_EvalExpression(interp, argv[1]);

if (argc > 2) {
Jim_Obj *obj = Jim_ConcatObj(interp, argc - 1, argv + 1);
Jim_IncrRefCount(obj);
const char *s = Jim_String(obj);
struct jim_scriptobj *script = Jim_GetIntRepPtr(interp->currentScriptObj);
if (interp->currentScriptObj == interp->emptyObj ||
strcmp(interp->currentScriptObj->typePtr->name, "script") ||
script->subst_flags ||
script->filename_obj == interp->emptyObj)
LOG_WARNING("DEPRECATED! use 'expr { %s }' not 'expr %s'", s, s);
else
LOG_WARNING("DEPRECATED! (%s:%d) use 'expr { %s }' not 'expr %s'",
Jim_String(script->filename_obj), script->linenr, s, s);
int retcode = Jim_EvalExpression(interp, obj);
Jim_DecrRefCount(interp, obj);
return retcode;
}

Jim_WrongNumArgs(interp, 1, argv, "expression ?...?");
return JIM_ERR;
}

static const struct command_registration expr_handler[] = {
{
.name = "expr",
.jim_handler = jim_expr_command,
.mode = COMMAND_ANY,
.help = "",
.usage = "",
},
COMMAND_REGISTRATION_DONE
};

static int workaround_for_jimtcl_expr(struct command_context *cmd_ctx)
{
return register_commands(cmd_ctx, NULL, expr_handler);
}

struct command_context *global_cmd_ctx;

static struct command_context *setup_command_handler(Jim_Interp *interp)
Expand All @@ -242,6 +301,7 @@ static struct command_context *setup_command_handler(Jim_Interp *interp)
/* register subsystem commands */
typedef int (*command_registrant_t)(struct command_context *cmd_ctx_value);
static const command_registrant_t command_registrants[] = {
&workaround_for_jimtcl_expr,
&openocd_register_commands,
&server_register_commands,
&gdb_register_commands,
Expand Down

0 comments on commit 4c4c149

Please sign in to comment.