diff options
author | nagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-09-07 07:10:44 +0000 |
---|---|---|
committer | nagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-09-07 07:10:44 +0000 |
commit | 865ff7fb4f11bbf1f0e139e16470727828f54e63 (patch) | |
tree | 09e2f00bbd85e05ba96774c32f6ee3b6f543ae64 /ext/tcltklib | |
parent | a7357c196559f3181e359662d92cb06d7b18e3cb (diff) |
* tcltklib.c (lib_mainloop_core): fixed signal-trap bug
* multi-tk.rb, tk.rb, tkafter.rb, tkcanvas.rb, tkfont.rb, tktext.rb,
tkvirtevent.rb : Ruby/Tk works at $SAFE == 4
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4527 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/tcltklib')
-rw-r--r-- | ext/tcltklib/MANUAL.euc | 11 | ||||
-rw-r--r-- | ext/tcltklib/tcltklib.c | 36 |
2 files changed, 35 insertions, 12 deletions
diff --git a/ext/tcltklib/MANUAL.euc b/ext/tcltklib/MANUAL.euc index f04d036c64..8a7143892c 100644 --- a/ext/tcltklib/MANUAL.euc +++ b/ext/tcltklib/MANUAL.euc @@ -192,13 +192,16 @@ require "tcltklib" �����, �ʲ��Υ⥸�塼��, ���饹�����Ѳ�ǽ�Ǥ�. : ( �ƻ륹��åɤ�����������˥��٥�ȥ롼�פ�¹Ԥ��� )�� : �����ΰ�̣�� mainloop ��Ʊ���Ǥ��롥 - do_one_event(flag = TclTkLib::EventFlag::ALL) + do_one_event(flag = TclTkLib::EventFlag::ALL | + TclTkLib::EventFlag::DONT_WAIT) : �����Ԥ��Υ��٥�� 1 �Ĥ�¹Ԥ��롥 : ���٥�Ȥ������������ true ���֤��� : �ե饰�� DONT_WAIT ����ꤷ�Ƥ��ʤ���硤�ե饰�ǽ����� : �ݤȤʤäƤ������Υ��٥�Ȥ�ȯ������ޤ��Ԥ�³���롥 : DONT_WAIT ����ꤷ�Ƥ�����硤�����оݥ��٥�Ȥ��ʤ��Ƥ� : �����˽�λ�� false ���֤��� + : $SAFE >= 4 ����$SAFE >= 1 ���� flag ����������Ƥ���ʤ�� + : flag �ˤ� DONT_WAIT ������Ū���դ����롥 set_eventloop_tick(timer_tick) : ���٥�ȥ롼�פ�Ʊ�����̥���åɤ���Ư���Ƥ�����ˡ��� @@ -213,6 +216,7 @@ require "tcltklib" �����, �ʲ��Υ⥸�塼��, ���饹�����Ѳ�ǽ�Ǥ�. : �ꤵ��롥 : �ܺ٤�������ά����������� CPU �ѥ�����Ĥİ����� : ���ꤷ��ư���¸����뤿��˼����������ͤǤ��롥 + : $SAFE >= 4 �Ǥϼ¹Ԥ��ػߤ���롥 get_eventloop_tick : timer_tick �θ����ͤ��֤��� @@ -222,6 +226,7 @@ require "tcltklib" �����, �ʲ��Υ⥸�塼��, ���饹�����Ѳ�ǽ�Ǥ�. : ��¸�ߤ��ʤ��ä��ݤ� sleep ���֤��������Ĺ����ꤹ�롥 : ��Ư����åɤ����٥�ȥ롼�פ����ξ��ˤϰ�̣��ʤ��ʤ��� : �ǥե���Ȥ��ͤ� 20 (ms) + : $SAFE >= 4 �Ǥϼ¹Ԥ��ػߤ���롥 get_no_event_wait : no_event_wait �θ����ͤ��֤��� @@ -239,6 +244,7 @@ require "tcltklib" �����, �ʲ��Υ⥸�塼��, ���饹�����Ѳ�ǽ�Ǥ�. : ������ȯ�����ʤ��ޤޤ� 80 ��ν����Ԥ����٥�ȸ�������λ : ����Ȥ��ǥ�����Ȥ� 800 �ʾ�ˤʤ�ȥ���åɥ����å��� : ��ȯ�����뤳�Ȥˤʤ롥 + : $SAFE >= 4 �Ǥϼ¹Ԥ��ػߤ���롥 get_eventloop_weight : ���ߤ� loop_max �� no_event_tick �Ȥ��ͤ��֤��� @@ -258,6 +264,7 @@ require "tcltklib" �����, �ʲ��Υ⥸�塼��, ���饹�����Ѳ�ǽ�Ǥ�. : ¾�Υ����ץ�ν�����³���Բ�ǽ�ˤʤ뤳�Ȥ����롥���� : �褦�ʾ��Ǥ⥨�顼��̵�뤷�ƥ��٥�ȥ롼�פ���Ư��³���� : ���Ȥǡ�¾�Υ����ץ�������ư�³���뤳�Ȥ��Ǥ��롥 + : $SAFE >= 4 �Ǥϼ¹Ԥ��ػߤ���롥 mainloop_abort_on_exception : Tk �����ץ����㳰��ȯ�������ݤˡ����٥�ȥ롼�פ� @@ -295,6 +302,7 @@ require "tcltklib" �����, �ʲ��Υ⥸�塼��, ���饹�����Ѳ�ǽ�Ǥ�. : ���Ȥ����Τ� false ����ꤷ�Ƥ����Ȥ��Ƥ⡤�ƤȤʤ륤�� : �ץ�� safe �����ץ�Ǥ���С��������������Ѥ��� : safe �����ץ�Ȥ�����������롥 + : $SAFE >= 4 �Ǥϡ�safe �����ץ�ʳ����������ػߤ���롥 make_safe : Tcl/Tk �����ץ�� safe �����ץ���ѹ����롥 @@ -319,6 +327,7 @@ require "tcltklib" �����, �ʲ��Υ⥸�塼��, ���饹�����Ѳ�ǽ�Ǥ�. : Tcl/Tk �����ץ�� Tk ��ʬ�ν�������Ƶ�ư��Ԥ��� : ��ö root widget ���˲�������˺��� Tk �ε�ǽ��ɬ�פ� : �ʤä������Ѥ��롥 + : $SAFE >= 4 �Ǥϼ¹Ԥ��ػߤ���롥 _eval(str) _invoke(*args) diff --git a/ext/tcltklib/tcltklib.c b/ext/tcltklib/tcltklib.c index ef91fcae3d..fdc4b00305 100644 --- a/ext/tcltklib/tcltklib.c +++ b/ext/tcltklib/tcltklib.c @@ -154,6 +154,8 @@ set_eventloop_tick(self, tick) { int ttick = NUM2INT(tick); + rb_secure(4); + if (ttick < 0) { rb_raise(rb_eArgError, "timer-tick parameter must be 0 or positive number"); @@ -209,6 +211,8 @@ set_no_event_wait(self, wait) { int t_wait = NUM2INT(wait); + rb_secure(4); + if (t_wait <= 0) { rb_raise(rb_eArgError, "no_event_wait parameter must be positive number"); @@ -256,6 +260,8 @@ set_eventloop_weight(self, loop_max, no_event) int lpmax = NUM2INT(loop_max); int no_ev = NUM2INT(no_event); + rb_secure(4); + if (lpmax <= 0 || no_ev <= 0) { rb_raise(rb_eArgError, "weight parameters must be positive numbers"); } @@ -336,6 +342,7 @@ ip_evloop_abort_on_exc_set(self, val) { struct tcltkip *ptr = get_ip(self); + rb_secure(4); if (Tcl_GetMaster(ptr->ip) != (Tcl_Interp*)NULL) { /* slave IP */ return lib_evloop_abort_on_exc(self); @@ -392,6 +399,8 @@ lib_mainloop_core(check_root_widget) if (run_timer_flag) { DUMP1("timer interrupt"); run_timer_flag = 0; + DUMP1("call rb_trap_exec()"); + rb_trap_exec(); DUMP1("check Root Widget"); if (check && Tk_GetNumMainWindows() == 0) { return Qnil; @@ -619,15 +628,18 @@ lib_do_one_event_core(argc, argv, self, is_ip) { VALUE vflags; int flags; - int ret; if (rb_scan_args(argc, argv, "01", &vflags) == 0) { - flags = TCL_ALL_EVENTS; + flags = TCL_ALL_EVENTS | TCL_DONT_WAIT; } else { Check_Type(vflags, T_FIXNUM); flags = FIX2INT(vflags); } - + + if (rb_safe_level() >= 4 || (rb_safe_level() >=1 && OBJ_TAINTED(vflags))) { + flags |= TCL_DONT_WAIT; + } + if (is_ip) { /* check IP */ struct tcltkip *ptr = get_ip(self); @@ -637,8 +649,7 @@ lib_do_one_event_core(argc, argv, self, is_ip) } } - ret = Tcl_DoOneEvent(flags); - if (ret) { + if (Tcl_DoOneEvent(flags)) { return Qtrue; } else { return Qfalse; @@ -681,6 +692,8 @@ lib_restart(self) { struct tcltkip *ptr = get_ip(self); + rb_secure(4); + /* destroy the root wdiget */ ptr->return_value = Tcl_Eval(ptr->ip, "destroy ."); /* ignore ERROR */ @@ -715,6 +728,7 @@ ip_restart(self) { struct tcltkip *ptr = get_ip(self); + rb_secure(4); if (Tcl_GetMaster(ptr->ip) != (Tcl_Interp*)NULL) { /* slave IP */ return Qnil; @@ -912,6 +926,7 @@ ip_create_slave(argc, argv, self) safe = 1; } else if (safemode == Qfalse || safemode == Qnil) { safe = 0; + rb_secure(4); } else { safe = 1; } @@ -961,7 +976,7 @@ ip_delete(self) VALUE self; { struct tcltkip *ptr = get_ip(self); - + Tcl_DeleteInterp(ptr->ip); return Qnil; @@ -1131,7 +1146,6 @@ ip_invoke_real(argc, argv, obj) /* ip is deleted? */ if (Tcl_InterpDeleted(ptr->ip)) { - Tcl_ResetResult(ptr->ip); return rb_tainted_str_new2(""); } @@ -1139,7 +1153,7 @@ ip_invoke_real(argc, argv, obj) if (!Tcl_GetCommandInfo(ptr->ip, cmd, &info)) { /* if (event_loop_abort_on_exc || cmd[0] != '.') { */ if (event_loop_abort_on_exc > 0) { - /*rb_ip_raise(obj, rb_eNameError, "invalid command name `%s'", cmd);*/ + /*rb_ip_raise(obj,rb_eNameError,"invalid command name `%s'",cmd);*/ return create_ip_exc(obj, rb_eNameError, "invalid command name `%s'", cmd); } else { @@ -1349,11 +1363,11 @@ ip_invoke(argc, argv, obj) /* get result & free allocated memory */ result = *alloc_result; - if (rb_obj_is_kind_of(result, rb_eException)) { - rb_exc_raise(result); - } free(alloc_argv); free(alloc_result); + if (rb_obj_is_kind_of(result, rb_eException)) { + rb_exc_raise(result); + } return result; } |