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