mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
matz
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1081 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
8369164408
commit
ceec42bf8c
9 changed files with 129 additions and 85 deletions
37
ChangeLog
37
ChangeLog
|
@ -1,5 +1,14 @@
|
||||||
|
Tue Dec 26 18:46:41 2000 NAKAMURA Hiroshi <nakahiro@sarion.co.jp>
|
||||||
|
|
||||||
|
* lib/debug.rb: Avoid thread deadlock in debugging stopped thread.
|
||||||
|
|
||||||
|
* lib/debug.rb: Uncleared 'finish' state.
|
||||||
|
|
||||||
Tue Dec 26 16:53:55 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
|
Tue Dec 26 16:53:55 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
|
* eval.c (rb_yield_0): remove dvar node by rb_gc_force_recycle()
|
||||||
|
more eagerly.
|
||||||
|
|
||||||
* eval.c (rb_f_binding): recycling should be stopped for outer
|
* eval.c (rb_f_binding): recycling should be stopped for outer
|
||||||
scope too.
|
scope too.
|
||||||
|
|
||||||
|
@ -859,7 +868,7 @@ Sat Sep 23 03:06:25 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
Fri Sep 22 15:46:21 2000 Minero Aoki <aamine@dp.u-netsurf.ne.jp>
|
Fri Sep 22 15:46:21 2000 Minero Aoki <aamine@dp.u-netsurf.ne.jp>
|
||||||
|
|
||||||
* lib/net/http.rb: too early parameter expantion in string.
|
* lib/net/http.rb: too early parameter expansion in string.
|
||||||
|
|
||||||
Fri Sep 22 13:58:51 2000 WATANABE Hirofumi <eban@os.rim.or.jp>
|
Fri Sep 22 13:58:51 2000 WATANABE Hirofumi <eban@os.rim.or.jp>
|
||||||
|
|
||||||
|
@ -916,7 +925,7 @@ Wed Sep 20 23:21:38 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
Wed Sep 20 14:01:45 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
|
Wed Sep 20 14:01:45 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
* eval.c (rb_provided): detect infnite load loop.
|
* eval.c (rb_provided): detect infinite load loop.
|
||||||
|
|
||||||
* eval.c (rb_provided): too weak filename comparison.
|
* eval.c (rb_provided): too weak filename comparison.
|
||||||
|
|
||||||
|
@ -981,7 +990,7 @@ Thu Sep 14 02:46:54 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
Wed Sep 13 17:01:03 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
|
Wed Sep 13 17:01:03 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
* bignum.c (rb_big_eq): imcomplete value compare of bignums.
|
* bignum.c (rb_big_eq): incomplete value comparison of bignums.
|
||||||
|
|
||||||
Wed Sep 13 06:39:54 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
|
Wed Sep 13 06:39:54 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
|
@ -1106,7 +1115,7 @@ Fri Sep 1 10:36:29 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
* parse.y (aref_args,opt_call_args): add block_call to allow a
|
* parse.y (aref_args,opt_call_args): add block_call to allow a
|
||||||
method without parentheses and with block as a last argument.
|
method without parentheses and with block as a last argument.
|
||||||
|
|
||||||
* hash.c (rb_hash_sort): should not retrun nil.
|
* hash.c (rb_hash_sort): should not return nil.
|
||||||
|
|
||||||
* re.c (match_aref): should use rb_reg_nth_match().
|
* re.c (match_aref): should use rb_reg_nth_match().
|
||||||
|
|
||||||
|
@ -1274,7 +1283,7 @@ Fri Aug 11 15:43:46 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
Thu Aug 10 08:05:03 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
|
Thu Aug 10 08:05:03 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
* eval.c (rb_callcc): returned current thread instaed of
|
* eval.c (rb_callcc): returned current thread instead of
|
||||||
continuation wrongly.
|
continuation wrongly.
|
||||||
|
|
||||||
Thu Aug 10 05:40:28 2000 WATANABE Hirofumi <eban@os.rim.or.jp>
|
Thu Aug 10 05:40:28 2000 WATANABE Hirofumi <eban@os.rim.or.jp>
|
||||||
|
@ -1447,7 +1456,7 @@ Tue Jul 18 14:58:30 2000 Yukihiro Matsumoto <matz@netlab.co.jp>
|
||||||
|
|
||||||
Mon Jul 17 04:29:50 2000 Minero Aoki <aamine@dp.u-netsurf.ne.jp>
|
Mon Jul 17 04:29:50 2000 Minero Aoki <aamine@dp.u-netsurf.ne.jp>
|
||||||
|
|
||||||
* lib/mkmf.rb: converts extention of $objs into $OBJEXT.
|
* lib/mkmf.rb: converts extension of $objs into $OBJEXT.
|
||||||
|
|
||||||
Sun Jul 16 03:02:34 2000 Dave Thomas <dave@thomases.com>
|
Sun Jul 16 03:02:34 2000 Dave Thomas <dave@thomases.com>
|
||||||
|
|
||||||
|
@ -1544,7 +1553,7 @@ Mon Jul 10 09:07:54 2000 Yukihiro Matsumoto <matz@netlab.co.jp>
|
||||||
Sat Jul 8 23:08:40 2000 Yukihiro Matsumoto <matz@netlab.co.jp>
|
Sat Jul 8 23:08:40 2000 Yukihiro Matsumoto <matz@netlab.co.jp>
|
||||||
|
|
||||||
* eval.c (rb_thread_start_0): should copy previous scopes to
|
* eval.c (rb_thread_start_0): should copy previous scopes to
|
||||||
prevent rb_gc_force_recylce().
|
prevent rb_gc_force_recycle().
|
||||||
|
|
||||||
Fri Jul 7 23:36:36 2000 Katsuyuki Komatsu <komatsu@sarion.co.jp>
|
Fri Jul 7 23:36:36 2000 Katsuyuki Komatsu <komatsu@sarion.co.jp>
|
||||||
|
|
||||||
|
@ -1619,7 +1628,7 @@ Wed Jul 5 09:47:14 2000 Yukihiro Matsumoto <matz@netlab.co.jp>
|
||||||
* time.c (time_arg): Time::local, Time::gm now take 7th optional
|
* time.c (time_arg): Time::local, Time::gm now take 7th optional
|
||||||
argument for usec.
|
argument for usec.
|
||||||
|
|
||||||
* numeric.c (num_ceil, etc): default ceil, floor, round, trancate
|
* numeric.c (num_ceil, etc): default ceil, floor, round, truncate
|
||||||
implementation for Numeric, using `to_f'.
|
implementation for Numeric, using `to_f'.
|
||||||
|
|
||||||
* io.c (rb_io_reopen): clear fptr->path after free() to prevent
|
* io.c (rb_io_reopen): clear fptr->path after free() to prevent
|
||||||
|
@ -1710,7 +1719,7 @@ Mon Jul 3 13:15:02 2000 Yukihiro Matsumoto <matz@netlab.co.jp>
|
||||||
|
|
||||||
* bignum.c (rb_big_divmod): ditto.
|
* bignum.c (rb_big_divmod): ditto.
|
||||||
|
|
||||||
* numeric.c (fixdivmod): does not depend C's undifined %
|
* numeric.c (fixdivmod): does not depend C's undefined %
|
||||||
behavior. adopt to fmod(3m) behavior.
|
behavior. adopt to fmod(3m) behavior.
|
||||||
|
|
||||||
* numeric.c (flo_mod): modulo now reserves fmod(3m) behavior.
|
* numeric.c (flo_mod): modulo now reserves fmod(3m) behavior.
|
||||||
|
@ -1753,7 +1762,7 @@ Sat Jul 1 15:22:35 2000 Yukihiro Matsumoto <matz@netlab.co.jp>
|
||||||
Sat Jul 1 15:22:35 2000 Yukihiro Matsumoto <matz@netlab.co.jp>
|
Sat Jul 1 15:22:35 2000 Yukihiro Matsumoto <matz@netlab.co.jp>
|
||||||
|
|
||||||
* eval.c (rb_eval): the value from RTEST() is not valid Ruby
|
* eval.c (rb_eval): the value from RTEST() is not valid Ruby
|
||||||
objct. result should be either true or false.
|
object. result should be either true or false.
|
||||||
|
|
||||||
Sat Jul 1 09:30:06 2000 Katsuyuki Komatsu <komatsu@sarion.co.jp>
|
Sat Jul 1 09:30:06 2000 Katsuyuki Komatsu <komatsu@sarion.co.jp>
|
||||||
|
|
||||||
|
@ -3946,7 +3955,7 @@ Thu Oct 21 16:14:19 1999 Yukihiro Matsumoto <matz@netlab.co.jp>
|
||||||
* ruby.c (proc_options): use RUBYOPT environment variable to
|
* ruby.c (proc_options): use RUBYOPT environment variable to
|
||||||
retrieve the default options.
|
retrieve the default options.
|
||||||
|
|
||||||
* dir.c (fnmatch): use eban's fnmatch; do not depend on systems's
|
* dir.c (fnmatch): use eban's fnmatch; do not depend on system's
|
||||||
fnmatch (which may have portability problem) anymore.
|
fnmatch (which may have portability problem) anymore.
|
||||||
|
|
||||||
Wed Oct 20 15:14:24 1999 Yukihiro Matsumoto <matz@netlab.co.jp>
|
Wed Oct 20 15:14:24 1999 Yukihiro Matsumoto <matz@netlab.co.jp>
|
||||||
|
@ -6541,7 +6550,7 @@ Sun Nov 1 01:18:52 1998 EGUCHI Osamu <eguchi@shizuokanet.ne.jp>
|
||||||
Sat Oct 31 23:18:34 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
|
Sat Oct 31 23:18:34 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
|
||||||
|
|
||||||
* string.c (rb_str_split_method): negative LIMIT means number of
|
* string.c (rb_str_split_method): negative LIMIT means number of
|
||||||
splitted fields are unlimited, as in perl.
|
split fields are unlimited, as in perl.
|
||||||
|
|
||||||
* string.c (rb_str_split_method): if LIMIT is unspecified,
|
* string.c (rb_str_split_method): if LIMIT is unspecified,
|
||||||
trailing null fields are stripped.
|
trailing null fields are stripped.
|
||||||
|
@ -8797,7 +8806,7 @@ Wed Nov 12 13:44:47 1997 Yukihiro Matsumoto <matz@netlab.co.jp>
|
||||||
|
|
||||||
Mon Nov 10 11:24:51 1997 Yukihiro Matsumoto <matz@netlab.co.jp>
|
Mon Nov 10 11:24:51 1997 Yukihiro Matsumoto <matz@netlab.co.jp>
|
||||||
|
|
||||||
* regex.c (re_compile_pattern): non-resitering parens (?:..).
|
* regex.c (re_compile_pattern): non-registering parens (?:..).
|
||||||
|
|
||||||
* regex.c (re_compile_pattern): new meta character \< (wordbeg)
|
* regex.c (re_compile_pattern): new meta character \< (wordbeg)
|
||||||
and \> (wordend).
|
and \> (wordend).
|
||||||
|
@ -9053,7 +9062,7 @@ Tue Sep 16 17:54:25 1997 Yukihiro Matsumoto <matz@netlab.co.jp>
|
||||||
* ruby.c (ruby_prog_init): close stdaux and stdprn for MSDOS.
|
* ruby.c (ruby_prog_init): close stdaux and stdprn for MSDOS.
|
||||||
|
|
||||||
* ruby.c (ruby_prog_init): should not add path from environment
|
* ruby.c (ruby_prog_init): should not add path from environment
|
||||||
variable, if ruby is running under seuid.
|
variable, if ruby is running under setuid.
|
||||||
|
|
||||||
* process.c (init_ids): check suid check for setuid/seteuid etc.
|
* process.c (init_ids): check suid check for setuid/seteuid etc.
|
||||||
|
|
||||||
|
|
15
README
15
README
|
@ -46,11 +46,14 @@ in the mail body (not subject) to the address <ruby-talk-ctl@netlab.co.jp>.
|
||||||
|
|
||||||
This is what you need to do to compile and install Ruby:
|
This is what you need to do to compile and install Ruby:
|
||||||
|
|
||||||
1. Run ./configure, which will generate config.h and Makefile.
|
1. If ./configure does not exist or is older than configure.in,
|
||||||
|
run autoconf to (re)generate configure.
|
||||||
|
|
||||||
2. Edit defines.h if you need. Probably this step will not need.
|
2. Run ./configure, which will generate config.h and Makefile.
|
||||||
|
|
||||||
3. Remove comment mark(#) before the module names from ext/Setup (or
|
3. Edit defines.h if you need. Probably this step will not need.
|
||||||
|
|
||||||
|
4. Remove comment mark(#) before the module names from ext/Setup (or
|
||||||
add module names if not present), if you want to link modules
|
add module names if not present), if you want to link modules
|
||||||
statically.
|
statically.
|
||||||
|
|
||||||
|
@ -59,13 +62,13 @@ This is what you need to do to compile and install Ruby:
|
||||||
remove comment mark from the line "#option nodynamic" in
|
remove comment mark from the line "#option nodynamic" in
|
||||||
ext/Setup.
|
ext/Setup.
|
||||||
|
|
||||||
4. Run make.
|
5. Run make.
|
||||||
|
|
||||||
5. Optionally, run 'make test' to check whether the compiled Ruby
|
6. Optionally, run 'make test' to check whether the compiled Ruby
|
||||||
interpreter works well. If you see the message "test succeeded",
|
interpreter works well. If you see the message "test succeeded",
|
||||||
your ruby works as it should (hopefully).
|
your ruby works as it should (hopefully).
|
||||||
|
|
||||||
6. Run 'make install'
|
7. Run 'make install'
|
||||||
|
|
||||||
You may have to be a super user to install ruby.
|
You may have to be a super user to install ruby.
|
||||||
|
|
||||||
|
|
16
README.jp
16
README.jp
|
@ -78,13 +78,17 @@ Ruby
|
||||||
|
|
||||||
以下の手順で行ってください.
|
以下の手順で行ってください.
|
||||||
|
|
||||||
1. configureを実行してMakefileなどを生成する
|
1. もしconfigureファイルが見つからない、もしくは
|
||||||
|
configure.inより古いようなら、autoconfを実行して
|
||||||
|
新しくconfigureを生成する
|
||||||
|
|
||||||
2. (必要ならば)defines.hを編集する
|
2. configureを実行してMakefileなどを生成する
|
||||||
|
|
||||||
|
3. (必要ならば)defines.hを編集する
|
||||||
|
|
||||||
多分,必要無いと思います.
|
多分,必要無いと思います.
|
||||||
|
|
||||||
3. (必要ならば)ext/Setupに静的にリンクする拡張モジュールを
|
4. (必要ならば)ext/Setupに静的にリンクする拡張モジュールを
|
||||||
指定する
|
指定する
|
||||||
|
|
||||||
ext/Setupに記述したモジュールは静的にリンクされます.
|
ext/Setupに記述したモジュールは静的にリンクされます.
|
||||||
|
@ -95,14 +99,14 @@ Ruby
|
||||||
拡張モジュールを利用するためには,あらかじめ静的にリン
|
拡張モジュールを利用するためには,あらかじめ静的にリン
|
||||||
クしておく必要があります.
|
クしておく必要があります.
|
||||||
|
|
||||||
4. makeを実行してコンパイルする
|
5. makeを実行してコンパイルする
|
||||||
|
|
||||||
5. make testでテストを行う.
|
6. make testでテストを行う.
|
||||||
|
|
||||||
「test succeeded」と表示されれば成功です.ただしテスト
|
「test succeeded」と表示されれば成功です.ただしテスト
|
||||||
に成功しても完璧だと保証されている訳ではありません.
|
に成功しても完璧だと保証されている訳ではありません.
|
||||||
|
|
||||||
6. make install
|
7. make install
|
||||||
|
|
||||||
rootで作業する必要があるかもしれません.
|
rootで作業する必要があるかもしれません.
|
||||||
|
|
||||||
|
|
13
eval.c
13
eval.c
|
@ -1982,7 +1982,7 @@ rb_eval(self, n)
|
||||||
|
|
||||||
/* nodes for speed-up(default match) */
|
/* nodes for speed-up(default match) */
|
||||||
case NODE_MATCH:
|
case NODE_MATCH:
|
||||||
result = rb_reg_match2(node->nd_head->nd_lit);
|
result = rb_reg_match2(node->nd_lit);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* nodes for speed-up(literal match) */
|
/* nodes for speed-up(literal match) */
|
||||||
|
@ -3558,17 +3558,18 @@ rb_yield_0(val, self, klass, acheck)
|
||||||
pop_state:
|
pop_state:
|
||||||
POP_ITER();
|
POP_ITER();
|
||||||
POP_CLASS();
|
POP_CLASS();
|
||||||
if ((block->flags & BLOCK_D_SCOPE) &&
|
if (ruby_dyna_vars && (block->flags & BLOCK_D_SCOPE) &&
|
||||||
!FL_TEST(ruby_dyna_vars, DVAR_DONT_RECYCLE)) {
|
!FL_TEST(ruby_dyna_vars, DVAR_DONT_RECYCLE)) {
|
||||||
struct RVarmap *vars = ruby_dyna_vars;
|
struct RVarmap *vars, *tmp;
|
||||||
|
|
||||||
|
if (ruby_dyna_vars->id == 0) {
|
||||||
|
vars = ruby_dyna_vars->next;
|
||||||
|
rb_gc_force_recycle((VALUE)ruby_dyna_vars);
|
||||||
while (vars && vars->id != 0) {
|
while (vars && vars->id != 0) {
|
||||||
struct RVarmap *tmp = vars->next;
|
tmp = vars->next;
|
||||||
rb_gc_force_recycle((VALUE)vars);
|
rb_gc_force_recycle((VALUE)vars);
|
||||||
vars = tmp;
|
vars = tmp;
|
||||||
}
|
}
|
||||||
if (ruby_dyna_vars && ruby_dyna_vars->id == 0) {
|
|
||||||
rb_gc_force_recycle((VALUE)ruby_dyna_vars);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
POP_VARS();
|
POP_VARS();
|
||||||
|
|
|
@ -370,7 +370,7 @@ def create_makefile(target)
|
||||||
|
|
||||||
if $configure_args['--enable-shared'] or "@LIBRUBY@" != "@LIBRUBY_A@"
|
if $configure_args['--enable-shared'] or "@LIBRUBY@" != "@LIBRUBY_A@"
|
||||||
$libs = "@LIBRUBYARG@ " + $libs
|
$libs = "@LIBRUBYARG@ " + $libs
|
||||||
$LIBPATH |= [$topdir]
|
$LIBPATH.unshift $topdir
|
||||||
end
|
end
|
||||||
|
|
||||||
defflag = ''
|
defflag = ''
|
||||||
|
|
48
lib/debug.rb
48
lib/debug.rb
|
@ -98,13 +98,25 @@ class DEBUGGER__
|
||||||
@stop_next = n
|
@stop_next = n
|
||||||
end
|
end
|
||||||
|
|
||||||
def suspend
|
def set_suspend
|
||||||
@suspend_next = true
|
@suspend_next = true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def clear_suspend
|
||||||
|
@suspend_next = false
|
||||||
|
end
|
||||||
|
|
||||||
|
def suspend_all
|
||||||
|
DEBUGGER__.suspend
|
||||||
|
end
|
||||||
|
|
||||||
|
def resume_all
|
||||||
|
DEBUGGER__.resume
|
||||||
|
end
|
||||||
|
|
||||||
def check_suspend
|
def check_suspend
|
||||||
while (Thread.critical = true; @suspend_next)
|
while (Thread.critical = true; @suspend_next)
|
||||||
waiting.push Thread.current
|
DEBUGGER__.waiting.push Thread.current
|
||||||
@suspend_next = false
|
@suspend_next = false
|
||||||
Thread.stop
|
Thread.stop
|
||||||
end
|
end
|
||||||
|
@ -131,14 +143,18 @@ class DEBUGGER__
|
||||||
DEBUGGER__.display
|
DEBUGGER__.display
|
||||||
end
|
end
|
||||||
|
|
||||||
def waiting
|
def context(th)
|
||||||
DEBUGGER__.waiting
|
DEBUGGER__.context(th)
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_trace_all(arg)
|
def set_trace_all(arg)
|
||||||
DEBUGGER__.set_trace(arg)
|
DEBUGGER__.set_trace(arg)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def set_last_thread(th)
|
||||||
|
DEBUGGER__.set_last_thread(th)
|
||||||
|
end
|
||||||
|
|
||||||
def debug_eval(str, binding)
|
def debug_eval(str, binding)
|
||||||
begin
|
begin
|
||||||
val = eval(str, binding)
|
val = eval(str, binding)
|
||||||
|
@ -237,7 +253,7 @@ class DEBUGGER__
|
||||||
|
|
||||||
def debug_command(file, line, id, binding)
|
def debug_command(file, line, id, binding)
|
||||||
MUTEX.lock
|
MUTEX.lock
|
||||||
DEBUGGER__.set_last_thread(Thread.current)
|
set_last_thread(Thread.current)
|
||||||
frame_pos = 0
|
frame_pos = 0
|
||||||
binding_file = file
|
binding_file = file
|
||||||
binding_line = line
|
binding_line = line
|
||||||
|
@ -506,7 +522,7 @@ class DEBUGGER__
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
MUTEX.unlock
|
MUTEX.unlock
|
||||||
DEBUGGER__.resume_all_thread
|
resume_all
|
||||||
end
|
end
|
||||||
|
|
||||||
def debug_print_help
|
def debug_print_help
|
||||||
|
@ -662,14 +678,14 @@ EOHELP
|
||||||
stdout.printf "\tfrom %s\n", i
|
stdout.printf "\tfrom %s\n", i
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
DEBUGGER__.suspend_all_thread
|
suspend_all
|
||||||
debug_command(file, line, id, binding)
|
debug_command(file, line, id, binding)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def trace_func(event, file, line, id, binding, klass)
|
def trace_func(event, file, line, id, binding, klass)
|
||||||
Tracer.trace_func(event, file, line, id, binding, klass) if trace?
|
Tracer.trace_func(event, file, line, id, binding, klass) if trace?
|
||||||
DEBUGGER__.context(Thread.current).check_suspend
|
context(Thread.current).check_suspend
|
||||||
@file = file
|
@file = file
|
||||||
@line = line
|
@line = line
|
||||||
case event
|
case event
|
||||||
|
@ -687,7 +703,7 @@ EOHELP
|
||||||
@stop_next = 1
|
@stop_next = 1
|
||||||
else
|
else
|
||||||
@no_step = nil
|
@no_step = nil
|
||||||
DEBUGGER__.suspend_all_thread
|
suspend_all
|
||||||
debug_command(file, line, id, binding)
|
debug_command(file, line, id, binding)
|
||||||
@last = [file, line]
|
@last = [file, line]
|
||||||
end
|
end
|
||||||
|
@ -697,7 +713,7 @@ EOHELP
|
||||||
@frames.unshift [binding, file, line, id]
|
@frames.unshift [binding, file, line, id]
|
||||||
if check_break_points(file, id.id2name, binding, id) or
|
if check_break_points(file, id.id2name, binding, id) or
|
||||||
check_break_points(klass.to_s, id.id2name, binding, id)
|
check_break_points(klass.to_s, id.id2name, binding, id)
|
||||||
DEBUGGER__.suspend_all_thread
|
suspend_all
|
||||||
debug_command(file, line, id, binding)
|
debug_command(file, line, id, binding)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -710,6 +726,7 @@ EOHELP
|
||||||
when 'return', 'end'
|
when 'return', 'end'
|
||||||
if @frames.size == @finish_pos
|
if @frames.size == @finish_pos
|
||||||
@stop_next = 1
|
@stop_next = 1
|
||||||
|
@finish_pos = 0
|
||||||
end
|
end
|
||||||
@frames.shift
|
@frames.shift
|
||||||
|
|
||||||
|
@ -767,20 +784,25 @@ EOHELP
|
||||||
@last_thread = th
|
@last_thread = th
|
||||||
end
|
end
|
||||||
|
|
||||||
def suspend_all_thread
|
def suspend
|
||||||
Thread.critical = true
|
Thread.critical = true
|
||||||
make_thread_list
|
make_thread_list
|
||||||
for th in @thread_list
|
for th in @thread_list
|
||||||
next if th[0] == Thread.current
|
next if th[0] == Thread.current
|
||||||
context(th[0]).suspend
|
context(th[0]).set_suspend
|
||||||
end
|
end
|
||||||
Thread.critical = false
|
Thread.critical = false
|
||||||
# Schedule other threads to suspend as soon as possible.
|
# Schedule other threads to suspend as soon as possible.
|
||||||
Thread.pass
|
Thread.pass
|
||||||
end
|
end
|
||||||
|
|
||||||
def resume_all_thread
|
def resume
|
||||||
Thread.critical = true
|
Thread.critical = true
|
||||||
|
make_thread_list
|
||||||
|
for th in @thread_list
|
||||||
|
next if th[0] == Thread.current
|
||||||
|
context(th[0]).clear_suspend
|
||||||
|
end
|
||||||
waiting.each do |th|
|
waiting.each do |th|
|
||||||
th.run
|
th.run
|
||||||
end
|
end
|
||||||
|
|
68
parse.y
68
parse.y
|
@ -4436,69 +4436,71 @@ assign_in_cond(node)
|
||||||
}
|
}
|
||||||
|
|
||||||
static NODE*
|
static NODE*
|
||||||
cond0(node)
|
cond0(node, log)
|
||||||
NODE *node;
|
NODE *node;
|
||||||
|
int log;
|
||||||
{
|
{
|
||||||
enum node_type type = nd_type(node);
|
enum node_type type = nd_type(node);
|
||||||
|
|
||||||
assign_in_cond(node);
|
assign_in_cond(node);
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
case NODE_DSTR:
|
||||||
|
if (log) break;
|
||||||
|
nd_set_type(node, NODE_DREGX);
|
||||||
|
/* fall through */
|
||||||
case NODE_DREGX:
|
case NODE_DREGX:
|
||||||
case NODE_DREGX_ONCE:
|
case NODE_DREGX_ONCE:
|
||||||
local_cnt('_');
|
local_cnt('_');
|
||||||
local_cnt('~');
|
local_cnt('~');
|
||||||
|
rb_warn("string/regex literal in condition");
|
||||||
return NEW_MATCH2(node, NEW_GVAR(rb_intern("$_")));
|
return NEW_MATCH2(node, NEW_GVAR(rb_intern("$_")));
|
||||||
|
|
||||||
case NODE_DOT2:
|
case NODE_DOT2:
|
||||||
case NODE_DOT3:
|
case NODE_DOT3:
|
||||||
node->nd_beg = cond2(node->nd_beg);
|
node->nd_beg = cond0(node->nd_beg, log);
|
||||||
node->nd_end = cond2(node->nd_end);
|
node->nd_end = cond0(node->nd_end, log);
|
||||||
if (type == NODE_DOT2) nd_set_type(node,NODE_FLIP2);
|
if (type == NODE_DOT2) nd_set_type(node,NODE_FLIP2);
|
||||||
else if (type == NODE_DOT3) nd_set_type(node, NODE_FLIP3);
|
else if (type == NODE_DOT3) nd_set_type(node, NODE_FLIP3);
|
||||||
node->nd_cnt = local_append(0);
|
node->nd_cnt = local_append(0);
|
||||||
|
rb_warn("range literal in condition");
|
||||||
return node;
|
return node;
|
||||||
|
|
||||||
|
case NODE_STR:
|
||||||
|
if (log) break;
|
||||||
|
node->nd_lit = rb_reg_new(RSTRING(node->nd_lit)->ptr,RSTRING(node->nd_lit)->len,0);
|
||||||
|
goto regexp;
|
||||||
|
|
||||||
case NODE_LIT:
|
case NODE_LIT:
|
||||||
if (TYPE(node->nd_lit) == T_REGEXP) {
|
if (TYPE(node->nd_lit) == T_REGEXP) {
|
||||||
|
regexp:
|
||||||
|
nd_set_type(node, NODE_MATCH);
|
||||||
local_cnt('_');
|
local_cnt('_');
|
||||||
local_cnt('~');
|
local_cnt('~');
|
||||||
return NEW_MATCH(node);
|
rb_warn("string/regex literal in condition");
|
||||||
}
|
|
||||||
if (TYPE(node->nd_lit) == T_STRING) {
|
|
||||||
local_cnt('_');
|
|
||||||
local_cnt('~');
|
|
||||||
return NEW_MATCH(rb_reg_new(RSTRING(node)->ptr,RSTRING(node)->len,0));
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NODE*
|
||||||
|
cond1(node, log)
|
||||||
|
NODE *node;
|
||||||
|
int log;
|
||||||
|
{
|
||||||
|
if (node == 0) return 0;
|
||||||
|
if (nd_type(node) == NODE_NEWLINE){
|
||||||
|
node->nd_next = cond0(node->nd_next, log);
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
return cond0(node, log);
|
||||||
|
}
|
||||||
|
|
||||||
static NODE*
|
static NODE*
|
||||||
cond(node)
|
cond(node)
|
||||||
NODE *node;
|
NODE *node;
|
||||||
{
|
{
|
||||||
if (node == 0) return 0;
|
return cond1(node, 0);
|
||||||
if (nd_type(node) == NODE_NEWLINE){
|
|
||||||
node->nd_next = cond0(node->nd_next);
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
return cond0(node);
|
|
||||||
}
|
|
||||||
|
|
||||||
static NODE*
|
|
||||||
cond2(node)
|
|
||||||
NODE *node;
|
|
||||||
{
|
|
||||||
enum node_type type;
|
|
||||||
|
|
||||||
node = cond(node);
|
|
||||||
type = nd_type(node);
|
|
||||||
if (type == NODE_NEWLINE) node = node->nd_next;
|
|
||||||
if (type == NODE_LIT && FIXNUM_P(node->nd_lit)) {
|
|
||||||
return call_op(node,tEQ,1,NEW_GVAR(rb_intern("$.")));
|
|
||||||
}
|
|
||||||
return node;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static NODE*
|
static NODE*
|
||||||
|
@ -4507,7 +4509,7 @@ logop(type, left, right)
|
||||||
NODE *left, *right;
|
NODE *left, *right;
|
||||||
{
|
{
|
||||||
value_expr(left);
|
value_expr(left);
|
||||||
return rb_node_newnode(type, cond(left), cond(right), 0);
|
return rb_node_newnode(type, cond1(left, 1), cond1(right, 1), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static NODE *
|
static NODE *
|
||||||
|
|
3
range.c
3
range.c
|
@ -341,6 +341,9 @@ range_length(range)
|
||||||
if (!EXCL(range)) {
|
if (!EXCL(range)) {
|
||||||
size = rb_funcall(size, '+', 1, INT2FIX(1));
|
size = rb_funcall(size, '+', 1, INT2FIX(1));
|
||||||
}
|
}
|
||||||
|
if (TYPE(size) == T_FLOAT) {
|
||||||
|
size = rb_funcall(size, rb_intern("floor"), 0);
|
||||||
|
}
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,12 +45,12 @@
|
||||||
#define DEFAULT_KCODE KCODE_NONE
|
#define DEFAULT_KCODE KCODE_NONE
|
||||||
#define DLEXT ".so"
|
#define DLEXT ".so"
|
||||||
#define DLEXT2 ".dll"
|
#define DLEXT2 ".dll"
|
||||||
#define RUBY_LIB "/lib/ruby/1.6"
|
#define RUBY_LIB "/lib/ruby/1.7"
|
||||||
#define RUBY_SITE_LIB "/lib/ruby/site_ruby"
|
#define RUBY_SITE_LIB "/lib/ruby/site_ruby"
|
||||||
#define RUBY_SITE_LIB2 "/lib/ruby/site_ruby/1.6"
|
#define RUBY_SITE_LIB2 "/lib/ruby/site_ruby/1.7"
|
||||||
#define RUBY_PLATFORM "i586-mswin32"
|
#define RUBY_PLATFORM "i586-mswin32"
|
||||||
#define RUBY_ARCHLIB "/lib/ruby/1.6/i586-mswin32"
|
#define RUBY_ARCHLIB "/lib/ruby/1.7/i586-mswin32"
|
||||||
#define RUBY_SITE_ARCHLIB "/lib/ruby/site_ruby/1.6/i586-mswin32"
|
#define RUBY_SITE_ARCHLIB "/lib/ruby/site_ruby/1.7/i586-mswin32"
|
||||||
|
|
||||||
#define SIZEOF_INT 4
|
#define SIZEOF_INT 4
|
||||||
#define SIZEOF_SHORT 2
|
#define SIZEOF_SHORT 2
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue