[前][次][番号順一覧][スレッド一覧][生データ]

yarv-diff:407

From: ko1 atdot.net
Date: 6 Nov 2006 22:53:21 +0900
Subject: [yarv-diff:407] r575 - in trunk: . ext/socket lib lib/net lib/rss lib/soap lib/soap/mapping lib/webrick lib/xmlrpc lib/xsd/codegen rb

Author: ko1
Date: 2006-11-06 22:53:20 +0900 (Mon, 06 Nov 2006)
New Revision: 575

Modified:
   trunk/ChangeLog
   trunk/array.c
   trunk/ext/socket/extconf.rb
   trunk/ext/socket/socket.c
   trunk/gc.c
   trunk/lib/date.rb
   trunk/lib/net/imap.rb
   trunk/lib/rss/0.9.rb
   trunk/lib/set.rb
   trunk/lib/soap/mapping/rubytypeFactory.rb
   trunk/lib/soap/mimemessage.rb
   trunk/lib/soap/property.rb
   trunk/lib/webrick/httprequest.rb
   trunk/lib/webrick/httputils.rb
   trunk/lib/xmlrpc/create.rb
   trunk/lib/xsd/codegen/gensupport.rb
   trunk/object.c
   trunk/rb/ir.rb
   trunk/ruby.h
   trunk/string.c
   trunk/version.h
   trunk/vm_dump.c
Log:
	* array.c : import Ruby HEAD

	* ext/socket/extconf.rb : ditto

	* ext/socket/socket.c : ditto

	* gc.c : ditto

	* lib/date.rb : ditto

	* lib/net/imap.rb : ditto

	* lib/rss/0.9.rb : ditto

	* lib/set.rb : ditto

	* lib/soap/mapping/rubytypeFactory.rb : ditto

	* lib/soap/mimemessage.rb : ditto

	* lib/soap/property.rb : ditto

	* lib/webrick/httprequest.rb : ditto

	* lib/webrick/httputils.rb : ditto

	* lib/xmlrpc/create.rb : ditto

	* lib/xsd/codegen/gensupport.rb : ditto

	* object.c : ditto

	* ruby.h : ditto

	* string.c : ditto

	* version.h : ditto

	* rb/ir.rb : fix to use "diffs" directory

	* vm_dump.c : add "const"



Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-11-06 08:30:05 UTC (rev 574)
+++ trunk/ChangeLog	2006-11-06 13:53:20 UTC (rev 575)
@@ -4,6 +4,51 @@
 #  from Mon, 03 May 2004 01:24:19 +0900
 #
 
+2006-11-06(Mon) 22:32:18 +0900  Koichi Sasada  <ko1 atdot.net>
+
+	* array.c : import Ruby HEAD
+
+	* ext/socket/extconf.rb : ditto
+
+	* ext/socket/socket.c : ditto
+
+	* gc.c : ditto
+
+	* lib/date.rb : ditto
+
+	* lib/net/imap.rb : ditto
+
+	* lib/rss/0.9.rb : ditto
+
+	* lib/set.rb : ditto
+
+	* lib/soap/mapping/rubytypeFactory.rb : ditto
+
+	* lib/soap/mimemessage.rb : ditto
+
+	* lib/soap/property.rb : ditto
+
+	* lib/webrick/httprequest.rb : ditto
+
+	* lib/webrick/httputils.rb : ditto
+
+	* lib/xmlrpc/create.rb : ditto
+
+	* lib/xsd/codegen/gensupport.rb : ditto
+
+	* object.c : ditto
+
+	* ruby.h : ditto
+
+	* string.c : ditto
+
+	* version.h : ditto
+
+	* rb/ir.rb : fix to use "diffs" directory
+
+	* vm_dump.c : add "const"
+
+
 2006-11-06(Mon) 16:36:47 +0900  Koichi Sasada  <ko1 atdot.net>
 
 	* eval_proc.c : remove "static" from external global variables

Modified: trunk/array.c
===================================================================
--- trunk/array.c	2006-11-06 08:30:05 UTC (rev 574)
+++ trunk/array.c	2006-11-06 13:53:20 UTC (rev 575)
@@ -3,7 +3,7 @@
   array.c -
 
   $Author: matz $
-  $Date: 2006/10/31 07:28:37 $
+  $Date: 2006/11/02 00:19:57 $
   created at: Fri Aug  6 09:46:12 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -40,67 +40,16 @@
 }
 
 #define ARY_TMPLOCK  FL_USER1
-#define ARY_NOEMBED FL_USER3
 #define ARY_SHARED_P(a) FL_TEST(a, ELTS_SHARED)
 
-#define ARY_SET_NOEMBED(ary) do {\
-    FL_SET(ary, ARY_NOEMBED);\
-    ARY_SET_EMBED_LEN(ary, 0);\
-} while (0)
-#define ARY_SET_EMBED(str) FL_UNSET(str, ARY_NOEMBED)
-#define ARY_EMBED_P(ary) (!FL_TEST(ary, ARY_NOEMBED))
-#define ARY_SET_EMBED_LEN(ary, n) do { \
-    long tmp_n = (n);\
-    RBASIC(ary)->flags &= ~RARRAY_EMBED_LEN_MASK;\
-    RBASIC(ary)->flags |= (tmp_n) << RARRAY_EMBED_LEN_SHIFT;\
-} while (0)
-
 #define ARY_SET_LEN(ary, n) do { \
-    if (ARY_EMBED_P(ary)) {\
-	ARY_SET_EMBED_LEN(ary, n);\
-    }\
-    else {\
-	RARRAY(ary)->as.heap.len = (n);\
-    }\
+    RARRAY(ary)->len = (n);\
 } while (0) 
 
-#define ARY_LFREE FL_USER6
-#define ARY_LFREE_P(ary) FL_TEST(ary, ARY_LFREE)
-#define LFREE_SIZE(ary) RARRAY(ary)->as.heap.ptr[-1]
-#define LFREE_CAPA(ary) (LFREE_SIZE(ary)+RARRAY(ary)->as.heap.aux.capa)
-
-#define ARY_CAPA(ary) ((ARY_EMBED_P(ary)) ? RARRAY_EMBED_LEN_MAX : RARRAY(ary)->as.heap.aux.capa)
+#define ARY_CAPA(ary) RARRAY(ary)->aux.capa
 #define RESIZE_CAPA(ary,capacity) do {\
-    if (ARY_EMBED_P(ary)) {\
-        if ((capacity) > RARRAY_EMBED_LEN_MAX) {\
-	    VALUE *tmp = ALLOC_N(VALUE, capacity);\
-            long len = RARRAY_LEN(ary);\
-	    MEMCPY(tmp, RARRAY_PTR(ary), VALUE, len);\
-	    RARRAY(ary)->as.heap.ptr = tmp;\
-	    RARRAY(ary)->as.heap.len = len;\
-            ARY_SET_NOEMBED(ary);\
-	    RARRAY(ary)->as.heap.aux.capa = (capacity);\
-        }\
-    }\
-    else if (ARY_LFREE_P(ary)) {\
-        VALUE *ptr = RARRAY(ary)->as.heap.ptr - LFREE_SIZE(ary);\
-	if (LFREE_CAPA(ary) >= (capacity)) {\
-	    RARRAY(ary)->as.heap.aux.capa = LFREE_CAPA(ary);\
-	    MEMMOVE(ptr, RARRAY(ary)->as.heap.ptr, VALUE, RARRAY_LEN(ary));\
-	    FL_UNSET(ary, ARY_LFREE);\
-	    RARRAY(ary)->as.heap.ptr = ptr;\
-	}\
-        else {\
-	    long offset = LFREE_SIZE(ary);\
-	    REALLOC_N(ptr, VALUE, offset+(capacity));\
-	    RARRAY(ary)->as.heap.aux.capa = (capacity);\
-	    RARRAY(ary)->as.heap.ptr = ptr + offset;\
-	}\
-    }\
-    else {\
-	REALLOC_N(RARRAY(ary)->as.heap.ptr, VALUE, (capacity));\
-	RARRAY(ary)->as.heap.aux.capa = (capacity);\
-    }\
+    REALLOC_N(RARRAY(ary)->ptr, VALUE, (capacity));\
+    RARRAY(ary)->aux.capa = (capacity);\
 } while (0)
 
 static VALUE *
@@ -125,13 +74,12 @@
     VALUE *ptr;
 
     rb_ary_modify_check(ary);
