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

* variable.c (rb_const_get): no recursion to show full class path

for modules.

* eval.c (rb_set_safe_level): should set safe level in curr_thread
  as well.

* eval.c (safe_setter): ditto.

* object.c (rb_obj_is_instance_of): nil belongs to false, not true.

* time.c (make_time_t): proper (I hope) daylight saving time
  handling for both US and Europe.  I HATE SUMMER TIME!

* eval.c (rb_thread_wait_for): non blocked signal interrupt should
  stop the interval.

* class.c (rb_mod_clone): should copy method bodies too.

* bignum.c (bigdivrem): should trim trailing zero bdigits of
  remainder, even if dd == 0.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_6@1307 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2001-04-06 05:42:43 +00:00
parent 2c29a1c0e9
commit 0c176f00c1
14 changed files with 264 additions and 152 deletions

View file

@ -1,3 +1,32 @@
Thu Apr 5 22:40:12 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
* variable.c (rb_const_get): no recursion to show full class path
for modules.
* eval.c (rb_set_safe_level): should set safe level in curr_thread
as well.
* eval.c (safe_setter): ditto.
Thu Apr 5 13:46:06 2001 K.Kosako <kosako@sofnec.co.jp>
* object.c (rb_obj_is_instance_of): nil belongs to false, not true.
Thu Apr 5 02:19:03 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
* time.c (make_time_t): proper (I hope) daylight saving time
handling for both US and Europe. I HATE SUMMER TIME!
* eval.c (rb_thread_wait_for): non blocked signal interrupt should
stop the interval.
Wed Apr 4 03:47:03 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
* class.c (rb_mod_clone): should copy method bodies too.
* bignum.c (bigdivrem): should trim trailing zero bdigits of
remainder, even if dd == 0.
Tue Apr 3 15:29:10 2001 Akinori MUSHA <knu@iDaemons.org>
* Makefile.in: Introduce MAINLIBS.

View file

