1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* error.c (exc_exception): clone the receiver exception instead of

creating brand new exception object of the receiver.

* eval.c (rb_eval_string_wrap): extend new ruby_top_self, not
  original self.

* eval.c (rb_eval_cmd): respect ruby_wrapper if set.

* eval.c (eval): do not update ruby_class unless scope is not
  provided.

* eval.c (eval): preserve wrapper information.

* eval.c (proc_invoke): ditto.

* eval.c (block_pass): ditto.

* parse.y (void_expr): too much warnings for void context
  (e.g. foo[1] that can be mere Proc call).

* error.c (rb_name_error): new function to raise NameError with
  name attribute set.

* eval.c (rb_f_missing): set name and args in the exception
  object. [new]

* error.c (name_name): NameError#name - new method.

* error.c (nometh_args): NoMethodError#args - new method.

* lex.c (rb_reserved_word): lex_state after tRESCUE should be
  EXPR_MID.

* gc.c (add_heap): allocation size of the heap unit is doubled for
  each allocation.

* dir.c (isdelim): space, tab, and newline are no longer
  delimiters for glob patterns.

* eval.c (svalue_to_avalue): new conversion scheme between single
  value and array values.

* eval.c (avalue_to_svalue): ditto.

* eval.c (rb_eval): REXPAND now uses avalue_to_svalue(), return
  and yield too.

* eval.c (rb_yield_0): use avalue_to_svalue().

* eval.c (proc_invoke): Proc#call gives avaules, whereas
  Proc#yield gives mvalues.

* eval.c (bmcall): convert given value (svalue) to avalue.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1555 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2001-07-02 08:46:28 +00:00
parent cc13bb43bc
commit ffe1cf575e
24 changed files with 374 additions and 164 deletions

View file

@ -1,3 +1,48 @@
Mon Jul 2 17:22:00 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
* error.c (exc_exception): clone the receiver exception instead of
creating brand new exception object of the receiver.
Mon Jul 2 09:53:12 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
* eval.c (rb_eval_string_wrap): extend new ruby_top_self, not
original self.
* eval.c (rb_eval_cmd): respect ruby_wrapper if set.
* eval.c (eval): do not update ruby_class unless scope is not
provided.
Sun Jul 1 10:51:15 2001 Shugo Maeda <shugo@ruby-lang.org>
* eval.c (eval): preserve wrapper information.
* eval.c (proc_invoke): ditto.
* eval.c (block_pass): ditto.
Sat Jun 30 02:55:45 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
* parse.y (void_expr): too much warnings for void context
(e.g. foo[1] that can be mere Proc call).
Fri Jun 29 17:23:18 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
* error.c (rb_name_error): new function to raise NameError with
name attribute set.
* eval.c (rb_f_missing): set name and args in the exception
object. [new]
* error.c (name_name): NameError#name - new method.
* error.c (nometh_args): NoMethodError#args - new method.
Fri Jun 29 15:29:31 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
* lex.c (rb_reserved_word): lex_state after tRESCUE should be
EXPR_MID.
Thu Jun 28 00:21:28 2001 Keiju Ishitsuka <keiju@ishitsuka.com> Thu Jun 28 00:21:28 2001 Keiju Ishitsuka <keiju@ishitsuka.com>
* lib/matrix.rb: resolve 'ruby -w' warnings. * lib/matrix.rb: resolve 'ruby -w' warnings.
@ -23,6 +68,33 @@ Wed Jun 27 08:53:26 2001 Minero Aoki <aamine@loveruby.net>
* lib/net/protocol.rb,smtp.rb,pop.rb,http.rb: add document. * lib/net/protocol.rb,smtp.rb,pop.rb,http.rb: add document.
Tue Jun 26 18:42:42 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
* gc.c (add_heap): allocation size of the heap unit is doubled for
each allocation.
Mon Jun 25 09:54:48 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
* dir.c (isdelim): space, tab, and newline are no longer
delimiters for glob patterns.
Sat Jun 23 22:28:52 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
* eval.c (svalue_to_avalue): new conversion scheme between single
value and array values.
* eval.c (avalue_to_svalue): ditto.
* eval.c (rb_eval): REXPAND now uses avalue_to_svalue(), return
and yield too.
* eval.c (rb_yield_0): use avalue_to_svalue().
* eval.c (proc_invoke): Proc#call gives avaules, whereas
Proc#yield gives mvalues.
* eval.c (bmcall): convert given value (svalue) to avalue.
Sat Jun 23 18:28:52 2001 Akinori MUSHA <knu@iDaemons.org> Sat Jun 23 18:28:52 2001 Akinori MUSHA <knu@iDaemons.org>
* ext/readline/readline.c (readline_event): a non-void function * ext/readline/readline.c (readline_event): a non-void function

25
array.c
View file

@ -419,28 +419,31 @@ rb_ary_aref(argc, argv, ary)
VALUE *argv; VALUE *argv;
VALUE ary; VALUE ary;
{ {
VALUE arg1, arg2; VALUE arg;
long beg, len; long beg, len;
if (rb_scan_args(argc, argv, "11", &arg1, &arg2) == 2) { if (argc == 2) {
beg = NUM2LONG(arg1); beg = NUM2LONG(argv[0]);
len = NUM2LONG(arg2); len = NUM2LONG(argv[1]);
if (beg < 0) { if (beg < 0) {
beg += RARRAY(ary)->len; beg += RARRAY(ary)->len;
} }
return rb_ary_subseq(ary, beg, len); return rb_ary_subseq(ary, beg, len);
} }
if (argc != 1) {
/* special case - speeding up */ rb_scan_args(argc, argv, "11", 0, 0);
if (FIXNUM_P(arg1)) {
return rb_ary_entry(ary, FIX2LONG(arg1));
} }
else if (TYPE(arg1) == T_BIGNUM) { arg = argv[0];
/* special case - speeding up */
if (FIXNUM_P(arg)) {
return rb_ary_entry(ary, FIX2LONG(arg));
}
else if (TYPE(arg) == T_BIGNUM) {
rb_raise(rb_eIndexError, "index too big"); rb_raise(rb_eIndexError, "index too big");
} }
else { else {
/* check if idx is Range */ /* check if idx is Range */
switch (rb_range_beg_len(arg1, &beg, &len, RARRAY(ary)->len, 0)) { switch (rb_range_beg_len(arg, &beg, &len, RARRAY(ary)->len, 0)) {
case Qfalse: case Qfalse:
break; break;
case Qnil: case Qnil:
@ -449,7 +452,7 @@ rb_ary_aref(argc, argv, ary)
return rb_ary_subseq(ary, beg, len); return rb_ary_subseq(ary, beg, len);
} }
} }
return rb_ary_entry(ary, NUM2LONG(arg1)); return rb_ary_entry(ary, NUM2LONG(arg));
} }
static VALUE static VALUE

View file

@ -149,7 +149,7 @@ rb_define_class(name, super)
id = rb_intern(name); id = rb_intern(name);
if (rb_const_defined(rb_cObject, id)) { if (rb_const_defined(rb_cObject, id)) {
klass = rb_const_get(rb_cObject, id); klass = rb_const_get(rb_cObject, id);
rb_raise(rb_eNameError, "%s is already defined", name); rb_name_error(id, "%s is already defined", name);
} }
klass = rb_define_class_id(id, super); klass = rb_define_class_id(id, super);
st_add_direct(rb_class_tbl, id, klass); st_add_direct(rb_class_tbl, id, klass);
@ -169,7 +169,7 @@ rb_define_class_under(outer, name, super)
id = rb_intern(name); id = rb_intern(name);
if (rb_const_defined_at(outer, id)) { if (rb_const_defined_at(outer, id)) {
klass = rb_const_get(outer, id); klass = rb_const_get(outer, id);
rb_raise(rb_eNameError, "%s is already defined", name); rb_name_error(id, "%s is already defined", name);
} }
klass = rb_define_class_id(id, super); klass = rb_define_class_id(id, super);
rb_const_set(outer, id, klass); rb_const_set(outer, id, klass);

View file

@ -42,8 +42,7 @@ cmp_equal(x, y)
if (x == y) return Qtrue; if (x == y) return Qtrue;
a[0] = x; a[1] = y; a[0] = x; a[1] = y;
return rb_rescue2(cmp_eq, (VALUE)a, cmp_failed, 0, return rb_rescue(cmp_eq, (VALUE)a, cmp_failed, 0);
rb_eStandardError, rb_eNameError, 0);
} }
static VALUE static VALUE