-    if (ARY_EMBED_P(ary)) return;
     if (ARY_SHARED_P(ary)) {
 	ptr = ALLOC_N(VALUE, RARRAY_LEN(ary));
 	FL_UNSET(ary, ELTS_SHARED);
-	RARRAY(ary)->as.heap.aux.capa = RARRAY_LEN(ary);
+	RARRAY(ary)->aux.capa = RARRAY_LEN(ary);
 	MEMCPY(ptr, RARRAY_PTR(ary), VALUE, RARRAY_LEN(ary));
-	RARRAY(ary)->as.heap.ptr = ptr;
+	RARRAY(ary)->ptr = ptr;
     }
 }
 
@@ -163,9 +111,9 @@
     NEWOBJ(ary, struct RArray);
     OBJSETUP(ary, klass, T_ARRAY);
 
-    ary->as.heap.len = 0;
-    ary->as.heap.ptr = 0;
-    ary->as.heap.aux.capa = 0;
+    ary->len = 0;
+    ary->ptr = 0;
+    ary->aux.capa = 0;
 
     return (VALUE)ary;
 }
@@ -182,15 +130,9 @@
 	rb_raise(rb_eArgError, "array size too big");
     }
     ary = ary_alloc(klass);
-    if (len <= RARRAY_EMBED_LEN_MAX) {
-	ARY_SET_EMBED_LEN(ary, 0);
-    }
-    else {
 	if (len == 0) len++;
-	ARY_SET_NOEMBED(ary);
-	RARRAY(ary)->as.heap.ptr = ALLOC_N(VALUE, len);
-	RARRAY(ary)->as.heap.aux.capa = len;
-    }
+    RARRAY(ary)->ptr = ALLOC_N(VALUE, len);
+    RARRAY(ary)->aux.capa = len;
 
     return ary;
 }
@@ -225,7 +167,7 @@
     }
     va_end(ar);
 
-    ARY_SET_LEN(ary, n);
+    RARRAY(ary)->len = n;
     return ary;
 }
 
@@ -237,7 +179,7 @@
     ary = rb_ary_new2(n);
     if (n > 0 && elts) {
 	MEMCPY(RARRAY_PTR(ary), elts, VALUE, n);
-	ARY_SET_LEN(ary, n);
+	RARRAY(ary)->len = n;
     }
 
     return ary;
@@ -246,36 +188,25 @@
 void
 rb_ary_free(VALUE ary)
 {
-    if (!ARY_SHARED_P(ary) && !ARY_EMBED_P(ary)) {
-	if (ARY_LFREE_P(ary)) {
-	    xfree(RARRAY(ary)->as.heap.ptr - LFREE_SIZE(ary));
-	}
-	else {
-	    xfree(RARRAY(ary)->as.heap.ptr);
-	}
+    if (!ARY_SHARED_P(ary)) {
+	xfree(RARRAY(ary)->ptr);
     }
 }
 
 static VALUE
 ary_make_shared(VALUE ary)
 {
-    if (ARY_EMBED_P(ary)) abort();
     if (ARY_SHARED_P(ary)) {
-	return RARRAY(ary)->as.heap.aux.shared;
+	return RARRAY(ary)->aux.shared;
     }
     else {
 	NEWOBJ(shared, struct RArray);
 	OBJSETUP(shared, 0, T_ARRAY);
 
-	ARY_SET_NOEMBED(shared);
-	shared->as.heap.len = RARRAY(ary)->as.heap.len;
-	shared->as.heap.ptr = RARRAY(ary)->as.heap.ptr;
-	shared->as.heap.aux.capa = RARRAY(ary)->as.heap.aux.capa;
-        if (ARY_LFREE_P(ary)) {
-            FL_SET(shared,ARY_LFREE);
-            FL_UNSET(ary,ARY_LFREE);
-        }
-	RARRAY(ary)->as.heap.aux.shared = (VALUE)shared;
+	shared->len = RARRAY(ary)->len;
+	shared->ptr = RARRAY(ary)->ptr;
+	shared->aux.capa = RARRAY(ary)->aux.capa;
+	RARRAY(ary)->aux.shared = (VALUE)shared;
 	FL_SET(ary, ELTS_SHARED);
 	OBJ_FREEZE(shared);
 	return (VALUE)shared;
@@ -352,11 +283,10 @@
 
     rb_ary_modify(ary);
     if (rb_scan_args(argc, argv, "02", &size, &val) == 0) {
-	if (!ARY_EMBED_P(ary) && RARRAY_PTR(ary) && !ARY_SHARED_P(ary)) {
-	    free(RARRAY(ary)->as.heap.ptr);
+	if (RARRAY_PTR(ary) && !ARY_SHARED_P(ary)) {
+	    free(RARRAY(ary)->ptr);
 	}
-	ARY_SET_EMBED(ary);
-	ARY_SET_LEN(ary, 0);
+	RARRAY(ary)->len = 0;
 	if (rb_block_given_p()) {
 	    rb_warning("given block not used");
 	}
@@ -379,21 +309,7 @@
 	rb_raise(rb_eArgError, "array size too big");
     }
     rb_ary_modify(ary);
-    if (len <= RARRAY_EMBED_LEN_MAX) {
-	if (!ARY_EMBED_P(ary)) {
-	    xfree(RARRAY(ary)->as.heap.ptr);
-	    ARY_SET_EMBED(ary);
-	}
-	ARY_SET_EMBED_LEN(ary, len);
-    }
-    else {
-	if (ARY_EMBED_P(ary)) {
-	    ARY_SET_NOEMBED(ary);
-	    RARRAY(ary)->as.heap.len = 0;
-	    RARRAY(ary)->as.heap.ptr = 0;
-	}
 	RESIZE_CAPA(ary, len);
-    }
     if (rb_block_given_p()) {
 	long i;
 
@@ -402,12 +318,12 @@
 	}
 	for (i=0; i<len; i++) {
 	    rb_ary_store(ary, i, rb_yield(LONG2NUM(i)));
-	    ARY_SET_LEN(ary, i+1);
+	    RARRAY(ary)->len = i + 1;
 	}
     }
     else {
 	memfill(RARRAY_PTR(ary), len, val);
-	ARY_SET_LEN(ary, len);
+	RARRAY(ary)->len = len;
     }
     return ary;
 }
@@ -429,13 +345,10 @@
     if (argc < 0) {
 	rb_raise(rb_eArgError, "negative array size");
     }
-    if (argc > RARRAY_EMBED_LEN_MAX) {
-	ARY_SET_NOEMBED(ary);
-	RARRAY(ary)->as.heap.ptr = ALLOC_N(VALUE, argc);
-	RARRAY(ary)->as.heap.aux.capa = argc;
-    }
+    RARRAY(ary)->ptr = ALLOC_N(VALUE, argc);
+    RARRAY(ary)->aux.capa = argc;
     MEMCPY(RARRAY_PTR(ary), argv, VALUE, argc);
-    ARY_SET_LEN(ary, argc);
+    RARRAY(ary)->len = argc;
 
     return ary;
 }
@@ -473,7 +386,7 @@
     }
 
     if (idx >= RARRAY_LEN(ary)) {
-	ARY_SET_LEN(ary, idx + 1);
+	RARRAY(ary)->len = idx + 1;
     }
     RARRAY_PTR(ary)[idx] = val;
 }
@@ -484,10 +397,9 @@
     VALUE val = ary_alloc(klass);
 
     ary_make_shared(ary);
-    ARY_SET_NOEMBED(val);
-    RARRAY(val)->as.heap.ptr = RARRAY(ary)->as.heap.ptr;
-    RARRAY(val)->as.heap.len = RARRAY(ary)->as.heap.len;
-    RARRAY(val)->as.heap.aux.shared = RARRAY(ary)->as.heap.aux.shared;
+    RARRAY(val)->ptr = RARRAY(ary)->ptr;
+    RARRAY(val)->len = RARRAY(ary)->len;
+    RARRAY(val)->aux.shared = RARRAY(ary)->aux.shared;
     FL_SET(val, ELTS_SHARED);
     return val;
 }
@@ -510,14 +422,10 @@
     if (last) {
 	offset = RARRAY_LEN(ary) - n;
     }
