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

2000-02-25

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@627 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2000-02-25 03:51:23 +00:00
parent e13f96f413
commit 7ed66b9e1d
10 changed files with 114 additions and 80 deletions

View file

@ -1,3 +1,12 @@
Fri Feb 25 12:50:20 2000 Yukihiro Matsumoto <matz@netlab.co.jp>
* eval.c (rb_thread_start_timer): interval made 10ms from 50ms.
Thu Feb 24 16:53:47 2000 Yukihiro Matsumoto <matz@netlab.co.jp>
* eval.c (rb_thread_schedule): priority check for sleep expired
threads needed.
Wed Feb 23 14:22:32 2000 Yukihiro Matsumoto <matz@netlab.co.jp>
* array.c (rb_ary_join): forgot to initialize a local variable

1
ToDo
View file

@ -66,6 +66,7 @@ Standard Libraries
* String#{pred,prev}, String#downto
* optional stepsize argument for succ()
* performance tune for String's non-bang methods.
* Ruby module -- Ruby::Version, Ruby::Interpreter
Extension Libraries

View file

@ -605,6 +605,8 @@ rb_scan_args(argc, argv, fmt, va_alist)
va_init_list(vargs, fmt);
if (*p == '*') goto rest_arg;
if (ISDIGIT(*p)) {
n = *p - '0';
if (n > argc)
@ -634,6 +636,7 @@ rb_scan_args(argc, argv, fmt, va_alist)
}
if(*p == '*') {
rest_arg:
var = va_arg(vargs, VALUE*);
if (argc > i) {
if (var) *var = rb_ary_new4(argc-i, argv+i);

5
eval.c
View file

@ -6603,7 +6603,8 @@ rb_thread_schedule()
th->wait_for &= ~WAIT_TIME;
th->status = THREAD_RUNNABLE;
num_waiting_on_timer--;
next = th;
if (!next || next->priority < th->priority)
next = th;
} else if (th->delay < delay) {
delay = th->delay;
}
@ -7216,7 +7217,7 @@ rb_thread_start_timer()
if (!thread_init) return;
tval.it_interval.tv_sec = 0;
tval.it_interval.tv_usec = 50000;
tval.it_interval.tv_usec = 10000;
tval.it_value = tval.it_interval;
setitimer(ITIMER_VIRTUAL, &tval, NULL);
}

16
hash.c
View file

@ -89,23 +89,7 @@ rb_any_hash(a)
break;
case T_STRING:
#if 0
hval = rb_str_hash(a);
#else
{
register const char *p = RSTRING(a)->ptr;
register int len = RSTRING(a)->len;
register unsigned int h = 0, g;
while (len--) {
h = ( h << 4 ) + *p++;
if ( g = h & 0xF0000000 )
h ^= g >> 24;
h &= ~g;
}
hval = h;
}
#endif
break;
default:

View file

@ -9,25 +9,25 @@ class Mail
@header = {}
@body = []
begin
while f.gets()
$_.chop!
next if /^From / # skip From-line
break if /^$/ # end of header
while line = f.gets()
line.chop!
next if /^From /=~line # skip From-line
break if /^$/=~line # end of header
if /^(\S+):\s*(.*)/
if /^(\S+):\s*(.*)/=~line
(attr = $1).capitalize!
@header[attr] = $2
elsif attr
sub!(/^\s*/, '')
@header[attr] += "\n" + $_
line.sub!(/^\s*/, '')
@header[attr] += "\n" + line
end
end
return unless $_
return unless line
while f.gets()
break if /^From /
@body.push($_)
while line = f.gets()
break if /^From /=~line
@body.push(line)
end
ensure
f.close if opened

View file

@ -43,13 +43,12 @@ end
if $0 == __FILE__
a = Open3.popen3("nroff -man")
Thread.start do
while gets
a[0].print $_
while line = gets
a[0].print line
end
a[0].close
end
while a[1].gets
print ":", $_
while line = a[1].gets
print ":", line
end
end

72
st.c
View file

