summaryrefslogtreecommitdiff
path: root/ext/tcltklib
diff options
context:
space:
mode:
authornagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-09-07 07:10:44 +0000
committernagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-09-07 07:10:44 +0000
commit865ff7fb4f11bbf1f0e139e16470727828f54e63 (patch)
tree09e2f00bbd85e05ba96774c32f6ee3b6f543ae64 /ext/tcltklib
parenta7357c196559f3181e359662d92cb06d7b18e3cb (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.euc11
-rw-r--r--ext/tcltklib/tcltklib.c36
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;
}