-    if (ARY_EMBED_P(ary) || n <= RARRAY_EMBED_LEN_MAX) {
-	return rb_ary_new4(n, RARRAY_PTR(ary)+offset);
-    }
-    else {
     result = ary_shared_array(rb_cArray, ary);
-	RARRAY(result)->as.heap.ptr += offset;
-	RARRAY(result)->as.heap.len = n;
-    }
+    RARRAY(result)->ptr += offset;
+    RARRAY(result)->len = n;
+
     return result;
 }
 
@@ -576,7 +484,7 @@
 	RESIZE_CAPA(ary, RARRAY_LEN(ary) * 2);
     }
     n = RARRAY_LEN(ary)-1;
-    ARY_SET_LEN(ary, n);
+    RARRAY(ary)->len = n;
     return RARRAY_PTR(ary)[n];
 }
 
@@ -604,7 +512,7 @@
 
     rb_ary_modify_check(ary);
     result = ary_shared_first(argc, argv, ary, Qtrue);
-    ARY_SET_LEN(ary, RARRAY_LEN(ary) - RARRAY_LEN(result));
+    RARRAY(ary)->len -= RARRAY_LEN(result);
     return result;
 }
 
@@ -616,23 +524,17 @@
     rb_ary_modify_check(ary);
     if (RARRAY_LEN(ary) == 0) return Qnil;
     top = RARRAY_PTR(ary)[0];