@ -62,7 +62,7 @@ static void rehash();
#define EQUAL(table, x, y) ((*table->type->compare)(x, y) == 0)
#define do_hash(key, table) (unsigned int)(*(table)->type->hash)((key))
#define do_hash_bin(key, table) (do_hash(key, table)%(table)->num_bins)
#define do_hash_bin(key, table) (do_hash(key, table)&(table)->num_bins)
/*
* MINSIZE is the minimum size of a dictionary.
@ -112,6 +112,11 @@ new_size(size)
int i, newsize;
#if 1
for (i=3; i<31; i++) {
if ((1<<i) > size) return 1<<i;
}
return -1;
#else
for (i = 0, newsize = MINSIZE;
i < sizeof(primes)/sizeof(primes[0]);
i++, newsize <<= 1)
@ -120,14 +125,10 @@ new_size(size)
}
/* Ran out of polynomials */
return -1; /* should raise exception */
#else
for (i=3; i<31; i++) {
if ((1<<i) > size) return 1<<i;
}
return -1;
#endif
}
#ifdef HASH_LOG
static int collision = 0;
static int init_st = 0;
@ -138,6 +139,7 @@ stat_col()
fprintf(f, "collision: %d\n", collision);
fclose(f);
}
#endif
st_table*
st_init_table_with_size(type, size)
@ -146,7 +148,7 @@ st_init_table_with_size(type, size)
{
st_table *tbl;
#if 0
#ifdef HASH_LOG
if (init_st == 0) {
init_st = 1;
atexit(stat_col);
@ -158,7 +160,7 @@ st_init_table_with_size(type, size)
tbl = alloc(st_table);
tbl->type = type;
tbl->num_entries = 0;
tbl->num_bins = size;
tbl->num_bins = size-1;
tbl->bins = (st_table_entry **)Calloc(size, sizeof(st_table_entry*));
return tbl;
@ -204,7 +206,7 @@ st_free_table(table)
register st_table_entry *ptr, *next;
int i;
for(i = 0; i < table->num_bins; i++) {
for(i = 0; i <= table->num_bins; i++) {
ptr = table->bins[i];
while (ptr != 0) {
next = ptr->next;
@ -219,11 +221,17 @@ st_free_table(table)
#define PTR_NOT_EQUAL(table, ptr, hash_val, key) \
((ptr) != 0 && (ptr->hash != (hash_val) || !EQUAL((table), (key), (ptr)->key)))
#ifdef HASH_LOG
#define COLLISION collision++
#else
#define COLLISION
#endif
#define FIND_ENTRY(table, ptr, hash_val, bin_pos) \
bin_pos = hash_val%(table)->num_bins;\
bin_pos = hash_val&(table)->num_bins;\
ptr = (table)->bins[bin_pos];\
if (PTR_NOT_EQUAL(table, ptr, hash_val, key)) {\
collision++;\
COLLISION;\
while (PTR_NOT_EQUAL(table, ptr->next, hash_val, key)) {\
ptr = ptr->next;\
}\
@ -253,9 +261,9 @@ st_lookup(table, key, value)
#define ADD_DIRECT(table, key, value, hash_val, bin_pos)\
{\
st_table_entry *entry;\
if (table->num_entries/table->num_bins > ST_DEFAULT_MAX_DENSITY) {\
if (table->num_entries/(table->num_bins+1) > ST_DEFAULT_MAX_DENSITY) {\
rehash(table);\
bin_pos = hash_val % table->num_bins;\
bin_pos = hash_val & table->num_bins;\
}\
\
entry = alloc(st_table_entry);\
@ -298,7 +306,7 @@ st_add_direct(table, key, value)
unsigned int hash_val, bin_pos;
hash_val = do_hash(key, table);
bin_pos = hash_val % table->num_bins;
bin_pos = hash_val & table->num_bins;
ADD_DIRECT(table, key, value, hash_val, bin_pos);
}
@ -310,14 +318,15 @@ rehash(table)
int i, old_num_bins = table->num_bins, new_num_bins;
unsigned int hash_val;
new_num_bins = new_size(old_num_bins);
new_num_bins = new_size(old_num_bins+1);
new_bins = (st_table_entry**)Calloc(new_num_bins, sizeof(st_table_entry*));
for(i = 0; i < old_num_bins; i++) {
new_num_bins--;
for(i = 0; i <= old_num_bins; i++) {
ptr = table->bins[i];
while (ptr != 0) {
next = ptr->next;
hash_val = ptr->hash % new_num_bins;
hash_val = ptr->hash & new_num_bins;
ptr->next = new_bins[hash_val];
new_bins[hash_val] = ptr;
ptr = next;
@ -334,7 +343,7 @@ st_copy(old_table)
{
st_table *new_table;
st_table_entry *ptr, *entry;
int i, num_bins = old_table->num_bins;
int i, num_bins = old_table->num_bins+1;
new_table = alloc(st_table);
if (new_table == 0) {
@ -471,7 +480,7 @@ st_foreach(table, func, arg)
enum st_retval retval;
int i;
for(i = 0; i < table->num_bins; i++) {
for(i = 0; i <= table->num_bins; i++) {
last = 0;
for(ptr = table->bins[i]; ptr != 0;) {
retval = (*func)(ptr->key, ptr->record, arg);
@ -501,14 +510,35 @@ static int
strhash(string)
register char *string;
{
register int val = 0;
register int c;
#ifdef HASH_ELFHASH
register unsigned int h = 0, g;
while ((c = *string++) != '\0') {
h = ( h << 4 ) + c;
if ( g = h & 0xF0000000 )
h ^= g >> 24;
h &= ~g;
}
return h;
#elif HASH_PERL
register int val = 0;
while ((c = *string++) != '\0') {
val = val*33 + c;
}
return val + (val>>5);
#else
register int val = 0;
while ((c = *string++) != '\0') {
val = val*997 + c;
}
return val;
return val + (val>>5);
#endif
}
static int

View file

@ -421,7 +421,29 @@ rb_str_hash(str)
register char *p = RSTRING(str)->ptr;
register int key = 0;
#if 0
#ifdef HASH_ELFHASH
register unsigned int g;
while (len--) {
key = (key << 4) + *p++;
if (g = key & 0xF0000000)
key ^= g >> 24;
key &= ~g;
}
#elif HASH_PERL
if (ruby_ignorecase) {
while (len--) {
key = key*33 + toupper(*p);
p++;
}
}
else {
while (len--) {
key = key*33 + *p++;
}
}
key = key + (key>>5);
#else
if (ruby_ignorecase) {
while (len--) {
key = key*65599 + toupper(*p);
@ -434,18 +456,6 @@ rb_str_hash(str)
p++;
}
}
#else
if (ruby_ignorecase) {
while (len--) {
key = key*33 + toupper(*p);
p++;
}
}
else {
while (len--) {
key = key*33 + *p++;
}
}
key = key + (key>>5);
#endif
return key;
@ -943,16 +953,13 @@ rb_str_aset_m(argc, argv, str)
VALUE *argv;
VALUE str;
{
VALUE arg1, arg2, arg3;
rb_str_modify(str);
if (rb_scan_args(argc, argv, "21", &arg1, &arg2, &arg3) == 3) {
if (argc == 3) {
int beg, len;
if (TYPE(arg3) != T_STRING) arg3 = rb_str_to_str(arg3);
beg = NUM2INT(arg1);
len = NUM2INT(arg2);
if (TYPE(argv[2]) != T_STRING) argv[2] = rb_str_to_str(argv[2]);
beg = NUM2INT(argv[0]);
len = NUM2INT(argv[1]);
if (len < 0) rb_raise(rb_eIndexError, "negative length %d", len);
if (beg < 0) {
beg += RSTRING(str)->len;
@ -966,10 +973,10 @@ rb_str_aset_m(argc, argv, str)
if (beg + len > RSTRING(str)->len) {
len = RSTRING(str)->len - beg;
}
rb_str_replace(str, beg, len, arg3);
return arg3;
rb_str_replace(str, beg, len, argv[2]);
return argv[2];
}
return rb_str_aset(str, arg1, arg2);
return rb_str_aset(str, argv[0], argv[1]);
}
static VALUE

View file

@ -1,4 +1,4 @@
#define RUBY_VERSION "1.5.2"
#define RUBY_RELEASE_DATE "2000-02-23"
#define RUBY_RELEASE_DATE "2000-02-25"
#define RUBY_VERSION_CODE 152
#define RUBY_RELEASE_CODE 20000223
#define RUBY_RELEASE_CODE 20000225