git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1053 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2000-11-27 09:23:38 +00:00
Родитель 1f297b8bfc
Коммит f54418b71f
20 изменённых файлов: 909 добавлений и 183 удалений

Просмотреть файл

@ -1,7 +1,79 @@
Mon Nov 27 17:00:35 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
* eval.c (rb_eval): should not redefine builtin classes/modules
from within wrapped load.
Mon Nov 27 08:57:33 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
* eval.c (call_end_proc): should be isolated from outer block.
Mon Nov 27 00:10:08 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
* io.c (rb_io_ctl): call ioctl/fcntl for fptr->f2 too.
* process.c (rb_f_fork): call rb_thread_atfork() after creating
child process.
* eval.c (rb_thread_atfork): kill all other threads immediately,
then turn the current thread into the main thread.
Sat Nov 25 23:12:22 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
* eval.c (ruby_run): move calling point of rb_trap_exit after
cleaning up threads.
* eval.c (ruby_finalize): new function to call EXIT trap, END
procs and GC finalizers.
* eval.c (rb_exec_end_proc): prevent recursion.
* gc.c (rb_gc_call_finalizer_at_exit): ditto.
* signal.c (rb_trap_exit): ditto. made static.
* process.c (rb_f_fork): should swallow all exceptions from block
execution.
* process.c (fork_rescue): should call ruby_finalize().
* parse.y (yycompile): rb_gc() removed. I don't remember why I put
this here. test code?
Fri Nov 24 22:03:48 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
* range.c (EXCL): exclusive infomation is now stored in an
instance variable. this enables proper marshal dump.
* process.c (proc_waitpid): should clear rb_last_status ($?) if
no pid was given by waitpid(2).
Thu Nov 23 01:35:38 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
* process.c (proc_waitpid2): returns nil if no pid found.
Wed Nov 22 23:45:15 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
* range.c (range_eq): new method. Compares start and end of range
respectively.
Wed Nov 22 11:01:32 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
* variable.c (rb_mod_class_variables): should honor singleton
class variable rule defined yesterday.
Tue Nov 21 23:24:14 2000 Mitsuteru S Nakao <nakao@kuicr.kyoto-u.ac.jp>
* numeric.c (flodivmod): missing second operand (typo).
Tue Nov 21 03:39:41 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
* marshal.c (marshal_load): marshal format compatibility check
revised. greater minor revision is UPWARD compatibile;
downward compatibility is not assured.
* eval.c (is_defined): clarify class variable behavior for
singleton classes.
singleton classes. class variables within singleton class
should be treated like within singleton method.
Mon Nov 20 13:45:21 2000 Yukihiro Matsumoto <matz@ruby-lang.org>

2
config.sub поставляемый
Просмотреть файл

@ -989,7 +989,7 @@ case $os in
-xenix)
os=-xenix
;;
-*mint | -*MiNT)
-mint* | -MiNT*)
os=-mint
;;
-uxpds)

109
eval.c
Просмотреть файл