-    if (ARY_EMBED_P(ary)) {
+    if (!ARY_SHARED_P(ary)) {
+	if (RARRAY_LEN(ary) < ARY_DEFAULT_SIZE) {
 	MEMMOVE(RARRAY_PTR(ary), RARRAY_PTR(ary)+1, VALUE, RARRAY_LEN(ary)-1);
-	ARY_SET_EMBED_LEN(ary, RARRAY_LEN(ary)-1);
+	    RARRAY(ary)->len--;
 	return top;
     }
-    if (!ARY_SHARED_P(ary)) {
-	if (ARY_LFREE_P(ary)) {
-	    RARRAY(ary)->as.heap.ptr[0] = LFREE_SIZE(ary)+1;
-	}
-	else {
-            FL_SET(ary, ARY_LFREE);
-            RARRAY(ary)->as.heap.ptr[0] = 1;
-	}
-	RARRAY(ary)->as.heap.aux.capa--;
+	RARRAY_PTR(ary)[0] = Qnil;
+	ary_make_shared(ary);
     }
-    RARRAY(ary)->as.heap.ptr++;	/* shift ptr */
-    RARRAY(ary)->as.heap.len--;
+    RARRAY(ary)->ptr++;		/* shift ptr */
+    RARRAY(ary)->len--;
 
     return top;
 }
@@ -668,12 +570,12 @@
     result = ary_shared_first(argc, argv, ary, Qfalse);
     n = RARRAY_LEN(result);
     if (ARY_SHARED_P(ary)) {
-	RARRAY(ary)->as.heap.ptr += n;
-	RARRAY(ary)->as.heap.len -= n;
+	RARRAY(ary)->ptr += n;
+	RARRAY(ary)->len -= n;
 	}
     else {
 	MEMMOVE(RARRAY_PTR(ary), RARRAY_PTR(ary)+n, VALUE, RARRAY_LEN(ary)-n);
-	ARY_SET_LEN(ary, RARRAY_LEN(ary)-n);
+	RARRAY(ary)->len -= n;
     }
 
     return result;
@@ -694,58 +596,18 @@
 static VALUE
 rb_ary_unshift_m(int argc, VALUE *argv, VALUE ary)
 {
-    long lfree = ARY_LFREE_P(ary) ? LFREE_SIZE(ary) : 0;
-    long free2 = lfree;
+    long len = RARRAY(ary)->len;
 
-    rb_ary_modify_check(ary);
     if (argc == 0) return ary;
-
-    if (lfree < argc) {
-        int shared = ARY_SHARED_P(ary); 
-	long len = RARRAY_LEN(ary);
-	long free = shared ? RARRAY_LEN(ary) : ARY_CAPA(ary);
-        VALUE *ptr;
-
-	if (!ARY_EMBED_P(ary) && free > len + argc) {
-	    free += lfree;
-	    free2 = (free - len - argc) / 2 + argc;
-	    ptr = RARRAY(ary)->as.heap.ptr-lfree+free2;
-	    MEMMOVE(ptr, RARRAY(ary)->as.heap.ptr, VALUE,
-		    RARRAY(ary)->as.heap.len);
-	}
-	else {
-	    free = (len+argc) * 1.5;
-	    if (free - len < ARY_DEFAULT_SIZE) {
-		free += ARY_DEFAULT_SIZE;
-	    }
-	    free2 = (free - len - argc)/2 + argc;
-	    ptr = ALLOC_N(VALUE,free)+free2;
-	    MEMCPY(ptr, RARRAY_PTR(ary), VALUE, len);
-	    if (shared) {
-		FL_UNSET(ary, ELTS_SHARED);
-	    }
-	    else if (ARY_EMBED_P(ary)) {
-		ARY_SET_NOEMBED(ary);
-	    }
-	    else {
-		xfree(RARRAY(ary)->as.heap.ptr-lfree);
-	    }
-	}
-	RARRAY(ary)->as.heap.ptr = ptr;
-	RARRAY(ary)->as.heap.len = len;
-	RARRAY(ary)->as.heap.aux.capa = free-free2;
+    rb_ary_modify(ary);
+    if (RARRAY(ary)->aux.capa <= RARRAY_LEN(ary)+argc) {
+	RESIZE_CAPA(ary, RARRAY(ary)->aux.capa + ARY_DEFAULT_SIZE);
     }
-    RARRAY(ary)->as.heap.ptr -= argc;
-    RARRAY(ary)->as.heap.len += argc;
-    RARRAY(ary)->as.heap.aux.capa += argc;
-    free2 -= argc;
-    if (free2 > 0) {
-	RARRAY(ary)->as.heap.ptr[-1] = free2;
-        FL_SET(ary, ARY_LFREE);
-    } else {
-	FL_UNSET(ary, ARY_LFREE);
-    }
-    MEMCPY(RARRAY_PTR(ary), argv, VALUE, argc);
+
+    /* sliding items */
+    MEMMOVE(RARRAY(ary)->ptr + argc, RARRAY(ary)->ptr, VALUE, len);
+    MEMCPY(RARRAY(ary)->ptr, argv, VALUE, argc);
+    RARRAY(ary)->len += argc;
     
     return ary;
 }
@@ -793,20 +655,15 @@
     klass = rb_obj_class(ary);
     if (len == 0) return ary_new(klass, 0);
 
-    if (ARY_EMBED_P(ary) && len <= RARRAY_EMBED_LEN_MAX) {
-	return rb_ary_new4(len, RARRAY_PTR(ary)+beg);
-    }
-    else {
     shared = ary_make_shared(ary);
 	ptr = RARRAY_PTR(ary);
     ary2 = ary_alloc(klass);
-	ARY_SET_NOEMBED(ary2);
-	RARRAY(ary2)->as.heap.ptr = ptr + beg;
-	RARRAY(ary2)->as.heap.len = len;
-	RARRAY(ary2)->as.heap.aux.shared = shared;
+    RARRAY(ary2)->ptr = ptr + beg;
+    RARRAY(ary2)->len = len;
+    RARRAY(ary2)->aux.shared = shared;
     FL_SET(ary2, ELTS_SHARED);
+
     return ary2;
-    }
 }
 
 /* 
@@ -1122,7 +979,7 @@
 	if (rlen > 0) {
 	    MEMCPY(RARRAY_PTR(ary) + beg, RARRAY_PTR(rpl), VALUE, rlen);
 	}
-	ARY_SET_LEN(ary, len);
+	RARRAY(ary)->len = len;
     }
     else {
 	long alen;
@@ -1139,7 +996,7 @@
 	if (len != rlen) {
 	    MEMMOVE(RARRAY_PTR(ary) + beg + rlen, RARRAY_PTR(ary) + beg + len,
 		    VALUE, RARRAY_LEN(ary) - (beg + len));
-	    ARY_SET_LEN(ary, alen);
+	    RARRAY(ary)->len = alen;
 	}
 	if (rlen > 0) {
 	    MEMMOVE(RARRAY_PTR(ary) + beg, RARRAY_PTR(rpl), VALUE, rlen);
@@ -1367,7 +1224,7 @@
     VALUE dup = rb_ary_new2(RARRAY_LEN(ary));
 
     MEMCPY(RARRAY_PTR(dup), RARRAY_PTR(ary), VALUE, RARRAY_LEN(ary));
-    ARY_SET_LEN(dup, RARRAY_LEN(ary));
+    RARRAY(dup)->len = RARRAY_LEN(ary);
     OBJ_INFECT(dup, ary);
 
     return dup;
@@ -1871,7 +1728,7 @@
 
     rb_ary_modify(ary);
     if (RARRAY_LEN(ary) > i2) {
-	ARY_SET_LEN(ary, i2);
+	RARRAY(ary)->len = i2;
 	if (i2 * 2 < ARY_CAPA(ary) &&
 	    ARY_CAPA(ary) > ARY_DEFAULT_SIZE) {
 	    RESIZE_CAPA(ary, i2*2);
@@ -1897,7 +1754,7 @@
     del = RARRAY_PTR(ary)[pos];
     MEMMOVE(RARRAY_PTR(ary)+pos, RARRAY_PTR(ary)+pos+1, VALUE,
 	    RARRAY_LEN(ary)-pos-1);
-    ARY_SET_LEN(ary, RARRAY_LEN(ary)-1);
+    RARRAY(ary)->len--;
 
     return del;
 }
@@ -1999,7 +1856,7 @@
     }
     if (RARRAY_LEN(ary) == i2) return Qnil;
     if (i2 < RARRAY_LEN(ary))
-	ARY_SET_LEN(ary, i2);
+	RARRAY(ary)->len = i2;
 
     return ary;
 }
@@ -2152,29 +2009,17 @@
 rb_ary_replace(VALUE copy, VALUE orig)
 {
     VALUE shared;
+    VALUE *ptr;
 
     rb_ary_modify(copy);
     orig = to_ary(orig);
     if (copy == orig) return copy;
-    if (ARY_EMBED_P(orig)) {
-	MEMCPY(RARRAY_PTR(copy), RARRAY_PTR(orig), VALUE, RARRAY_LEN(orig));
-	ARY_SET_LEN(copy, RARRAY_LEN(orig));
-	return copy;
-    }
     shared = ary_make_shared(orig);
-    if (ARY_EMBED_P(copy)) {
-	ARY_SET_NOEMBED(copy);
-    }
-    else {
-	VALUE *ptr = RARRAY(copy)->as.heap.ptr;
-	if (ARY_LFREE_P(copy)) {
-	    ptr -= LFREE_SIZE(copy);
-	}
+    ptr = RARRAY(copy)->ptr;
 	xfree(ptr);
-    }
-    RARRAY(copy)->as.heap.ptr = RARRAY(shared)->as.heap.ptr;
-    RARRAY(copy)->as.heap.len = RARRAY(shared)->as.heap.len;
-    RARRAY(copy)->as.heap.aux.shared = shared;
+    RARRAY(copy)->ptr = RARRAY(shared)->ptr;
+    RARRAY(copy)->len = RARRAY(shared)->len;
+    RARRAY(copy)->aux.shared = shared;
     FL_SET(copy, ELTS_SHARED);
 
     return copy;
@@ -2194,7 +2039,7 @@
 rb_ary_clear(VALUE ary)
 {
     rb_ary_modify(ary);
-    ARY_SET_LEN(ary, 0);
+    RARRAY(ary)->len = 0;
     if (ARY_DEFAULT_SIZE * 2 < ARY_CAPA(ary)) {
 	RESIZE_CAPA(ary, ARY_DEFAULT_SIZE * 2);
     }
@@ -2267,7 +2112,7 @@
 	    RESIZE_CAPA(ary, end);
 	}
 	rb_mem_clear(RARRAY_PTR(ary) + RARRAY_LEN(ary), end - RARRAY_LEN(ary));
-	ARY_SET_LEN(ary, end);
+	RARRAY(ary)->len = end;
     }
 
     if (block_p) {
@@ -2311,7 +2156,7 @@
     z = rb_ary_new2(len);
     MEMCPY(RARRAY_PTR(z), RARRAY_PTR(x), VALUE, RARRAY_LEN(x));
     MEMCPY(RARRAY_PTR(z) + RARRAY_LEN(x), RARRAY_PTR(y), VALUE, RARRAY_LEN(y));
-    ARY_SET_LEN(z, len);
+    RARRAY(z)->len = len;
     return z;
 }
 
@@ -2373,7 +2218,7 @@
     len *= RARRAY_LEN(ary);
 
     ary2 = ary_new(rb_obj_class(ary), len);
-    ARY_SET_LEN(ary2, len);
+    RARRAY(ary2)->len = len;
 
     for (i=0; i<len; i+=RARRAY_LEN(ary)) {
 	MEMCPY(RARRAY_PTR(ary2)+i, RARRAY_PTR(ary), VALUE, RARRAY_LEN(ary));
@@ -2753,7 +2598,7 @@
 	    rb_ary_store(ary, j++, v);
 	}
     }
-    ARY_SET_LEN(ary, j);
+    RARRAY(ary)->len = j;
 
     return ary;
 }
@@ -2806,7 +2651,7 @@
     }
     n = p - RARRAY_PTR(ary);
     RESIZE_CAPA(ary, n);
-    ARY_SET_LEN(ary, n);
+    RARRAY(ary)->len = n;
 
     return ary;
 }

Modified: trunk/ext/socket/extconf.rb
===================================================================
--- trunk/ext/socket/extconf.rb	2006-11-06 08:30:05 UTC (rev 574)
+++ trunk/ext/socket/extconf.rb	2006-11-06 13:53:20 UTC (rev 575)
@@ -141,6 +141,10 @@
       if (ai->ai_addr == NULL)
         goto bad;
 #if defined(_AIX)
+      if (ai->ai_family == AF_INET6 && passive) {
+        inet6++;
+        continue;
+      }
       ai->ai_addr->sa_len = ai->ai_addrlen;
       ai->ai_addr->sa_family = ai->ai_family;
 #endif

Modified: trunk/ext/socket/socket.c
===================================================================
--- trunk/ext/socket/socket.c	2006-11-06 08:30:05 UTC (rev 574)
+++ trunk/ext/socket/socket.c	2006-11-06 13:53:20 UTC (rev 575)
@@ -3,7 +3,7 @@
   socket.c -
 
   $Author: matz $
-  $Date: 2006/09/26 23:31:02 $
+  $Date: 2006/11/02 15:38:59 $
   created at: Thu Mar 31 12:21:29 JST 1994
 
   Copyright (C) 1993-2001 Yukihiro Matsumoto
@@ -188,6 +188,34 @@
 }
 #undef getaddrinfo
 #define getaddrinfo(node,serv,hints,res) ruby_getaddrinfo__aix((node),(serv),(hints),(res))
+static int
+ruby_getnameinfo__aix(sa, salen, host, hostlen, serv, servlen, flags)
+     const struct sockaddr *sa;
+     size_t salen;
+     char *host;
+     size_t hostlen;
+     char *serv;
+     size_t servlen;
+     int flags;
+{
+  struct sockaddr_in6 *sa6;
+  u_int32_t *a6;
+
+  if (sa->sa_family == AF_INET6) {
+    sa6 = (struct sockaddr_in6 *)sa;
+    a6 = sa6->sin6_addr.u6_addr.u6_addr32;
+
+    if (a6[0] == 0 && a6[1] == 0 && a6[2] == 0 && a6[3] == 0) {
+      strncpy(host, "::", hostlen);
+      snprintf(serv, servlen, "%d", sa6->sin6_port);
+      return 0;
+    }
+  }
+  return getnameinfo(sa, salen, host, hostlen, serv, servlen, flags);
+}
+#undef getnameinfo
+#define getnameinfo(sa, salen, host, hostlen, serv, servlen, flags) \
+            ruby_getnameinfo__aix((sa), (salen), (host), (hostlen), (serv), (servlen), (flags))
 #ifndef CMSG_SPACE
 # define CMSG_SPACE(len) (_CMSG_ALIGN(sizeof(struct cmsghdr)) + _CMSG_ALIGN(len))
 #endif

Modified: trunk/gc.c
===================================================================
--- trunk/gc.c	2006-11-06 08:30:05 UTC (rev 574)
+++ trunk/gc.c	2006-11-06 13:53:20 UTC (rev 575)
@@ -3,7 +3,7 @@
   gc.c -
 
   $Author: nobu $
-  $Date: 2005/10/08 09:58:23 $
+  $Date: 2006/11/01 14:42:39 $
   created at: Tue Oct  5 09:44:46 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -982,7 +982,7 @@
 
       case T_ARRAY:
 	if (FL_TEST(obj, ELTS_SHARED)) {
-	    ptr = obj->as.array.as.heap.aux.shared;
+	    ptr = obj->as.array.aux.shared;
 	    goto again;
 	}
 	else {

Modified: trunk/lib/date.rb
===================================================================
--- trunk/lib/date.rb	2006-11-06 08:30:05 UTC (rev 574)
+++ trunk/lib/date.rb	2006-11-06 13:53:20 UTC (rev 575)
@@ -6,7 +6,7 @@
 # Documentation: William Webber <william williamwebber.com>
 #
 #--
-# $Id: date.rb,v 2.28 2006-10-13 22:04:07+09 tadf Exp $
+# $Id: date.rb,v 2.29 2006-11-05 18:21:29+09 tadf Exp $
 #++
 #
 # == Overview
@@ -1124,8 +1124,14 @@
   def gregorian() new_start(self.class::GREGORIAN) end
 
   def offset() @of end
-  def new_offset(of=0) self.class.new0(@ajd, of, @sg) end
 
+  def new_offset(of=0)
+    if String === of
+      of = (self.class.zone_to_diff(of) || 0).to_r/86400
+    end
+    self.class.new0(@ajd, of, @sg)
+  end
+
   private :offset, :new_offset
 
   # Return a new Date object that is +n+ days later than the
@@ -1229,11 +1235,16 @@
   def next_year(n=1) self >> n * 12 end
   def prev_year(n=1) self << n * 12 end
 
+  require 'enumerator'
+
   # Step the current date forward +step+ days at a
   # time (or backward, if +step+ is negative) until
   # we reach +limit+ (inclusive), yielding the resultant
   # date at each step.
   def step(limit, step=1) # :yield: date
+    unless block_given?
+      return to_enum(:step, limit, step)
+    end
     da = self
     op = %w(- <= >=)[step <=> 0]
     while da.__send__(op, limit)
@@ -1388,6 +1399,9 @@
 	   (fr = valid_time?(h, min, s))
       raise ArgumentError, 'invalid date'
     end
+    if String === of
+      of = (zone_to_diff(of) || 0).to_r/86400
+    end
     new0(jd_to_ajd(jd, fr, of), of, sg)
   end
 
@@ -1410,6 +1424,9 @@
 	   (fr = valid_time?(h, min, s))
       raise ArgumentError, 'invalid date'
     end
+    if String === of
+      of = (zone_to_diff(of) || 0).to_r/86400
+    end
     new0(jd_to_ajd(jd, fr, of), of, sg)
   end
 
@@ -1432,6 +1449,9 @@
 	   (fr = valid_time?(h, min, s))
       raise ArgumentError, 'invalid date'
     end
+    if String === of
+      of = (zone_to_diff(of) || 0).to_r/86400
+    end
     new0(jd_to_ajd(jd, fr, of), of, sg)
   end
 
@@ -1457,6 +1477,9 @@
 	   (fr = valid_time?(h, min, s))
       raise ArgumentError, 'invalid date'
     end
+    if String === of
+      of = (zone_to_diff(of) || 0).to_r/86400
+    end
     new0(jd_to_ajd(jd, fr, of), of, sg)
   end
 
@@ -1547,8 +1570,15 @@
   # Create a new Date object representing today.
   #
   # +sg+ specifies the Day of Calendar Reform.
-  def self.today(sg=ITALY) Time.now.to_date.new_start(sg) end
+  def self.today(sg=ITALY) Time.now.to_date    .new_start(sg) end
 
+  # Create a new DateTime object representing the current time.
+  #
+  # +sg+ specifies the Day of Calendar Reform.
+  def self.now  (sg=ITALY) Time.now.to_datetime.new_start(sg) end
+
+  private_class_method :now
+
 end
 
 class DateTime < Date
@@ -1565,13 +1595,9 @@
   def to_date() Date.new0(self.class.jd_to_ajd(jd, 0, 0), 0, @sg) end
   def to_datetime() self end
 
-  class << self; undef_method :today end
+  private_class_method :today
+  public_class_method  :now
 
-  # Create a new DateTime object representing the current time.
-  #
-  # +sg+ specifies the Day of Calendar Reform.
-  def self.now(sg=ITALY) Time.now.to_datetime.new_start(sg) end
-
 end
 
 class Date

Modified: trunk/lib/net/imap.rb
===================================================================
--- trunk/lib/net/imap.rb	2006-11-06 08:30:05 UTC (rev 574)
+++ trunk/lib/net/imap.rb	2006-11-06 13:53:20 UTC (rev 575)
@@ -2637,7 +2637,7 @@
         token = match(T_ATOM)
         name = token.value.upcase
         case name
-        when /\A(?:ALERT|PARSE|READ-ONLY|READ-WRITE|TRYCREATE)\z/n
+        when /\A(?:ALERT|PARSE|READ-ONLY|READ-WRITE|TRYCREATE|NOMODSEQ)\z/n
           result = ResponseCode.new(name, nil)
         when /\A(?:PERMANENTFLAGS)\z/n
           match(T_SPACE)

Modified: trunk/lib/rss/0.9.rb
===================================================================
--- trunk/lib/rss/0.9.rb	2006-11-06 08:30:05 UTC (rev 574)
+++ trunk/lib/rss/0.9.rb	2006-11-06 13:53:20 UTC (rev 575)
@@ -17,7 +17,7 @@
 
     include RSS09
     include RootElementMixin
-    include XMLStyleSheetMixin
+    # include XMLStyleSheetMixin
 
     [
       ["channel", nil],

Modified: trunk/lib/set.rb
===================================================================
--- trunk/lib/set.rb	2006-11-06 08:30:05 UTC (rev 574)
+++ trunk/lib/set.rb	2006-11-06 13:53:20 UTC (rev 575)
@@ -9,7 +9,7 @@
 # All rights reserved.  You can redistribute and/or modify it under the same
 # terms as Ruby.
 #
-#   $Id: set.rb,v 1.29 2005/07/04 10:31:44 ocean Exp $
+#   $Id: set.rb,v 1.31 2006/11/02 05:45:12 knu Exp $
 #
 # == Overview 
 # 
@@ -294,8 +294,8 @@
   # and the given enumerable object.  (set ^ enum) is equivalent to
   # ((set | enum) - (set & enum)).
   def ^(enum)
-    n = dup
-    enum.each { |o| if n.include?(o) then n.delete(o) else n.add(o) end }
+    n = Set.new(enum)
+    each { |o| if n.include?(o) then n.delete(o) else n.add(o) end }
     n
   end
 
@@ -640,7 +640,6 @@
       Set.new([])
       Set.new([1,2])
       Set.new('a'..'c')
-      Set.new('XYZ')
     }
     assert_raises(NoMethodError) {
       Set.new(false)
@@ -1040,6 +1039,13 @@
     assert_equal(Set[2,4], ret)
   end
 
+  def test_xor
+    set = Set[1,2,3,4]
+    ret = set ^ [2,4,5,5]
+    assert_not_same(set, ret)
+    assert_equal(Set[1,3,5], ret)
+  end
+
   def test_eq
     set1 = Set[2,3,1]
     set2 = Set[1,2,3]

Modified: trunk/lib/soap/mapping/rubytypeFactory.rb
===================================================================
--- trunk/lib/soap/mapping/rubytypeFactory.rb	2006-11-06 08:30:05 UTC (rev 574)
+++ trunk/lib/soap/mapping/rubytypeFactory.rb	2006-11-06 13:53:20 UTC (rev 575)
@@ -38,6 +38,14 @@
   def obj2soap(soap_class, obj, info, map)
     param = nil
     case obj
+    when ::Symbol
+      unless @allow_original_mapping
+        return nil
+      end
+      param = SOAPStruct.new(TYPE_SYMBOL)
+      mark_marshalled_obj(obj, param)
+      param.add('id', SOAPString.new(obj.id2name))
+      addiv2soapattr(param, obj, map)
     when ::String
       unless @allow_original_mapping
         return nil
@@ -185,14 +193,6 @@
       mark_marshalled_obj(obj, param)
       param.add('name', SOAPString.new(obj.name))
       addiv2soapattr(param, obj, map)
-    when ::Symbol
-      unless @allow_original_mapping
-        return nil
-      end
-      param = SOAPStruct.new(TYPE_SYMBOL)
-      mark_marshalled_obj(obj, param)
-      param.add('id', SOAPString.new(obj.id2name))
-      addiv2soapattr(param, obj, map)
     when ::Struct
       unless @allow_original_mapping
         # treat it as an user defined class. [ruby-talk:104980]

Modified: trunk/lib/soap/mimemessage.rb
===================================================================
--- trunk/lib/soap/mimemessage.rb	2006-11-06 08:30:05 UTC (rev 574)
+++ trunk/lib/soap/mimemessage.rb	2006-11-06 13:53:20 UTC (rev 575)
@@ -49,7 +49,7 @@
 
     def parse(str)
       header_cache = nil
-      str.each do |line|
+      str.lines.each do |line|
 	case line
 	when /^\A[^\: \t]+:\s*.+$/
 	  parse_line(header_cache) if header_cache

Modified: trunk/lib/soap/property.rb
===================================================================
--- trunk/lib/soap/property.rb	2006-11-06 08:30:05 UTC (rev 574)
+++ trunk/lib/soap/property.rb	2006-11-06 13:53:20 UTC (rev 575)
@@ -70,7 +70,7 @@
   LINE_REGEXP = Regexp.new("^#{DEF_REGSRC}$")
   def load(stream)
     key_prefix = ""
-    stream.each_with_index do |line, lineno|
+    stream.lines.each_with_index do |line, lineno|
       line.sub!(/\r?\n\z/, '')
       case line
       when COMMENT_REGEXP

Modified: trunk/lib/webrick/httprequest.rb
===================================================================
--- trunk/lib/webrick/httprequest.rb	2006-11-06 08:30:05 UTC (rev 574)
+++ trunk/lib/webrick/httprequest.rb	2006-11-06 13:53:20 UTC (rev 575)
@@ -240,7 +240,7 @@
         end
       end
       begin
-        @header = HTTPUtils::parse_header(@raw_header)
+        @header = HTTPUtils::parse_header( raw_header.join)
       rescue => ex
         raise  HTTPStatus::BadRequest, ex.message
       end

Modified: trunk/lib/webrick/httputils.rb
===================================================================
--- trunk/lib/webrick/httputils.rb	2006-11-06 08:30:05 UTC (rev 574)
+++ trunk/lib/webrick/httputils.rb	2006-11-06 13:53:20 UTC (rev 575)
@@ -127,7 +127,7 @@
     def parse_header(raw)
       header = Hash.new([].freeze)
       field = nil
-      raw.each{|line|
+      raw.lines.each{|line|
         case line
         when /^([A-Za-z0-9!\#$%&'*+\-.^_`|~]+):\s*(.*?)\s*\z/om
           field, value = $1, $2

Modified: trunk/lib/xmlrpc/create.rb
===================================================================
--- trunk/lib/xmlrpc/create.rb	2006-11-06 08:30:05 UTC (rev 574)
+++ trunk/lib/xmlrpc/create.rb	2006-11-06 13:53:20 UTC (rev 575)
@@ -3,7 +3,7 @@
 # 
 # Copyright (C) 2001, 2002, 2003 by Michael Neumann (mneumann ntecs.de)
 #
-# $Id: create.rb,v 1.3 2006/06/21 05:13:47 matz Exp $
+# $Id: create.rb,v 1.4 2006/11/02 00:21:27 matz Exp $
 #
 
 require "date"
@@ -194,12 +194,12 @@
 	when TrueClass, FalseClass
 	  @writer.tag("boolean", param ? "1" : "0")
 
+	when Symbol 
+	  @writer.tag("string", param.to_s)
+
 	when String 
 	  @writer.tag("string", param)
 
-	when Symbol 
-	  @writer.tag("string", param.to_s)
-
         when NilClass
           if Config::ENABLE_NIL_CREATE
             @writer.ele("nil")

Modified: trunk/lib/xsd/codegen/gensupport.rb
===================================================================
--- trunk/lib/xsd/codegen/gensupport.rb	2006-11-06 08:30:05 UTC (rev 574)
+++ trunk/lib/xsd/codegen/gensupport.rb	2006-11-06 13:53:20 UTC (rev 575)
@@ -129,22 +129,22 @@
 private
 
   def trim_eol(str)
-    str.collect { |line|
+    str.lines.collect { |line|
       line.sub(/\r?\n\z/, "") + "\n"
     }.join
   end
 
   def trim_indent(str)
     indent = nil
-    str = str.collect { |line| untab(line) }.join
-    str.each do |line|
+    str = str.lines.collect { |line| untab(line) }.join
+    str.each_line do |line|
       head = line.index(/\S/)
       if !head.nil? and (indent.nil? or head < indent)
         indent = head
       end
     end
     return str unless indent
-    str.collect { |line|
+    str.lines.collect { |line|
       line.sub(/^ {0,#{indent}}/, "")
     }.join
   end

Modified: trunk/object.c
===================================================================
--- trunk/object.c	2006-11-06 08:30:05 UTC (rev 574)
+++ trunk/object.c	2006-11-06 13:53:20 UTC (rev 575)
@@ -3,7 +3,7 @@
   object.c -
 
   $Author: matz $
-  $Date: 2006/10/13 09:24:31 $
+  $Date: 2006/11/06 10:27:58 $
   created at: Thu Jul 15 12:01:24 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -714,6 +714,8 @@
 }
 
 /*
+ * Document-method: to_a
+ *
  *  call-seq:
  *     nil.to_a    => []
  *  
@@ -722,6 +724,16 @@
  *     nil.to_a   #=> []
  */
 
+/*
+ * Document-method: to_splat
+ *
+ *  call-seq:
+ *     nil.to_splat   => []
+ *  
+ *  Always returns an empty array.
+ *     
+ */
+
 static VALUE
 nil_to_a(VALUE obj)
 {
@@ -2333,6 +2345,7 @@
     rb_define_method(rb_cNilClass, "to_f", nil_to_f, 0);
     rb_define_method(rb_cNilClass, "to_s", nil_to_s, 0);
     rb_define_method(rb_cNilClass, "to_a", nil_to_a, 0);
+    rb_define_method(rb_cNilClass, "to_splat", nil_to_a, 0);
     rb_define_method(rb_cNilClass, "inspect", nil_inspect, 0);
     rb_define_method(rb_cNilClass, "&", false_and, 1);
     rb_define_method(rb_cNilClass, "|", false_or, 1);

Modified: trunk/rb/ir.rb
===================================================================
--- trunk/rb/ir.rb	2006-11-06 08:30:05 UTC (rev 574)
+++ trunk/rb/ir.rb	2006-11-06 13:53:20 UTC (rev 575)
@@ -3,9 +3,10 @@
 #
 
 IGNORE = ['eval.c', 'version.c', 'inits.c']
+DIFFDIR = 'diffs'
 
 def output_filename f
-  "_.#{f}".tr('/', '_')
+  File.join(DIFFDIR, "#{f}".tr('/', '_'))
 end
 
 def make_diff dir1, dir2, *files
@@ -43,7 +44,7 @@
   puts cmd
   
   if system(cmd)
-    `mv -f "#{patch_file}" __."#{patch_file}"`
+    `mv -f "#{patch_file}" "#{patch_file}.done"`
   end
 end
 

Modified: trunk/ruby.h
===================================================================
--- trunk/ruby.h	2006-11-06 08:30:05 UTC (rev 574)
+++ trunk/ruby.h	2006-11-06 13:53:20 UTC (rev 575)
@@ -2,7 +2,7 @@
 
   ruby.h -
 
-  $Author: why $
+  $Author: matz $
   created at: Thu Jun 10 14:26:32 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -399,33 +399,17 @@
      RSTRING(str)->as.ary : \
      RSTRING(str)->as.heap.ptr)
 
-#define RARRAY_EMBED_LEN_MAX 3
 struct RArray {
     struct RBasic basic;
-    union {
-	struct {
     long len;
     union {
 	long capa;
 	VALUE shared;
     } aux;
     VALUE *ptr;
-	} heap;
-	VALUE ary[RARRAY_EMBED_LEN_MAX];
-    } as;
 };
-#define RARRAY_NOEMBED FL_USER3
-#define RARRAY_EMBED_LEN_MASK (FL_USER4|FL_USER5)
-#define RARRAY_EMBED_LEN_SHIFT (FL_USHIFT+4)
-#define RARRAY_LEN(a) \
-    (!(RBASIC(a)->flags & RARRAY_NOEMBED) ? \
-     (long)((RBASIC(a)->flags >> RARRAY_EMBED_LEN_SHIFT) & \
-            (RARRAY_EMBED_LEN_MASK >> RARRAY_EMBED_LEN_SHIFT)) : \
-     RARRAY(a)->as.heap.len)
-#define RARRAY_PTR(a) \
-    (!(RBASIC(a)->flags & RARRAY_NOEMBED) ? \
-     RARRAY(a)->as.ary : \
-     RARRAY(a)->as.heap.ptr)
+#define RARRAY_LEN(a) RARRAY(a)->len
+#define RARRAY_PTR(a) RARRAY(a)->ptr
 
 struct RRegexp {
     struct RBasic basic;

Modified: trunk/string.c
===================================================================
--- trunk/string.c	2006-11-06 08:30:05 UTC (rev 574)
+++ trunk/string.c	2006-11-06 13:53:20 UTC (rev 575)
@@ -3,7 +3,7 @@
   string.c -
 
   $Author: matz $
-  $Date: 2006/10/22 08:06:16 $
+  $Date: 2006/11/06 06:37:40 $
   created at: Mon Aug  9 17:12:58 JST 1993
 
   Copyright (C) 1993-2006 Yukihiro Matsumoto
@@ -879,105 +879,131 @@
     return rb_str_append(str1, str2);
 }
 
-/*
- * hash_32 - 32 bit Fowler/Noll/Vo FNV-1a hash code
- *
- * @(#) $hash_32.Revision: 1.1 $
- * @(#) $hash_32.Id: hash_32a.c,v 1.1 2003/10/03 20:38:53 chongo Exp $
- * @(#) $hash_32.Source: /usr/local/src/cmd/fnv/RCS/hash_32a.c,v $
- *
- ***
- *
- * Fowler/Noll/Vo hash
- *
- * The basis of this hash algorithm was taken from an idea sent
- * as reviewer comments to the IEEE POSIX P1003.2 committee by:
- *
- *      Phong Vo (http://www.research.att.com/info/kpv/)
- *      Glenn Fowler (http://www.research.att.com/~gsf/)
- *
- * In a subsequent ballot round:
- *
- *      Landon Curt Noll (http://www.isthe.com/chongo/)
- *
- * improved on their algorithm.  Some people tried this hash
- * and found that it worked rather well.  In an EMail message
- * to Landon, they named it the ``Fowler/Noll/Vo'' or FNV hash.
- *
- * FNV hashes are designed to be fast while maintaining a low
- * collision rate. The FNV speed allows one to quickly hash lots
- * of data while maintaining a reasonable collision rate.  See:
- *
- *      http://www.isthe.com/chongo/tech/comp/fnv/index.html
- *
- * for more details as well as other forms of the FNV hash.
- ***
- *
- * To use the recommended 32 bit FNV-1a hash, pass FNV1_32A_INIT as the
- * Fnv32_t hashval argument to fnv_32a_buf() or fnv_32a_str().
- *
- ***
- *
- * Please do not copyright this code.  This code is in the public domain.
- *
- * LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
- * EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
- * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- *
- * By:
- *	chongo <Landon Curt Noll> /\oo/\
- *      http://www.isthe.com/chongo/
- *
- * Share and Enjoy!	:-)
- */
+typedef  unsigned int  ub4;   /* unsigned 4-byte quantities */
+typedef  unsigned char ub1;   /* unsigned 1-byte quantities */
 
+#define hashsize(n) ((ub4)1<<(n))
+#define hashmask(n) (hashsize(n)-1)
+
 /*
- * 32 bit FNV-1 and FNV-1a non-zero initial basis
- *
- * The FNV-1 initial basis is the FNV-0 hash of the following 32 octets:
- *
- *              chongo <Landon Curt Noll> /\../\
- *
- * NOTE: The \'s above are not back-slashing escape characters.
- * They are literal ASCII  backslash 0x5c characters.
- *
- * NOTE: The FNV-1a initial basis is the same value as FNV-1 by definition.
- */
-#define FNV1_32A_INIT 0x811c9dc5
+--------------------------------------------------------------------
+mix -- mix 3 32-bit values reversibly.
+For every delta with one or two bits set, and the deltas of all three
+  high bits or all three low bits, whether the original value of a,b,c
+  is almost all zero or is uniformly distributed,
+* If mix() is run forward or backward, at least 32 bits in a,b,c
+  have at least 1/4 probability of changing.
+* If mix() is run forward, every bit of c will change between 1/3 and
+  2/3 of the time.  (Well, 22/100 and 78/100 for some 2-bit deltas.)
+mix() was built out of 36 single-cycle latency instructions in a 
+  structure that could supported 2x parallelism, like so:
+      a -= b; 
+      a -= c; x = (c>>13);
+      b -= c; a ^= x;
+      b -= a; x = (a<<8);
+      c -= a; b ^= x;
+      c -= b; x = (b>>13);
+      ...
+  Unfortunately, superscalar Pentiums and Sparcs can't take advantage 
+  of that parallelism.  They've also turned some of those single-cycle
+  latency instructions into multi-cycle latency instructions.  Still,
+  this is the fastest good hash I could find.  There were about 2^^68
+  to choose from.  I only looked at a billion or so.
+--------------------------------------------------------------------
+*/
+#define mix(a,b,c) \
+{ \
+  a -= b; a -= c; a ^= (c>>13); \
+  b -= c; b -= a; b ^= (a<<8); \
+  c -= a; c -= b; c ^= (b>>13); \
+  a -= b; a -= c; a ^= (c>>12);  \
+  b -= c; b -= a; b ^= (a<<16); \
+  c -= a; c -= b; c ^= (b>>5); \
+  a -= b; a -= c; a ^= (c>>3);  \
+  b -= c; b -= a; b ^= (a<<10); \
+  c -= a; c -= b; c ^= (b>>15); \
+}
 
 /*
- * 32 bit magic FNV-1a prime
- */
-#define FNV_32_PRIME 0x01000193
+--------------------------------------------------------------------
+hash() -- hash a variable-length key into a 32-bit value
+  k       : the key (the unaligned variable-length array of bytes)
+  len     : the length of the key, counting by bytes
+  initval : can be any 4-byte value
+Returns a 32-bit value.  Every bit of the key affects every bit of
+the return value.  Every 1-bit and 2-bit delta achieves avalanche.
+About 6*len+35 instructions.
 
-int
-rb_memhash(const void *ptr, long len)
+The best hash table sizes are powers of 2.  There is no need to do
+mod a prime (mod is sooo slow!).  If you need less than 32 bits,
+use a bitmask.  For example, if you need only 10 bits, do
+  h = (h & hashmask(10));
+In which case, the hash table should have hashsize(10) elements.
+
+If you are hashing n strings (ub1 **)k, do it like this:
+  for (i=0, h=0; i<n; ++i) h = hash( k[i], len[i], h);
+
+By Bob Jenkins, 1996.  bob_jenkins burtleburtle.net.  You may use this
+code any way you wish, private, educational, or commercial.  It's free.
+
+See http://burtleburtle.net/bob/hash/evahash.html
+Use for hash table lookup, or anything where one collision in 2^^32 is
+acceptable.  Do NOT use for cryptographic purposes.
+--------------------------------------------------------------------
+*/
+
+static ub4
+hash(const ub1 *k, ub4 length, ub4 initval)
+    /* k: the key */
+    /* length: the length of the key */
+    /* initval: the previous hash, or an arbitrary value */
 {
-    register const unsigned char *p = ptr;
-    register unsigned int hval = FNV1_32A_INIT;
+    register ub4 a,b,c,len;
 
-    /*
-     * FNV-1a hash each octet in the buffer
-     */
-    while (len--) {
-	/* xor the bottom with the current octet */
-	hval ^= (unsigned int)*p++;
+    /* Set up the internal state */
+    len = length;
+    a = b = 0x9e3779b9;  /* the golden ratio; an arbitrary value */
+    c = initval;         /* the previous hash value */
 
-	/* multiply by the 32 bit FNV magic prime mod 2^32 */
-#if defined(FNV_GCC_OPTIMIZATION)
-	hval += (hval<<1) + (hval<<4) + (hval<<7) + (hval<<8) + (hval<<24);
-#else
-	hval *= FNV_32_PRIME;
-#endif
+   /*---------------------------------------- handle most of the key */
+    while (len >= 12) {
+	a += (k[0] +((ub4)k[1]<<8) +((ub4)k[2]<<16) +((ub4)k[3]<<24));
+	b += (k[4] +((ub4)k[5]<<8) +((ub4)k[6]<<16) +((ub4)k[7]<<24));
+	c += (k[8] +((ub4)k[9]<<8) +((ub4)k[10]<<16)+((ub4)k[11]<<24));
+	mix(a,b,c);
+	k += 12; len -= 12;
     }
-    return hval;
+
+    /*------------------------------------- handle the last 11 bytes */
+    c += length;
+    switch(len)              /* all the case statements fall through */
+    {
+      case 11: c+=((ub4)k[10]<<24);
+      case 10: c+=((ub4)k[9]<<16);
+      case 9 : c+=((ub4)k[8]<<8);
+	/* the first byte of c is reserved for the length */
+      case 8 : b+=((ub4)k[7]<<24);
+      case 7 : b+=((ub4)k[6]<<16);
+      case 6 : b+=((ub4)k[5]<<8);
+      case 5 : b+=k[4];
+      case 4 : a+=((ub4)k[3]<<24);
+      case 3 : a+=((ub4)k[2]<<16);
+      case 2 : a+=((ub4)k[1]<<8);
+      case 1 : a+=k[0];
+	/* case 0: nothing left to add */
+    }
+    mix(a,b,c);
+    /*-------------------------------------------- report the result */
+    return c;
 }
 
 int
+rb_memhash(const void *ptr, long len)
+{
+    return hash(ptr, len, 0);
+}
+
+int
 rb_str_hash(VALUE str)
 {
     return rb_memhash(RSTRING_PTR(str), RSTRING_LEN(str));
@@ -3566,7 +3592,7 @@
  *     str.lines(separator=$/) {|substr| block }        => str
  *  
  *  Returns an enumerator that gives each line in the string.  If a block is
- *  given, it iterates over eac line in the string.
+ *  given, it iterates over each line in the string.
  *     
  *     "foo\nbar\n".lines.to_a   #=> ["foo\n", "bar\n"]
  *     "foo\nb ar".lines.sort    #=> ["b ar", "foo\n"]
@@ -4786,6 +4812,12 @@
 }
 
 
+static VALUE
+sym_succ(VALUE sym)
+{
+    return rb_str_intern(rb_str_succ(sym));
+}
+
 static ID
 str_to_id(VALUE str)
 {
@@ -4955,7 +4987,8 @@
     rb_define_variable("$;", &rb_fs);
     rb_define_variable("$-F", &rb_fs);
 
-    rb_cSymbol = rb_define_class("Symbol", rb_cString);
+    rb_cSymbol = rb_define_class("Symbol", rb_cObject);
+    rb_include_module(rb_cSymbol, rb_mComparable);
     rb_undef_alloc_func(rb_cSymbol);
     rb_undef_method(CLASS_OF(rb_cSymbol), "new");
     rb_define_singleton_method(rb_cSymbol, "all_symbols", rb_sym_all_symbols, 0); /* in parse.y */
@@ -4971,4 +5004,51 @@
     rb_define_method(rb_cSymbol, "intern", sym_to_sym, 0);
     rb_define_method(rb_cSymbol, "to_sym", sym_to_sym, 0);
     rb_define_method(rb_cSymbol, "to_proc", sym_to_proc, 0);
+    rb_define_method(rb_cSymbol, "succ", sym_succ, 0);
+    rb_define_method(rb_cSymbol, "next", sym_succ, 0);
+
+    rb_define_method(rb_cSymbol, "<=>", rb_str_cmp_m, 1);
+    rb_define_method(rb_cSymbol, "casecmp", rb_str_casecmp, 1);
+    rb_define_method(rb_cSymbol, "+", rb_str_plus, 1);
+    rb_define_method(rb_cSymbol, "*", rb_str_times, 1);
+    rb_define_method(rb_cSymbol, "%", rb_str_format_m, 1);
+    rb_define_method(rb_cSymbol, "[]", rb_str_aref_m, -1);
+    rb_define_method(rb_cSymbol, "length", rb_str_length, 0);
+    rb_define_method(rb_cSymbol, "size", rb_str_length, 0);
+    rb_define_method(rb_cSymbol, "empty?", rb_str_empty, 0);
+    rb_define_method(rb_cSymbol, "=~", rb_str_match, 1);
+    rb_define_method(rb_cSymbol, "match", rb_str_match_m, -1);
+    rb_define_method(rb_cSymbol, "index", rb_str_index_m, -1);
+    rb_define_method(rb_cSymbol, "rindex", rb_str_rindex_m, -1);
+    rb_define_method(rb_cSymbol, "chr", rb_str_chr, 0);
+
+    rb_define_method(rb_cSymbol, "to_f", rb_str_to_f, 0);
+    rb_define_method(rb_cSymbol, "to_str", rb_str_to_s, 0);
+    rb_define_method(rb_cSymbol, "dump", rb_str_dump, 0);
+
+    rb_define_method(rb_cSymbol, "upcase", rb_str_upcase, 0);
+    rb_define_method(rb_cSymbol, "downcase", rb_str_downcase, 0);
+    rb_define_method(rb_cSymbol, "capitalize", rb_str_capitalize, 0);
+    rb_define_method(rb_cSymbol, "swapcase", rb_str_swapcase, 0);
+
+    rb_define_method(rb_cSymbol, "ord", rb_str_ord, 0);
+
+    rb_define_method(rb_cSymbol, "include?", rb_str_include, 1);
+    rb_define_method(rb_cSymbol, "start_with?", rb_str_start_with, -1);
+    rb_define_method(rb_cSymbol, "end_with?", rb_str_end_with, -1);
+
+    rb_define_method(rb_cSymbol, "scan", rb_str_scan, 1);
+
+    rb_define_method(rb_cSymbol, "sub", rb_str_sub, -1);
+    rb_define_method(rb_cSymbol, "gsub", rb_str_gsub, -1);
+ 
+    rb_define_method(rb_cSymbol, "tr", rb_str_tr, 2);
+    rb_define_method(rb_cSymbol, "tr_s", rb_str_tr_s, 2);
+    rb_define_method(rb_cSymbol, "delete", rb_str_delete, -1);
+    rb_define_method(rb_cSymbol, "squeeze", rb_str_squeeze, -1);
+    rb_define_method(rb_cSymbol, "count", rb_str_count, -1);
+
+    rb_define_method(rb_cSymbol, "each_byte", rb_str_each_byte, 0);
+
+    rb_define_method(rb_cSymbol, "slice", rb_str_aref_m, -1);
 }

Modified: trunk/version.h
===================================================================
--- trunk/version.h	2006-11-06 08:30:05 UTC (rev 574)
+++ trunk/version.h	2006-11-06 13:53:20 UTC (rev 575)
@@ -1,14 +1,14 @@
 #define RUBY_VERSION "2.0.0"
-#define RUBY_RELEASE_DATE "2006-11-01"
+#define RUBY_RELEASE_DATE "2006-11-06"
 #define RUBY_VERSION_CODE 200
-#define RUBY_RELEASE_CODE 20061101
+#define RUBY_RELEASE_CODE 20061106
 
-#define RUBY_VERSION_MAJOR 2
-#define RUBY_VERSION_MINOR 0
+#define RUBY_VERSION_MAJOR 1
+#define RUBY_VERSION_MINOR 9
 #define RUBY_VERSION_TEENY 0
 #define RUBY_RELEASE_YEAR 2006
 #define RUBY_RELEASE_MONTH 11
-#define RUBY_RELEASE_DAY 1
+#define RUBY_RELEASE_DAY 6
 
 RUBY_EXTERN const char ruby_version[];
 RUBY_EXTERN const char ruby_release_date[];

Modified: trunk/vm_dump.c
===================================================================
--- trunk/vm_dump.c	2006-11-06 08:30:05 UTC (rev 574)
+++ trunk/vm_dump.c	2006-11-06 13:53:20 UTC (rev 575)
@@ -219,7 +219,7 @@
     VALUE *dfp = cfp->dfp;
 
     int argc, local_size;
-    char *name;
+    const char *name;
     yarv_iseq_t *iseq = cfp->iseq;
 
     if (iseq == 0) {


--
ML: yarv-diff quickml.atdot.net
Info: http://www.atdot.net/~ko1/quickml

[前][次][番号順一覧][スレッド一覧][生データ]