@ -917,10 +917,10 @@ bigdivrem(x, y, divp, modp)
}
if (modp) { /* just normalize remainder */
*modp = rb_big_clone(z);
zds = BDIGITS(*modp);
while (!zds[ny-1]) ny--;
if (dd) {
zds = BDIGITS(*modp);
while (ny-- && !zds[ny]) ;
t2 = 0; i = ++ny;
t2 = 0; i = ny;
while(i--) {
t2 = (t2 | zds[i]) >> dd;
q = zds[i];

56
class.c
View file

@ -33,16 +33,6 @@ rb_class_new(super)
return (VALUE)klass;
}
VALUE
rb_singleton_class_new(super)
VALUE super;
{
VALUE klass = rb_class_new(super);
FL_SET(klass, FL_SINGLETON);
return klass;
}
static int
clone_method(mid, body, tbl)
ID mid;
@ -53,6 +43,47 @@ clone_method(mid, body, tbl)
return ST_CONTINUE;
}
VALUE
rb_mod_clone(module)
VALUE module;
{
NEWOBJ(clone, struct RClass);
CLONESETUP(clone, module);
clone->super = RCLASS(module)->super;
if (RCLASS(module)->iv_tbl) {
clone->iv_tbl = st_copy(RCLASS(module)->iv_tbl);
}
if (RCLASS(module)->m_tbl) {
clone->m_tbl = st_init_numtable();
st_foreach(RCLASS(module)->m_tbl, clone_method, clone->m_tbl);
}
return (VALUE)clone;
}
VALUE
rb_mod_dup(mod)
VALUE mod;
{
VALUE dup = rb_mod_clone(mod);
OBJSETUP(dup, RBASIC(mod)->klass, BUILTIN_TYPE(mod));
if (FL_TEST(mod, FL_SINGLETON)) {
FL_SET(dup, FL_SINGLETON);
}
return dup;
}
VALUE
rb_singleton_class_new(super)
VALUE super;
{
VALUE klass = rb_class_new(super);
FL_SET(klass, FL_SINGLETON);
return klass;
}
VALUE
rb_singleton_class_clone(klass)
VALUE klass;
@ -222,6 +253,11 @@ rb_include_module(klass, module)
VALUE p;
int changed = 0;
rb_frozen_class_p(klass);
if (!OBJ_TAINTED(klass)) {
rb_secure(4);
}
rb_frozen_class_p(klass);
if (!OBJ_TAINTED(klass)) {
rb_secure(4);

157
eval.c
View file

@ -128,33 +128,8 @@ int ruby_safe_level = 0;
4 - no global (non-tainted) variable modification/no direct output
*/
void
rb_set_safe_level(level)
int level;
{
if (level > ruby_safe_level) {
ruby_safe_level = level;
}
}
static VALUE
safe_getter()
{
return INT2FIX(ruby_safe_level);
}
static void
safe_setter(val)
VALUE val;
{
int level = NUM2INT(val);
if (level < ruby_safe_level) {
rb_raise(rb_eSecurityError, "tried to downgrade safe level from %d to %d",
ruby_safe_level, level);
}
ruby_safe_level = level;
}
static VALUE safe_getter _((void));
static void safe_setter _((VALUE val));
void
rb_secure(level)
@ -821,6 +796,11 @@ static VALUE ruby_wrapper; /* security wrapper */
#define POP_CLASS() ruby_class = _class; }
static NODE *ruby_cref = 0;
static NODE *top_cref;
#define PUSH_CREF(c) ruby_cref = rb_node_newnode(NODE_CREF,(c),0,ruby_cref)
#define POP_CREF() ruby_cref = ruby_cref->nd_next
#define PUSH_SCOPE() { \
volatile int _vmode = scope_vmode; \
struct SCOPE * volatile _old; \
@ -1047,7 +1027,9 @@ ruby_init()
rb_call_inits();
ruby_class = rb_cObject;
ruby_frame->self = ruby_top_self;
ruby_frame->cbase = (VALUE)rb_node_newnode(NODE_CREF,rb_cObject,0,0);
top_cref = rb_node_newnode(NODE_CREF,rb_cObject,0,0);
ruby_cref = top_cref;
ruby_frame->cbase = (VALUE)ruby_cref;
rb_define_global_const("TOPLEVEL_BINDING", rb_f_binding(ruby_top_self));
#ifdef __MACOS__
_macruby_init();
@ -1605,6 +1587,23 @@ rb_mod_alias_method(mod, newname, oldname)
return mod;
}
static NODE*
copy_node_scope(node, rval)
NODE *node;
VALUE rval;
{
NODE *copy = rb_node_newnode(NODE_SCOPE,0,rval,node->nd_next);
if (node->nd_tbl) {
copy->nd_tbl = ALLOC_N(ID, node->nd_tbl[0]+1);
MEMCPY(copy->nd_tbl, node->nd_tbl, ID, node->nd_tbl[0]+1);
}
else {
copy->nd_tbl = 0;
}
return copy;
}
#ifdef C_ALLOCA
# define TMP_PROTECT NODE * volatile tmp__protect_tmp=0
# define TMP_ALLOC(n) \
@ -2533,6 +2532,7 @@ rb_eval(self, n)
case NODE_SCOPE:
{
struct FRAME frame;
NODE *saved_cref = 0;
frame = *ruby_frame;
frame.tmp = ruby_frame;
@ -2540,7 +2540,11 @@ rb_eval(self, n)
PUSH_SCOPE();
PUSH_TAG(PROT_NONE);
if (node->nd_rval) ruby_frame->cbase = node->nd_rval;
if (node->nd_rval) {
saved_cref = ruby_cref;
ruby_cref = (NODE*)node->nd_rval;
ruby_frame->cbase = node->nd_rval;
}
if (node->nd_tbl) {
VALUE *vars = ALLOCA_N(VALUE, node->nd_tbl[0]+1);
*vars++ = (VALUE)node;
@ -2558,6 +2562,8 @@ rb_eval(self, n)
POP_TAG();
POP_SCOPE();
ruby_frame = frame.tmp;
if (saved_cref)
ruby_cref = saved_cref;
if (state) JUMP_TAG(state);
}
break;
@ -2896,7 +2902,7 @@ rb_eval(self, n)
case NODE_DEFN:
if (node->nd_defn) {
NODE *body;
NODE *body, *defn;
VALUE origin;
int noex;
@ -2938,11 +2944,13 @@ rb_eval(self, n)
if (body && origin == ruby_class && body->nd_noex & NOEX_UNDEF) {
noex |= NOEX_UNDEF;
}
rb_add_method(ruby_class, node->nd_mid, node->nd_defn, noex);
defn = copy_node_scope(node->nd_defn, ruby_cref);
rb_add_method(ruby_class, node->nd_mid, defn, noex);
rb_clear_cache_by_id(node->nd_mid);
if (scope_vmode == SCOPE_MODFUNC) {
rb_add_method(rb_singleton_class(ruby_class),
node->nd_mid, node->nd_defn, NOEX_PUBLIC);
node->nd_mid, defn, NOEX_PUBLIC);
rb_funcall(ruby_class, singleton_added, 1, ID2SYM(node->nd_mid));
}
if (FL_TEST(ruby_class, FL_SINGLETON)) {
@ -2960,7 +2968,7 @@ rb_eval(self, n)
if (node->nd_defn) {
VALUE recv = rb_eval(self, node->nd_recv);
VALUE klass;
NODE *body = 0;
NODE *body = 0, *defn;
if (rb_safe_level() >= 4 && !OBJ_TAINTED(recv)) {
rb_raise(rb_eSecurityError, "Insecure; can't define singleton method");
@ -2982,7 +2990,9 @@ rb_eval(self, n)
rb_warning("redefine %s", rb_id2name(node->nd_mid));
}
}
rb_add_method(klass, node->nd_mid, node->nd_defn,
defn = copy_node_scope(node->nd_defn, ruby_cref);
defn->nd_rval = (VALUE)ruby_cref;
rb_add_method(klass, node->nd_mid, defn,
NOEX_PUBLIC|(body?body->nd_noex&NOEX_UNDEF:0));
rb_clear_cache_by_id(node->nd_mid);
rb_funcall(recv, singleton_added, 1, ID2SYM(node->nd_mid));
@ -3180,16 +3190,11 @@ module_setup(module, n)
frame.tmp = ruby_frame;
ruby_frame = &frame;
/* fill c-ref */
node->nd_clss = module;
node = node->nd_body;
PUSH_CLASS();
ruby_class = module;
PUSH_SCOPE();
PUSH_VARS();
if (node->nd_rval) ruby_frame->cbase = node->nd_rval;
if (node->nd_tbl) {
VALUE *vars = TMP_ALLOC(node->nd_tbl[0]+1);
*vars++ = (VALUE)node;
@ -3202,6 +3207,8 @@ module_setup(module, n)
ruby_scope->local_tbl = 0;
}
PUSH_CREF(module);
ruby_frame->cbase = (VALUE)ruby_cref;
PUSH_TAG(PROT_NONE);
if ((state = EXEC_TAG()) == 0) {
if (trace_func) {
@ -3212,6 +3219,7 @@ module_setup(module, n)
result = rb_eval(ruby_class, node->nd_next);
}
POP_TAG();
POP_CREF();
POP_VARS();
POP_SCOPE();
POP_CLASS();
@ -4313,14 +4321,19 @@ rb_call0(klass, recv, id, argc, argv, body, nosuper)
result = proc_call(body->nd_cval, rb_ary_new4(argc, argv));
break;
default:
case NODE_SCOPE:
{
int state;
VALUE *local_vars; /* OK */
NODE *saved_cref = 0;
PUSH_SCOPE();
if (body->nd_rval) ruby_frame->cbase = body->nd_rval;
if (body->nd_rval) {
saved_cref = ruby_cref;
ruby_cref = (NODE*)body->nd_rval;
ruby_frame->cbase = body->nd_rval;
}
if (body->nd_tbl) {
local_vars = TMP_ALLOC(body->nd_tbl[0]+1);
*local_vars++ = (VALUE)body;
@ -4413,6 +4426,7 @@ rb_call0(klass, recv, id, argc, argv, body, nosuper)
POP_TAG();
POP_VARS();
POP_SCOPE();
ruby_cref = saved_cref;
if (trace_func) {
char *file = ruby_frame->prev->file;
int line = ruby_frame->prev->line;
@ -4436,6 +4450,11 @@ rb_call0(klass, recv, id, argc, argv, body, nosuper)
break;
}
}
break;
default:
rb_bug("unknown node type %d", nd_type(body));
break;
}
POP_FRAME();
POP_ITER();
@ -5074,6 +5093,7 @@ rb_load(fname, wrap)
volatile ID last_func;
volatile VALUE wrapper = 0;
volatile VALUE self = ruby_top_self;
NODE *saved_cref = ruby_cref;
TMP_PROTECT;
if (wrap) {
@ -5091,6 +5111,7 @@ rb_load(fname, wrap)
PUSH_VARS();
PUSH_CLASS();
wrapper = ruby_wrapper;
ruby_cref = top_cref;
if (!wrap) {
rb_secure(4); /* should alter global state */
ruby_class = rb_cObject;
@ -5101,6 +5122,7 @@ rb_load(fname, wrap)
ruby_class = ruby_wrapper = rb_module_new();
self = rb_obj_clone(ruby_top_self);
rb_extend_object(self, ruby_class);
PUSH_CREF(ruby_wrapper);
}
PUSH_FRAME();
ruby_frame->last_func = 0;
@ -5143,6 +5165,7 @@ rb_load(fname, wrap)
free(ruby_scope->local_tbl);
}
POP_TAG();
ruby_cref = saved_cref;
POP_SCOPE();
POP_FRAME();
POP_CLASS();
@ -6321,8 +6344,10 @@ proc_eq(self, other)
{
struct BLOCK *data, *data2;
if (self == other) return Qtrue;
if (TYPE(other) != T_DATA) return Qfalse;
if (RDATA(other)->dmark != (RUBY_DATA_FUNC)blk_mark) Qfalse;
if (RDATA(other)->dmark != (RUBY_DATA_FUNC)blk_mark) return Qfalse;
if (CLASS_OF(self) != CLASS_OF(other)) return Qfalse;
Data_Get_Struct(self, struct BLOCK, data);
Data_Get_Struct(other, struct BLOCK, data2);
if (data->tag == data2->tag) return Qtrue;
@ -6556,8 +6581,8 @@ method_call(argc, argv, method)
Data_Get_Struct(method, struct METHOD, data);
PUSH_ITER(rb_block_given_p()?ITER_PRE:ITER_NOT);
PUSH_TAG(PROT_NONE);
if (OBJ_TAINTED(method)) {
if (ruby_safe_level < 4) ruby_safe_level = 4;
if (OBJ_TAINTED(method) && ruby_safe_level < 4) {
ruby_safe_level = 4;
}
if ((state = EXEC_TAG()) == 0) {
result = rb_call0(data->klass,data->recv,data->id,argc,argv,data->body,0);
@ -6841,6 +6866,7 @@ struct thread {
struct tag *tag;
VALUE klass;
VALUE wrapper;
NODE *cref;
int flags; /* misc. states (vmode/rb_trap_immediate/raised) */
@ -6884,6 +6910,37 @@ struct thread {
#define FOREACH_THREAD(x) FOREACH_THREAD_FROM(curr_thread,x)
#define END_FOREACH(x) END_FOREACH_FROM(curr_thread,x)
/* $SAFE accessor */
void
rb_set_safe_level(level)
int level;
{
if (level > ruby_safe_level) {
ruby_safe_level = level;
curr_thread->safe = level;
}
}
static VALUE
safe_getter()
{
return INT2FIX(ruby_safe_level);
}
static void
safe_setter(val)
VALUE val;
{
int level = NUM2INT(val);
if (level < ruby_safe_level) {
rb_raise(rb_eSecurityError, "tried to downgrade safe level from %d to %d",
ruby_safe_level, level);
}
ruby_safe_level = level;
curr_thread->safe = level;
}
/* Return the current time as a floating-point number */
static double
timeofday()
@ -7026,6 +7083,7 @@ rb_thread_save_context(th)
th->scope = ruby_scope;
th->klass = ruby_class;
th->wrapper = ruby_wrapper;
th->cref = ruby_cref;
th->dyna_vars = ruby_dyna_vars;
th->block = ruby_block;
th->flags &= THREAD_FLAGS_MASK;
@ -7116,6 +7174,7 @@ rb_thread_restore_context(th, exit)
ruby_scope = th->scope;
ruby_class = th->klass;
ruby_wrapper = th->wrapper;
ruby_cref = th->cref;
ruby_dyna_vars = th->dyna_vars;
ruby_block = th->block;
scope_vmode = th->flags&SCOPE_MASK;
@ -7516,7 +7575,14 @@ rb_thread_wait_for(time)
n = select(0, 0, 0, 0, &time);
TRAP_END;
if (n == 0) return;
if (n < 0) {
switch (errno) {
case EINTR:
return;
default:
rb_sys_fail("sleep");
}
}
#ifndef linux
d = limit - timeofday();
@ -7920,6 +7986,7 @@ rb_thread_abort_exc_set(thread, val)
th->scope = 0;\
th->klass = 0;\
th->wrapper = 0;\
th->cref = ruby_cref;\
th->dyna_vars = ruby_dyna_vars;\
th->block = 0;\
th->iter = 0;\

View file

@ -351,7 +351,7 @@ module TkComm
end
if context.kind_of? Array
context = context.collect{|ev|
if context.kind_of? TkVirtualEvent
if ev.kind_of? TkVirtualEvent
ev.path
else
ev
@ -397,8 +397,18 @@ module TkComm
end
}
else
tk_split_list(tk_call(*what)).collect{|seq|
seq[1..-2].gsub(/></,',')
tk_split_simplelist(tk_call(*what)).collect!{|seq|
l = seq.scan(/<*[^<>]+>*/).collect!{|subseq|
case (subseq)
when /^<<[^<>]+>>$/
TkVirtualEvent.getobj(subseq[1..-2])
when /^<[^<>]+>$/
subseq[1..-2]
else
subseq.split('')
end
}.flatten
(l.size == 1) ? l[0] : l
}
end
end
@ -1046,6 +1056,12 @@ class TkBindTag
BTagID_TBL[id]? BTagID_TBL[id]: id
end
ALL = self.new
ALL.instance_eval {
@id = 'all'
BTagID_TBL[@id] = self
}
def initialize(*args)
@id = Tk_BINDTAG_ID[0]
Tk_BINDTAG_ID[0] = Tk_BINDTAG_ID[0].succ
@ -1063,20 +1079,11 @@ class TkBindTag
end
class TkBindTagAll<TkBindTag
BindTagALL = []
def TkBindTagAll.new(*args)
if BindTagALL[0]
BindTagALL[0].bind(*args) if args != []
else
new = super()
BindTagALL[0] = new
end
BindTagALL[0]
end
$stderr.puts "Warning: TkBindTagALL is obsolete. Use TkBindTag::ALL\n"
def initialize(*args)
@id = 'all'
BindTagALL[0].bind(*args) if args != []
TkBindTag::ALL.bind(*args) if args != []
TkBindTag::ALL
end
end
@ -2575,7 +2582,7 @@ class TkWindow<TkObject
def bindtags(taglist=nil)
if taglist
fail unless taglist.kind_of? Array
fail ArgumentError unless taglist.kind_of? Array
tk_call('bindtags', path, taglist)
else
list(tk_call('bindtags', path)).collect{|tag|

View file

@ -7,12 +7,27 @@ require 'tk'
class TkVirtualEvent<TkObject
extend Tk
TkVirturlEventID = [0]
TkVirturlEventTBL = {}
TkVirtualEventID = [0]
TkVirtualEventTBL = {}
class PreDefVirtEvent<self
def initialize(event)
@path = @id = event
TkVirtualEvent::TkVirtualEventTBL[@id] = self
end
end
def TkVirtualEvent.getobj(event)
obj = TkVirturlEventTBL[event]
obj ? obj : event
obj = TkVirtualEventTBL[event]
if obj
obj
else
if tk_call('event', 'info').index("<#{event}>")
PreDefVirtEvent.new(event)
else
fail ArgumentError, "undefined virtual event '<#{event}>'"
end
end
end
def TkVirtualEvent.info
@ -22,8 +37,8 @@ class TkVirtualEvent<TkObject
end
def initialize(*sequences)
@path = @id = format("<VirtEvent%.4d>", TkVirturlEventID[0])
TkVirturlEventID[0] += 1
@path = @id = format("<VirtEvent%.4d>", TkVirtualEventID[0])
TkVirtualEventID[0] += 1
add(*sequences)
end
@ -31,7 +46,7 @@ class TkVirtualEvent<TkObject
if sequences != []
tk_call('event', 'add', "<#{@id}>",
*(sequences.collect{|seq| "<#{tk_event_sequence(seq)}>"}) )
TkVirturlEventTBL[@id] = self
TkVirtualEventTBL[@id] = self
end
self
end
@ -39,11 +54,11 @@ class TkVirtualEvent<TkObject
def delete(*sequences)
if sequences == []
tk_call('event', 'delete', "<#{@id}>")
TkVirturlEventTBL[@id] = nil
TkVirtualEventTBL[@id] = nil
else
tk_call('event', 'delete', "<#{@id}>",
*(sequences.collect{|seq| "<#{tk_event_sequence(seq)}>"}) )
TkVirturlEventTBL[@id] = nil if info == []
TkVirtualEventTBL[@id] = nil if info == []
end
self
end

3
file.c
View file

@ -757,7 +757,8 @@ test_sticky(obj, fname)
VALUE obj, fname;
{
#ifdef S_ISVTX
return check3rdbyte(STR2CSTR(fname), S_ISVTX);
Check_SafeStr(fname);
return check3rdbyte(RSTRING(fname)->ptr, S_ISVTX);
#else
return Qnil;
#endif

View file

@ -78,6 +78,8 @@ VALUE rb_big_lshift _((VALUE, VALUE));
VALUE rb_big_rand _((VALUE, double));
/* class.c */
VALUE rb_class_new _((VALUE));
VALUE rb_mod_clone _((VALUE));
VALUE rb_mod_dup _((VALUE));
VALUE rb_singleton_class_new _((VALUE));
VALUE rb_singleton_class_clone _((VALUE));
void rb_singleton_class_attached _((VALUE,VALUE));

12
node.h
View file

@ -237,7 +237,7 @@ typedef struct RNode {
#define NEW_CFUNC(f,c) rb_node_newnode(NODE_CFUNC,f,c,0)
#define NEW_IFUNC(f,c) rb_node_newnode(NODE_IFUNC,f,c,0)
#define NEW_RFUNC(b1,b2) NEW_SCOPE(block_append(b1,b2))
#define NEW_SCOPE(b) rb_node_newnode(NODE_SCOPE,local_tbl(),cur_cref,(b))
#define NEW_SCOPE(b) rb_node_newnode(NODE_SCOPE,local_tbl(),0,(b))
#define NEW_BLOCK(a) rb_node_newnode(NODE_BLOCK,a,0,0)
#define NEW_IF(c,t,e) rb_node_newnode(NODE_IF,c,t,e)
#define NEW_UNLESS(c,t,e) NEW_IF(c,e,t)
@ -309,14 +309,12 @@ typedef struct RNode {
#define NEW_ALIAS(n,o) rb_node_newnode(NODE_ALIAS,o,n,0)
#define NEW_VALIAS(n,o) rb_node_newnode(NODE_VALIAS,o,n,0)
#define NEW_UNDEF(i) rb_node_newnode(NODE_UNDEF,0,i,0)
#define NEW_CLASS(n,b,s) rb_node_newnode(NODE_CLASS,n,NEW_CBODY(b),(s))
#define NEW_SCLASS(r,b) rb_node_newnode(NODE_SCLASS,r,NEW_CBODY(b),0)
#define NEW_MODULE(n,b) rb_node_newnode(NODE_MODULE,n,NEW_CBODY(b),0)
#define NEW_CLASS(n,b,s) rb_node_newnode(NODE_CLASS,n,NEW_SCOPE(b),(s))
#define NEW_SCLASS(r,b) rb_node_newnode(NODE_SCLASS,r,NEW_SCOPE(b),0)
#define NEW_MODULE(n,b) rb_node_newnode(NODE_MODULE,n,NEW_SCOPE(b),0)
#define NEW_COLON2(c,i) rb_node_newnode(NODE_COLON2,c,i,0)
#define NEW_COLON3(i) rb_node_newnode(NODE_COLON3,0,i,0)
#define NEW_CREF0() (cur_cref=RNODE(ruby_frame->cbase))
#define NEW_CREF() (cur_cref=rb_node_newnode(NODE_CREF,0,0,cur_cref))
#define NEW_CBODY(b) (cur_cref->nd_body=NEW_SCOPE(b),cur_cref)
#define NEW_CREF(c) (rb_node_newnode(NODE_CREF,0,0,c))
#define NEW_DOT2(b,e) rb_node_newnode(NODE_DOT2,b,e,0)
#define NEW_DOT3(b,e) rb_node_newnode(NODE_DOT3,b,e,0)
#define NEW_ATTRSET(a) rb_node_newnode(NODE_ATTRSET,a,0,0)

View file

@ -229,12 +229,10 @@ rb_obj_is_instance_of(obj, c)
return Qfalse;
case T_FALSE:
if (obj) return Qfalse;
return Qtrue;
return RTEST(obj) ? Qfalse : Qtrue;
case T_TRUE:
if (obj) return Qtrue;
return Qfalse;
return RTEST(obj) ? Qtrue : Qfalse;
default:
rb_raise(rb_eTypeError, "class or module required");
@ -518,36 +516,6 @@ sym_to_s(sym)
return rb_str_new2(rb_id2name(SYM2ID(sym)));
}
static VALUE
rb_mod_clone(module)
VALUE module;
{
NEWOBJ(clone, struct RClass);
CLONESETUP(clone, module);
clone->super = RCLASS(module)->super;
if (RCLASS(module)->iv_tbl) {
clone->iv_tbl = st_copy(RCLASS(module)->iv_tbl);
}
if (RCLASS(module)->m_tbl) {
clone->m_tbl = st_copy(RCLASS(module)->m_tbl);
}
return (VALUE)clone;
}
static VALUE
rb_mod_dup(mod)
VALUE mod;
{
VALUE dup = rb_mod_clone(mod);
OBJSETUP(dup, RBASIC(mod)->klass, BUILTIN_TYPE(mod));
if (FL_TEST(mod, FL_SINGLETON)) {
FL_SET(dup, FL_SINGLETON);
}
return dup;
}
static VALUE
rb_mod_to_s(klass)
VALUE klass;

19
parse.y
View file

@ -132,10 +132,6 @@ static struct RVarmap *dyna_push();
static void dyna_pop();
static int dyna_in_block();
#define cref_push() NEW_CREF()
static void cref_pop();
static NODE *cur_cref;
static void top_local_init();
static void top_local_setup();
%}
@ -269,7 +265,6 @@ program : {
$<vars>$ = ruby_dyna_vars;
lex_state = EXPR_BEG;
top_local_init();
NEW_CREF0(); /* initialize constant c-ref */
if ((VALUE)ruby_class == rb_cObject) class_nest = 0;
else class_nest = 1;
}
@ -288,7 +283,6 @@ program : {
}
ruby_eval_tree = block_append(ruby_eval_tree, $2);
top_local_setup();
cur_cref = 0;
class_nest = 0;
ruby_dyna_vars = $<vars>1;
}
@ -1248,7 +1242,6 @@ primary : literal
if (in_def || in_single)
yyerror("class definition in method body");
class_nest++;
cref_push();
local_push();
$<num>$ = ruby_sourceline;
}
@ -1258,7 +1251,6 @@ primary : literal
$$ = NEW_CLASS($2, $5, $3);
nd_set_line($$, $<num>4);
local_pop();
cref_pop();
class_nest--;
}
| kCLASS tLSHFT expr
@ -1271,7 +1263,6 @@ primary : literal
$<num>$ = in_single;
in_single = 0;
class_nest++;
cref_push();
local_push();
}
compstmt
@ -1280,7 +1271,6 @@ primary : literal
$$ = NEW_SCLASS($3, $7);
fixpos($$, $3);
local_pop();
cref_pop();
class_nest--;
in_def = $<num>4;
in_single = $<num>6;
@ -1290,7 +1280,6 @@ primary : literal
if (in_def || in_single)
yyerror("module definition in method body");
class_nest++;
cref_push();
local_push();
$<num>$ = ruby_sourceline;
}
@ -1300,7 +1289,6 @@ primary : literal
$$ = NEW_MODULE($2, $4);
nd_set_line($$, $<num>3);
local_pop();
cref_pop();
class_nest--;
}
| kDEF fname
@ -4748,12 +4736,6 @@ dyna_in_block()
return (lvtbl->dlev > 0);
}
static void
cref_pop()
{
cur_cref = cur_cref->nd_next;
}
void
rb_parser_append_print()
{
@ -4837,7 +4819,6 @@ Init_sym()
{
sym_tbl = st_init_strtable_with_size(200);
sym_rev_tbl = st_init_numtable_with_size(200);
rb_global_variable((VALUE*)&cur_cref);
rb_global_variable((VALUE*)&lex_lastline);
}

9
time.c
View file

@ -352,8 +352,13 @@ make_time_t(tptr, utc_or_local)
}
tm = localtime(&guess);
if (!tm) goto error;
if (tptr->tm_hour != tm->tm_hour) {
guess -= 3600;
if (lt.tm_isdst != tm->tm_isdst || tptr->tm_hour != tm->tm_hour) {
oguess = guess - 3600;
tm = localtime(&oguess);
if (!tm) goto error;
if (tptr->tm_hour == tm->tm_hour) {
guess = oguess;
}
}
if (guess < 0) {
goto out_of_range;

View file

@ -1064,10 +1064,11 @@ rb_const_get(klass, id)
VALUE klass;
ID id;
{
VALUE value;
VALUE tmp;
VALUE value, tmp;
int mod_retry = 0;
tmp = klass;
retry:
while (tmp) {
if (RCLASS(tmp)->iv_tbl && st_lookup(RCLASS(tmp)->iv_tbl,id,&value)) {
return value;
@ -1075,8 +1076,10 @@ rb_const_get(klass, id)
if (tmp == rb_cObject && top_const_get(id, &value)) return value;
tmp = RCLASS(tmp)->super;
}
if (BUILTIN_TYPE(klass) == T_MODULE) {
return rb_const_get(rb_cObject, id);
if (!mod_retry && BUILTIN_TYPE(klass) == T_MODULE) {
mod_retry = 1;
tmp = rb_cObject;
goto retry;
}
/* Uninitialized constant */

View file

@ -1,4 +1,4 @@
#define RUBY_VERSION "1.6.3"
#define RUBY_RELEASE_DATE "2001-04-03"
#define RUBY_RELEASE_DATE "2001-04-06"
#define RUBY_VERSION_CODE 163
#define RUBY_RELEASE_CODE 20010403
#define RUBY_RELEASE_CODE 20010406