* range.c (range_step): 'iter' here should be an array.
* marshal.c (w_object): should retrieve __member__ data from non-singleton class. * variable.c (rb_cvar_get): class variable override check added. * variable.c (rb_cvar_set): ditto * variable.c (rb_cvar_declare): ditto. * parse.y (parse_regx): handle backslash escaping of delimiter here. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1703 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
772ed5507e
commit
c786866812
21
ChangeLog
21
ChangeLog
@ -1,3 +1,20 @@
|
|||||||
|
Mon Aug 20 13:24:08 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
|
* range.c (range_step): 'iter' here should be an array.
|
||||||
|
|
||||||
|
Mon Aug 20 12:43:08 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
|
* marshal.c (w_object): should retrieve __member__ data from
|
||||||
|
non-singleton class.
|
||||||
|
|
||||||
|
Sat Aug 18 23:11:14 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
|
* variable.c (rb_cvar_get): class variable override check added.
|
||||||
|
|
||||||
|
* variable.c (rb_cvar_set): ditto
|
||||||
|
|
||||||
|
* variable.c (rb_cvar_declare): ditto.
|
||||||
|
|
||||||
Fri Aug 17 12:13:48 2001 Minero Aoki <aamine@loveruby.net>
|
Fri Aug 17 12:13:48 2001 Minero Aoki <aamine@loveruby.net>
|
||||||
|
|
||||||
* lib/net/protocol.rb: Protocol.new requires at least one arg.
|
* lib/net/protocol.rb: Protocol.new requires at least one arg.
|
||||||
@ -8,6 +25,10 @@ Fri Aug 17 12:13:48 2001 Minero Aoki <aamine@loveruby.net>
|
|||||||
|
|
||||||
* lib/net/http.rb: ditto.
|
* lib/net/http.rb: ditto.
|
||||||
|
|
||||||
|
Fri Aug 17 00:49:51 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
|
* parse.y (parse_regx): handle backslash escaping of delimiter here.
|
||||||
|
|
||||||
Thu Aug 16 13:54:04 2001 Usaku Nakamura <usa@ruby-lang.org>
|
Thu Aug 16 13:54:04 2001 Usaku Nakamura <usa@ruby-lang.org>
|
||||||
|
|
||||||
* ext/socket/socket.c (s_recvfrom): fix typo.
|
* ext/socket/socket.c (s_recvfrom): fix typo.
|
||||||
|
1
ToDo
1
ToDo
@ -27,6 +27,7 @@ Language Spec.
|
|||||||
* raise exception by `` error
|
* raise exception by `` error
|
||||||
* jar like combined library package.
|
* jar like combined library package.
|
||||||
* resumable Exception via Exception#resume.
|
* resumable Exception via Exception#resume.
|
||||||
|
* method combination, e.g. before, after, around, etc.
|
||||||
|
|
||||||
Hacking Interpreter
|
Hacking Interpreter
|
||||||
|
|
||||||
|
2
array.c
2
array.c
@ -732,7 +732,7 @@ rb_ary_dup(ary)
|
|||||||
{
|
{
|
||||||
VALUE dup = rb_ary_new2(RARRAY(ary)->len);
|
VALUE dup = rb_ary_new2(RARRAY(ary)->len);
|
||||||
|
|
||||||
OBJSETUP(dup, rb_obj_type(ary), T_ARRAY);
|
OBJSETUP(dup, rb_obj_class(ary), T_ARRAY);
|
||||||
MEMCPY(RARRAY(dup)->ptr, RARRAY(ary)->ptr, VALUE, RARRAY(ary)->len);
|
MEMCPY(RARRAY(dup)->ptr, RARRAY(ary)->ptr, VALUE, RARRAY(ary)->len);
|
||||||
RARRAY(dup)->len = RARRAY(ary)->len;
|
RARRAY(dup)->len = RARRAY(ary)->len;
|
||||||
OBJ_INFECT(dup, ary);
|
OBJ_INFECT(dup, ary);
|
||||||
|
2
intern.h
2
intern.h
@ -244,7 +244,7 @@ VALUE rb_obj_tainted _((VALUE));
|
|||||||
VALUE rb_obj_untaint _((VALUE));
|
VALUE rb_obj_untaint _((VALUE));
|
||||||
VALUE rb_obj_freeze _((VALUE));
|
VALUE rb_obj_freeze _((VALUE));
|
||||||
VALUE rb_obj_id _((VALUE));
|
VALUE rb_obj_id _((VALUE));
|
||||||
VALUE rb_obj_type _((VALUE));
|
VALUE rb_obj_class _((VALUE));
|
||||||
VALUE rb_class_real _((VALUE));
|
VALUE rb_class_real _((VALUE));
|
||||||
VALUE rb_convert_type _((VALUE,int,const char*,const char*));
|
VALUE rb_convert_type _((VALUE,int,const char*,const char*));
|
||||||
VALUE rb_to_int _((VALUE));
|
VALUE rb_to_int _((VALUE));
|
||||||
|
4
keywords
4
keywords
@ -7,7 +7,7 @@ END, klEND, klEND, EXPR_END
|
|||||||
alias, kALIAS, kALIAS, EXPR_FNAME
|
alias, kALIAS, kALIAS, EXPR_FNAME
|
||||||
and, kAND, kAND, EXPR_BEG
|
and, kAND, kAND, EXPR_BEG
|
||||||
begin, kBEGIN, kBEGIN, EXPR_BEG
|
begin, kBEGIN, kBEGIN, EXPR_BEG
|
||||||
break, kBREAK, kBREAK, EXPR_END
|
break, kBREAK, kBREAK, EXPR_MID
|
||||||
case, kCASE, kCASE, EXPR_BEG
|
case, kCASE, kCASE, EXPR_BEG
|
||||||
class, kCLASS, kCLASS, EXPR_CLASS
|
class, kCLASS, kCLASS, EXPR_CLASS
|
||||||
def, kDEF, kDEF, EXPR_FNAME
|
def, kDEF, kDEF, EXPR_FNAME
|
||||||
@ -22,7 +22,7 @@ for, kFOR, kFOR, EXPR_BEG
|
|||||||
if, kIF, kIF_MOD, EXPR_BEG
|
if, kIF, kIF_MOD, EXPR_BEG
|
||||||
in, kIN, kIN, EXPR_BEG
|
in, kIN, kIN, EXPR_BEG
|
||||||
module, kMODULE, kMODULE, EXPR_BEG
|
module, kMODULE, kMODULE, EXPR_BEG
|
||||||
next, kNEXT, kNEXT, EXPR_END
|
next, kNEXT, kNEXT, EXPR_MID
|
||||||
nil, kNIL, kNIL, EXPR_END
|
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
|
||||||
|
4
lex.c
4
lex.c
@ -97,14 +97,14 @@ rb_reserved_word (str, len)
|
|||||||
{"defined?", kDEFINED, kDEFINED, EXPR_ARG},
|
{"defined?", kDEFINED, kDEFINED, EXPR_ARG},
|
||||||
{"super", kSUPER, kSUPER, EXPR_ARG},
|
{"super", kSUPER, kSUPER, EXPR_ARG},
|
||||||
{"undef", kUNDEF, kUNDEF, EXPR_FNAME},
|
{"undef", kUNDEF, kUNDEF, EXPR_FNAME},
|
||||||
{"break", kBREAK, kBREAK, EXPR_END},
|
{"break", kBREAK, kBREAK, EXPR_MID},
|
||||||
{"in", kIN, kIN, EXPR_BEG},
|
{"in", kIN, kIN, EXPR_BEG},
|
||||||
{"do", kDO, kDO, EXPR_BEG},
|
{"do", kDO, kDO, EXPR_BEG},
|
||||||
{"nil", kNIL, kNIL, EXPR_END},
|
{"nil", kNIL, kNIL, EXPR_END},
|
||||||
{"until", kUNTIL, kUNTIL_MOD, EXPR_BEG},
|
{"until", kUNTIL, kUNTIL_MOD, EXPR_BEG},
|
||||||
{"unless", kUNLESS, kUNLESS_MOD, EXPR_BEG},
|
{"unless", kUNLESS, kUNLESS_MOD, EXPR_BEG},
|
||||||
{"or", kOR, kOR, EXPR_BEG},
|
{"or", kOR, kOR, EXPR_BEG},
|
||||||
{"next", kNEXT, kNEXT, EXPR_END},
|
{"next", kNEXT, kNEXT, EXPR_MID},
|
||||||
{"when", kWHEN, kWHEN, EXPR_BEG},
|
{"when", kWHEN, kWHEN, EXPR_BEG},
|
||||||
{"redo", kREDO, kREDO, EXPR_END},
|
{"redo", kREDO, kREDO, EXPR_END},
|
||||||
{"and", kAND, kAND, EXPR_BEG},
|
{"and", kAND, kAND, EXPR_BEG},
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
#
|
#
|
||||||
#=end
|
#=end
|
||||||
|
|
||||||
class TimeoutError<StandardError
|
class TimeoutError<Interrupt
|
||||||
end
|
end
|
||||||
|
|
||||||
def timeout(sec)
|
def timeout(sec)
|
||||||
@ -37,14 +37,20 @@ def timeout(sec)
|
|||||||
x.raise TimeoutError, "execution expired" if x.alive?
|
x.raise TimeoutError, "execution expired" if x.alive?
|
||||||
}
|
}
|
||||||
yield sec
|
yield sec
|
||||||
return true
|
# return true
|
||||||
ensure
|
ensure
|
||||||
Thread.kill y if y and y.alive?
|
y.kill if y and y.alive?
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if __FILE__ == $0
|
if __FILE__ == $0
|
||||||
timeout(5) {
|
p timeout(5) {
|
||||||
p 10
|
45
|
||||||
|
}
|
||||||
|
p timeout(5) {
|
||||||
|
loop {
|
||||||
|
p 10
|
||||||
|
sleep 1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
@ -293,7 +293,7 @@ w_object(obj, arg, limit)
|
|||||||
w_byte(TYPE_FIXNUM, arg);
|
w_byte(TYPE_FIXNUM, arg);
|
||||||
w_long(FIX2INT(obj), arg);
|
w_long(FIX2INT(obj), arg);
|
||||||
#else
|
#else
|
||||||
if (RSHIFT((long)obj, 32) == 0 || RSHIFT((long)obj, 32) == -1) {
|
if (RSHIFT((long)obj, 30) == 0 || RSHIFT((long)obj, 30) == -1) {
|
||||||
w_byte(TYPE_FIXNUM, arg);
|
w_byte(TYPE_FIXNUM, arg);
|
||||||
w_long(FIX2LONG(obj), arg);
|
w_long(FIX2LONG(obj), arg);
|
||||||
}
|
}
|
||||||
@ -447,13 +447,12 @@ w_object(obj, arg, limit)
|
|||||||
w_byte(TYPE_STRUCT, arg);
|
w_byte(TYPE_STRUCT, arg);
|
||||||
{
|
{
|
||||||
long len = RSTRUCT(obj)->len;
|
long len = RSTRUCT(obj)->len;
|
||||||
char *path = rb_class2name(CLASS_OF(obj));
|
|
||||||
VALUE mem;
|
VALUE mem;
|
||||||
long i;
|
long i;
|
||||||
|
|
||||||
w_unique(path, arg);
|
w_unique(rb_class2name(CLASS_OF(obj)), arg);
|
||||||
w_long(len, arg);
|
w_long(len, arg);
|
||||||
mem = rb_ivar_get(CLASS_OF(obj), rb_intern("__member__"));
|
mem = rb_ivar_get(rb_obj_class(obj), rb_intern("__member__"));
|
||||||
if (mem == Qnil) {
|
if (mem == Qnil) {
|
||||||
rb_raise(rb_eTypeError, "uninitialized struct");
|
rb_raise(rb_eTypeError, "uninitialized struct");
|
||||||
}
|
}
|
||||||
|
10
object.c
10
object.c
@ -81,7 +81,7 @@ rb_class_real(cl)
|
|||||||
}
|
}
|
||||||
|
|
||||||
VALUE
|
VALUE
|
||||||
rb_obj_type(obj)
|
rb_obj_class(obj)
|
||||||
VALUE obj;
|
VALUE obj;
|
||||||
{
|
{
|
||||||
return rb_class_real(CLASS_OF(obj));
|
return rb_class_real(CLASS_OF(obj));
|
||||||
@ -116,7 +116,7 @@ rb_obj_dup(obj)
|
|||||||
rb_raise(rb_eTypeError, "dupulicated object must be same type");
|
rb_raise(rb_eTypeError, "dupulicated object must be same type");
|
||||||
}
|
}
|
||||||
if (!SPECIAL_CONST_P(dup)) {
|
if (!SPECIAL_CONST_P(dup)) {
|
||||||
OBJSETUP(dup, rb_obj_type(obj), BUILTIN_TYPE(obj));
|
OBJSETUP(dup, rb_obj_class(obj), BUILTIN_TYPE(obj));
|
||||||
OBJ_INFECT(dup, obj);
|
OBJ_INFECT(dup, obj);
|
||||||
if (FL_TEST(obj, FL_EXIVAR)) {
|
if (FL_TEST(obj, FL_EXIVAR)) {
|
||||||
FL_SET(dup, FL_EXIVAR);
|
FL_SET(dup, FL_EXIVAR);
|
||||||
@ -233,7 +233,7 @@ rb_obj_is_instance_of(obj, c)
|
|||||||
rb_raise(rb_eTypeError, "class or module required");
|
rb_raise(rb_eTypeError, "class or module required");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rb_obj_type(obj) == c) return Qtrue;
|
if (rb_obj_class(obj) == c) return Qtrue;
|
||||||
return Qfalse;
|
return Qfalse;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1155,8 +1155,8 @@ Init_Object()
|
|||||||
rb_define_method(rb_mKernel, "hash", rb_obj_id, 0);
|
rb_define_method(rb_mKernel, "hash", rb_obj_id, 0);
|
||||||
rb_define_method(rb_mKernel, "id", rb_obj_id, 0);
|
rb_define_method(rb_mKernel, "id", rb_obj_id, 0);
|
||||||
rb_define_method(rb_mKernel, "__id__", rb_obj_id, 0);
|
rb_define_method(rb_mKernel, "__id__", rb_obj_id, 0);
|
||||||
rb_define_method(rb_mKernel, "type", rb_obj_type, 0);
|
rb_define_method(rb_mKernel, "type", rb_obj_class, 0);
|
||||||
rb_define_method(rb_mKernel, "class", rb_obj_type, 0);
|
rb_define_method(rb_mKernel, "class", rb_obj_class, 0);
|
||||||
|
|
||||||
rb_define_method(rb_mKernel, "clone", rb_obj_clone, 0);
|
rb_define_method(rb_mKernel, "clone", rb_obj_clone, 0);
|
||||||
rb_define_method(rb_mKernel, "dup", rb_obj_dup, 0);
|
rb_define_method(rb_mKernel, "dup", rb_obj_dup, 0);
|
||||||
|
10
parse.y
10
parse.y
@ -2327,7 +2327,8 @@ read_escape()
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
tokadd_escape()
|
tokadd_escape(term)
|
||||||
|
int term;
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
@ -2388,7 +2389,7 @@ tokadd_escape()
|
|||||||
tokadd('\\'); tokadd('c');
|
tokadd('\\'); tokadd('c');
|
||||||
escaped:
|
escaped:
|
||||||
if ((c = nextc()) == '\\') {
|
if ((c = nextc()) == '\\') {
|
||||||
return tokadd_escape();
|
return tokadd_escape(term);
|
||||||
}
|
}
|
||||||
else if (c == -1) goto eof;
|
else if (c == -1) goto eof;
|
||||||
tokadd(c);
|
tokadd(c);
|
||||||
@ -2400,7 +2401,8 @@ tokadd_escape()
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
tokadd('\\');
|
if (c == '/' && c != term)
|
||||||
|
tokadd('\\');
|
||||||
tokadd(c);
|
tokadd(c);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -2431,7 +2433,7 @@ parse_regx(term, paren)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
case '\\':
|
case '\\':
|
||||||
if (tokadd_escape() < 0)
|
if (tokadd_escape(term) < 0)
|
||||||
return 0;
|
return 0;
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
2
range.c
2
range.c
@ -286,7 +286,7 @@ range_step(argc, argv, range)
|
|||||||
}
|
}
|
||||||
else if (TYPE(b) == T_STRING) {
|
else if (TYPE(b) == T_STRING) {
|
||||||
VALUE args[5];
|
VALUE args[5];
|
||||||
long *iter;
|
long iter[2];
|
||||||
|
|
||||||
args[0] = b; args[1] = e; args[2] = range;
|
args[0] = b; args[1] = e; args[2] = range;
|
||||||
iter[0] = 1; iter[1] = NUM2LONG(step);
|
iter[0] = 1; iter[1] = NUM2LONG(step);
|
||||||
|
3
regex.c
3
regex.c
@ -2897,6 +2897,7 @@ re_compile_fastmap(bufp)
|
|||||||
|
|
||||||
case duplicate:
|
case duplicate:
|
||||||
bufp->can_be_null = 1;
|
bufp->can_be_null = 1;
|
||||||
|
if (*p >= bufp->re_nsub) break;
|
||||||
fastmap['\n'] = 1;
|
fastmap['\n'] = 1;
|
||||||
case anychar_repeat:
|
case anychar_repeat:
|
||||||
case anychar:
|
case anychar:
|
||||||
@ -3740,6 +3741,8 @@ re_match(bufp, string_arg, size, pos, regs)
|
|||||||
int regno = *p++; /* Get which register to match against */
|
int regno = *p++; /* Get which register to match against */
|
||||||
register unsigned char *d2, *dend2;
|
register unsigned char *d2, *dend2;
|
||||||
|
|
||||||
|
/* Check if there's corresponding group */
|
||||||
|
if (regno >= num_regs) goto fail;
|
||||||
/* Check if corresponding group is still open */
|
/* Check if corresponding group is still open */
|
||||||
if (IS_ACTIVE(reg_info[regno])) goto fail;
|
if (IS_ACTIVE(reg_info[regno])) goto fail;
|
||||||
|
|
||||||
|
4
string.c
4
string.c
@ -100,7 +100,7 @@ rb_str_new4(orig)
|
|||||||
{
|
{
|
||||||
VALUE klass;
|
VALUE klass;
|
||||||
|
|
||||||
klass = rb_obj_type(orig);
|
klass = rb_obj_class(orig);
|
||||||
if (RSTRING(orig)->orig) {
|
if (RSTRING(orig)->orig) {
|
||||||
VALUE str;
|
VALUE str;
|
||||||
|
|
||||||
@ -257,7 +257,7 @@ rb_str_dup(str)
|
|||||||
VALUE klass;
|
VALUE klass;
|
||||||
|
|
||||||
StringValue(str);
|
StringValue(str);
|
||||||
klass = rb_obj_type(str);
|
klass = rb_obj_class(str);
|
||||||
|
|
||||||
if (OBJ_FROZEN(str)) str2 = rb_str_new3(str);
|
if (OBJ_FROZEN(str)) str2 = rb_str_new3(str);
|
||||||
else if (FL_TEST(str, STR_NO_ORIG)) {
|
else if (FL_TEST(str, STR_NO_ORIG)) {
|
||||||
|
32
struct.c
32
struct.c
@ -16,16 +16,6 @@ VALUE rb_cStruct;
|
|||||||
|
|
||||||
static VALUE struct_alloc _((int, VALUE*, VALUE));
|
static VALUE struct_alloc _((int, VALUE*, VALUE));
|
||||||
|
|
||||||
static VALUE
|
|
||||||
class_of(obj)
|
|
||||||
VALUE obj;
|
|
||||||
{
|
|
||||||
obj = CLASS_OF(obj);
|
|
||||||
if (FL_TEST(obj, FL_SINGLETON))
|
|
||||||
return RCLASS(obj)->super;
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
iv_get(obj, name)
|
iv_get(obj, name)
|
||||||
VALUE obj;
|
VALUE obj;
|
||||||
@ -68,7 +58,7 @@ static VALUE
|
|||||||
rb_struct_members(obj)
|
rb_struct_members(obj)
|
||||||
VALUE obj;
|
VALUE obj;
|
||||||
{
|
{
|
||||||
return rb_struct_s_members(class_of(obj));
|
return rb_struct_s_members(rb_obj_class(obj));
|
||||||
}
|
}
|
||||||
|
|
||||||
VALUE
|
VALUE
|
||||||
@ -79,7 +69,7 @@ rb_struct_getmember(obj, id)
|
|||||||
VALUE member, slot;
|
VALUE member, slot;
|
||||||
long i;
|
long i;
|
||||||
|
|
||||||
member = iv_get(class_of(obj), "__member__");
|
member = iv_get(rb_obj_class(obj), "__member__");
|
||||||
if (NIL_P(member)) {
|
if (NIL_P(member)) {
|
||||||
rb_bug("uninitialized struct");
|
rb_bug("uninitialized struct");
|
||||||
}
|
}
|
||||||
@ -140,7 +130,7 @@ rb_struct_set(obj, val)
|
|||||||
VALUE member, slot;
|
VALUE member, slot;
|
||||||
long i;
|
long i;
|
||||||
|
|
||||||
member = iv_get(class_of(obj), "__member__");
|
member = iv_get(rb_obj_class(obj), "__member__");
|
||||||
if (NIL_P(member)) {
|
if (NIL_P(member)) {
|
||||||
rb_bug("non-initialized struct");
|
rb_bug("non-initialized struct");
|
||||||
}
|
}
|
||||||
@ -260,7 +250,7 @@ static VALUE
|
|||||||
rb_struct_initialize(self, values)
|
rb_struct_initialize(self, values)
|
||||||
VALUE self, values;
|
VALUE self, values;
|
||||||
{
|
{
|
||||||
VALUE klass = CLASS_OF(self);
|
VALUE klass = rb_obj_class(self);
|
||||||
VALUE size;
|
VALUE size;
|
||||||
long n;
|
long n;
|
||||||
|
|
||||||
@ -349,7 +339,7 @@ static VALUE
|
|||||||
rb_struct_to_s(s)
|
rb_struct_to_s(s)
|
||||||
VALUE s;
|
VALUE s;
|
||||||
{
|
{
|
||||||
char *cname = rb_class2name(CLASS_OF(s));
|
char *cname = rb_class2name(rb_obj_class(s));
|
||||||
VALUE str = rb_str_new(0, strlen(cname) + 4);
|
VALUE str = rb_str_new(0, strlen(cname) + 4);
|
||||||
|
|
||||||
sprintf(RSTRING(str)->ptr, "#<%s>", cname);
|
sprintf(RSTRING(str)->ptr, "#<%s>", cname);
|
||||||
@ -361,11 +351,11 @@ static VALUE
|
|||||||
inspect_struct(s)
|
inspect_struct(s)
|
||||||
VALUE s;
|
VALUE s;
|
||||||
{
|
{
|
||||||
char *cname = rb_class2name(CLASS_OF(s));
|
char *cname = rb_class2name(rb_obj_class(s));
|
||||||
VALUE str, member;
|
VALUE str, member;
|
||||||
long i;
|
long i;
|
||||||
|
|
||||||
member = iv_get(CLASS_OF(s), "__member__");
|
member = iv_get(rb_obj_class(s), "__member__");
|
||||||
if (NIL_P(member)) {
|
if (NIL_P(member)) {
|
||||||
rb_bug("non-initialized struct");
|
rb_bug("non-initialized struct");
|
||||||
}
|
}
|
||||||
@ -398,7 +388,7 @@ rb_struct_inspect(s)
|
|||||||
VALUE s;
|
VALUE s;
|
||||||
{
|
{
|
||||||
if (rb_inspecting_p(s)) {
|
if (rb_inspecting_p(s)) {
|
||||||
char *cname = rb_class2name(CLASS_OF(s));
|
char *cname = rb_class2name(rb_obj_class(s));
|
||||||
VALUE str = rb_str_new(0, strlen(cname) + 8);
|
VALUE str = rb_str_new(0, strlen(cname) + 8);
|
||||||
|
|
||||||
sprintf(RSTRING(str)->ptr, "#<%s:...>", cname);
|
sprintf(RSTRING(str)->ptr, "#<%s:...>", cname);
|
||||||
@ -436,7 +426,7 @@ rb_struct_aref_id(s, id)
|
|||||||
VALUE member;
|
VALUE member;
|
||||||
long i, len;
|
long i, len;
|
||||||
|
|
||||||
member = iv_get(CLASS_OF(s), "__member__");
|
member = iv_get(rb_obj_class(s), "__member__");
|
||||||
if (NIL_P(member)) {
|
if (NIL_P(member)) {
|
||||||
rb_bug("non-initialized struct");
|
rb_bug("non-initialized struct");
|
||||||
}
|
}
|
||||||
@ -480,7 +470,7 @@ rb_struct_aset_id(s, id, val)
|
|||||||
VALUE member;
|
VALUE member;
|
||||||
long i, len;
|
long i, len;
|
||||||
|
|
||||||
member = iv_get(CLASS_OF(s), "__member__");
|
member = iv_get(rb_obj_class(s), "__member__");
|
||||||
if (NIL_P(member)) {
|
if (NIL_P(member)) {
|
||||||
rb_bug("non-initialized struct");
|
rb_bug("non-initialized struct");
|
||||||
}
|
}
|
||||||
@ -527,7 +517,7 @@ rb_struct_equal(s, s2)
|
|||||||
long i;
|
long i;
|
||||||
|
|
||||||
if (TYPE(s2) != T_STRUCT) return Qfalse;
|
if (TYPE(s2) != T_STRUCT) return Qfalse;
|
||||||
if (CLASS_OF(s) != CLASS_OF(s2)) return Qfalse;
|
if (rb_obj_class(s) != rb_obj_class(s2)) return Qfalse;
|
||||||
if (RSTRUCT(s)->len != RSTRUCT(s2)->len) {
|
if (RSTRUCT(s)->len != RSTRUCT(s2)->len) {
|
||||||
rb_bug("inconsistent struct"); /* should never happen */
|
rb_bug("inconsistent struct"); /* should never happen */
|
||||||
}
|
}
|
||||||
|
31
variable.c
31
variable.c
@ -1376,6 +1376,22 @@ rb_cvar_singleton(obj)
|
|||||||
return CLASS_OF(obj);
|
return CLASS_OF(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
cvar_override_check(id, a, b)
|
||||||
|
VALUE a, b;
|
||||||
|
{
|
||||||
|
a = RCLASS(a)->super;
|
||||||
|
while (a) {
|
||||||
|
if (!RCLASS(a)->iv_tbl) continue;
|
||||||
|
if (st_lookup(RCLASS(a)->iv_tbl,id,0)) {
|
||||||
|
rb_warning("class variable %s of %s is overridden by %s",
|
||||||
|
rb_id2name(id), rb_class2name(a),
|
||||||
|
rb_class2name(b));
|
||||||
|
}
|
||||||
|
a = RCLASS(a)->super;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_cvar_set(klass, id, val)
|
rb_cvar_set(klass, id, val)
|
||||||
VALUE klass;
|
VALUE klass;
|
||||||
@ -1386,10 +1402,14 @@ rb_cvar_set(klass, id, val)
|
|||||||
|
|
||||||
tmp = klass;
|
tmp = klass;
|
||||||
while (tmp) {
|
while (tmp) {
|
||||||
if (RCLASS(tmp)->iv_tbl && st_lookup(RCLASS(tmp)->iv_tbl,id,0)) {
|
if (!RCLASS(tmp)->iv_tbl) continue;
|
||||||
|
if (st_lookup(RCLASS(tmp)->iv_tbl,id,0)) {
|
||||||
if (!OBJ_TAINTED(tmp) && rb_safe_level() >= 4)
|
if (!OBJ_TAINTED(tmp) && rb_safe_level() >= 4)
|
||||||
rb_raise(rb_eSecurityError, "Insecure: can't modify class variable");
|
rb_raise(rb_eSecurityError, "Insecure: can't modify class variable");
|
||||||
st_insert(RCLASS(tmp)->iv_tbl,id,val);
|
st_insert(RCLASS(tmp)->iv_tbl,id,val);
|
||||||
|
if (ruby_verbose) {
|
||||||
|
cvar_override_check(id, tmp, klass);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
tmp = RCLASS(tmp)->super;
|
tmp = RCLASS(tmp)->super;
|
||||||
@ -1416,6 +1436,9 @@ rb_cvar_declare(klass, id, val)
|
|||||||
rb_warning("already initialized class variable %s", rb_id2name(id));
|
rb_warning("already initialized class variable %s", rb_id2name(id));
|
||||||
}
|
}
|
||||||
st_insert(RCLASS(tmp)->iv_tbl,id,val);
|
st_insert(RCLASS(tmp)->iv_tbl,id,val);
|
||||||
|
if (ruby_verbose) {
|
||||||
|
cvar_override_check(id, tmp, klass);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
tmp = RCLASS(tmp)->super;
|
tmp = RCLASS(tmp)->super;
|
||||||
@ -1434,7 +1457,11 @@ rb_cvar_get(klass, id)
|
|||||||
|
|
||||||
tmp = klass;
|
tmp = klass;
|
||||||
while (tmp) {
|
while (tmp) {
|
||||||
if (RCLASS(tmp)->iv_tbl && st_lookup(RCLASS(tmp)->iv_tbl,id,&value)) {
|
if (!RCLASS(tmp)->iv_tbl) continue;
|
||||||
|
if (st_lookup(RCLASS(tmp)->iv_tbl,id,&value)) {
|
||||||
|
if (ruby_verbose) {
|
||||||
|
cvar_override_check(id, tmp, klass);
|
||||||
|
}
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
tmp = RCLASS(tmp)->super;
|
tmp = RCLASS(tmp)->super;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#define RUBY_VERSION "1.7.1"
|
#define RUBY_VERSION "1.7.1"
|
||||||
#define RUBY_RELEASE_DATE "2001-08-16"
|
#define RUBY_RELEASE_DATE "2001-08-20"
|
||||||
#define RUBY_VERSION_CODE 171
|
#define RUBY_VERSION_CODE 171
|
||||||
#define RUBY_RELEASE_CODE 20010816
|
#define RUBY_RELEASE_CODE 20010820
|
||||||
|
Loading…
x
Reference in New Issue
Block a user