From f32c76a2668cdbee36f1c6515693b41428f865e7 Mon Sep 17 00:00:00 2001 From: matz Date: Wed, 2 Aug 2000 04:54:21 +0000 Subject: matz git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@869 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 8 ++ eval.c | 17 ++-- ext/tk/lib/tk.rb | 92 ++++++++++++++++++- ext/tk/lib/tkfont.rb | 254 ++++++++++++++++++++++++++------------------------- ext/tk/lib/tktext.rb | 88 ++++++++++++++---- gc.c | 5 +- parse.y | 1 + 7 files changed, 310 insertions(+), 155 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2003a12f23..514ffa2a5f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Wed Aug 2 08:22:04 2000 Yukihiro Matsumoto + + * gc.c (rb_gc): clear malloc_memories to zero, to avoid potential + super frequent GC invocation. (ruby-bugs:#PR48) + + * gc.c (rb_gc): only add_heap() if GC trigger condition is + satisfied. + Tue Aug 1 16:41:58 2000 Yukihiro Matsumoto * ruby.c (proc_options): global load path setting moved from diff --git a/eval.c b/eval.c index 3377327465..31f4694071 100644 --- a/eval.c +++ b/eval.c @@ -6768,12 +6768,14 @@ rb_thread_ready(th) } static void -rb_thread_remove() +rb_thread_remove(th) + rb_thread_t th; { - rb_thread_ready(curr_thread); - curr_thread->status = THREAD_KILLED; - curr_thread->prev->next = curr_thread->next; - curr_thread->next->prev = curr_thread->prev; + if (th->status == THREAD_KILLED) return; + rb_thread_ready(th); + th->status = THREAD_KILLED; + th->prev->next = th->next; + th->next->prev = th->prev; } static int @@ -7661,7 +7663,7 @@ rb_thread_start_0(fn, arg, th) } POP_TAG(); status = th->status; - rb_thread_remove(); + rb_thread_remove(th); if (state && status != THREAD_TO_KILL && !NIL_P(ruby_errinfo)) { th->flags |= THREAD_RAISED; if (state == TAG_FATAL) { @@ -8090,7 +8092,8 @@ rb_callcc(self) for (tag=prot_tag; tag; tag=tag->prev) { scope_dup(tag->scope); } - th->prev = th->next = 0; + th->prev = 0; + th->next = curr_thread; if (THREAD_SAVE_CONTEXT(th)) { return th->result; } diff --git a/ext/tk/lib/tk.rb b/ext/tk/lib/tk.rb index 4b1c21f40a..d3b3714a28 100644 --- a/ext/tk/lib/tk.rb +++ b/ext/tk/lib/tk.rb @@ -311,7 +311,7 @@ module TkComm def install_bind(cmd, args=nil) if args - id = install_cmd(proc{|arg| + id = install_cmd(proc{|*arg| TkUtil.eval_cmd cmd, *arg }) id + " " + args @@ -784,6 +784,96 @@ module Tk end end +########################################### +# convert kanji string to/from utf-8 +########################################### +if /^8\.[1-9]/ =~ Tk::TCL_VERSION && !Tk::JAPANIZED_TK + class TclTkIp + # from tkencoding.rb by ttate@jaist.ac.jp + alias __eval _eval + alias __invoke _invoke + private :__eval + private :__invoke + + attr_accessor :encoding + + def _eval(cmd) + if @encoding + _fromUTF8(__eval(_toUTF8(cmd, @encoding)), @encoding) + else + __eval(cmd) + end + end + + def _invoke(*cmds) + if @encoding + cmds = cmds.collect{|cmd| _toUTF8(cmd, @encoding)} + _fromUTF8(__invoke(*cmds), @encoding) + else + __invoke(*cmds) + end + end + end + + module Tk + def encoding=(name) + INTERP.encoding = name + end + + def encoding + INTERP.encoding + end + + def encoding_names + tk_split_simplelist(tk_call('encoding', 'names')) + end + + def encoding_system + tk_call('encoding', 'system') + end + + def encoding_system=(enc) + tk_call('encoding', 'system', enc) + end + end + + # estimate encoding + case $KCODE + when /^e/i # EUC + Tk.encoding = 'euc-jp' + when /^s/i # SJIS + Tk.encoding = 'shiftjis' + when /^u/i # UTF8 + Tk.encoding = 'utf-8' + else # NONE + begin + Tk.encoding = Tk.encoding_system + rescue StandardError, NameError + Tk.encoding = 'utf-8' + end + end + +else + # dummy methods + module Tk + def encoding=(name) + nil + end + def encoding + nil + end + def encoding_names + nil + end + def encoding_system + nil + end + def encoding_system=(enc) + nil + end + end +end + module TkBindCore def bind(context, cmd=Proc.new, args=nil) Tk.bind(to_eval, context, cmd, args) diff --git a/ext/tk/lib/tkfont.rb b/ext/tk/lib/tkfont.rb index 297e73f49d..65842e0188 100644 --- a/ext/tk/lib/tkfont.rb +++ b/ext/tk/lib/tkfont.rb @@ -13,6 +13,7 @@ class TkFont Tk_FontNameTBL = {} Tk_FontUseTBL = {} + # set default font case Tk::TK_VERSION when /^4\.*/ DEFAULT_LATIN_FONT_NAME = 'a14'.freeze @@ -33,22 +34,65 @@ class TkFont '-compound')) else # unknown Tcl/Tk-JP - ltn = 'Helvetica' - knj = 'mincho' + platform = tk_call('set', 'tcl_platform(platform)') + case platform + when 'unix' + ltn = {'family'=>'Helvetica'.freeze, 'size'=>-12} + knj = 'k14' + #knj = '-misc-fixed-medium-r-normal--14-*-*-*-c-*-jisx0208.1983-0' + when 'windows' + ltn = {'family'=>'MS Sans Serif'.freeze, 'size'=>8} + knj = 'mincho' + when 'macintosh' + ltn = 'system' + knj = 'mincho' + else # unknown + ltn = 'Helvetica' + knj = 'mincho' + end end rescue ltn = 'Helvetica' knj = 'mincho' end - DEFAULT_LATIN_FONT_NAME = ltn.freeze - DEFAULT_KANJI_FONT_NAME = knj.freeze - else - DEFAULT_LATIN_FONT_NAME = 'Helvetica'.freeze - DEFAULT_KANJI_FONT_NAME = 'mincho'.freeze + + else # not JAPANIZED_TK + begin + platform = tk_call('set', 'tcl_platform(platform)') + case platform + when 'unix' + ltn = {'family'=>'Helvetica'.freeze, 'size'=>-12} + knj = 'k14' + #knj = '-misc-fixed-medium-r-normal--14-*-*-*-c-*-jisx0208.1983-0' + when 'windows' + ltn = {'family'=>'MS Sans Serif'.freeze, 'size'=>8} + knj = 'mincho' + when 'macintosh' + ltn = 'system' + knj = 'mincho' + else # unknown + ltn = 'Helvetica' + knj = 'mincho' + end + rescue + ltn = 'Helvetica' + knj = 'mincho' + end end + + DEFAULT_LATIN_FONT_NAME = ltn.freeze + DEFAULT_KANJI_FONT_NAME = knj.freeze + + else # unknown version + DEFAULT_LATIN_FONT_NAME = 'Helvetica'.freeze + DEFAULT_KANJI_FONT_NAME = 'mincho'.freeze + + end + + if $DEBUG + print "default latin font = "; p DEFAULT_LATIN_FONT_NAME + print "default kanji font = "; p DEFAULT_KANJI_FONT_NAME end - p "default latin font = #{DEFAULT_LATIN_FONT_NAME}" if $DEBUG - p "default kanji font = #{DEFAULT_KANJI_FONT_NAME}" if $DEBUG ################################### # class methods @@ -167,14 +211,12 @@ class TkFont ################################### private ################################### - def initialize(ltn=DEFAULT_LATIN_FONT_NAME, knj=DEFAULT_KANJI_FONT_NAME, - keys=nil) + def initialize(ltn=DEFAULT_LATIN_FONT_NAME, knj=nil, keys=nil) @id = format("@font%.4d", Tk_FontID[0]) Tk_FontID[0] += 1 Tk_FontNameTBL[@id] = self - create_latinfont(ltn) - create_kanjifont(knj) - create_compoundfont(keys) + knj = DEFAULT_KANJI_FONT_NAME if JAPANIZED_TK && !knj + create_compoundfont(ltn, knj, keys) end def _get_font_info_from_hash(font) @@ -293,7 +335,10 @@ class TkFont end end - def create_compoundfont_tk4x(keys) + def create_compoundfont_tk4x(ltn, knj, keys) + create_latinfont(ltn) + create_kanjifont(knj) + if JAPANIZED_TK @compoundfont = [[@latinfont], [@kanjifont]] @fontslot = {'font'=>@latinfont, 'kanjifont'=>@kanjifont} @@ -339,63 +384,66 @@ class TkFont end tk_call('font', 'create', @latinfont, *hash_kv(keys)) end - end - end - def create_kanjifont_tk80(font) - unless JAPANIZED_TK - @kanjifont = "" - return - end - - @kanjifont = @id + 'k' - - if font.kind_of? Hash - if font['charset'] - tk_call('font', 'create', @kanjifont, *hash_kv(font)) - else - tk_call('font', 'create', @kanjifont, - '-charset', 'jisx0208.1983', *hash_kv(font)) + if font && @compoundfont + keys = {} + actual_core(@latinfont).each{|key,val| keys[key] = val} + tk_call('font', 'configure', @compoundfont, *hash_kv(keys)) end - elsif font.kind_of? Array - tk_call('font', 'create', @kanjifont, '-copy', array2tk_list(font)) - tk_call('font', 'configure', @kanjifont, '-charset', 'jisx0208.1983') - elsif font.kind_of? TkFont - tk_call('font', 'create', @kanjifont, '-copy', font.kanji_font) - elsif font - tk_call('font', 'create', @kanjifont, '-copy', font, - '-charset', 'jisx0208.1983') - else - tk_call('font', 'create', @kanjifont, '-charset', 'jisx0208.1983') end end - def create_kanjifont_tk81(font) + def create_kanjifont_tk8x(font) @kanjifont = @id + 'k' - if font.kind_of? Hash - tk_call('font', 'create', @kanjifont, *hash_kv(font)) - else - keys = {} - if font.kind_of? Array - actual_core(array2tk_list(font)).each{|key,val| keys[key] = val} + if JAPANIZED_TK + if font.kind_of? Hash + if font['charset'] + tk_call('font', 'create', @kanjifont, *hash_kv(font)) + else + tk_call('font', 'create', @kanjifont, + '-charset', 'jisx0208.1983', *hash_kv(font)) + end + elsif font.kind_of? Array + tk_call('font', 'create', @kanjifont, '-copy', array2tk_list(font)) + tk_call('font', 'configure', @kanjifont, '-charset', 'jisx0208.1983') elsif font.kind_of? TkFont - actual_core(font.kanji_font).each{|key,val| keys[key] = val} + tk_call('font', 'create', @kanjifont, '-copy', font.kanji_font) elsif font - actual_core(font).each{|key,val| keys[key] = val} + tk_call('font', 'create', @kanjifont, '-copy', font, + '-charset', 'jisx0208.1983') + else + tk_call('font', 'create', @kanjifont, '-charset', 'jisx0208.1983') end - tk_call('font', 'create', @kanjifont, *hash_kv(keys)) - end + # end of JAPANIZED_TK - keys = {} - actual_core(@kanjifont).each{|key,val| keys[key] = val} - begin - tk_call('font', 'configure', @compoundfont, *hash_kv(keys)) - rescue + else + if font.kind_of? Hash + tk_call('font', 'create', @kanjifont, *hash_kv(font)) + else + keys = {} + if font.kind_of? Array + actual_core(array2tk_list(font)).each{|key,val| keys[key] = val} + elsif font.kind_of? TkFont + actual_core(font.kanji_font).each{|key,val| keys[key] = val} + elsif font + actual_core(font).each{|key,val| keys[key] = val} + end + tk_call('font', 'create', @kanjifont, *hash_kv(keys)) + end + + if font && @compoundfont + keys = {} + actual_core(@kanjifont).each{|key,val| keys[key] = val} + tk_call('font', 'configure', @compoundfont, *hash_kv(keys)) + end end end - def create_compoundfont_tk80(keys) + def create_compoundfont_tk8x(ltn, knj, keys) + create_latinfont(ltn) + create_kanjifont(knj) + @compoundfont = @id + 'c' if JAPANIZED_TK @fontslot = {'font'=>@compoundfont} @@ -403,6 +451,7 @@ class TkFont '-compound', [@latinfont, @kanjifont], *hash_kv(keys)) else tk_call('font', 'create', @compoundfont) + latinkeys = {} begin actual_core(@latinfont).each{|key,val| latinkeys[key] = val} @@ -412,37 +461,22 @@ class TkFont if latinkeys != {} tk_call('font', 'configure', @compoundfont, *hash_kv(latinkeys)) end - @fontslot = {'font'=>@compoundfont} - tk_call('font', 'configure', @compoundfont, *hash_kv(keys)) - end - end - def create_compoundfont_tk81(keys) - @compoundfont = @id + 'c' - tk_call('font', 'create', @compoundfont) - - latinkeys = {} - begin - actual_core(@latinfont).each{|key,val| latinkeys[key] = val} - rescue - latinkeys {} - end - if latinkeys != {} - tk_call('font', 'configure', @compoundfont, *hash_kv(latinkeys)) - end + if knj + kanjikeys = {} + begin + actual_core(@kanjifont).each{|key,val| kanjikeys[key] = val} + rescue + kanjikeys {} + end + if kanjikeys != {} + tk_call('font', 'configure', @compoundfont, *hash_kv(kanjikeys)) + end + end - kanjikeys = {} - begin - actual_core(@kanjifont).each{|key,val| kanjikeys[key] = val} - rescue - kanjikeys {} - end - if kanjikeys != {} - tk_call('font', 'configure', @compoundfont, *hash_kv(kanjikeys)) + @fontslot = {'font'=>@compoundfont} + tk_call('font', 'configure', @compoundfont, *hash_kv(keys)) end - - @fontslot = {'font'=>@compoundfont} - tk_call('font', 'configure', @compoundfont, *hash_kv(keys)) end def actual_core_tk4x(font, window=nil, option=nil) @@ -623,9 +657,7 @@ class TkFont self end - def kanji_replace_core_tk80(knj) - return self unless JAPANIZED_TK - + def kanji_replace_core_tk8x(knj) begin tk_call('font', 'delete', @kanjifont) rescue @@ -634,23 +666,6 @@ class TkFont self end - def kanji_replace_core_tk81(knj) - if font.kind_of? Hash - tk_call('font', 'configure', @compoundfont, *hash_kv(knj)) - else - keys = {} - if knj.kind_of? Array - actual_core(array2tk_list(knj)).each{|key,val| keys[key] = val} - elsif knj.kind_of? TkFont - actual_core(knj.latin_font).each{|key,val| keys[key] = val} - else - actual_core(knj).each{|key,val| keys[key] = val} - end - tk_call('font', 'configure', @compoundfont, *hash_kv(keys)) - end - self - end - def measure_core_tk4x(window, text) 0 end @@ -712,42 +727,29 @@ class TkFont alias measure_core measure_core_tk4x alias metrics_core metrics_core_tk4x - when /^8\.0/ - alias create_latinfont create_latinfont_tk8x - alias create_kanjifont create_kanjifont_tk80 - alias create_compoundfont create_compoundfont_tk80 - alias actual_core actual_core_tk8x - alias configure_core configure_core_tk8x - alias configinfo_core configinfo_core_tk8x - alias delete_core delete_core_tk8x - alias latin_replace_core latin_replace_core_tk8x - alias kanji_replace_core kanji_replace_core_tk80 - alias measure_core measure_core_tk8x - alias metrics_core metrics_core_tk8x - - when /^8\.[123]/ + when /^8\.[0123]/ alias create_latinfont create_latinfont_tk8x - alias create_kanjifont create_kanjifont_tk81 - alias create_compoundfont create_compoundfont_tk81 + alias create_kanjifont create_kanjifont_tk8x + alias create_compoundfont create_compoundfont_tk8x alias actual_core actual_core_tk8x alias configure_core configure_core_tk8x alias configinfo_core configinfo_core_tk8x alias delete_core delete_core_tk8x alias latin_replace_core latin_replace_core_tk8x - alias kanji_replace_core kanji_replace_core_tk81 + alias kanji_replace_core kanji_replace_core_tk8x alias measure_core measure_core_tk8x alias metrics_core metrics_core_tk8x when /^8\.*/ alias create_latinfont create_latinfont_tk8x - alias create_kanjifont create_kanjifont_tk81 - alias create_compoundfont create_compoundfont_tk81 + alias create_kanjifont create_kanjifont_tk8x + alias create_compoundfont create_compoundfont_tk8x alias actual_core actual_core_tk8x alias configure_core configure_core_tk8x alias configinfo_core configinfo_core_tk8x alias delete_core delete_core_tk8x alias latin_replace_core latin_replace_core_tk8x - alias kanji_replace_core kanji_replace_core_tk81 + alias kanji_replace_core kanji_replace_core_tk8x alias measure_core measure_core_tk8x alias metrics_core metrics_core_tk8x diff --git a/ext/tk/lib/tktext.rb b/ext/tk/lib/tktext.rb index f7b3f84ba7..c8b171c156 100644 --- a/ext/tk/lib/tktext.rb +++ b/ext/tk/lib/tktext.rb @@ -334,17 +334,42 @@ class TkText=',stop) txt = get(start,stop) if (pos = txt.index(pat)) - pos = txt[0..(pos-1)].split('').length if pos > 0 + match = $& + #pos = txt[0..(pos-1)].split('').length if pos > 0 + pos = _ktext_length(txt[0..(pos-1)]) if pos > 0 if pat.kind_of? String - return [index(start + " + #{pos} chars"), pat.split('').length] + #return [index(start + " + #{pos} chars"), pat.split('').length] + return [index(start + " + #{pos} chars"), + _ktext_length(pat), pat.dup] else - return [index(start + " + #{pos} chars"), $&.split('').length] + #return [index(start + " + #{pos} chars"), $&.split('').length] + return [index(start + " + #{pos} chars"), + _ktext_length(match), match] end else return ["", 0] @@ -352,20 +377,31 @@ class TkText 0 + match = $& + #pos = txt[0..(pos-1)].split('').length if pos > 0 + pos = _ktext_length(txt[0..(pos-1)]) if pos > 0 if pat.kind_of? String - return [index(start + " + #{pos} chars"), pat.split('').length] + #return [index(start + " + #{pos} chars"), pat.split('').length] + return [index(start + " + #{pos} chars"), + _ktext_length(pat), pat.dup] else - return [index(start + " + #{pos} chars"), $&.split('').length] + #return [index(start + " + #{pos} chars"), $&.split('').length] + return [index(start + " + #{pos} chars"), + _ktext_length(match), match] end else txt = get('1.0','end - 1 char') if (pos = txt.index(pat)) - pos = txt[0..(pos-1)].split('').length if pos > 0 + match = $& + #pos = txt[0..(pos-1)].split('').length if pos > 0 + pos = _ktext_length(txt[0..(pos-1)]) if pos > 0 if pat.kind_of? String - return [index("1.0 + #{pos} chars"), pat.split('').length] + #return [index("1.0 + #{pos} chars"), pat.split('').length] + return [index("1.0 + #{pos} chars"), + _ktext_length(pat), pat.dup] else - return [index("1.0 + #{pos} chars"), $&.split('').length] + #return [index("1.0 + #{pos} chars"), $&.split('').length] + return [index("1.0 + #{pos} chars"), _ktext_length(match), match] end else return ["", 0] @@ -379,16 +415,20 @@ class TkText 0 + match = $& + #pos = txt[0..(pos-1)].split('').length if pos > 0 + pos = _ktext_length(txt[0..(pos-1)]) if pos > 0 if pat.kind_of? String - return [index(stop + " + #{pos} chars"), pat.split('').length] + #return [index(stop + " + #{pos} chars"), pat.split('').length] + return [index(stop + " + #{pos} chars"), _ktext_length(pat), pat.dup] else - return [index(stop + " + #{pos} chars"), $&.split('').length] + #return [index(stop + " + #{pos} chars"), $&.split('').length] + return [index(stop + " + #{pos} chars"), _ktext_length(match), match] end else return ["", 0] @@ -396,20 +436,28 @@ class TkText 0 + match = $& + #pos = txt[0..(pos-1)].split('').length if pos > 0 + pos = _ktext_length(txt[0..(pos-1)]) if pos > 0 if pat.kind_of? String - return [index("1.0 + #{pos} chars"), pat.split('').length] + #return [index("1.0 + #{pos} chars"), pat.split('').length] + return [index("1.0 + #{pos} chars"), _ktext_length(pat), pat.dup] else - return [index("1.0 + #{pos} chars"), $&.split('').length] + #return [index("1.0 + #{pos} chars"), $&.split('').length] + return [index("1.0 + #{pos} chars"), _ktext_length(match), match] end else txt = get('1.0','end - 1 char') if (pos = txt.rindex(pat)) - pos = txt[0..(pos-1)].split('').length if pos > 0 + match = $& + #pos = txt[0..(pos-1)].split('').length if pos > 0 + pos = _ktext_length(txt[0..(pos-1)]) if pos > 0 if pat.kind_of? String - return [index("1.0 + #{pos} chars"), pat.split('').length] + #return [index("1.0 + #{pos} chars"), pat.split('').length] + return [index("1.0 + #{pos} chars"), _ktext_length(pat), pat.dup] else - return [index("1.0 + #{pos} chars"), $&.split('').length] + #return [index("1.0 + #{pos} chars"), $&.split('').length] + return [index("1.0 + #{pos} chars"), _ktext_length(match), match] end else return ["", 0] diff --git a/gc.c b/gc.c index d7d7c26793..0db6354dfc 100644 --- a/gc.c +++ b/gc.c @@ -901,7 +901,10 @@ rb_gc() #endif if (dont_gc || during_gc || rb_prohibit_interrupt || ruby_in_compile) { - add_heap(); + if (!freelist || malloc_memories > GC_MALLOC_LIMIT) { + malloc_memories = 0; + add_heap(); + } return; } diff --git a/parse.y b/parse.y index 48e26e7acc..1bc113fcee 100644 --- a/parse.y +++ b/parse.y @@ -1891,6 +1891,7 @@ yycompile(f, line) n = yyparse(); ruby_debug_lines = 0; compile_for_eval = 0; + rb_gc(); ruby_in_compile = 0; cond_nest = 0; class_nest = 0; -- cgit v1.2.3