+ struct command_context *cmd_ctx = current_command_context(interp);
+
+ if (!command_can_run(cmd_ctx, c, Jim_GetString(argv[0], NULL)))
+ return JIM_ERR;
+
+ /*
+ * 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:
+ * If the command we are going to handle has a target prefix,
+ * override the current target temporarily for the time
+ * of processing the command.
+ * current_target_override is used also for event handlers
+ * therefore we prevent touching it if command has no prefix.
+ * Previous override is saved and restored back to ensure
+ * correct work when jim_command_dispatch() is re-entered.
+ */
+ struct target *saved_target_override = cmd_ctx->current_target_override;
+ if (c->jim_override_target)
+ cmd_ctx->current_target_override = c->jim_override_target;
+
+ int retval = exec_command(interp, cmd_ctx, c, argc, argv);
+
+ if (c->jim_override_target)
+ cmd_ctx->current_target_override = saved_target_override;
+
+ return retval;