4
dir.c
View file

@ -596,6 +596,7 @@ static void
remove_backslashes(p) remove_backslashes(p)
char *p; char *p;
{ {
#if defined DOSISH
char *pend = p + strlen(p); char *pend = p + strlen(p);
char *t = p; char *t = p;
@ -606,6 +607,7 @@ remove_backslashes(p)
*t++ = *p++; *t++ = *p++;
} }
*t = '\0'; *t = '\0';
#endif
} }
#ifndef S_ISDIR #ifndef S_ISDIR
@ -845,7 +847,7 @@ push_braces(ary, s)
} }
} }
#define isdelim(c) ((c)==' '||(c)=='\t'||(c)=='\n'||(c)=='\0') #define isdelim(c) ((c)=='\0')
static VALUE static VALUE
dir_s_glob(dir, str) dir_s_glob(dir, str)

2
dln.c
View file

@ -87,7 +87,7 @@ int eaccess();
#endif #endif
#ifndef FUNCNAME_PATTERN #ifndef FUNCNAME_PATTERN
# if defined(__hp9000s300) || (defined(__NetBSD__) && !defined(__ELF__)) || defined(__BORLANDC__) || (defined(__FreeBSD__) && __FreeBSD__ < 3) || defined(__OpenBSD__) || defined(NeXT) || defined(__WATCOMC__) || defined(__APPLE__) # if defined(__hp9000s300) || (defined(__NetBSD__) && !defined(__ELF__)) || defined(__BORLANDC__) || (defined(__FreeBSD__) && !defined(__ELF__)) || defined(__OpenBSD__) || defined(NeXT) || defined(__WATCOMC__) || defined(__APPLE__)
# define FUNCNAME_PATTERN "_Init_%s" # define FUNCNAME_PATTERN "_Init_%s"
# else # else
# define FUNCNAME_PATTERN "Init_%s" # define FUNCNAME_PATTERN "Init_%s"

47
error.c
View file

