diff options
-rw-r--r-- | ChangeLog | 25 | ||||
-rw-r--r-- | MANIFEST | 1 | ||||
-rw-r--r-- | eval.c | 65 | ||||
-rw-r--r-- | gc.c | 4 | ||||
-rw-r--r-- | object.c | 6 | ||||
-rw-r--r-- | pack.c | 38 | ||||
-rw-r--r-- | parse.y | 3 | ||||
-rw-r--r-- | ruby.h | 4 | ||||
-rw-r--r-- | version.h | 4 |
9 files changed, 91 insertions, 59 deletions
@@ -1,7 +1,32 @@ +Mon Oct 16 15:37:33 2000 Kazuhiro NISHIYAMA <zn@mbf.nifty.com> + + * eval.c (rb_thread_inspect): tag size was shorter than required. + + * object.c (rb_obj_inspect): ditto. + +Mon Oct 16 14:25:18 2000 Shugo Maeda <shugo@ruby-lang.org> + + * object.c (sym_inspect): used `name' before initialization. + +Mon Oct 16 14:06:00 2000 Yukihiro Matsumoto <matz@ruby-lang.org> + + * pack.c (pack_pack): use NATINT_U32 for 'l', 'L', and 'N'. + + * pack.c (I32,U32): 32 bit sized integer. + + * pack.c (OFF16,OFF32B): big endien offset for network byteorder. + Mon Oct 16 06:39:32 2000 Minero Aoki <aamine@dp.u-netsurf.ne.jp> * lib/net/http.rb: hex-alpha is not [a-h] but [a-f]. +Mon Oct 16 01:02:02 2000 Yukihiro Matsumoto <matz@ruby-lang.org> + + * eval.c (rb_thread_start_0): should not abort on exception if + $SAFE >= 4. + + * parse.y (sym): symbols for class variable names. + Sat Oct 14 03:32:13 2000 Yukihiro Matsumoto <matz@ruby-lang.org> * eval.c (rb_thread_alloc): should not link a new thread in the @@ -129,6 +129,7 @@ lib/monitor.rb lib/mutex_m.rb lib/net/ftp.rb lib/net/http.rb +lib/net/imap.rb lib/net/pop.rb lib/net/protocol.rb lib/net/smtp.rb @@ -637,7 +637,6 @@ rb_dvar_ref(id) struct RVarmap *vars = ruby_dyna_vars; while (vars) { - if (TYPE(vars) != T_VARMAP) abort(); if (vars->id == id) { return vars->val; } @@ -728,7 +727,6 @@ struct tag { struct SCOPE *scope; int dst; struct tag *prev; - int line; }; static struct tag *prot_tag; @@ -742,7 +740,6 @@ static struct tag *prot_tag; _tag.scope = ruby_scope; \ _tag.tag = ptag; \ _tag.dst = 0; \ - _tag.line = __LINE__; \ prot_tag = &_tag; #define PROT_NONE 0 @@ -804,8 +801,7 @@ static void scope_dup _((struct SCOPE *)); #define POP_SCOPE() \ if (ruby_scope->flag & SCOPE_DONT_RECYCLE) {\ - if (_old)\ - scope_dup(_old);\ + if (_old) scope_dup(_old); \ } \ if (!(ruby_scope->flag & SCOPE_MALLOC)) {\ ruby_scope->local_vars = 0; \ @@ -3495,8 +3491,9 @@ rb_yield_0(val, self, klass, acheck) struct RVarmap *vars = ruby_dyna_vars; while (vars && vars->id != 0) { + struct RVarmap *tmp = vars->next; rb_gc_force_recycle((VALUE)vars); - vars = vars->next; + vars = tmp; } if (ruby_dyna_vars && ruby_dyna_vars->id == 0) { rb_gc_force_recycle((VALUE)ruby_dyna_vars); @@ -7621,19 +7618,15 @@ static VALUE rb_thread_abort_exc(thread) VALUE thread; { - rb_thread_t th = rb_thread_check(thread); - - return th->abort?Qtrue:Qfalse; + return rb_thread_check(thread)->abort?Qtrue:Qfalse; } static VALUE rb_thread_abort_exc_set(thread, val) VALUE thread, val; { - rb_thread_t th = rb_thread_check(thread); - rb_secure(4); - th->abort = RTEST(val); + rb_thread_check(thread)->abort = RTEST(val); return val; } @@ -7686,18 +7679,6 @@ rb_thread_alloc(klass) THREAD_ALLOC(th); th->thread = Data_Wrap_Struct(klass, thread_mark, thread_free, th); - if (curr_thread) { - th->prev = curr_thread; - curr_thread->next->prev = th; - th->next = curr_thread->next; - curr_thread->next = th; - th->priority = curr_thread->priority; - th->gid = curr_thread->gid; - } - else { - curr_thread = th->prev = th->next = th; - } - for (vars = th->dyna_vars; vars; vars = vars->next) { if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break; FL_SET(vars, DVAR_DONT_RECYCLE); @@ -7789,9 +7770,19 @@ rb_thread_start_0(fn, arg, th_arg) return thread; } + if (!th->next) { + /* merge in thread list */ + th->prev = curr_thread; + curr_thread->next->prev = th; + th->next = curr_thread->next; + curr_thread->next = th; + th->priority = curr_thread->priority; + th->gid = curr_thread->gid; + } + PUSH_TAG(PROT_THREAD); if ((state = EXEC_TAG()) == 0) { - if ((status = THREAD_SAVE_CONTEXT(th)) == 0) { + if (THREAD_SAVE_CONTEXT(th) == 0) { curr_thread = th; th->result = (*fn)(arg, th); } @@ -7807,14 +7798,15 @@ rb_thread_start_0(fn, arg, th_arg) rb_thread_cleanup(); } else if (rb_obj_is_kind_of(ruby_errinfo, rb_eSystemExit)) { - if (ruby_safe_level >= 4) { + if (th->safe >= 4) { rb_raise(rb_eSecurityError, "Insecure exit at level %d", ruby_safe_level); } /* delegate exception to main_thread */ rb_thread_raise(1, &ruby_errinfo, main_thread); } - else if (thread_abort || th->abort || RTEST(ruby_debug)) { + else if (th->safe < 4 && + (thread_abort || th->abort || RTEST(ruby_debug))) { VALUE err = rb_exc_new(rb_eSystemExit, 0, 0); error_print(); /* exit on main_thread */ @@ -7833,8 +7825,7 @@ rb_thread_create(fn, arg) VALUE (*fn)(); void *arg; { - rb_thread_t th = rb_thread_alloc(rb_cThread); - return rb_thread_start_0(fn, arg, th); + return rb_thread_start_0(fn, arg, rb_thread_alloc(rb_cThread)); } int @@ -7861,10 +7852,9 @@ rb_thread_s_new(argc, argv, klass) rb_thread_t th = rb_thread_alloc(klass); volatile VALUE *pos; - THREAD_SAVE_CONTEXT(th); pos = th->stk_pos; rb_obj_call_init(th->thread, argc, argv); - if (th->stk_pos == pos) { + if (th->stk_pos == 0) { rb_raise(rb_eThreadError, "uninitialized thread - check `%s#initialize'", rb_class2name(klass)); } @@ -7876,14 +7866,10 @@ static VALUE rb_thread_initialize(thread, args) VALUE thread, args; { - rb_thread_t th; - - th = rb_thread_check(thread); if (!rb_block_given_p()) { - rb_thread_remove(th); rb_raise(rb_eThreadError, "must be called with a block"); } - return rb_thread_start_0(rb_thread_yield, args, th); + return rb_thread_start_0(rb_thread_yield, args, rb_thread_check(thread)); } static VALUE @@ -7891,12 +7877,11 @@ rb_thread_start(klass, args) VALUE klass, args; { rb_thread_t th; - VALUE t; if (!rb_block_given_p()) { rb_raise(rb_eThreadError, "must be called with a block"); } - return rb_thread_start_0(rb_thread_yield, args, rb_thread_alloc(rb_cThread)); + return rb_thread_start_0(rb_thread_yield, args, rb_thread_alloc(klass)); } static VALUE @@ -8194,7 +8179,7 @@ rb_thread_inspect(thread) default: status = "unknown"; break; } - str = rb_str_new(0, strlen(cname)+6+16+9+1); /* 6:tags 16:addr 9:status 1:nul */ + str = rb_str_new(0, strlen(cname)+7+16+9+1); /* 7:tags 16:addr 9:status 1:nul */ sprintf(RSTRING(str)->ptr, "#<%s:0x%lx %s>", cname, thread, status); RSTRING(str)->len = strlen(RSTRING(str)->ptr); OBJ_INFECT(str, thread); @@ -8214,7 +8199,6 @@ rb_callcc(self) struct RVarmap *vars; THREAD_ALLOC(th); - th->status = THREAD_RUNNABLE; cont = Data_Wrap_Struct(rb_cCont, thread_mark, thread_free, th); scope_dup(ruby_scope); @@ -8374,6 +8358,7 @@ Init_Thread() /* allocate main thread */ main_thread = rb_thread_alloc(rb_cThread); + curr_thread = main_thread->prev = main_thread->next = main_thread; rb_cCont = rb_define_class("Continuation", rb_cObject); rb_undef_method(CLASS_OF(rb_cCont), "new"); @@ -905,7 +905,7 @@ rb_gc() alloca(0); # define STACK_END (&stack_end) #else -# if defined(__GNUC__) +# if defined(__GNUC__) && !defined(__alpha__) VALUE *stack_end = __builtin_frame_address(0); # else VALUE *stack_end = alloca(1); @@ -985,7 +985,7 @@ Init_stack(addr) #if defined(__human68k__) extern void *_SEND; rb_gc_stack_start = _SEND; -#elif defined(__GNUC__) +#elif defined(__GNUC__) && !defined(__alpha__) rb_gc_stack_start = __builtin_frame_address(2); #else VALUE start; @@ -198,12 +198,12 @@ rb_obj_inspect(obj) c = rb_class2name(CLASS_OF(obj)); if (rb_inspecting_p(obj)) { - str = rb_str_new(0, strlen(c)+8+16+1); /* 8:tags 16:addr 1:eos */ + str = rb_str_new(0, strlen(c)+10+16+1); /* 10:tags 16:addr 1:eos */ sprintf(RSTRING(str)->ptr, "#<%s:0x%lx ...>", c, obj); RSTRING(str)->len = strlen(RSTRING(str)->ptr); return str; } - str = rb_str_new(0, strlen(c)+4+16+1); /* 4:tags 16:addr 1:eos */ + str = rb_str_new(0, strlen(c)+6+16+1); /* 6:tags 16:addr 1:eos */ sprintf(RSTRING(str)->ptr, "-<%s:0x%lx ", c, obj); RSTRING(str)->len = strlen(RSTRING(str)->ptr); return rb_protect_inspect(inspect_obj, obj, str); @@ -498,8 +498,8 @@ sym_inspect(sym) VALUE str; char *name; - str = rb_str_new(0, strlen(name)+2); name = rb_id2name(SYM2ID(sym)); + str = rb_str_new(0, strlen(name)+2); sprintf(RSTRING(str)->ptr, ":%s", name); RSTRING(str)->len = strlen(RSTRING(str)->ptr); return str; @@ -22,16 +22,24 @@ #endif #ifdef NATINT_PACK +# define OFF16B(p) ((char*)(p) + (natint?0:(sizeof(short) - SIZE16))) +# define OFF32B(p) ((char*)(p) + (natint?0:(sizeof(long) - SIZE32))) +# define NATINT_I32(x) (natint?sizeof(NUM2LONG(x)):(NUM2I32(x))) +# define NATINT_U32(x) (natint?sizeof(NUM2ULONG(x)):(NUM2U32(x))) # define NATINT_LEN(type,len) (natint?sizeof(type):(len)) # ifdef WORDS_BIGENDIAN -# define OFF16(p) ((char*)(p) + (natint?0:(sizeof(short) - 2))) -# define OFF32(p) ((char*)(p) + (natint?0:(sizeof(long) - 4))) +# define OFF16(p) OFF16B(p) +# define OFF32(p) OFF32B(p) # endif #else +# define NATINT_I32(x) NUM2I32(x) +# define NATINT_U32(x) NUM2U32(x) # define NATINT_LEN(type,len) sizeof(type) #endif #ifndef OFF16 +# define OFF16B(p) (char*)(p) +# define OFF32B(p) (char*)(p) # define OFF16(p) (char*)(p) # define OFF32(p) (char*)(p) #endif @@ -293,6 +301,18 @@ endian() #define VTOHD(x,y) vtohd(x) #endif +#if SIZEOF_LONG == SIZE32 +typedef long I32; +typedef unsigned long U32; +#define NUM2I32(x) NUM2LONG(x) +#define NUM2U32(x) NUM2LONG(x) +#elif SIZEOF_INT == SIZE32 +typedef int I32; +typedef unsigned int U32; +#define NUM2I32(x) NUM2INT(x) +#define NUM2U32(x) NUM2UINT(x) +#endif + static char *toofew = "too few arguments"; static void encodes _((VALUE,char*,int,int)); @@ -569,7 +589,7 @@ pack_pack(ary, fmt) from = NEXTFROM; if (NIL_P(from)) l = 0; else { - l = NUM2ULONG(from); + l = NATINT_U32(from); } rb_str_cat(res, OFF32(&l), NATINT_LEN(long,4)); } @@ -585,7 +605,7 @@ pack_pack(ary, fmt) s = NUM2INT(from); } s = htons(s); - rb_str_cat(res, OFF16(&s), NATINT_LEN(short,2)); + rb_str_cat(res, OFF16B(&s), NATINT_LEN(short,2)); } break; @@ -596,10 +616,10 @@ pack_pack(ary, fmt) from = NEXTFROM; if (NIL_P(from)) l = 0; else { - l = NUM2ULONG(from); + l = NATINT_U32(from); } l = htonl(l); - rb_str_cat(res, OFF32(&l), NATINT_LEN(long,4)); + rb_str_cat(res, OFF32B(&l), NATINT_LEN(long,4)); } break; @@ -624,7 +644,7 @@ pack_pack(ary, fmt) from = NEXTFROM; if (NIL_P(from)) l = 0; else { - l = NUM2ULONG(from); + l = NATINT_U32(from); } l = htovl(l); rb_str_cat(res, OFF32(&l), NATINT_LEN(long,4)); @@ -1315,7 +1335,7 @@ pack_unpack(str, fmt) PACK_LENGTH_ADJUST(unsigned short,2); while (len-- > 0) { unsigned short tmp = 0; - memcpy(OFF16(&tmp), s, NATINT_LEN(unsigned short,2)); + memcpy(OFF16B(&tmp), s, NATINT_LEN(unsigned short,2)); s += NATINT_LEN(unsigned short,2); rb_ary_push(ary, rb_uint2inum(ntohs(tmp))); } @@ -1326,7 +1346,7 @@ pack_unpack(str, fmt) PACK_LENGTH_ADJUST(unsigned long,4); while (len-- > 0) { unsigned long tmp = 0; - memcpy(OFF32(&tmp), s, NATINT_LEN(unsigned long,4)); + memcpy(OFF32B(&tmp), s, NATINT_LEN(unsigned long,4)); s += NATINT_LEN(unsigned long,4); rb_ary_push(ary, rb_uint2inum(ntohl(tmp))); } @@ -1349,6 +1349,7 @@ opt_block_var : none $$ = $2; } + do_block : kDO { $<vars>$ = dyna_push(); @@ -1561,7 +1562,7 @@ symbol : tSYMBEG sym sym : fname | tIVAR | tGVAR - + | tCVAR numeric : tINTEGER | tFLOAT @@ -194,8 +194,8 @@ int rb_num2int _((VALUE)); #define NUM2INT(x) (FIXNUM_P(x)?FIX2INT(x):rb_num2int((VALUE)x)) int rb_fix2int _((VALUE)); #define FIX2INT(x) rb_fix2int((VALUE)x) -#define NUM2UINT(x) ((unsigned int)NUM2ULONG(x)) -#define FIX2UINT(x) ((unsigned int)FIX2ULONG(x)) +#define NUM2UINT(x) ((unsigned int)NUM2INT(x)) +#define FIX2UINT(x) ((unsigned int)FIX2INT(x)) #else #define NUM2INT(x) NUM2LONG(x) #define NUM2UINT(x) NUM2ULONG(x) @@ -1,4 +1,4 @@ #define RUBY_VERSION "1.6.2" -#define RUBY_RELEASE_DATE "2000-10-12" +#define RUBY_RELEASE_DATE "2000-10-16" #define RUBY_VERSION_CODE 162 -#define RUBY_RELEASE_CODE 20001012 +#define RUBY_RELEASE_CODE 20001016 |