diff --git a/src/helper/command.c b/src/helper/command.c index ef50ab5bd..26d22794d 100644 --- a/src/helper/command.c +++ b/src/helper/command.c @@ -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: diff --git a/src/openocd.c b/src/openocd.c index 54c5eb34f..07955256c 100644 --- a/src/openocd.c +++ b/src/openocd.c @@ -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) @@ -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,