@ -322,15 +322,11 @@ exc_exception(argc, argv, self)
VALUE *argv; VALUE *argv;
VALUE self; VALUE self;
{ {
VALUE etype, exc; VALUE exc;
if (argc == 0) return self; if (argc == 0) return self;
if (argc == 1 && self == argv[0]) return self; if (argc == 1 && self == argv[0]) return self;
etype = CLASS_OF(self); exc = rb_obj_clone(self);
while (FL_TEST(etype, FL_SINGLETON)) {
etype = RCLASS(etype)->super;
}
exc = rb_obj_alloc(etype);
rb_obj_call_init(exc, argc, argv); rb_obj_call_init(exc, argc, argv);
return exc; return exc;
@ -417,6 +413,43 @@ exit_status(exc)
return rb_iv_get(exc, "status"); return rb_iv_get(exc, "status");
} }
void
#ifdef HAVE_STDARG_PROTOTYPES
rb_name_error(ID id, const char *fmt, ...)
#else
rb_name_error(id, fmt, va_alist)
ID id;
const char *fmt;
va_dcl
#endif
{
VALUE exc;
va_list args;
char buf[BUFSIZ];
va_init_list(args, fmt);
vsnprintf(buf, BUFSIZ, fmt, args);
va_end(args);
exc = rb_exc_new2(rb_eLoadError, buf);
rb_iv_set(exc, "name", ID2SYM(id));
rb_exc_raise(exc);
}
static VALUE
name_name(self)
VALUE self;
{
return rb_iv_get(self, "name");
}
static VALUE
nometh_args(self)
VALUE self;
{
return rb_iv_get(self, "args");
}
#ifdef __BEOS__ #ifdef __BEOS__
typedef struct { typedef struct {
VALUE *list; VALUE *list;
@ -594,7 +627,9 @@ Init_Exception()
rb_eIndexError = rb_define_class("IndexError", rb_eStandardError); rb_eIndexError = rb_define_class("IndexError", rb_eStandardError);
rb_eRangeError = rb_define_class("RangeError", rb_eStandardError); rb_eRangeError = rb_define_class("RangeError", rb_eStandardError);
rb_eNameError = rb_define_class("NameError", rb_eStandardError); rb_eNameError = rb_define_class("NameError", rb_eStandardError);
rb_define_method(rb_eNameError, "name", name_name, 0);
rb_eNoMethodError = rb_define_class("NoMethodError", rb_eNameError); rb_eNoMethodError = rb_define_class("NoMethodError", rb_eNameError);
rb_define_method(rb_eNoMethodError, "args", nometh_args, 0);
rb_eScriptError = rb_define_class("ScriptError", rb_eException); rb_eScriptError = rb_define_class("ScriptError", rb_eException);
rb_eSyntaxError = rb_define_class("SyntaxError", rb_eScriptError); rb_eSyntaxError = rb_define_class("SyntaxError", rb_eScriptError);

59
eval.c
View file

@ -168,7 +168,7 @@ print_undef(klass, id)
VALUE klass; VALUE klass;
ID id; ID id;
{ {
rb_raise(rb_eNameError, "undefined method `%s' for %s `%s'", rb_name_error(id, "undefined method `%s' for %s `%s'",
rb_id2name(id), rb_id2name(id),
(TYPE(klass) == T_MODULE)?"module":"class", (TYPE(klass) == T_MODULE)?"module":"class",
rb_class2name(klass)); rb_class2name(klass));
@ -315,7 +315,7 @@ remove_method(klass, mid)
} }
if (OBJ_FROZEN(klass)) rb_error_frozen("class/module"); if (OBJ_FROZEN(klass)) rb_error_frozen("class/module");
if (!st_delete(RCLASS(klass)->m_tbl, &mid, &body)) { if (!st_delete(RCLASS(klass)->m_tbl, &mid, &body)) {
rb_raise(rb_eNameError, "method `%s' not defined in %s", rb_name_error(mid, "method `%s' not defined in %s",
rb_id2name(mid), rb_class2name(klass)); rb_id2name(mid), rb_class2name(klass));
} }
rb_clear_cache_by_id(mid); rb_clear_cache_by_id(mid);
@ -546,6 +546,7 @@ struct BLOCK {
int flags; int flags;
struct RVarmap *dyna_vars; struct RVarmap *dyna_vars;
VALUE orig_thread; VALUE orig_thread;
VALUE wrapper;
struct BLOCK *prev; struct BLOCK *prev;
}; };
@ -1273,7 +1274,7 @@ rb_eval_string_wrap(str, state)
PUSH_CLASS(); PUSH_CLASS();
ruby_class = ruby_wrapper = rb_module_new(); ruby_class = ruby_wrapper = rb_module_new();
ruby_top_self = rb_obj_clone(ruby_top_self); ruby_top_self = rb_obj_clone(ruby_top_self);
rb_extend_object(self, ruby_class); rb_extend_object(ruby_top_self, ruby_class);
val = rb_eval_string_protect(str, &status); val = rb_eval_string_protect(str, &status);
ruby_top_self = self; ruby_top_self = self;
@ -1336,7 +1337,7 @@ rb_eval_cmd(cmd, arg)
saved_scope = ruby_scope; saved_scope = ruby_scope;
ruby_scope = top_scope; ruby_scope = top_scope;
ruby_class = rb_cObject; ruby_class = ruby_wrapper ? ruby_wrapper : rb_cObject;
if (OBJ_TAINTED(cmd)) { if (OBJ_TAINTED(cmd)) {
ruby_safe_level = 4; ruby_safe_level = 4;
} }
@ -1545,7 +1546,7 @@ rb_undef(klass, id)
else if (TYPE(c) == T_MODULE) { else if (TYPE(c) == T_MODULE) {
s0 = " module"; s0 = " module";
} }
rb_raise(rb_eNameError, "undefined method `%s' for%s `%s'", rb_name_error(id, "undefined method `%s' for%s `%s'",
rb_id2name(id),s0,rb_class2name(c)); rb_id2name(id),s0,rb_class2name(c));
} }
rb_add_method(klass, id, 0, NOEX_PUBLIC); rb_add_method(klass, id, 0, NOEX_PUBLIC);
@ -2378,7 +2379,7 @@ rb_eval(self, n)
case NODE_BREAK: case NODE_BREAK:
if (node->nd_stts) { if (node->nd_stts) {
return_value(rb_eval(self, node->nd_stts)); return_value(avalue_to_svalue(rb_eval(self, node->nd_stts)));
} }
else { else {
return_value(Qnil); return_value(Qnil);
@ -2388,7 +2389,7 @@ rb_eval(self, n)
case NODE_NEXT: case NODE_NEXT:
if (node->nd_stts) { if (node->nd_stts) {
return_value(rb_eval(self, node->nd_stts)); return_value(avalue_to_svalue(rb_eval(self, node->nd_stts)));
} }
else { else {
return_value(Qnil); return_value(Qnil);
@ -2616,7 +2617,8 @@ rb_eval(self, n)
TMP_PROTECT; TMP_PROTECT;
if (ruby_frame->last_class == 0) { if (ruby_frame->last_class == 0) {
rb_raise(rb_eNameError, "superclass method `%s' disabled", rb_name_error(ruby_frame->last_func,
"superclass method `%s' disabled",
rb_id2name(ruby_frame->last_func)); rb_id2name(ruby_frame->last_func));
} }
if (nd_type(node) == NODE_ZSUPER) { if (nd_type(node) == NODE_ZSUPER) {
@ -4119,7 +4121,6 @@ rb_f_missing(argc, argv, obj)
} }
id = SYM2ID(argv[0]); id = SYM2ID(argv[0]);
argc--; argv++;
switch (TYPE(obj)) { switch (TYPE(obj)) {
case T_NIL: case T_NIL:
@ -4167,9 +4168,17 @@ rb_f_missing(argc, argv, obj)
PUSH_FRAME(); /* fake frame */ PUSH_FRAME(); /* fake frame */
*ruby_frame = *_frame.prev->prev; *ruby_frame = *_frame.prev->prev;
rb_raise(exc, format, rb_id2name(id), {
char buf[BUFSIZ];
snprintf(buf, BUFSIZ, format, rb_id2name(id),
desc, desc[0]=='#'?"":":", desc, desc[0]=='#'?"":":",
desc[0]=='#'?"":rb_class2name(CLASS_OF(obj))); desc[0]=='#'?"":rb_class2name(CLASS_OF(obj)));
exc = rb_exc_new2(exc, buf);
rb_iv_set(exc, "name", argv[0]);
rb_iv_set(exc, "args", rb_ary_new4(argc-1, argv+1));
rb_exc_raise(exc);
}
POP_FRAME(); POP_FRAME();
return Qnil; /* not reached */ return Qnil; /* not reached */
@ -4195,15 +4204,15 @@ rb_undefined(obj, id, argc, argv, call_status)
} }
#ifdef DJGPP #ifdef DJGPP
static int STACK_LEVEL_MAX = 65535; static unsigned int STACK_LEVEL_MAX = 65535;
#else #else
#ifdef __human68k__ #ifdef __human68k__
extern int _stacksize; extern unsigned int _stacksize;
# define STACK_LEVEL_MAX (_stacksize - 4096) # define STACK_LEVEL_MAX (_stacksize - 4096)
#undef HAVE_GETRLIMIT #undef HAVE_GETRLIMIT
#else #else
#ifdef HAVE_GETRLIMIT #ifdef HAVE_GETRLIMIT
static int STACK_LEVEL_MAX = 655300; static unsigned int STACK_LEVEL_MAX = 655300;
#else #else
# define STACK_LEVEL_MAX 655300 # define STACK_LEVEL_MAX 655300
#endif #endif
@ -4586,7 +4595,7 @@ rb_call(klass, recv, mid, argc, argv, scope)
} }
else if ((body = rb_get_method_body(&klass, &id, &noex)) == 0) { else if ((body = rb_get_method_body(&klass, &id, &noex)) == 0) {
if (scope == 3) { if (scope == 3) {
rb_raise(rb_eNameError, "super: no superclass method `%s'", rb_name_error(mid, "super: no superclass method `%s'",
rb_id2name(mid)); rb_id2name(mid));
} }
return rb_undefined(recv, mid, argc, argv, scope==2?CSTAT_VCALL:0); return rb_undefined(recv, mid, argc, argv, scope==2?CSTAT_VCALL:0);
@ -4712,7 +4721,7 @@ rb_call_super(argc, argv)
VALUE result; VALUE result;
if (ruby_frame->last_class == 0) { if (ruby_frame->last_class == 0) {
rb_raise(rb_eNameError, "superclass method `%s' must be enabled by rb_enable_super()", rb_name_error(ruby_frame->last_func, "superclass method `%s' must be enabled by rb_enable_super()",
rb_id2name(ruby_frame->last_func)); rb_id2name(ruby_frame->last_func));
} }
@ -4843,6 +4852,7 @@ eval(self, src, scope, file, line)
struct RVarmap * volatile old_dyna_vars; struct RVarmap * volatile old_dyna_vars;
VALUE volatile old_cref; VALUE volatile old_cref;
int volatile old_vmode; int volatile old_vmode;
volatile VALUE old_wrapper;
struct FRAME frame; struct FRAME frame;
char *filesave = ruby_sourcefile; char *filesave = ruby_sourcefile;
int linesave = ruby_sourceline; int linesave = ruby_sourceline;
@ -4853,6 +4863,7 @@ eval(self, src, scope, file, line)
file = ruby_sourcefile; file = ruby_sourcefile;
line = ruby_sourceline; line = ruby_sourceline;
} }
PUSH_CLASS();
if (!NIL_P(scope)) { if (!NIL_P(scope)) {
if (!rb_obj_is_block(scope)) { if (!rb_obj_is_block(scope)) {
rb_raise(rb_eTypeError, "wrong argument type %s (expected Proc/Binding)", rb_raise(rb_eTypeError, "wrong argument type %s (expected Proc/Binding)",
@ -4874,17 +4885,18 @@ eval(self, src, scope, file, line)
scope_vmode = data->vmode; scope_vmode = data->vmode;
old_cref = (VALUE)ruby_cref; old_cref = (VALUE)ruby_cref;
ruby_cref = (NODE*)ruby_frame->cbase; ruby_cref = (NODE*)ruby_frame->cbase;
old_wrapper = ruby_wrapper;
ruby_wrapper = data->wrapper;
self = data->self; self = data->self;
ruby_frame->iter = data->iter; ruby_frame->iter = data->iter;
ruby_class = ruby_cbase;
} }
else { else {
if (ruby_frame->prev) { if (ruby_frame->prev) {
ruby_frame->iter = ruby_frame->prev->iter; ruby_frame->iter = ruby_frame->prev->iter;
} }
} }
PUSH_CLASS();
ruby_class = ruby_cbase;
ruby_in_eval++; ruby_in_eval++;
if (TYPE(ruby_class) == T_ICLASS) { if (TYPE(ruby_class) == T_ICLASS) {
@ -4909,6 +4921,7 @@ eval(self, src, scope, file, line)
if (!NIL_P(scope)) { if (!NIL_P(scope)) {
int dont_recycle = ruby_scope->flags & SCOPE_DONT_RECYCLE; int dont_recycle = ruby_scope->flags & SCOPE_DONT_RECYCLE;
ruby_wrapper = old_wrapper;
ruby_cref = (NODE*)old_cref; ruby_cref = (NODE*)old_cref;
ruby_frame = frame.tmp; ruby_frame = frame.tmp;
ruby_scope = old_scope; ruby_scope = old_scope;
@ -6079,6 +6092,7 @@ blk_mark(data)
rb_gc_mark((VALUE)data->dyna_vars); rb_gc_mark((VALUE)data->dyna_vars);
rb_gc_mark((VALUE)data->klass); rb_gc_mark((VALUE)data->klass);
rb_gc_mark((VALUE)data->tag); rb_gc_mark((VALUE)data->tag);
rb_gc_mark(data->wrapper);
data = data->prev; data = data->prev;
} }
} }
@ -6194,6 +6208,7 @@ rb_f_binding(self)
*data = *ruby_block; *data = *ruby_block;
data->orig_thread = rb_thread_current(); data->orig_thread = rb_thread_current();
data->wrapper = ruby_wrapper;
data->iter = rb_f_block_given_p(); data->iter = rb_f_block_given_p();
frame_dup(&data->frame); frame_dup(&data->frame);
if (ruby_frame->prev) { if (ruby_frame->prev) {
@ -6283,6 +6298,7 @@ proc_new(klass)
*data = *ruby_block; *data = *ruby_block;
data->orig_thread = rb_thread_current(); data->orig_thread = rb_thread_current();
data->wrapper = ruby_wrapper;
data->iter = data->prev?Qtrue:Qfalse; data->iter = data->prev?Qtrue:Qfalse;
frame_dup(&data->frame); frame_dup(&data->frame);
if (data->iter) { if (data->iter) {
@ -6352,6 +6368,7 @@ proc_invoke(proc, args, pcall)
int state; int state;
volatile int orphan; volatile int orphan;
volatile int safe = ruby_safe_level; volatile int safe = ruby_safe_level;
volatile VALUE old_wrapper = ruby_wrapper;
if (rb_block_given_p() && ruby_frame->last_func) { if (rb_block_given_p() && ruby_frame->last_func) {
rb_warning("block for %s#%s is useless", rb_warning("block for %s#%s is useless",
@ -6362,6 +6379,7 @@ proc_invoke(proc, args, pcall)
Data_Get_Struct(proc, struct BLOCK, data); Data_Get_Struct(proc, struct BLOCK, data);
orphan = blk_orphan(data); orphan = blk_orphan(data);
ruby_wrapper = data->wrapper;
/* PUSH BLOCK from data */ /* PUSH BLOCK from data */
old_block = ruby_block; old_block = ruby_block;
_block = *data; _block = *data;
@ -6387,6 +6405,7 @@ proc_invoke(proc, args, pcall)
state &= TAG_MASK; state &= TAG_MASK;
} }
ruby_block = old_block; ruby_block = old_block;
ruby_wrapper = old_wrapper;
ruby_safe_level = safe; ruby_safe_level = safe;
switch (state) { switch (state) {
@ -6496,6 +6515,7 @@ block_pass(self, node)
int state; int state;
volatile int orphan; volatile int orphan;
volatile int safe = ruby_safe_level; volatile int safe = ruby_safe_level;
volatile VALUE old_wrapper = ruby_wrapper;
if (NIL_P(block)) { if (NIL_P(block)) {
return rb_eval(self, node->nd_iter); return rb_eval(self, node->nd_iter);
@ -6511,6 +6531,8 @@ block_pass(self, node)
Data_Get_Struct(block, struct BLOCK, data); Data_Get_Struct(block, struct BLOCK, data);
orphan = blk_orphan(data); orphan = blk_orphan(data);
ruby_wrapper = data->wrapper;
/* PUSH BLOCK from data */ /* PUSH BLOCK from data */
old_block = ruby_block; old_block = ruby_block;
_block = *data; _block = *data;
@ -6548,6 +6570,7 @@ block_pass(self, node)
} }
} }
ruby_block = old_block; ruby_block = old_block;
ruby_wrapper = old_wrapper;
ruby_safe_level = safe; ruby_safe_level = safe;
switch (state) {/* escape from orphan procedure */ switch (state) {/* escape from orphan procedure */
@ -8989,7 +9012,7 @@ rb_f_throw(argc, argv)
tt = tt->prev; tt = tt->prev;
} }
if (!tt) { if (!tt) {
rb_raise(rb_eNameError, "uncaught throw `%s'", rb_id2name(t)); rb_name_error(t, "uncaught throw `%s'", rb_id2name(t));
} }
return_value(value); return_value(value);
rb_trap_restore_mask(); rb_trap_restore_mask();

View file

@ -25,7 +25,7 @@ class IO
break break
end end
end end
if iterator? then if block_given? then
yield result yield result
else else
return result return result

View file

@ -1,63 +1,60 @@
GNU Readline Libraryを利用するための拡張モジュールです。 Extension for GNU Readline Library
Example:
require "readline" require "readline"
include Readline include Readline
line = readline("Prompt> ", TRUE) line = readline("Prompt> ", true)
のように使用してください。
[Readline] [Readline]
<モジュール関数> <module function>
readline(prompt, add=nil) readline(prompt, add_hostory=nil)
一行入力を読み込みます。 Reads one line wit line edit. the line is added to the
addがTRUEの場合、ヒストリに読み込んだ文字列を追加します。 history also if "add" is true.
<クラスメソッド> <class mehods>
completion_proc = proc completion_proc = proc
補完時の動作を決定するProcオブジェクトを指定します。 Specifies Proc object to determin completion behavior. It
procは引数に入力文字列を取り、候補文字列の配列を返すように shoule take input-string, and return completion candidates.
してください。
completion_proc completion_proc
補完時の動作を決定するProcオブジェクトを返します。 Returns the completion Proc object.
completion_case_fold = case_fold completion_case_fold = bool
補完時に大文字小文字を区別しない場合、TRUEを指定します。 Sets whether or not to ignore case on completion.
completion_case_fold completion_case_fold
補完時に大文字小文字を区別しない場合、TRUEを返します。 Returns true if completion ignores case.
completion_append_character = char completion_append_character = char
補完時に付加される文字を文字列で指定します。先頭の一文字が Specifies a chacatcter to be appended on completion.
設定され、空文字列 ("") または nil を指定すると何も付加 Nothing will be appended if empty string ("") or nil is specified.
されなくなります。
completion_append_character completion_append_character
補完時に付加される文字を文字列で返します。デフォルトは Returns a string contains a character to be appended on
空白 (" ") です。 completion. The default is a space (" ").
vi_editing_mode vi_editing_mode
VIモードになります。 Specifies VI editing mode.
emacs_editing_mode emacs_editing_mode
Emacsモードになります。 Specifies Emacs editing mode.
<クラス定数> <class constants>
HISTORY HISTORY
ヒストリに対する操作はこの定数を通して行ってください。 The history buffer. It behaves just like an array.
配列と同じように扱えるようになっています。

63
ext/readline/README.jp Normal file
View file

@ -0,0 +1,63 @@
GNU Readline Libraryを利用するための拡張モジュールです。
require "readline"
include Readline
line = readline("Prompt> ", true)
のように使用してください。
[Readline]
<モジュール関数>
readline(prompt, add=nil)
一行入力を読み込みます。
addがtrueの場合、ヒストリに読み込んだ文字列を追加します。
<クラスメソッド>
completion_proc = proc
補完時の動作を決定するProcオブジェクトを指定します。
procは引数に入力文字列を取り、候補文字列の配列を返すように
してください。
completion_proc
補完時の動作を決定するProcオブジェクトを返します。
completion_case_fold = case_fold
補完時に大文字小文字を区別しない場合、trueを指定します。
completion_case_fold
補完時に大文字小文字を区別しない場合、trueを返します。
completion_append_character = char
補完時に付加される文字を文字列で指定します。先頭の一文字が
設定され、空文字列 ("") または nil を指定すると何も付加
されなくなります。
completion_append_character
補完時に付加される文字を文字列で返します。デフォルトは
空白 (" ") です。
vi_editing_mode
VIモードになります。
emacs_editing_mode
Emacsモードになります。
<クラス定数>
HISTORY
ヒストリに対する操作はこの定数を通して行ってください。
配列と同じように扱えるようになっています。

47
gc.c
View file

@ -258,7 +258,10 @@ static RVALUE **heaps;
static int heaps_length = 0; static int heaps_length = 0;
static int heaps_used = 0; static int heaps_used = 0;
#define HEAP_SLOTS 10000 #define HEAP_MIN_SLOTS 10000
static int *heaps_limits;
static int heap_slots = HEAP_MIN_SLOTS;
#define FREE_MIN 4096 #define FREE_MIN 4096
static RVALUE *himem, *lomem; static RVALUE *himem, *lomem;
@ -275,13 +278,29 @@ add_heap()
(RVALUE**)realloc(heaps, heaps_length*sizeof(RVALUE*)): (RVALUE**)realloc(heaps, heaps_length*sizeof(RVALUE*)):
(RVALUE**)malloc(heaps_length*sizeof(RVALUE*))); (RVALUE**)malloc(heaps_length*sizeof(RVALUE*)));
if (heaps == 0) mem_error("heaps: can't alloc memory"); if (heaps == 0) mem_error("heaps: can't alloc memory");
RUBY_CRITICAL(heaps_limits = (heaps_used>0)?
(int*)realloc(heaps_limits, heaps_length*sizeof(int)):
(int*)malloc(heaps_length*sizeof(int)));
if (heaps_limits == 0) mem_error("heaps_limits: can't alloc memory");
} }
RUBY_CRITICAL(p = heaps[heaps_used++] = (RVALUE*)malloc(sizeof(RVALUE)*HEAP_SLOTS)); for (;;) {
if (p == 0) mem_error("add_heap: can't alloc memory"); RUBY_CRITICAL(p = heaps[heaps_used] = (RVALUE*)malloc(sizeof(RVALUE)*heap_slots));
pend = p + HEAP_SLOTS; heaps_limits[heaps_used] = heap_slots;
if (p == 0) {
if (heap_slots == HEAP_MIN_SLOTS) {
mem_error("add_heap: can't alloc memory");
}
heap_slots = HEAP_MIN_SLOTS;
continue;
}
break;
}
pend = p + heap_slots;
if (lomem == 0 || lomem > p) lomem = p; if (lomem == 0 || lomem > p) lomem = p;
if (himem < pend) himem = pend; if (himem < pend) himem = pend;
heaps_used++;
heap_slots *= 2;
while (p < pend) { while (p < pend) {
p->as.free.flags = 0; p->as.free.flags = 0;
@ -337,8 +356,8 @@ is_pointer_to_heap(ptr)
/* check if p looks like a pointer */ /* check if p looks like a pointer */
for (i=0; i < heaps_used; i++) { for (i=0; i < heaps_used; i++) {
heap_org = heaps[i]; heap_org = heaps[i];
if (heap_org <= p && p < heap_org + HEAP_SLOTS if (heap_org <= p && p < heap_org + heaps_limits[i] &&
&& ((((char*)p)-((char*)heap_org))%sizeof(RVALUE)) == 0) ((((char*)p)-((char*)heap_org))%sizeof(RVALUE)) == 0)
return Qtrue; return Qtrue;
} }
return Qfalse; return Qfalse;
@ -512,6 +531,8 @@ rb_gc_mark(ptr)
case NODE_DEFINED: case NODE_DEFINED:
case NODE_MATCH: case NODE_MATCH:
case NODE_RETURN: case NODE_RETURN:
case NODE_BREAK:
case NODE_NEXT:
case NODE_YIELD: case NODE_YIELD:
case NODE_COLON2: case NODE_COLON2:
case NODE_ARGS: case NODE_ARGS:
@ -539,8 +560,6 @@ rb_gc_mark(ptr)
case NODE_BACK_REF: case NODE_BACK_REF:
case NODE_ALIAS: case NODE_ALIAS:
case NODE_VALIAS: case NODE_VALIAS:
case NODE_BREAK:
case NODE_NEXT:
case NODE_REDO: case NODE_REDO:
case NODE_RETRY: case NODE_RETRY:
case NODE_UNDEF: case NODE_UNDEF:
@ -676,7 +695,7 @@ gc_sweep()
if (ruby_in_compile) { if (ruby_in_compile) {
/* should not reclaim nodes during compilation */ /* should not reclaim nodes during compilation */
for (i = 0; i < used; i++) { for (i = 0; i < used; i++) {
p = heaps[i]; pend = p + HEAP_SLOTS; p = heaps[i]; pend = p + heaps_limits[i];
while (p < pend) { while (p < pend) {
if (!(p->as.basic.flags&FL_MARK) && BUILTIN_TYPE(p) == T_NODE) if (!(p->as.basic.flags&FL_MARK) && BUILTIN_TYPE(p) == T_NODE)
rb_gc_mark((VALUE)p); rb_gc_mark((VALUE)p);
@ -691,7 +710,7 @@ gc_sweep()
for (i = 0; i < used; i++) { for (i = 0; i < used; i++) {
int n = 0; int n = 0;
p = heaps[i]; pend = p + HEAP_SLOTS; p = heaps[i]; pend = p + heaps_limits[i];
while (p < pend) { while (p < pend) {
if (!(p->as.basic.flags & FL_MARK)) { if (!(p->as.basic.flags & FL_MARK)) {
if (p->as.basic.flags) { if (p->as.basic.flags) {
@ -1045,7 +1064,7 @@ os_live_obj()
for (i = 0; i < heaps_used; i++) { for (i = 0; i < heaps_used; i++) {
RVALUE *p, *pend; RVALUE *p, *pend;
p = heaps[i]; pend = p + HEAP_SLOTS; p = heaps[i]; pend = p + heaps_limits[i];
for (;p < pend; p++) { for (;p < pend; p++) {
if (p->as.basic.flags) { if (p->as.basic.flags) {
switch (TYPE(p)) { switch (TYPE(p)) {
@ -1078,7 +1097,7 @@ os_obj_of(of)
for (i = 0; i < heaps_used; i++) { for (i = 0; i < heaps_used; i++) {
RVALUE *p, *pend; RVALUE *p, *pend;
p = heaps[i]; pend = p + HEAP_SLOTS; p = heaps[i]; pend = p + heaps_limits[i];
for (;p < pend; p++) { for (;p < pend; p++) {
if (p->as.basic.flags) { if (p->as.basic.flags) {
switch (TYPE(p)) { switch (TYPE(p)) {
@ -1245,7 +1264,7 @@ rb_gc_call_finalizer_at_exit()
} }
} }
for (i = 0; i < heaps_used; i++) { for (i = 0; i < heaps_used; i++) {
p = heaps[i]; pend = p + HEAP_SLOTS; p = heaps[i]; pend = p + heaps_limits[i];
while (p < pend) { while (p < pend) {
if (FL_TEST(p, FL_FINALIZE)) { if (FL_TEST(p, FL_FINALIZE)) {
FL_UNSET(p, FL_FINALIZE); FL_UNSET(p, FL_FINALIZE);
@ -1258,7 +1277,7 @@ rb_gc_call_finalizer_at_exit()
} }
/* run data object's finaliers */ /* run data object's finaliers */
for (i = 0; i < heaps_used; i++) { for (i = 0; i < heaps_used; i++) {
p = heaps[i]; pend = p + HEAP_SLOTS; p = heaps[i]; pend = p + heaps_limits[i];
while (p < pend) { while (p < pend) {
if (BUILTIN_TYPE(p) == T_DATA && if (BUILTIN_TYPE(p) == T_DATA &&
DATA_PTR(p) && RANY(p)->as.data.dfree) { DATA_PTR(p) && RANY(p)->as.data.dfree) {

View file

@ -109,6 +109,7 @@ VALUE rb_exc_new _((VALUE, const char*, long));
VALUE rb_exc_new2 _((VALUE, const char*)); VALUE rb_exc_new2 _((VALUE, const char*));
VALUE rb_exc_new3 _((VALUE, VALUE)); VALUE rb_exc_new3 _((VALUE, VALUE));
NORETURN(void rb_loaderror __((const char*, ...))); NORETURN(void rb_loaderror __((const char*, ...)));
NORETURN(void rb_name_error __((VALUE id, const char*, ...)));
void rb_compile_error __((const char*, ...)); void rb_compile_error __((const char*, ...));
void rb_compile_error_append __((const char*, ...)); void rb_compile_error_append __((const char*, ...));
NORETURN(void rb_load_fail _((char*))); NORETURN(void rb_load_fail _((char*)));

View file

@ -27,7 +27,7 @@ nil, kNIL, kNIL, EXPR_END
not, kNOT, kNOT, EXPR_BEG not, kNOT, kNOT, EXPR_BEG
or, kOR, kOR, EXPR_BEG or, kOR, kOR, EXPR_BEG
redo, kREDO, kREDO, EXPR_END redo, kREDO, kREDO, EXPR_END
rescue, kRESCUE, kRESCUE_MOD, EXPR_END rescue, kRESCUE, kRESCUE_MOD, EXPR_MID
retry, kRETRY, kRETRY, EXPR_END retry, kRETRY, kRETRY, EXPR_END
return, kRETURN, kRETURN, EXPR_MID return, kRETURN, kRETURN, EXPR_MID
self, kSELF, kSELF, EXPR_END self, kSELF, kSELF, EXPR_END

10
lex.c
View file

@ -1,5 +1,5 @@
/* C code produced by gperf version 2.7.1 (19981006 egcs) */ /* C code produced by gperf version 2.7.2 */
/* Command-line: gperf -p -j1 -i 1 -g -o -t -N rb_reserved_word -k1,3,$ ./keywords */ /* Command-line: gperf -p -j1 -i 1 -g -o -t -N rb_reserved_word -k'1,3,$' ./keywords */
struct kwtable {char *name; int id[2]; enum lex_state state;}; struct kwtable {char *name; int id[2]; enum lex_state state;};
#define TOTAL_KEYWORDS 40 #define TOTAL_KEYWORDS 40
@ -11,6 +11,10 @@ struct kwtable {char *name; int id[2]; enum lex_state state;};
#ifdef __GNUC__ #ifdef __GNUC__
__inline __inline
#else
#ifdef __cplusplus
inline
#endif
#endif #endif
static unsigned int static unsigned int
hash (str, len) hash (str, len)
@ -79,7 +83,7 @@ rb_reserved_word (str, len)
{"module", kMODULE, kMODULE, EXPR_BEG}, {"module", kMODULE, kMODULE, EXPR_BEG},
{"elsif", kELSIF, kELSIF, EXPR_BEG}, {"elsif", kELSIF, kELSIF, EXPR_BEG},
{"def", kDEF, kDEF, EXPR_FNAME}, {"def", kDEF, kDEF, EXPR_FNAME},
{"rescue", kRESCUE, kRESCUE_MOD, EXPR_END}, {"rescue", kRESCUE, kRESCUE_MOD, EXPR_MID},
{"not", kNOT, kNOT, EXPR_BEG}, {"not", kNOT, kNOT, EXPR_BEG},
{"then", kTHEN, kTHEN, EXPR_BEG}, {"then", kTHEN, kTHEN, EXPR_BEG},
{"yield", kYIELD, kYIELD, EXPR_ARG}, {"yield", kYIELD, kYIELD, EXPR_ARG},

View file

@ -300,7 +300,9 @@ class DEBUGGER__
when /^\s*b(?:reak)?\s+((?:.*?+:)?.+)$/ when /^\s*b(?:reak)?\s+((?:.*?+:)?.+)$/
pos = $1 pos = $1
if pos.index(":") if pos.index(":")
file, pos = pos.split(":") pos = pos.split(":")
file = pos[0...-1].join(":")
pos = pos[-1]
end end
file = File.basename(file) file = File.basename(file)
if pos =~ /^\d+$/ if pos =~ /^\d+$/

View file

@ -70,8 +70,7 @@ do_coerce(x, y)
VALUE a[2]; VALUE a[2];
a[0] = *x; a[1] = *y; a[0] = *x; a[1] = *y;
ary = rb_rescue2(coerce_body, (VALUE)a, coerce_rescue, (VALUE)a, ary = rb_rescue(coerce_body, (VALUE)a, coerce_rescue, (VALUE)a);
rb_eStandardError, rb_eNameError, 0);
if (TYPE(ary) != T_ARRAY || RARRAY(ary)->len != 2) { if (TYPE(ary) != T_ARRAY || RARRAY(ary)->len != 2) {
rb_raise(rb_eTypeError, "coerce must return [x, y]"); rb_raise(rb_eTypeError, "coerce must return [x, y]");
} }

View file

@ -769,7 +769,7 @@ rb_mod_const_get(mod, name)
ID id = rb_to_id(name); ID id = rb_to_id(name);
if (!rb_is_const_id(id)) { if (!rb_is_const_id(id)) {
rb_raise(rb_eNameError, "wrong constant name %s", rb_id2name(id)); rb_name_error(id, "wrong constant name %s", rb_id2name(id));
} }
return rb_const_get(mod, id); return rb_const_get(mod, id);
} }
@ -781,7 +781,7 @@ rb_mod_const_set(mod, name, value)
ID id = rb_to_id(name); ID id = rb_to_id(name);
if (!rb_is_const_id(id)) { if (!rb_is_const_id(id)) {
rb_raise(rb_eNameError, "wrong constant name %s", rb_id2name(id)); rb_name_error(id, "wrong constant name %s", rb_id2name(id));
} }
rb_const_set(mod, id, value); rb_const_set(mod, id, value);
return value; return value;
@ -794,7 +794,7 @@ rb_mod_const_defined(mod, name)
ID id = rb_to_id(name); ID id = rb_to_id(name);
if (!rb_is_const_id(id)) { if (!rb_is_const_id(id)) {
rb_raise(rb_eNameError, "wrong constant name %s", rb_id2name(id)); rb_name_error(id, "wrong constant name %s", rb_id2name(id));
} }
return rb_const_defined_at(mod, id); return rb_const_defined_at(mod, id);
} }
@ -866,8 +866,7 @@ rb_convert_type(val, type, tname, method)
arg1.val = arg2.val = val; arg1.val = arg2.val = val;
arg1.s = method; arg1.s = method;
arg2.s = tname; arg2.s = tname;
val = rb_rescue2(to_type, (VALUE)&arg1, fail_to_type, (VALUE)&arg2, val = rb_rescue2(to_type, (VALUE)&arg1, fail_to_type, (VALUE)&arg2);
rb_eStandardError, rb_eNameError, 0);
if (TYPE(val) != type) { if (TYPE(val) != type) {
rb_raise(rb_eTypeError, "%s#%s should return %s", rb_raise(rb_eTypeError, "%s#%s should return %s",
rb_class2name(CLASS_OF(arg1.val)), method, tname); rb_class2name(CLASS_OF(arg1.val)), method, tname);
@ -886,8 +885,7 @@ rb_to_integer(val, method)
arg1.val = arg2.val = val; arg1.val = arg2.val = val;
arg1.s = method; arg1.s = method;
arg2.s = "Integer"; arg2.s = "Integer";
val = rb_rescue2(to_type, (VALUE)&arg1, fail_to_type, (VALUE)&arg2, val = rb_rescue(to_type, (VALUE)&arg1, fail_to_type, (VALUE)&arg2);
rb_eStandardError, rb_eNameError, 0);
if (!rb_obj_is_kind_of(val, rb_cInteger)) { if (!rb_obj_is_kind_of(val, rb_cInteger)) {
rb_raise(rb_eTypeError, "%s#%s should return Integer", rb_raise(rb_eTypeError, "%s#%s should return Integer",
rb_class2name(CLASS_OF(arg1.val)), method); rb_class2name(CLASS_OF(arg1.val)), method);

13
parse.y
View file

@ -99,7 +99,6 @@ static int in_single = 0;
static int in_def = 0; static int in_def = 0;
static int compile_for_eval = 0; static int compile_for_eval = 0;
static ID cur_mid = 0; static ID cur_mid = 0;
static ID last_id = 0;
static NODE *cond(); static NODE *cond();
static NODE *logop(); static NODE *logop();
@ -1094,13 +1093,13 @@ open_args : call_args
| tLPAREN_ARG {lex_state = EXPR_ENDARG;} ')' | tLPAREN_ARG {lex_state = EXPR_ENDARG;} ')'
{ {
rb_warning("%s (...) interpreted as method call", rb_warning("%s (...) interpreted as method call",
rb_id2name(last_id)); rb_id2name($<id>1));
$$ = 0; $$ = 0;
} }
| tLPAREN_ARG call_args2 {lex_state = EXPR_ENDARG;} ')' | tLPAREN_ARG call_args2 {lex_state = EXPR_ENDARG;} ')'
{ {
rb_warning("%s (...) interpreted as method call", rb_warning("%s (...) interpreted as method call",
rb_id2name(last_id)); rb_id2name($<id>1));
$$ = $2; $$ = $2;
} }
@ -1192,7 +1191,7 @@ primary : literal
} }
| tLPAREN_ARG expr {lex_state = EXPR_ENDARG;} ')' | tLPAREN_ARG expr {lex_state = EXPR_ENDARG;} ')'
{ {
rb_warning("%s (...) interpreted as command call", rb_id2name(last_id)); rb_warning("%s (...) interpreted as command call", rb_id2name($<id>1));
$$ = $2; $$ = $2;
} }
| tLPAREN compstmt ')' | tLPAREN compstmt ')'
@ -2892,6 +2891,7 @@ double strtod ();
static int static int
yylex() yylex()
{ {
static ID last_id = 0;
register int c; register int c;
int space_seen = 0; int space_seen = 0;
int cmd_state; int cmd_state;
@ -3460,6 +3460,7 @@ yylex()
else if (lex_state == EXPR_ARG) { else if (lex_state == EXPR_ARG) {
rb_warning("%s (...) interpreted as method call", tok()); rb_warning("%s (...) interpreted as method call", tok());
c = tLPAREN_ARG; c = tLPAREN_ARG;
yylval.id = last_id;
} }
} }
COND_PUSH(0); COND_PUSH(0);
@ -4422,10 +4423,6 @@ void_expr(node)
case tLEQ: case tLEQ:
case tEQ: case tEQ:
case tNEQ: case tNEQ:
case tAREF:
case tRSHFT:
case tCOLON2:
case tCOLON3:
useless = rb_id2name(node->nd_mid); useless = rb_id2name(node->nd_mid);
break; break;
} }

View file

@ -45,8 +45,7 @@ range_init(obj, beg, end, exclude_end)
args[0] = beg; args[1] = end; args[0] = beg; args[1] = end;
if (!FIXNUM_P(beg) || !FIXNUM_P(end)) { if (!FIXNUM_P(beg) || !FIXNUM_P(end)) {
rb_rescue2(range_check, (VALUE)args, range_failed, 0, rb_rescue2(range_check, (VALUE)args, range_failed, 0);
rb_eStandardError, rb_eNameError, 0);
} }
SET_EXCL(obj, exclude_end); SET_EXCL(obj, exclude_end);
@ -76,7 +75,7 @@ range_initialize(argc, argv, obj)
rb_scan_args(argc, argv, "21", &beg, &end, &flags); rb_scan_args(argc, argv, "21", &beg, &end, &flags);
/* Ranges are immutable, so that they should be initialized only once. */ /* Ranges are immutable, so that they should be initialized only once. */
if (rb_ivar_defined(obj, id_beg)) { if (rb_ivar_defined(obj, id_beg)) {
rb_raise(rb_eNameError, "`initialize' called twice"); rb_name_error(rb_intern("initialized"), "`initialize' called twice");
} }
range_init(obj, beg, end, RTEST(flags)); range_init(obj, beg, end, RTEST(flags));
return Qnil; return Qnil;

View file

@ -3496,6 +3496,7 @@ init_regs(regs, num_regs)
else if (regs->allocated < num_regs) { else if (regs->allocated < num_regs) {
TREALLOC(regs->beg, num_regs, int); TREALLOC(regs->beg, num_regs, int);
TREALLOC(regs->end, num_regs, int); TREALLOC(regs->end, num_regs, int);
regs->allocated = num_regs;
} }
for (i=0; i<num_regs; i++) { for (i=0; i<num_regs; i++) {
regs->beg[i] = regs->end[i] = -1; regs->beg[i] = regs->end[i] = -1;

5
ruby.c
View file

@ -265,20 +265,19 @@ ruby_init_loadpath()
ruby_incpush(RUBY_RELATIVE(RUBY_SEARCH_PATH)); ruby_incpush(RUBY_RELATIVE(RUBY_SEARCH_PATH));
#endif #endif
ruby_incpush(RUBY_RELATIVE(RUBY_SITE_LIB2));
#ifdef RUBY_SITE_THIN_ARCHLIB #ifdef RUBY_SITE_THIN_ARCHLIB
ruby_incpush(RUBY_RELATIVE(RUBY_SITE_THIN_ARCHLIB)); ruby_incpush(RUBY_RELATIVE(RUBY_SITE_THIN_ARCHLIB));
#endif #endif
ruby_incpush(RUBY_RELATIVE(RUBY_SITE_ARCHLIB)); ruby_incpush(RUBY_RELATIVE(RUBY_SITE_ARCHLIB));
ruby_incpush(RUBY_RELATIVE(RUBY_SITE_LIB2));
ruby_incpush(RUBY_RELATIVE(RUBY_SITE_LIB)); ruby_incpush(RUBY_RELATIVE(RUBY_SITE_LIB));
ruby_incpush(RUBY_RELATIVE(RUBY_LIB));
#ifdef RUBY_THIN_ARCHLIB #ifdef RUBY_THIN_ARCHLIB
ruby_incpush(RUBY_RELATIVE(RUBY_THIN_ARCHLIB)); ruby_incpush(RUBY_RELATIVE(RUBY_THIN_ARCHLIB));
#endif #endif
ruby_incpush(RUBY_RELATIVE(RUBY_ARCHLIB)); ruby_incpush(RUBY_RELATIVE(RUBY_ARCHLIB));
ruby_incpush(RUBY_RELATIVE(RUBY_LIB));
if (rb_safe_level() == 0) { if (rb_safe_level() == 0) {
ruby_incpush("."); ruby_incpush(".");
} }

View file

@ -89,7 +89,7 @@ rb_struct_getmember(obj, id)
return RSTRUCT(obj)->ptr[i]; return RSTRUCT(obj)->ptr[i];
} }
} }
rb_raise(rb_eNameError, "%s is not struct member", rb_id2name(id)); rb_name_error(id, "%s is not struct member", rb_id2name(id));
return Qnil; /* not reached */ return Qnil; /* not reached */
} }
@ -141,7 +141,8 @@ rb_struct_set(obj, val)
return RSTRUCT(obj)->ptr[i] = val; return RSTRUCT(obj)->ptr[i] = val;
} }
} }
rb_raise(rb_eNameError, "not struct member"); rb_name_error(rb_frame_last_func(), "`%s' is not a struct member",
rb_id2name(rb_frame_last_func()));
return Qnil; /* not reached */ return Qnil; /* not reached */
} }
@ -160,7 +161,7 @@ make_struct(name, member, klass)
char *cname = StringValuePtr(name); char *cname = StringValuePtr(name);
id = rb_intern(cname); id = rb_intern(cname);
if (!rb_is_const_id(id)) { if (!rb_is_const_id(id)) {
rb_raise(rb_eNameError, "identifier %s needs to be constant", cname); rb_name_error(id, "identifier %s needs to be constant", cname);
} }
nstr = rb_define_class_under(klass, cname, klass); nstr = rb_define_class_under(klass, cname, klass);
} }
@ -435,7 +436,7 @@ rb_struct_aref_id(s, id)
return RSTRUCT(s)->ptr[i]; return RSTRUCT(s)->ptr[i];
} }
} }
rb_raise(rb_eNameError, "no member '%s' in struct", rb_id2name(id)); rb_name_error(id, "no member '%s' in struct", rb_id2name(id));
return Qnil; /* not reached */ return Qnil; /* not reached */
} }
@ -481,7 +482,7 @@ rb_struct_aset_id(s, id, val)
return val; return val;
} }
} }
rb_raise(rb_eNameError, "no member '%s' in struct", rb_id2name(id)); rb_name_error(id, "no member '%s' in struct", rb_id2name(id));
} }
VALUE VALUE

View file

@ -251,8 +251,7 @@ rb_autoload_id(id, filename)
{ {
rb_secure(4); rb_secure(4);
if (!rb_is_const_id(id)) { if (!rb_is_const_id(id)) {
rb_raise(rb_eNameError, "autoload must be constant name", rb_name_error(id, "autoload must be constant name", rb_id2name(id));
rb_id2name(id));
} }
if (!autoload_tbl) { if (!autoload_tbl) {
@ -418,7 +417,7 @@ readonly_setter(val, id, var)
ID id; ID id;
void *var; void *var;
{ {
rb_raise(rb_eNameError, "can't set variable %s", rb_id2name(id)); rb_name_error(id, "can't set variable %s", rb_id2name(id));
} }
static int static int
@ -528,8 +527,7 @@ rb_f_trace_var(argc, argv)
} }
id = rb_to_id(var); id = rb_to_id(var);
if (!st_lookup(rb_global_tbl, id, &entry)) { if (!st_lookup(rb_global_tbl, id, &entry)) {
rb_raise(rb_eNameError, "undefined global variable %s", rb_name_error(id, "undefined global variable %s", rb_id2name(id));
rb_id2name(id));
} }
trace = ALLOC(struct trace_var); trace = ALLOC(struct trace_var);
trace->next = entry->trace; trace->next = entry->trace;
@ -575,8 +573,7 @@ rb_f_untrace_var(argc, argv)
rb_scan_args(argc, argv, "11", &var, &cmd); rb_scan_args(argc, argv, "11", &var, &cmd);
id = rb_to_id(var); id = rb_to_id(var);
if (!st_lookup(rb_global_tbl, id, &entry)) { if (!st_lookup(rb_global_tbl, id, &entry)) {
rb_raise(rb_eNameError, "undefined global variable %s", rb_name_error(id, "undefined global variable %s", rb_id2name(id));
rb_id2name(id));
} }
trace = entry->trace; trace = entry->trace;
@ -1005,8 +1002,7 @@ rb_obj_remove_instance_variable(obj, name)
rb_raise(rb_eSecurityError, "Insecure: can't modify instance variable"); rb_raise(rb_eSecurityError, "Insecure: can't modify instance variable");
if (OBJ_FROZEN(obj)) rb_error_frozen("object"); if (OBJ_FROZEN(obj)) rb_error_frozen("object");
if (!rb_is_instance_id(id)) { if (!rb_is_instance_id(id)) {
rb_raise(rb_eNameError, "`%s' is not an instance variable", rb_name_error(id, "`%s' is not an instance variable", rb_id2name(id));
rb_id2name(id));
} }
switch (TYPE(obj)) { switch (TYPE(obj)) {
@ -1055,7 +1051,7 @@ rb_const_get_at(klass, id)
if (klass == rb_cObject && top_const_get(id, &value)) { if (klass == rb_cObject && top_const_get(id, &value)) {
return value; return value;
} }
rb_raise(rb_eNameError, "uninitialized constant %s::%s", rb_name_error(id, "uninitialized constant %s::%s",
RSTRING(rb_class_path(klass))->ptr, RSTRING(rb_class_path(klass))->ptr,
rb_id2name(id)); rb_id2name(id));
return Qnil; /* not reached */ return Qnil; /* not reached */
@ -1104,12 +1100,12 @@ rb_const_get(klass, id)
/* Uninitialized constant */ /* Uninitialized constant */
if (klass && klass != rb_cObject) { if (klass && klass != rb_cObject) {
rb_raise(rb_eNameError, "uninitialized constant %s at %s", rb_name_error(id, "uninitialized constant %s at %s",
rb_id2name(id), rb_id2name(id),
RSTRING(rb_class_path(klass))->ptr); RSTRING(rb_class_path(klass))->ptr);
} }
else { else {
rb_raise(rb_eNameError, "uninitialized constant %s",rb_id2name(id)); rb_name_error(id, "uninitialized constant %s",rb_id2name(id));
} }
return Qnil; /* not reached */ return Qnil; /* not reached */
} }
@ -1122,7 +1118,7 @@ rb_mod_remove_const(mod, name)
VALUE val; VALUE val;
if (!rb_is_const_id(id)) { if (!rb_is_const_id(id)) {
rb_raise(rb_eNameError, "`%s' is not constant", rb_id2name(id)); rb_name_error(id, "`%s' is not constant", rb_id2name(id));
} }
if (!OBJ_TAINTED(mod) && rb_safe_level() >= 4) if (!OBJ_TAINTED(mod) && rb_safe_level() >= 4)
rb_raise(rb_eSecurityError, "Insecure: can't remove constant"); rb_raise(rb_eSecurityError, "Insecure: can't remove constant");
@ -1132,10 +1128,10 @@ rb_mod_remove_const(mod, name)
return val; return val;
} }
if (rb_const_defined_at(mod, id)) { if (rb_const_defined_at(mod, id)) {
rb_raise(rb_eNameError, "cannot remove %s::%s", rb_name_error(id, "cannot remove %s::%s",
rb_class2name(mod), rb_id2name(id)); rb_class2name(mod), rb_id2name(id));
} }
rb_raise(rb_eNameError, "constant %s::%s not defined", rb_name_error(id, "constant %s::%s not defined",
rb_class2name(mod), rb_id2name(id)); rb_class2name(mod), rb_id2name(id));
return Qnil; /* not reached */ return Qnil; /* not reached */
} }
@ -1339,11 +1335,11 @@ rb_const_assign(klass, id, val)
/* Uninitialized constant */ /* Uninitialized constant */
if (klass && klass != rb_cObject) if (klass && klass != rb_cObject)
rb_raise(rb_eNameError, "uninitialized constant %s::%s", rb_name_error(id, "uninitialized constant %s::%s",
RSTRING(rb_class_path(klass))->ptr, RSTRING(rb_class_path(klass))->ptr,
rb_id2name(id)); rb_id2name(id));
else { else {
rb_raise(rb_eNameError, "uninitialized constant %s",rb_id2name(id)); rb_name_error(id, "uninitialized constant %s",rb_id2name(id));
} }
} }
@ -1402,7 +1398,7 @@ rb_cvar_set(klass, id, val)
tmp = RCLASS(tmp)->super; tmp = RCLASS(tmp)->super;
} }
rb_raise(rb_eNameError,"uninitialized class variable %s in %s", rb_name_error(id,"uninitialized class variable %s in %s",
rb_id2name(id), rb_class2name(klass)); rb_id2name(id), rb_class2name(klass));
} }
@ -1444,7 +1440,7 @@ rb_cvar_get(klass, id)
tmp = RCLASS(tmp)->super; tmp = RCLASS(tmp)->super;
} }
rb_raise(rb_eNameError,"uninitialized class variable %s in %s", rb_name_error(id,"uninitialized class variable %s in %s",
rb_id2name(id), rb_class2name(klass)); rb_id2name(id), rb_class2name(klass));
return Qnil; /* not reached */ return Qnil; /* not reached */
} }
@ -1475,7 +1471,7 @@ rb_cv_set(klass, name, val)
{ {
ID id = rb_intern(name); ID id = rb_intern(name);
if (!rb_is_class_id(id)) { if (!rb_is_class_id(id)) {
rb_raise(rb_eNameError, "wrong class variable name %s", name); rb_name_error(id, "wrong class variable name %s", name);
} }
rb_cvar_set(klass, id, val); rb_cvar_set(klass, id, val);
} }
@ -1487,7 +1483,7 @@ rb_cv_get(klass, name)
{ {
ID id = rb_intern(name); ID id = rb_intern(name);
if (!rb_is_class_id(id)) { if (!rb_is_class_id(id)) {
rb_raise(rb_eNameError, "wrong class variable name %s", name); rb_name_error(id, "wrong class variable name %s", name);
} }
return rb_cvar_get(klass, id); return rb_cvar_get(klass, id);
} }
@ -1501,7 +1497,7 @@ rb_define_class_variable(klass, name, val)
ID id = rb_intern(name); ID id = rb_intern(name);
if (!rb_is_class_id(id)) { if (!rb_is_class_id(id)) {
rb_raise(rb_eNameError, "wrong class variable name %s", name); rb_name_error(id, "wrong class variable name %s", name);
} }
rb_cvar_declare(klass, id, val); rb_cvar_declare(klass, id, val);
} }
@ -1549,7 +1545,7 @@ rb_mod_remove_cvar(mod, name)
VALUE val; VALUE val;
if (!rb_is_class_id(id)) { if (!rb_is_class_id(id)) {
rb_raise(rb_eNameError, "wrong class variable name %s", name); rb_name_error(id, "wrong class variable name %s", name);
} }
if (!OBJ_TAINTED(mod) && rb_safe_level() >= 4) if (!OBJ_TAINTED(mod) && rb_safe_level() >= 4)
rb_raise(rb_eSecurityError, "Insecure: can't remove class variable"); rb_raise(rb_eSecurityError, "Insecure: can't remove class variable");
@ -1559,10 +1555,10 @@ rb_mod_remove_cvar(mod, name)
return val; return val;
} }
if (rb_cvar_defined(mod, id)) { if (rb_cvar_defined(mod, id)) {
rb_raise(rb_eNameError, "cannot remove %s for %s", rb_name_error(id, "cannot remove %s for %s",
rb_id2name(id), rb_class2name(mod)); rb_id2name(id), rb_class2name(mod));
} }
rb_raise(rb_eNameError, "class variable %s not defined for %s", rb_name_error(id, "class variable %s not defined for %s",
rb_id2name(id), rb_class2name(mod)); rb_id2name(id), rb_class2name(mod));
return Qnil; /* not reached */ return Qnil; /* not reached */
} }