mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	matz
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1009 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									525836d683
								
							
						
					
					
						commit
						8353f303e3
					
				
					 9 changed files with 91 additions and 59 deletions
				
			
		
							
								
								
									
										25
									
								
								ChangeLog
									
										
									
									
									
								
							
							
						
						
									
										25
									
								
								ChangeLog
									
										
									
									
									
								
							|  | @ -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 | ||||
|  |  | |||
							
								
								
									
										1
									
								
								MANIFEST
									
										
									
									
									
								
							
							
						
						
									
										1
									
								
								MANIFEST
									
										
									
									
									
								
							|  | @ -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 | ||||
|  |  | |||
							
								
								
									
										65
									
								
								eval.c
									
										
									
									
									
								
							
							
						
						
									
										65
									
								
								eval.c
									
										
									
									
									
								
							|  | @ -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"); | ||||
|  |  | |||
							
								
								
									
										4
									
								
								gc.c
									
										
									
									
									
								
							
							
						
						
									
										4
									
								
								gc.c
									
										
									
									
									
								
							|  | @ -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; | ||||
|  |  | |||
							
								
								
									
										6
									
								
								object.c
									
										
									
									
									
								
							
							
						
						
									
										6
									
								
								object.c
									
										
									
									
									
								
							|  | @ -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; | ||||
|  |  | |||
							
								
								
									
										38
									
								
								pack.c
									
										
									
									
									
								
							
							
						
						
									
										38
									
								
								pack.c
									
										
									
									
									
								
							|  | @ -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))); | ||||
| 	    } | ||||
|  |  | |||
							
								
								
									
										3
									
								
								parse.y
									
										
									
									
									
								
							
							
						
						
									
										3
									
								
								parse.y
									
										
									
									
									
								
							|  | @ -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 | ||||
|  |  | |||
							
								
								
									
										4
									
								
								ruby.h
									
										
									
									
									
								
							
							
						
						
									
										4
									
								
								ruby.h
									
										
									
									
									
								
							|  | @ -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 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 matz
						matz