@ -1114,6 +1114,39 @@ ruby_options(argc, argv)
}
}
static void rb_exec_end_proc _((void));
void
ruby_finalize()
{
rb_trap_exit();
rb_exec_end_proc();
rb_gc_call_finalizer_at_exit();
}
void
ruby_stop(ex)
int ex;
{
int state;
PUSH_TAG(PROT_NONE);
PUSH_ITER(ITER_NOT);
if ((state = EXEC_TAG()) == 0) {
rb_thread_cleanup();
rb_thread_wait_other_threads();
}
else if (ex == 0) {
ex = state;
}
POP_ITER();
POP_TAG();
ex = error_handle(ex);
ruby_finalize();
exit(ex);
}
void
ruby_run()
{
@ -1133,23 +1166,7 @@ ruby_run()
POP_TAG();
if (state && !ex) ex = state;
PUSH_TAG(PROT_NONE);
PUSH_ITER(ITER_NOT);
if ((state = EXEC_TAG()) == 0) {
rb_trap_exit();
rb_thread_cleanup();
rb_thread_wait_other_threads();
}
else {
ex = state;
}
POP_ITER();
POP_TAG();
ex = error_handle(ex);
rb_exec_end_proc();
rb_gc_call_finalizer_at_exit();
exit(ex);
ruby_stop(ex);
}
static void
@ -2955,17 +2972,12 @@ rb_eval(self, n)
}
klass = 0;
if ((ruby_class == rb_cObject || ruby_class == ruby_wrapper) &&
rb_autoload_defined(node->nd_cname)) {
if ((ruby_class == rb_cObject) && rb_autoload_defined(node->nd_cname)) {
rb_autoload_load(node->nd_cname);
}
if (rb_const_defined_at(ruby_class, node->nd_cname)) {
klass = rb_const_get(ruby_class, node->nd_cname);
}
if (!klass && ruby_class == ruby_wrapper &&
rb_const_defined_at(rb_cObject, node->nd_cname)) {
klass = rb_const_get(rb_cObject, node->nd_cname);
}
if (klass) {
if (TYPE(klass) != T_CLASS) {
rb_raise(rb_eTypeError, "%s is not a class",
@ -3013,17 +3025,12 @@ rb_eval(self, n)
rb_raise(rb_eTypeError, "no outer class/module");
}
module = 0;
if ((ruby_class == rb_cObject || ruby_class == ruby_wrapper) &&
rb_autoload_defined(node->nd_cname)) {
if ((ruby_class == rb_cObject) && rb_autoload_defined(node->nd_cname)) {
rb_autoload_load(node->nd_cname);
}
if (rb_const_defined_at(ruby_class, node->nd_cname)) {
module = rb_const_get(ruby_class, node->nd_cname);
}
if (!module && ruby_class == ruby_wrapper &&
rb_const_defined_at(rb_cObject, node->nd_cname)) {
module = rb_const_get(rb_cObject, node->nd_cname);
}
if (module) {
if (TYPE(module) != T_MODULE) {
rb_raise(rb_eTypeError, "%s is not a module",
@ -3208,11 +3215,14 @@ rb_exit(status)
int status;
{
if (prot_tag) {
VALUE exit;
exit_status = status;
rb_exc_raise(rb_exc_new(rb_eSystemExit, 0, 0));
exit = rb_exc_new(rb_eSystemExit, 0, 0);
rb_iv_set(exit, "status", INT2NUM(status));
rb_exc_raise(exit);
}
rb_exec_end_proc();
rb_gc_call_finalizer_at_exit();
ruby_finalize();
exit(status);
}
@ -5602,7 +5612,11 @@ static void
call_end_proc(data)
VALUE data;
{
PUSH_ITER(ITER_NOT);
PUSH_FRAME();
proc_call(data, Qundef);
POP_FRAME();
POP_ITER();
}
static void
@ -5625,24 +5639,28 @@ rb_f_at_exit()
return proc;
}
void
static void
rb_exec_end_proc()
{
struct end_proc_data *link;
int status;
link = end_procs;
while (link) {
while (end_procs) {
link = end_procs;
end_procs = link->next;
rb_protect((VALUE(*)())link->func, link->data, &status);
if (status) {
error_handle(status);
}
link = link->next;
free(link);
}
while (ephemeral_end_procs) {
link = ephemeral_end_procs;
ephemeral_end_procs = link->next;
rb_protect((VALUE(*)())link->func, link->data, &status);
if (status) {
error_handle(status);
}
free(link);
}
}
@ -6915,6 +6933,7 @@ rb_thread_remove(th)
rb_thread_t th;
{
if (th->status == THREAD_KILLED) return;
rb_thread_ready(th);
th->status = THREAD_KILLED;
th->prev->next = th->next;
@ -7816,6 +7835,7 @@ rb_thread_start_0(fn, arg, th_arg)
}
POP_TAG();
status = th->status;
if (th == main_thread) ruby_stop(state);
rb_thread_remove(th);
if (state && status != THREAD_TO_KILL && !NIL_P(ruby_errinfo)) {
th->flags |= THREAD_RAISED;
@ -8214,6 +8234,23 @@ rb_thread_inspect(thread)
return str;
}
void
rb_thread_atfork()
{
rb_thread_t th;
if (rb_thread_alone()) return;
FOREACH_THREAD(th) {
if (th != curr_thread) {
th->status = THREAD_KILLED;
}
}
END_FOREACH(th);
main_thread = curr_thread;
curr_thread->next = curr_thread;
curr_thread->prev = curr_thread;
}
static VALUE rb_cCont;
static VALUE

Просмотреть файл

@ -485,6 +485,56 @@ module TkCore
end
end
def after_idle(cmd=Proc.new)
myid = _curr_cmd_id
cmdid = install_cmd(cmd)
tk_call('after','idle',cmdid)
end
def clock_clicks(ms=nil)
if ms
tk_call('clock','clicks','-milliseconds').to_i
else
tk_call('clock','clicks').to_i
end
end
def clock_format(clk, form=nil)
if form
tk_call('clock','format',clk,'-format',form).to_i
else
tk_call('clock','format',clk).to_i
end
end
def clock_formatGMT(clk, form=nil)
if form
tk_call('clock','format',clk,'-format',form,'-gmt','1').to_i
else
tk_call('clock','format',clk,'-gmt','1').to_i
end
end
def clock_scan(str, base=nil)
if base
tk_call('clock','scan',str,'-base',base).to_i
else
tk_call('clock','scan',str).to_i
end
end
def clock_scanGMT(str, base=nil)
if base
tk_call('clock','scan',str,'-base',base,'-gmt','1').to_i
else
tk_call('clock','scan',str,'-gmt','1').to_i
end
end
def clock_seconds
tk_call('clock','seconds').to_i
end
def TkCore.callback(arg)
arg = Array(tk_split_list(arg))
_get_eval_string(TkUtil.eval_cmd(Tk_CMDTBL[arg.shift], *arg))
@ -1762,10 +1812,28 @@ module TkPack
tk_call 'pack', 'forget' *args
end
def propagate(master, bool=None)
bool(tk_call('pack', 'propagate', master.epath, bool))
def info(slave)
ilist = list(tk_call('pack', 'info', slave.epath))
info = {}
while key = ilist.shift
info[key[1..-1]] = ilist.shift
end
return info
end
module_function :configure, :forget, :propagate
def propagate(master, bool=None)
if bool == None
bool(tk_call('pack', 'propagate', master.epath))
else
tk_call('pack', 'propagate', master.epath, bool)
end
end
def slaves(master)
list(tk_call('pack', 'slaves', master.epath))
end
module_function :configure, :forget, :info, :propagate, :slaves
end
module TkGrid
@ -1795,6 +1863,32 @@ module TkGrid
tk_call "grid", 'rowconfigure', master, index, *hash_kv(args)
end
def columnconfiginfo(master, index, slot=nil)
if slot
tk_call 'grid', 'columnconfigure', master, index, "-#{slot}"
else
ilist = list(tk_call('grid', 'columnconfigure', master, index))
info = {}
while key = ilist.shift
info[key[1..-1]] = ilist.shift
end
info
end
end
def rowconfiginfo(master, index, slot=nil)
if slot
tk_call 'grid', 'rowconfigure', master, index, "-#{slot}"
else
ilist = list(tk_call('grid', 'rowconfigure', master, index))
info = {}
while key = ilist.shift
info[key[1..-1]] = ilist.shift
end
info
end
end
def add(widget, *args)
configure(widget, *args)
end
@ -1812,7 +1906,11 @@ module TkGrid
end
def propagate(master, bool=None)
bool(tk_call('grid', 'propagate', master.epath, bool))
if bool == None
bool(tk_call('grid', 'propagate', master.epath))
else
tk_call('grid', 'propagate', master.epath, bool)
end
end
def remove(*args)
@ -1823,13 +1921,63 @@ module TkGrid
tk_call 'grid', 'size', master
end
def slaves(args)
list(tk_call('grid', 'slaves', *hash_kv(args)))
def slaves(master, args)
list(tk_call('grid', 'slaves', master, *hash_kv(args)))
end
module_function :bbox, :forget, :propagate, :info
module_function :remove, :size, :slaves, :location
module_function :configure, :columnconfigure, :rowconfigure
module_function :columnconfiginfo, :rowconfiginfo
end
module TkPlace
include Tk
extend Tk
def configure(win, slot, value=None)
if slot.kind_of? Hash
tk_call 'place', 'configure', win.epath, *hash_kv(slot)
else
tk_call 'place', 'configure', win.epath, "-#{slot}", value
end
end
def configinfo(win, slot = nil)
# for >= Tk8.4a2 ?
if slot
conf = tk_split_list(tk_call('place', 'configure',
win.epath, "-#{slot}") )
conf[0] = conf[0][1..-1]
conf
else
tk_split_simplelist(tk_call('place', 'configure',
win.epath)).collect{|conflist|
conf = tk_split_simplelist(conflist)
conf[0] = conf[0][1..-1]
conf
}
end
end
def forget(win)
tk_call 'place', 'forget', win
end
def info(win)
ilist = list(tk_call('place', 'info', win.epath))
info = {}
while key = ilist.shift
info[key[1..-1]] = ilist.shift
end
return info
end
def slaves(master)
list(tk_call('place', 'slaves', master.epath))
end
module_function :configure, :configinfo, :forget, :info, :slaves
end
module TkOption
@ -1993,7 +2141,12 @@ class TkObject<TkKernel
end
def cget(slot)
tk_tcl2ruby tk_call path, 'cget', "-#{slot}"
case slot
when 'text', 'label', 'show', 'data', 'flie'
tk_call path, 'cget', "-#{slot}"
else
tk_tcl2ruby tk_call path, 'cget', "-#{slot}"
end
end
def configure(slot, value=None)
@ -2028,17 +2181,43 @@ class TkObject<TkKernel
fontobj
else
if slot
conf = tk_split_list(tk_send('configure', "-#{slot}") )
case slot
when 'text', 'label', 'show', 'data', 'flie'
conf = tk_split_simplelist(tk_send('configure', "-#{slot}") )
else
conf = tk_split_list(tk_send('configure', "-#{slot}") )
end
conf[0] = conf[0][1..-1]
conf
else
ret = tk_split_list(tk_send('configure') ).collect{|conf|
ret = tk_split_simplelist(tk_send('configure') ).collect{|conflist|
conf = tk_split_simplelist(conflist)
conf[0] = conf[0][1..-1]
case conf[0]
when 'text', 'label', 'show', 'data', 'flie'
else
if conf[3]
if conf[3].index('{')
conf[3] = tk_split_list(conf[3])
else
conf[3] = tk_tcl2ruby(conf[3])
end
end
if conf[4]
if conf[4].index('{')
conf[4] = tk_split_list(conf[4])
else
conf[4] = tk_tcl2ruby(conf[4])
end
end
end
conf
}
if ret.assoc('font')
fontconf = ret.assoc('font')
if fontconf
ret.delete_if{|item| item[0] == 'font' || item[0] == 'kanjifont'}
ret.push(['font', fontobj])
fontconf[4] = fontobj
ret.push(fontconf)
else
ret
end
@ -2093,6 +2272,36 @@ class TkWindow<TkObject
tk_call 'pack', 'forget', epath
self
end
alias pack_forget unpack
def pack_config(slot, value=None)
if slot.kind_of? Hash
tk_call 'pack', 'configure', epath, *hash_kv(slot)
else
tk_call 'pack', 'configure', epath, "-#{slot}", value
end
end
def pack_info()
ilist = list(tk_call('pack', 'info', epath))
info = {}
while key = ilist.shift
info[key[1..-1]] = ilist.shift
end
return info
end
def pack_propagate(mode = nil)
if mode
tk_call('pack', 'propagate', epath, mode)
else
bool(tk_call('pack', 'propagate', epath))
end
end
def pack_slaves()
list(tk_call('pack', 'slaves', epath))
end
def grid(keys = nil)
tk_call 'grid', epath, *hash_kv(keys)
@ -2103,6 +2312,81 @@ class TkWindow<TkObject
tk_call 'grid', 'forget', epath
self
end
alias grid_forget ungrid
def grid_bbox(*args)
list(tk_call('grid', 'bbox', epath, *args))
end
def grid_config(slot, value=None)
if slot.kind_of? Hash
tk_call 'grid', 'configure', epath, *hash_kv(slot)
else
tk_call 'grid', 'configure', epath, "-#{slot}", value
end
end
def grid_columnconfig(index, keys)
tk_call('grid', 'columnconfigure', epath, index, hash_kv(keys))
end
def grid_rowconfig(index, keys)
tk_call('grid', 'rowconfigure', epath, index, hash_kv(keys))
end
def grid_columnconfiginfo(index, slot=nil)
if slot
tk_call('grid', 'columnconfigure', epath, index, "-#{slot}")
else
ilist = list(tk_call('grid', 'columnconfigure', epath, index))
info = {}
while key = ilist.shift
info[key[1..-1]] = ilist.shift
end
info
end
end
def grid_rowconfiginfo(index, slot=nil)
if slot
tk_call('grid', 'rowconfigure', epath, index, "-#{slot}")
else
ilist = list(tk_call('grid', 'rowconfigure', epath, index))
info = {}
while key = ilist.shift
info[key[1..-1]] = ilist.shift
end
info
end
end
def grid_info()
list(tk_call('grid', 'info', epath))
end
def grid_location(x, y)
list(tk_call('grid', 'location', epath, x, y))
end
def grid_propagate(mode=nil)
if mode
tk_call('grid', 'propagate', epath, bool)
else
bool(tk_call('grid', 'propagate', epath))
end
end
def grid_remove()
tk_call 'grid', 'remove', epath
end
def grid_size()
tk_call 'grid', 'size', epath
end
def grid_slaves(args)
list(tk_call('grid', 'slaves', epath, *hash_kv(args)))
end
def place(keys = nil)
tk_call 'place', epath, *hash_kv(keys)
@ -2115,8 +2399,28 @@ class TkWindow<TkObject
end
alias place_forget unplace
def place_config(keys)
tk_call "place", 'configure', epath, *hash_kv(keys)
def place_config(slot, value=None)
if slot.kind_of? Hash
tk_call 'place', 'configure', epath, *hash_kv(slot)
else
tk_call 'place', 'configure', epath, "-#{slot}", value
end
end
def place_configinfo(slot = nil)
# for >= Tk8.4a2 ?
if slot
conf = tk_split_list(tk_call('place', 'configure', epath, "-#{slot}") )
conf[0] = conf[0][1..-1]
conf
else
tk_split_simplelist(tk_call('place',
'configure', epath)).collect{|conflist|
conf = tk_split_simplelist(conflist)
conf[0] = conf[0][1..-1]
conf
}
end
end
def place_info()
@ -2128,19 +2432,6 @@ class TkWindow<TkObject
return info
end
def pack_slaves()
list(tk_call('pack', 'slaves', epath))
end
def pack_info()
ilist = list(tk_call('pack', 'info', epath))
info = {}
while key = ilist.shift
info[key[1..-1]] = ilist.shift
end
return info
end
def place_slaves()
list(tk_call('place', 'slaves', epath))
end
@ -2160,7 +2451,9 @@ class TkWindow<TkObject
elsif args.length == 1
case args[0]
when 'global'
tk_call 'grab', 'set', '-global', path
return(tk_call 'grab', 'set', '-global', path)
when 'release'
return(tk_call 'grab', 'release', path)
else
val = tk_call('grab', args[0], path)
end
@ -2360,9 +2653,9 @@ class TkButton<TkLabel
end
end
class TkRadiobutton<TkButton
class TkRadioButton<TkButton
WidgetClassNames['Radiobutton'] = self
def TkRadiobutton.to_eval
def TkRadioButton.to_eval
'Radiobutton'
end
def create_self
@ -2378,11 +2671,11 @@ class TkRadiobutton<TkButton
configure 'variable', tk_trace_variable(v)
end
end
TkRadioButton = TkRadiobutton
TkRadiobutton = TkRadioButton
class TkCheckbutton<TkRadiobutton
class TkCheckButton<TkRadioButton
WidgetClassNames['Checkbutton'] = self
def TkCheckbutton.to_eval
def TkCheckButton.to_eval
'Checkbutton'
end
def create_self
@ -2392,7 +2685,7 @@ class TkCheckbutton<TkRadiobutton
tk_send 'toggle'
end
end
TkCheckButton = TkCheckbutton
TkCheckbutton = TkCheckButton
class TkMessage<TkLabel
WidgetClassNames['Message'] = self
@ -2403,7 +2696,6 @@ class TkMessage<TkLabel
tk_call 'message', @path
end
end
TkRadiobutton = TkRadioButton
class TkScale<TkWindow
WidgetClassName = 'Scale'.freeze
@ -2432,7 +2724,6 @@ class TkScale<TkWindow
set val
end
end
TkCheckbutton = TkCheckButton
class TkScrollbar<TkWindow
WidgetClassName = 'Scrollbar'.freeze
@ -2547,7 +2838,12 @@ class TkListbox<TkTextWin
end
def itemcget(index, key)
tk_tcl2ruby tk_send 'itemcget', index, "-#{key}"
case key
when 'text', 'label', 'show'
tk_send 'itemcget', index, "-#{key}"
else
tk_tcl2ruby tk_send 'itemcget', index, "-#{key}"
end
end
def itemconfigure(index, key, val=None)
if key.kind_of? Hash
@ -2570,12 +2866,36 @@ class TkListbox<TkTextWin
def itemconfiginfo(index, key=nil)
if key
conf = tk_split_list(tk_send('itemconfigure',index,"-#{key}"))
case key
when 'text', 'label', 'show'
conf = tk_split_simplelist(tk_send('itemconfigure',index,"-#{key}"))
else
conf = tk_split_list(tk_send('itemconfigure',index,"-#{key}"))
end
conf[0] = conf[0][1..-1]
conf
else
tk_split_list(tk_send('itemconfigure', index)).collect{|conf|
tk_split_simplelist(tk_send('itemconfigure', index)).collect{|conflist|
conf = tk_split_simplelist(conflist)
conf[0] = conf[0][1..-1]
case conf[0]
when 'text', 'label', 'show'
else
if conf[3]
if conf[3].index('{')
conf[3] = tk_split_list(conf[3])
else
conf[3] = tk_tcl2ruby(conf[3])
end
end
if conf[4]
if conf[4].index('{')
conf[4] = tk_split_list(conf[4])
else
conf[4] = tk_tcl2ruby(conf[4])
end
end
end
conf
}
end
@ -2743,7 +3063,12 @@ class TkMenu<TkWindow
number(tk_send('yposition', index))
end
def entrycget(index, key)
tk_tcl2ruby tk_send 'entrycget', index, "-#{key}"
case key
when 'text', 'label', 'show'
tk_send 'entrycget', index, "-#{key}"
else
tk_tcl2ruby tk_send 'entrycget', index, "-#{key}"
end
end
def entryconfigure(index, key, val=None)
if key.kind_of? Hash
@ -2766,12 +3091,36 @@ class TkMenu<TkWindow
def entryconfiginfo(index, key=nil)
if key
conf = tk_split_list(tk_send('entryconfigure',index,"-#{key}"))
case key
when 'text', 'label', 'show'
conf = tk_split_simplelist(tk_send('entryconfigure',index,"-#{key}"))
else
conf = tk_split_list(tk_send('entryconfigure',index,"-#{key}"))
end
conf[0] = conf[0][1..-1]
conf
else
tk_split_list(tk_send('entryconfigure', index)).collect{|conf|
tk_split_simplelist(tk_send('entryconfigure', index)).collect{|conflist|
conf = tk_split_simplelist(conflist)
conf[0] = conf[0][1..-1]
case conf[0]
when 'text', 'label', 'show'
else
if conf[3]
if conf[3].index('{')
conf[3] = tk_split_list(conf[3])
else
conf[3] = tk_tcl2ruby(conf[3])
end
end
if conf[4]
if conf[4].index('{')
conf[4] = tk_split_list(conf[4])
else
conf[4] = tk_tcl2ruby(conf[4])
end
end
end
conf
}
end
@ -2977,8 +3326,15 @@ autoload :TkEntry, 'tkentry'
autoload :TkSpinbox, 'tkentry'
autoload :TkText, 'tktext'
autoload :TkDialog, 'tkdialog'
autoload :TkWarning, 'tkdialog'
autoload :TkMenubar, 'tkmenubar'
autoload :TkAfter, 'tkafter'
autoload :TkPalette, 'tkpalette'
autoload :TkFont, 'tkfont'
autoload :TkVirtualEvent, 'tkvirtevent'
autoload :TkBgError, 'tkbgerror'
autoload :TkManageFocus, 'tkmngfocus'
autoload :TkPalette, 'tkpalette'
autoload :TkWinDDE, 'tkwinpkg'
autoload :TkWinRegistry, 'tkwinpkg'
autoload :TkMacResource, 'tkmacpkg'

Просмотреть файл

@ -274,7 +274,19 @@ class TkCanvas<TkWindow
end
def itemcget(tagOrId, option)
tk_tcl2ruby tk_send 'itemcget', tagid(tagOrId), "-#{option}"
case option
when 'dash', 'activedash', 'disableddash'
conf = tk_send('itemcget', tagid(tagOrId), "-#{option}")
if conf =~ /^[0-9]/
list(conf)
else
conf
end
when 'text', 'label', 'show', 'data', 'file', 'maskdata', 'maskfile'
tk_send 'itemcget', tagid(tagOrId), "-#{option}"
else
tk_tcl2ruby tk_send 'itemcget', tagid(tagOrId), "-#{option}"
end
end
def itemconfigure(tagOrId, key, value=None)
@ -308,12 +320,55 @@ class TkCanvas<TkWindow
def itemconfiginfo(tagOrId, key=nil)
if key
conf = tk_split_list(tk_send 'itemconfigure', tagid(tagOrId), "-#{key}")
case key
when 'dash', 'activedash', 'disableddash'
conf = tk_split_simplelist(tk_send 'itemconfigure',
tagid(tagOrId), "-#{key}")
if conf[3] && conf[3] =~ /^[0-9]/
conf[3] = list(conf[3])
end
if conf[4] && conf[4] =~ /^[0-9]/
conf[4] = list(conf[4])
end
when 'text', 'label', 'show', 'data', 'file', 'maskdata', 'maskfile'
conf = tk_split_simplelist(tk_send 'itemconfigure',
tagid(tagOrId), "-#{key}")
else
conf = tk_split_list(tk_send 'itemconfigure',
tagid(tagOrId), "-#{key}")
end
conf[0] = conf[0][1..-1]
conf
else
tk_split_list(tk_send 'itemconfigure', tagid(tagOrId)).collect{|conf|
tk_split_simplelist(tk_send 'itemconfigure',
tagid(tagOrId)).collect{|conflist|
conf = tk_split_simplelist(conflist)
conf[0] = conf[0][1..-1]
case conf[0]
when 'text', 'label', 'show', 'data', 'file', 'maskdata', 'maskfile'
when 'dash', 'activedash', 'disableddash'
if conf[3] && conf[3] =~ /^[0-9]/
conf[3] = list(conf[3])
end
if conf[4] && conf[4] =~ /^[0-9]/
conf[4] = list(conf[4])
end
else
if conf[3]
if conf[3].index('{')
conf[3] = tk_split_list(conf[3])
else
conf[3] = tk_tcl2ruby(conf[3])
end
end
if conf[4]
if conf[4].index('{')
conf[4] = tk_split_list(conf[4])
else
conf[4] = tk_tcl2ruby(conf[4])
end
end
end
conf
}
end
@ -820,7 +875,12 @@ class TkPhotoImage<TkImage
end
def cget(option)
tk_tcl2ruby tk_send 'cget', option
case option
when 'data', 'flie'
tk_send 'cget', option
else
tk_tcl2ruby tk_send 'cget', option
end
end
def copy(source, *opts)

Просмотреть файл

@ -9,8 +9,8 @@ TopLevel = TkToplevel
Frame = TkFrame
Label = TkLabel
Button = TkButton
Radiobutton = TkRadiobutton
Checkbutton = TkCheckbutton
Radiobutton = TkRadioButton
Checkbutton = TkCheckButton
Message = TkMessage
Entry = TkEntry
Text = TkText

Просмотреть файл

@ -14,6 +14,47 @@ class TkEntry<TkLabel
WidgetClassName
end
class ValidateCmd
include TkComm
class ValidateArgs
def initialize(d,i,s,v,pp,ss,vv,ww)
@action = d
@index = i
@current = s
@type = v
@value = pp
@string = ss
@triggered = vv
@widget = ww
end
attr :action
attr :index
attr :current
attr :type
attr :value
attr :string
attr :triggered
attr :widget
end
def initialize(cmd = Proc.new, args=nil)
if args
@id = install_cmd(proc{|*arg|
TkUtil.eval_cmd cmd, *arg
}) + " " + args
else
@id = install_cmd(proc{|arg|
TkUtil.eval_cmd cmd, ValidateArgs.new(*arg)
}) + ' %d %i %s %v %P %S %V %W'
end
end
def to_eval
@id
end
end
def create_self
tk_call 'entry', @path
end
@ -26,6 +67,47 @@ class TkEntry<TkLabel
tk_send 'delete', s, e
end
def configure(slot, value=None)
if slot.kind_of? Hash
if slot['vcmd'].kind_of? Array
cmd, *args = slot['vcmd']
slot['vcmd'] = ValidateCmd.new(cmd, args.join(' '))
elsif slot['vcmd'].kind_of? Proc
slot['vcmd'] = ValidateCmd.new(slot['vcmd'])
end
if slot['validatecommand'].kind_of? Array
cmd, *args = slot['validatecommand']
slot['validatecommand'] = ValidateCmd.new(cmd, args.join(' '))
elsif slot['validatecommand'].kind_of? Proc
slot['validatecommand'] = ValidateCmd.new(slot['validatecommand'])
end
if slot['invcmd'].kind_of? Array
cmd, *args = slot['invcmd']
slot['invcmd'] = ValidateCmd.new(cmd, args.join(' '))
elsif slot['invcmd'].kind_of? Proc
slot['invcmd'] = ValidateCmd.new(slot['invcmd'])
end
if slot['invalidcommand'].kind_of? Array
cmd, *args = slot['invalidcommand']
slot['invalidcommand'] = ValidateCmd.new(cmd, args.join(' '))
elsif slot['invalidcommand'].kind_of? Proc
slot['invalidcommand'] = ValidateCmd.new(slot['invalidcommand'])
end
super(slot)
else
if (slot == 'vcmd' || slot == 'validatecommand' ||
slot == 'invcmd' || slot == 'invalidcommand')
if value.kind_of? Array
cmd, *args = value
value = ValidateCmd.new(cmd, args.join(' '))
elsif value.kind_of? Proc
value = ValidateCmd.new(value)
end
end
super(slot, value)
end
end
def cursor
tk_send 'index', 'insert'
end
@ -75,47 +157,6 @@ class TkEntry<TkLabel
end
end
class ValidateCmd
include TkComm
class ValidateArgs
def initialize(d,i,s,v,pp,ss,vv,ww)
@action = d
@index = i
@current = s
@type = v
@value = pp
@string = ss
@triggered = vv
@widget = ww
end
attr :action
attr :index
attr :current
attr :type
attr :value
attr :string
attr :triggered
attr :widget
end
def initialize(cmd = Proc.new, args=nil)
if args
@id = install_cmd(proc{|*arg|
TkUtil.eval_cmd cmd, *arg
}) + " " + args
else
@id = install_cmd(proc{|arg|
TkUtil.eval_cmd cmd, ValidateArgs.new(*arg)
}) + ' %d %i %s %v %P %S %V %W'
end
end
def to_eval
@id
end
end
def validatecommand(cmd = ValidateCmd.new, args = nil)
if cmd.kind_of?(ValidateCmd)
configure('validatecommand', cmd)

Просмотреть файл

@ -270,7 +270,12 @@ class TkText<TkTextWin
end
def tag_cget(tag, key)
tk_tcl2ruby tk_call @path, 'tag', 'cget', tag, "-#{key}"
case key
when 'text', 'label', 'show', 'data', 'flie'
tk_call @path, 'tag', 'cget', tag, "-#{key}"
else
tk_tcl2ruby tk_call @path, 'tag', 'cget', tag, "-#{key}"
end
end
def tag_configure(tag, key, val=None)
@ -294,12 +299,36 @@ class TkText<TkTextWin
def tag_configinfo(tag, key=nil)
if key
conf = tk_split_list(tk_send('tag','configure',tag,"-#{key}"))
case key
when 'text', 'label', 'show', 'data', 'flie'
conf = tk_split_simplelist(tk_send('tag','configure',tag,"-#{key}"))
else
conf = tk_split_list(tk_send('tag','configure',tag,"-#{key}"))
end
conf[0] = conf[0][1..-1]
conf
else
tk_split_list(tk_send('tag', 'configure', tag)).collect{|conf|
tk_split_simplelist(tk_send('tag', 'configure', tag)).collect{|conflist|
conf = tk_split_simplelist(conflist)
conf[0] = conf[0][1..-1]
case conf[0]
when 'text', 'label', 'show', 'data', 'flie'
else
if conf[3]
if conf[3].index('{')
conf[3] = tk_split_list(conf[3])
else
conf[3] = tk_tcl2ruby(conf[3])
end
end
if conf[4]
if conf[4].index('{')
conf[4] = tk_split_list(conf[4])
else
conf[4] = tk_tcl2ruby(conf[4])
end
end
end
conf
}
end
@ -674,7 +703,12 @@ class TkTextTag<TkObject
end
def cget(key)
tk_tcl2ruby tk_call @t.path, 'tag', 'cget', @id, "-#{key}"
case key
when 'text', 'label', 'show', 'data', 'flie'
tk_call @t.path, 'tag', 'cget', @id, "-#{key}"
else
tk_tcl2ruby tk_call @t.path, 'tag', 'cget', @id, "-#{key}"
end
end
def configure(key, val=None)
@ -853,7 +887,12 @@ class TkTextWindow<TkObject
end
def cget(slot)
tk_tcl2ruby tk_call @t.path, 'window', 'cget', @index, "-#{slot}"
case slot
when 'text', 'label', 'show', 'data', 'flie'
tk_call @t.path, 'window', 'cget', @index, "-#{slot}"
else
tk_tcl2ruby tk_call @t.path, 'window', 'cget', @index, "-#{slot}"
end
end
def configure(slot, value=None)
@ -899,14 +938,39 @@ class TkTextWindow<TkObject
def configinfo(slot = nil)
if slot
conf = tk_split_list(tk_call @t.path, 'window', 'configure',
@index, "-#{slot}")
case slot
when 'text', 'label', 'show', 'data', 'flie'
conf = tk_split_simplelist(tk_call @t.path, 'window', 'configure',
@index, "-#{slot}")
else
conf = tk_split_list(tk_call @t.path, 'window', 'configure',
@index, "-#{slot}")
end
conf[0] = conf[0][1..-1]
conf
else
tk_split_list(tk_call @t.path, 'window', 'configure',
@index).collect{|conf|
tk_split_simplelist(tk_call @t.path, 'window', 'configure',
@index).collect{|conflist|
conf = tk_split_simplelist(conflist)
conf[0] = conf[0][1..-1]
case conf[0]
when 'text', 'label', 'show', 'data', 'flie'
else
if conf[3]
if conf[3].index('{')
conf[3] = tk_split_list(conf[3])
else
conf[3] = tk_tcl2ruby(conf[3])
end
end
if conf[4]
if conf[4].index('{')
conf[4] = tk_split_list(conf[4])
else
conf[4] = tk_tcl2ruby(conf[4])
end
end
end
conf
}
end
@ -944,7 +1008,12 @@ class TkTextImage<TkObject
end
def cget(slot)
tk_tcl2ruby tk_call @t.path, 'image', 'cget', @index, "-#{slot}"
case slot
when 'text', 'label', 'show', 'data', 'flie'
tk_call @t.path, 'image', 'cget', @index, "-#{slot}"
else
tk_tcl2ruby tk_call @t.path, 'image', 'cget', @index, "-#{slot}"
end
end
def configure(slot, value=None)
@ -968,14 +1037,39 @@ class TkTextImage<TkObject
def configinfo(slot = nil)
if slot
conf = tk_split_list(tk_call @t.path, 'image', 'configure',
@index, "-#{slot}")
case slot
when 'text', 'label', 'show', 'data', 'flie'
conf = tk_split_simplelist(tk_call @t.path, 'image', 'configure',
@index, "-#{slot}")
else
conf = tk_split_list(tk_call @t.path, 'image', 'configure',
@index, "-#{slot}")
end
conf[0] = conf[0][1..-1]
conf
else
tk_split_list(tk_call @t.path, 'image', 'configure',
@index).collect{|conf|
tk_split_simplelist(tk_call @t.path, 'image', 'configure',
@index).collect{|conflist|
conf = tk_split_simplelist(conflist)
conf[0] = conf[0][1..-1]
case conf[0]
when 'text', 'label', 'show', 'data', 'flie'
else
if conf[3]
if conf[3].index('{')
conf[3] = tk_split_list(conf[3])
else
conf[3] = tk_tcl2ruby(conf[3])
end
end
if conf[4]
if conf[4].index('{')
conf[4] = tk_split_list(conf[4])
else
conf[4] = tk_tcl2ruby(conf[4])
end
end
end
conf
}
end

14
gc.c
Просмотреть файл

@ -61,7 +61,7 @@ mem_error(mesg)
void *
ruby_xmalloc(size)
size_t size;
long size;
{
void *mem;
@ -91,7 +91,7 @@ ruby_xmalloc(size)
void *
ruby_xcalloc(n, size)
size_t n, size;
long n, size;
{
void *mem;
@ -104,7 +104,7 @@ ruby_xcalloc(n, size)
void *
ruby_xrealloc(ptr, size)
void *ptr;
size_t size;
long size;
{
void *mem;
@ -1240,9 +1240,11 @@ rb_gc_call_finalizer_at_exit()
while (p < pend) {
if (BUILTIN_TYPE(p) == T_DATA &&
DATA_PTR(p) && RANY(p)->as.data.dfree) {
p->as.free.flag = 0;
(*RANY(p)->as.data.dfree)(DATA_PTR(p));
}
else if (BUILTIN_TYPE(p) == T_FILE) {
p->as.free.flag = 0;
rb_io_fptr_finalize(RANY(p)->as.file.fptr);
}
p++;
@ -1310,14 +1312,14 @@ Init_GC()
void*
xmalloc(size)
size_t size;
long size;
{
return ruby_xmalloc(size);
}
void*
xcalloc(n,size)
size_t n,size;
long n,size;
{
return ruby_xcalloc(n, size);
}
@ -1325,7 +1327,7 @@ xcalloc(n,size)
void*
xrealloc(ptr,size)
void *ptr;
size_t size;
long size;
{
return ruby_xrealloc(ptr, size);
}

Просмотреть файл

@ -140,8 +140,9 @@ VALUE rb_class_new_instance _((int, VALUE*, VALUE));
VALUE rb_f_lambda _((void));
VALUE rb_protect _((VALUE (*)(), VALUE, int*));
void rb_set_end_proc _((void (*)(), VALUE));
void rb_exec_end_proc _((void));
void rb_mark_end_proc _((void));
void ruby_finalize _((void));
void ruby_stop _((int));
void rb_gc_mark_threads _((void));
void rb_thread_start_timer _((void));
void rb_thread_stop_timer _((void));
@ -167,6 +168,7 @@ VALUE rb_thread_current _((void));
VALUE rb_thread_main _((void));
VALUE rb_thread_local_aref _((VALUE, ID));
VALUE rb_thread_local_aset _((VALUE, ID, VALUE));
void rb_thread_atfork _((void));
/* file.c */
int eaccess _((const char*, int));
VALUE rb_file_s_expand_path _((int, VALUE *));

50
io.c
Просмотреть файл

@ -2763,6 +2763,32 @@ rb_f_select(argc, argv, obj)
return res; /* returns an empty array on interrupt */
}
static int
io_cntl(fd,cmd,narg,io_p)
int fd, cmd, io_p;
long narg;
{
int retval;
#ifdef HAVE_FCNTL
TRAP_BEG;
# if defined(__CYGWIN__)
retval = io_p?ioctl(fd, cmd, (void*)narg):fcntl(fd, cmd, narg);
# else
retval = io_p?ioctl(fd, cmd, narg):fcntl(fd, cmd, narg);
# endif
TRAP_END;
#else
if (!io_p) {
rb_notimplement();
}
TRAP_BEG;
retval = ioctl(fd, cmd, narg);
TRAP_END;
#endif
return retval;
}
static VALUE
rb_io_ctl(io, req, arg, io_p)
VALUE io, req, arg;
@ -2772,7 +2798,6 @@ rb_io_ctl(io, req, arg, io_p)
int cmd = NUM2ULONG(req);
OpenFile *fptr;
int len = 0;
int fd;
long narg = 0;
int retval;
@ -2812,27 +2837,16 @@ rb_io_ctl(io, req, arg, io_p)
RSTRING(arg)->ptr[len] = 17; /* a little sanity check here */
narg = (long)RSTRING(arg)->ptr;
}
fd = fileno(fptr->f);
#ifdef HAVE_FCNTL
TRAP_BEG;
# if defined(__CYGWIN__)
retval = io_p?ioctl(fd, cmd, (void*)narg):fcntl(fd, cmd, narg);
# else
retval = io_p?ioctl(fd, cmd, narg):fcntl(fd, cmd, narg);
# endif
TRAP_END;
#else
if (!io_p) {
rb_notimplement();
}
TRAP_BEG;
retval = ioctl(fd, cmd, narg);
TRAP_END;
#endif
retval = io_cntl(fileno(fptr->f), cmd, narg, io_p);
if (retval < 0) rb_sys_fail(fptr->path);
if (TYPE(arg) == T_STRING && RSTRING(arg)->ptr[len] != 17) {
rb_raise(rb_eArgError, "return value overflowed string");
}
if (fptr->f2) { /* call on f2 too; ignore result */
io_cntl(fileno(fptr->f2), cmd, narg, io_p);
}
return INT2NUM(retval);
#else
rb_notimplement();

Просмотреть файл

@ -331,7 +331,7 @@ flodivmod(x, y, divp, modp)
{
double z;
modf(x/y, &);
modf(x/y, &z);
mod = x - z * x;
}
#endif

Просмотреть файл

@ -1956,7 +1956,6 @@ yycompile(f, line)
n = yyparse();
ruby_debug_lines = 0;
compile_for_eval = 0;
rb_gc();
ruby_in_compile = 0;
cond_nest = 0;
cond_stack = 0;

Просмотреть файл

@ -217,7 +217,10 @@ proc_waitpid(argc, argv)
if ((pid = rb_waitpid(NUM2INT(vpid), flags, &status)) < 0)
rb_sys_fail(0);
if (pid == 0) return Qnil;
if (pid == 0) {
rb_last_status = Qnil;
return Qnil;
}
return INT2FIX(pid);
}
@ -227,6 +230,7 @@ proc_waitpid2(argc, argv)
VALUE *argv;
{
VALUE pid = proc_waitpid(argc, argv);
if (NIL_P(pid)) return Qnil;
return rb_assoc_new(pid, rb_last_status);
}
@ -526,6 +530,21 @@ rb_f_exec(argc, argv)
return Qnil; /* dummy */
}
static VALUE
fork_rescue(data, errinfo)
VALUE data, errinfo;
{
int status = 1;
if (rb_obj_is_kind_of(errinfo, rb_eSystemExit)) {
VALUE st = rb_iv_get(errinfo, "status");
status = NUM2INT(st);
}
ruby_finalize();
_exit(status);
}
static VALUE
rb_f_fork(obj)
VALUE obj;
@ -539,9 +558,17 @@ rb_f_fork(obj)
#ifdef linux
after_exec();
#endif
rb_thread_atfork();
if (rb_block_given_p()) {
rb_yield(Qnil);
#if 0
rb_rescue2(rb_yield, Qnil, fork_rescue, 0, rb_eException, 0);
_exit(0);
#else
int status;
rb_protect(rb_yield, Qnil, &status);
ruby_stop(status);
#endif
}
return Qnil;

29
range.c
Просмотреть файл

@ -13,10 +13,10 @@
#include "ruby.h"
VALUE rb_cRange;
static ID id_cmp, id_beg, id_end;
static ID id_cmp, id_beg, id_end, id_excl;
#define EXCL(r) FL_TEST((r), FL_USER1)
#define SET_EXCL(r) FL_SET((r), FL_USER1)
#define EXCL(r) RTEST(rb_ivar_get((r), id_excl))
#define SET_EXCL(r,v) rb_ivar_set((r), id_excl, (v)?Qtrue:Qfalse)
static VALUE
range_check(args)
@ -46,10 +46,7 @@ range_init(obj, beg, end, exclude_end)
rb_eStandardError, rb_eNameError, 0);
}
if (exclude_end) {
SET_EXCL(obj);
}
SET_EXCL(obj, exclude_end);
rb_ivar_set(obj, id_beg, beg);
rb_ivar_set(obj, id_end, end);
}
@ -89,6 +86,22 @@ range_exclude_end_p(range)
return EXCL(range)?Qtrue:Qfalse;
}
static VALUE
range_eq(range, obj)
VALUE range, obj;
{
if (!rb_obj_is_kind_of(obj, rb_cRange)) return Qfalse;
if (!rb_equal(rb_ivar_get(range, id_beg), rb_ivar_get(obj, id_beg)))
return Qfalse;
if (!rb_equal(rb_ivar_get(range, id_end), rb_ivar_get(obj, id_end)))
return Qfalse;
if (EXCL(range) != EXCL(obj)) return Qfalse;
return Qtrue;
}
static VALUE
range_eqq(range, obj)
VALUE range, obj;
@ -338,6 +351,7 @@ Init_Range()
rb_cRange = rb_define_class("Range", rb_cObject);
rb_include_module(rb_cRange, rb_mEnumerable);
rb_define_method(rb_cRange, "initialize", range_initialize, -1);
rb_define_method(rb_cRange, "==", range_eq, 1);
rb_define_method(rb_cRange, "===", range_eqq, 1);
rb_define_method(rb_cRange, "each", range_each, 0);
rb_define_method(rb_cRange, "first", range_first, 0);
@ -355,4 +369,5 @@ Init_Range()
id_cmp = rb_intern("<=>");
id_beg = rb_intern("begin");
id_end = rb_intern("end");
id_excl = rb_intern("excl");
}

6
ruby.h
Просмотреть файл

@ -380,9 +380,9 @@ struct RBignum {
#define xrealloc ruby_xrealloc
#define xfree ruby_xfree
void *xmalloc _((size_t));
void *xcalloc _((size_t,size_t));
void *xrealloc _((void*,size_t));
void *xmalloc _((long));
void *xcalloc _((long,long));
void *xrealloc _((void*,long));
void xfree _((void*));
#define ALLOC_N(type,n) (type*)xmalloc(sizeof(type)*(n))

Просмотреть файл

@ -5,4 +5,4 @@
(display (fib 20))
(newline)
(quit)

Просмотреть файл

@ -391,7 +391,10 @@ rb_trap_exit()
{
#ifndef MACOS_UNUSE_SIGNAL
if (trap_list[0]) {
rb_eval_cmd(trap_list[0], rb_ary_new3(1, INT2FIX(0)));
VALUE trap_exit = trap_list[0];
trap_list[0] = 0;
rb_eval_cmd(trap_exit, rb_ary_new3(1, INT2FIX(0)));
}
#endif
}

Просмотреть файл

@ -1480,6 +1480,10 @@ rb_mod_class_variables(obj)
if (!OBJ_TAINTED(obj) && rb_safe_level() >= 4)
rb_raise(rb_eSecurityError, "Insecure: can't get metainfo");
if (FL_TEST(obj, FL_SINGLETON)) {
obj = rb_cvar_singleton(rb_iv_get(obj, "__attached__"));
}
for (;;) {
if (RCLASS(obj)->iv_tbl) {
st_foreach(RCLASS(obj)->iv_tbl, cv_i, ary);

Просмотреть файл

@ -1,4 +1,4 @@
#define RUBY_VERSION "1.6.2"
#define RUBY_RELEASE_DATE "2000-11-21"
#define RUBY_RELEASE_DATE "2000-11-27"
#define RUBY_VERSION_CODE 162
#define RUBY_RELEASE_CODE 20001121
#define RUBY_RELEASE_CODE 20001127