mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
19991110
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@561 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
2841285182
commit
04c7225b78
9 changed files with 102 additions and 41 deletions
27
ChangeLog
27
ChangeLog
|
@ -1,8 +1,33 @@
|
|||
Wed Nov 10 08:28:53 1999 Yukihiro Matsumoto <matz@netlab.co.jp>
|
||||
|
||||
* eval.c (rb_call0): supply class parameter for each invocation.
|
||||
|
||||
Tue Nov 9 13:21:04 1999 EGUCHI Osamu <eguchi@shizuokanet.ne.jp>
|
||||
|
||||
* configure.in: AC_MINIX move to before AC_EXEEXT and AC_OBJEXT.
|
||||
|
||||
Mon Nov 8 19:52:29 1999 EGUCHI Osamu <eguchi@shizuokanet.ne.jp>
|
||||
|
||||
* configure.in: Renamed AC_CHAR_UNSIGNED to AC_C_CHAR_UNSIGNED.
|
||||
|
||||
* configure.in: Added default to AC_CHECK_SIZEOF().
|
||||
|
||||
Mon Nov 8 14:28:18 1999 Yukihiro Matsumoto <matz@netlab.co.jp>
|
||||
|
||||
* parse.y (stmt): rescue modifier added to the syntax.
|
||||
|
||||
* keywords: kRESCUE_MOD added.
|
||||
|
||||
* eval.c (rb_f_eval): fake outer scope when eval() called without
|
||||
bindings.
|
||||
|
||||
* eval.c (rb_f_binding): should copy last_class in the outer frame too.
|
||||
|
||||
Sun Nov 7 18:31:04 1999 Yasuhiro Fukuma <yasuf@big.or.jp>
|
||||
|
||||
* eval.c (is_defined): last_class may be 0.
|
||||
|
||||
Sat Nov 6 19:26:55 1999 EGUCHI Osamu <eguchi@triton2.>
|
||||
Sat Nov 6 19:26:55 1999 EGUCHI Osamu <eguchi@shizuokanet.ne.jp>
|
||||
|
||||
* Makefile.in: Added depend entry make parse.@OBJEXT@ from parse.c
|
||||
for UCB make
|
||||
|
|
2
ToDo
2
ToDo
|
@ -2,6 +2,7 @@ Language Spec.
|
|||
|
||||
- def foo; .. rescue .. end
|
||||
- compile time string concatenation, "hello" "world" => "helloworld"
|
||||
- rescue modifier; a rescue b => begin a rescue; b end
|
||||
* objectify symbols
|
||||
* objectify characters
|
||||
* ../... outside condition invokes operator method too.
|
||||
|
@ -34,6 +35,7 @@ Standard Libraries
|
|||
- hash.fetch(key) raises exception if key is not found.
|
||||
- Array#{first,last,at}
|
||||
- Dir.glob(pat){|f|...}
|
||||
* Dir.glob("**/*.c") ala zsh
|
||||
* Struct::new([name,]member,...) ??
|
||||
* String#scanf(?)
|
||||
* Object#fmt(?)
|
||||
|
|
12
configure
vendored
12
configure
vendored
|
@ -1352,7 +1352,7 @@ if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then
|
|||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
if test "$cross_compiling" = yes; then
|
||||
{ echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
|
||||
ac_cv_sizeof_int=4
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1359 "configure"
|
||||
|
@ -1391,7 +1391,7 @@ if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then
|
|||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
if test "$cross_compiling" = yes; then
|
||||
{ echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
|
||||
ac_cv_sizeof_short=2
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1398 "configure"
|
||||
|
@ -1430,7 +1430,7 @@ if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then
|
|||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
if test "$cross_compiling" = yes; then
|
||||
{ echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
|
||||
ac_cv_sizeof_long=4
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1437 "configure"
|
||||
|
@ -1469,7 +1469,7 @@ if eval "test \"`echo '$''{'ac_cv_sizeof_voidp'+set}'`\" = set"; then
|
|||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
if test "$cross_compiling" = yes; then
|
||||
{ echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
|
||||
ac_cv_sizeof_voidp=4
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1476 "configure"
|
||||
|
@ -1508,7 +1508,7 @@ if eval "test \"`echo '$''{'ac_cv_sizeof_float'+set}'`\" = set"; then
|
|||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
if test "$cross_compiling" = yes; then
|
||||
{ echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
|
||||
ac_cv_sizeof_float=4
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1515 "configure"
|
||||
|
@ -1547,7 +1547,7 @@ if eval "test \"`echo '$''{'ac_cv_sizeof_double'+set}'`\" = set"; then
|
|||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
if test "$cross_compiling" = yes; then
|
||||
{ echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
|
||||
ac_cv_sizeof_double=8
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1554 "configure"
|
||||
|
|
20
configure.in
20
configure.in
|
@ -77,18 +77,18 @@ AC_CHECK_PROGS(AR, ar aal, ar)
|
|||
AC_PROG_LN_S
|
||||
AC_PROG_MAKE_SET
|
||||
|
||||
AC_EXEEXT
|
||||
AC_OBJEXT
|
||||
|
||||
# checks for UNIX variants that set C preprocessor variables
|
||||
AC_MINIX
|
||||
|
||||
AC_CHECK_SIZEOF(int)
|
||||
AC_CHECK_SIZEOF(short)
|
||||
AC_CHECK_SIZEOF(long)
|
||||
AC_CHECK_SIZEOF(void*)
|
||||
AC_CHECK_SIZEOF(float)
|
||||
AC_CHECK_SIZEOF(double)
|
||||
AC_EXEEXT
|
||||
AC_OBJEXT
|
||||
|
||||
AC_CHECK_SIZEOF(int, 4)
|
||||
AC_CHECK_SIZEOF(short, 2)
|
||||
AC_CHECK_SIZEOF(long, 4)
|
||||
AC_CHECK_SIZEOF(void*, 4)
|
||||
AC_CHECK_SIZEOF(float, 4)
|
||||
AC_CHECK_SIZEOF(double, 8)
|
||||
|
||||
AC_CACHE_CHECK(for prototypes, rb_cv_have_prototypes,
|
||||
[AC_TRY_COMPILE([int foo(int x) { return 0; }], [return foo(10);],
|
||||
|
@ -253,7 +253,7 @@ test $rb_cv_func_strtod = no && LIBOBJS="$LIBOBJS strtod.o"
|
|||
|
||||
AC_C_BIGENDIAN
|
||||
AC_C_CONST
|
||||
AC_CHAR_UNSIGNED
|
||||
AC_C_CHAR_UNSIGNED
|
||||
|
||||
AC_CACHE_CHECK(whether right shift preserve sign bit, rb_cv_rshift_sign,
|
||||
[AC_TRY_RUN([
|
||||
|
|
56
eval.c
56
eval.c
|
@ -292,10 +292,15 @@ rb_enable_super(klass, name)
|
|||
ID mid = rb_intern(name);
|
||||
|
||||
body = search_method(klass, mid, &origin);
|
||||
if (!body || !body->nd_body || origin != klass) {
|
||||
if (!body) {
|
||||
print_undef(klass, mid);
|
||||
}
|
||||
body->nd_noex &= ~NOEX_UNDEF;
|
||||
if (!body->nd_body) {
|
||||
remove_method(klass, mid);
|
||||
}
|
||||
else {
|
||||
body->nd_noex &= ~NOEX_UNDEF;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1696,7 +1701,7 @@ call_trace_func(event, file, line, self, id, klass)
|
|||
|
||||
prev = ruby_frame;
|
||||
PUSH_FRAME();
|
||||
*ruby_frame = *_frame.prev;
|
||||
*ruby_frame = *prev;
|
||||
ruby_frame->prev = prev;
|
||||
|
||||
if (file) {
|
||||
|
@ -1858,8 +1863,9 @@ rb_eval(self, node)
|
|||
tag = node->nd_head;
|
||||
while (tag) {
|
||||
if (trace_func) {
|
||||
call_trace_func("line", tag->nd_file, nd_line(tag),
|
||||
self, ruby_frame->last_func, 0);
|
||||
call_trace_func("line", tag->nd_file, nd_line(tag), self,
|
||||
ruby_frame->last_func,
|
||||
ruby_frame->last_class);
|
||||
}
|
||||
ruby_sourcefile = tag->nd_file;
|
||||
ruby_sourceline = nd_line(tag);
|
||||
|
@ -2868,8 +2874,9 @@ rb_eval(self, node)
|
|||
ruby_sourcefile = node->nd_file;
|
||||
ruby_sourceline = node->nd_nth;
|
||||
if (trace_func) {
|
||||
call_trace_func("line", ruby_sourcefile, ruby_sourceline,
|
||||
self, ruby_frame->last_func, 0);
|
||||
call_trace_func("line", ruby_sourcefile, ruby_sourceline, self,
|
||||
ruby_frame->last_func,
|
||||
ruby_frame->last_class);
|
||||
}
|
||||
node = node->nd_next;
|
||||
goto again;
|
||||
|
@ -2923,8 +2930,9 @@ module_setup(module, node)
|
|||
PUSH_TAG(PROT_NONE);
|
||||
if ((state = EXEC_TAG()) == 0) {
|
||||
if (trace_func) {
|
||||
call_trace_func("class", file, line,
|
||||
ruby_class, ruby_frame->last_func, 0);
|
||||
call_trace_func("class", file, line, ruby_class,
|
||||
ruby_frame->last_func,
|
||||
ruby_frame->last_class);
|
||||
}
|
||||
result = rb_eval(ruby_class, node->nd_next);
|
||||
}
|
||||
|
@ -2935,7 +2943,8 @@ module_setup(module, node)
|
|||
|
||||
ruby_frame = frame.tmp;
|
||||
if (trace_func) {
|
||||
call_trace_func("end", file, line, 0, ruby_frame->last_func, 0);
|
||||
call_trace_func("end", file, line, 0,
|
||||
ruby_frame->last_func, ruby_frame->last_class);
|
||||
}
|
||||
if (state) JUMP_TAG(state);
|
||||
|
||||
|
@ -3072,7 +3081,9 @@ rb_longjmp(tag, mesg)
|
|||
rb_trap_restore_mask();
|
||||
if (trace_func && tag != TAG_FATAL) {
|
||||
call_trace_func("raise", ruby_sourcefile, ruby_sourceline,
|
||||
ruby_frame->self, ruby_frame->last_func, 0);
|
||||
ruby_frame->self,
|
||||
ruby_frame->last_func,
|
||||
ruby_frame->last_class);
|
||||
}
|
||||
if (!prot_tag) {
|
||||
error_print();
|
||||
|
@ -3838,7 +3849,7 @@ rb_call0(klass, recv, id, argc, argv, body, nosuper)
|
|||
line = ruby_sourceline;
|
||||
}
|
||||
|
||||
call_trace_func("c-call", 0, 0, 0, id, 0);
|
||||
call_trace_func("c-call", 0, 0, 0, id, klass);
|
||||
PUSH_TAG(PROT_FUNC);
|
||||
if ((state = EXEC_TAG()) == 0) {
|
||||
result = call_cfunc(body->nd_cfnc, recv, len, argc, argv);
|
||||
|
@ -3950,7 +3961,7 @@ rb_call0(klass, recv, id, argc, argv, body, nosuper)
|
|||
|
||||
if (trace_func) {
|
||||
call_trace_func("call", b2->nd_file, nd_line(b2),
|
||||
recv, ruby_frame->last_func, 0);
|
||||
recv, id, klass);
|
||||
}
|
||||
result = rb_eval(recv, body);
|
||||
}
|
||||
|
@ -3968,8 +3979,7 @@ rb_call0(klass, recv, id, argc, argv, body, nosuper)
|
|||
file = ruby_sourcefile;
|
||||
line = ruby_sourceline;
|
||||
}
|
||||
call_trace_func("return", file, line, recv,
|
||||
ruby_frame->last_func, klass);
|
||||
call_trace_func("return", file, line, recv, id, klass);
|
||||
}
|
||||
switch (state) {
|
||||
case 0:
|
||||
|
@ -4365,7 +4375,7 @@ rb_f_eval(argc, argv, self)
|
|||
VALUE *argv;
|
||||
VALUE self;
|
||||
{
|
||||
VALUE src, scope, vfile, vline;
|
||||
VALUE src, scope, vfile, vline, val;
|
||||
char *file = "(eval)";
|
||||
int line = 1;
|
||||
|
||||
|
@ -4379,6 +4389,19 @@ rb_f_eval(argc, argv, self)
|
|||
}
|
||||
|
||||
Check_SafeStr(src);
|
||||
if (NIL_P(scope) && ruby_frame->prev) {
|
||||
struct FRAME *prev;
|
||||
VALUE val;
|
||||
|
||||
prev = ruby_frame;
|
||||
PUSH_FRAME();
|
||||
*ruby_frame = *prev->prev;
|
||||
ruby_frame->prev = prev;
|
||||
val = eval(self, src, scope, file, line);
|
||||
POP_FRAME();
|
||||
|
||||
return val;
|
||||
}
|
||||
return eval(self, src, scope, file, line);
|
||||
}
|
||||
|
||||
|
@ -5472,6 +5495,7 @@ rb_f_binding(self)
|
|||
frame_dup(&data->frame);
|
||||
if (ruby_frame->prev) {
|
||||
data->frame.last_func = ruby_frame->prev->last_func;
|
||||
data->frame.last_class = ruby_frame->prev->last_class;
|
||||
}
|
||||
|
||||
if (data->iter) {
|
||||
|
|
2
keywords
2
keywords
|
@ -27,7 +27,7 @@ nil, kNIL, kNIL, EXPR_END
|
|||
not, kNOT, kNOT, EXPR_BEG
|
||||
or, kOR, kOR, EXPR_BEG
|
||||
redo, kREDO, kREDO, EXPR_END
|
||||
rescue, kRESCUE, kRESCUE, EXPR_MID
|
||||
rescue, kRESCUE, kRESCUE_MOD, EXPR_MID
|
||||
retry, kRETRY, kRETRY, EXPR_END
|
||||
return, kRETURN, kRETURN, EXPR_MID
|
||||
self, kSELF, kSELF, EXPR_END
|
||||
|
|
2
lex.c
2
lex.c
|
@ -79,7 +79,7 @@ rb_reserved_word (str, len)
|
|||
{"module", kMODULE, kMODULE, EXPR_BEG},
|
||||
{"elsif", kELSIF, kELSIF, EXPR_BEG},
|
||||
{"def", kDEF, kDEF, EXPR_FNAME},
|
||||
{"rescue", kRESCUE, kRESCUE, EXPR_MID},
|
||||
{"rescue", kRESCUE, kRESCUE_MOD, EXPR_MID},
|
||||
{"not", kNOT, kNOT, EXPR_BEG},
|
||||
{"then", kTHEN, kTHEN, EXPR_BEG},
|
||||
{"yield", kYIELD, kYIELD, EXPR_END},
|
||||
|
|
13
lib/debug.rb
13
lib/debug.rb
|
@ -27,6 +27,7 @@ class DEBUGGER__
|
|||
@last_file = nil
|
||||
@last = [nil, nil]
|
||||
@no_step = nil
|
||||
@finish_pos = 0
|
||||
end
|
||||
|
||||
DEBUG_LAST_CMD = []
|
||||
|
@ -256,9 +257,13 @@ class DEBUGGER__
|
|||
STDOUT.printf "#%d %s\n", frame_pos, info
|
||||
|
||||
when /^fi(?:nish)?$/
|
||||
@finish_pos = @frames.size - frame_pos
|
||||
frame_pos = 0
|
||||
return
|
||||
if frame_pos == 0
|
||||
STDOUT.print "\"finish\" not meaningful in the outermost frame.\n"
|
||||
else
|
||||
@finish_pos = @frames.size - frame_pos
|
||||
frame_pos = 0
|
||||
return
|
||||
end
|
||||
|
||||
when /^q(?:uit)?$/
|
||||
input = readline("really quit? (y/n) ", false)
|
||||
|
@ -373,10 +378,10 @@ class DEBUGGER__
|
|||
@frames.unshift binding
|
||||
|
||||
when 'return', 'end'
|
||||
@frames.shift
|
||||
if @frames.size == @finish_pos
|
||||
@stop_next = 1
|
||||
end
|
||||
@frames.shift
|
||||
|
||||
when 'raise'
|
||||
excn_handle(file, line, id, binding)
|
||||
|
|
9
parse.y
9
parse.y
|
@ -156,6 +156,7 @@ static void top_local_setup();
|
|||
kUNLESS_MOD
|
||||
kWHILE_MOD
|
||||
kUNTIL_MOD
|
||||
kRESCUE_MOD
|
||||
kALIAS
|
||||
kDEFINED
|
||||
klBEGIN
|
||||
|
@ -212,7 +213,7 @@ static void top_local_setup();
|
|||
|
||||
%nonassoc kDO
|
||||
%nonassoc kDO2
|
||||
%left kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD
|
||||
%left kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD kRESCUE_MOD
|
||||
%left kOR kAND
|
||||
%right kNOT
|
||||
%nonassoc kDEFINED
|
||||
|
@ -347,6 +348,10 @@ stmt : block_call
|
|||
$$ = NEW_UNTIL(cond($3), $1, 1);
|
||||
}
|
||||
}
|
||||
| stmt kRESCUE_MOD expr
|
||||
{
|
||||
$$ = NEW_RESCUE($1, NEW_RESBODY(0,$3,0), 0);
|
||||
}
|
||||
| klBEGIN
|
||||
{
|
||||
if (cur_mid || in_single) {
|
||||
|
@ -607,7 +612,7 @@ reswords : k__LINE__ | k__FILE__ | klBEGIN | klEND
|
|||
| kFOR | kIF_MOD | kIN | kMODULE | kNEXT | kNIL | kNOT
|
||||
| kOR | kREDO | kRESCUE | kRETRY | kRETURN | kSELF | kSUPER
|
||||
| kTHEN | kTRUE | kUNDEF | kUNLESS_MOD | kUNTIL_MOD | kWHEN
|
||||
| kWHILE_MOD | kYIELD
|
||||
| kWHILE_MOD | kYIELD | kRESCUE_MOD
|
||||
|
||||
arg : lhs '=' arg
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue