* ext/tcltklib/tcltklib.c (ip_invoke_core): call Tcl's "::unknown"

command when can't get information of target command.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@8386 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nagai 2005-04-26 13:59:48 +00:00
parent a15556a27c
commit 7d3df9ddc1
2 changed files with 66 additions and 16 deletions

View file

@ -1,3 +1,8 @@
Tue Apr 26 22:58:00 2005 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
* ext/tcltklib/tcltklib.c (ip_invoke_core): call Tcl's "::unknown"
command when can't get information of target command.
Mon Apr 25 01:18:43 2005 Tanaka Akira <akr@m17n.org> Mon Apr 25 01:18:43 2005 Tanaka Akira <akr@m17n.org>
* regex.c: declare rb_warn to have variadic argument. [ruby-core:4751] * regex.c: declare rb_warn to have variadic argument. [ruby-core:4751]

View file

@ -4,7 +4,7 @@
* Oct. 24, 1997 Y. Matsumoto * Oct. 24, 1997 Y. Matsumoto
*/ */
#define TCLTKLIB_RELEASE_DATE "2005-04-23" #define TCLTKLIB_RELEASE_DATE "2005-04-26"
#include "ruby.h" #include "ruby.h"
#include "rubysig.h" #include "rubysig.h"
@ -6469,6 +6469,7 @@ ip_invoke_core(interp, argc, argv)
int thr_crit_bup; int thr_crit_bup;
struct invoke_info inf; struct invoke_info inf;
int status; int status;
int unknown_flag = 0;
VALUE ret; VALUE ret;
#if TCL_MAJOR_VERSION >= 8 #if TCL_MAJOR_VERSION >= 8
@ -6505,23 +6506,56 @@ ip_invoke_core(interp, argc, argv)
DUMP2("call Tcl_GetCommandInfo, %s", cmd); DUMP2("call Tcl_GetCommandInfo, %s", cmd);
if (!Tcl_GetCommandInfo(ptr->ip, cmd, &info)) { if (!Tcl_GetCommandInfo(ptr->ip, cmd, &info)) {
DUMP1("error Tcl_GetCommandInfo"); DUMP1("error Tcl_GetCommandInfo");
/* if (event_loop_abort_on_exc || cmd[0] != '.') { */ DUMP1("try auto_load (call 'unknown' command)");
if (event_loop_abort_on_exc > 0) { if (!Tcl_GetCommandInfo(ptr->ip,
/* Tcl_Release(ptr->ip); */ #if TCL_MAJOR_VERSION >= 8
rbtk_release_ip(ptr); "::unknown",
/*rb_ip_raise(obj,rb_eNameError,"invalid command name `%s'",cmd);*/ #else
return create_ip_exc(interp, rb_eNameError, "unknown",
"invalid command name `%s'", cmd); #endif
} else { &info)) {
if (event_loop_abort_on_exc < 0) { DUMP1("fail to get 'unknown' command");
rb_warning("invalid command name `%s' (ignore)", cmd); /* if (event_loop_abort_on_exc || cmd[0] != '.') { */
if (event_loop_abort_on_exc > 0) {
/* Tcl_Release(ptr->ip); */
rbtk_release_ip(ptr);
/*rb_ip_raise(obj,rb_eNameError,"invalid command name `%s'",cmd);*/
return create_ip_exc(interp, rb_eNameError,
"invalid command name `%s'", cmd);
} else { } else {
rb_warn("invalid command name `%s' (ignore)", cmd); if (event_loop_abort_on_exc < 0) {
rb_warning("invalid command name `%s' (ignore)", cmd);
} else {
rb_warn("invalid command name `%s' (ignore)", cmd);
}
Tcl_ResetResult(ptr->ip);
/* Tcl_Release(ptr->ip); */
rbtk_release_ip(ptr);
return rb_tainted_str_new2("");
} }
Tcl_ResetResult(ptr->ip); } else {
/* Tcl_Release(ptr->ip); */ #if TCL_MAJOR_VERSION >= 8
rbtk_release_ip(ptr); Tcl_Obj **unknown_objv;
return rb_tainted_str_new2(""); #else
char **unknown_argv;
#endif
DUMP1("find 'unknown' command -> set arguemnts");
unknown_flag = 1;
#if TCL_MAJOR_VERSION >= 8
unknown_objv = (Tcl_Obj **)ALLOC_N(Tcl_Obj *, objc+2);
unknown_objv[0] = Tcl_NewStringObj("::unknown", 9);
Tcl_IncrRefCount(unknown_objv[0]);
memcpy(unknown_objv + 1, objv, sizeof(Tcl_Obj *)*objc);
unknown_objv[++objc] = (Tcl_Obj*)NULL;
objv = unknown_objv;
#else
unknown_argv = (char **)ALLOC_N(char *, argc+2);
unknown_argv[0] = strdup("unknown");
memcpy(unknown_argv + 1, argv, sizeof(char *)*argc);
unknown_argv[++argc] = (char *)NULL;
argv = unknown_argv;
#endif
} }
} }
DUMP1("end Tcl_GetCommandInfo"); DUMP1("end Tcl_GetCommandInfo");
@ -6606,6 +6640,17 @@ ip_invoke_core(interp, argc, argv)
} }
#endif /* ! wrap tcl-proc call */ #endif /* ! wrap tcl-proc call */
/* free allocated memory for calling 'unknown' command */
if (unknown_flag) {
#if TCL_MAJOR_VERSION >= 8
Tcl_DecrRefCount(objv[0]);
free(objv);
#else
free(argv[0]);
free(argv);
#endif
}
/* exception on mainloop */ /* exception on mainloop */
if (pending_exception_check1(thr_crit_bup, ptr)) { if (pending_exception_check1(thr_crit_bup, ptr)) {
return rbtk_pending_exception; return rbtk_pending_exception;