* array.c (rb_ary_delete): element comparison might change array
size. [ruby-dev:24273] * parse.y: make ruby parser reentrant. merge ripper parser to the real one. this change makes ruby require bison. * file.c (rb_file_truncate): clear stdio buffer before truncating the file. [ruby-dev:24191] * ext/digest/digest.c: use rb_obj_class() instead of CLASS_OF which might return singleton class. [ruby-dev:24202] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6919 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
7b66963f61
commit
e77ddaf0d1
25
ChangeLog
25
ChangeLog
@ -1,3 +1,17 @@
|
|||||||
|
Fri Sep 17 17:11:08 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
|
* array.c (rb_ary_delete): element comparison might change array
|
||||||
|
size. [ruby-dev:24273]
|
||||||
|
|
||||||
|
* parse.y: make ruby parser reentrant. merge ripper parser to the
|
||||||
|
real one. this change makes ruby require bison.
|
||||||
|
|
||||||
|
* file.c (rb_file_truncate): clear stdio buffer before truncating
|
||||||
|
the file. [ruby-dev:24191]
|
||||||
|
|
||||||
|
* ext/digest/digest.c: use rb_obj_class() instead of CLASS_OF
|
||||||
|
which might return singleton class. [ruby-dev:24202]
|
||||||
|
|
||||||
Fri Sep 17 16:07:09 2004 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
|
Fri Sep 17 16:07:09 2004 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
|
||||||
|
|
||||||
* ext/tk/lib/multi-tk.rb: improve exit operation
|
* ext/tk/lib/multi-tk.rb: improve exit operation
|
||||||
@ -28,6 +42,11 @@ Thu Sep 16 18:12:13 2004 GOTOU Yuuzou <gotoyuzo@notwork.org>
|
|||||||
(WEBrick::HTTPServlet::FileHandler#initialize): should expand
|
(WEBrick::HTTPServlet::FileHandler#initialize): should expand
|
||||||
the pathname of document root directory.
|
the pathname of document root directory.
|
||||||
|
|
||||||
|
Thu Sep 16 15:49:28 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
|
* string.c (rb_str_intern): protect string argument from GC.
|
||||||
|
[ruby-core:03411]
|
||||||
|
|
||||||
Wed Sep 15 20:22:23 2004 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
|
Wed Sep 15 20:22:23 2004 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
|
||||||
|
|
||||||
* ext/tk/sample/tkoptdb-safeTk.rb: fix a bug depend on the changes
|
* ext/tk/sample/tkoptdb-safeTk.rb: fix a bug depend on the changes
|
||||||
@ -321,6 +340,12 @@ Tue Sep 7 12:48:22 2004 NAKAMURA Usaku <usa@ruby-lang.org>
|
|||||||
* ext/socket/socket.c (wait_connectable, ruby_connect): support
|
* ext/socket/socket.c (wait_connectable, ruby_connect): support
|
||||||
nonblocking connect on various platforms.
|
nonblocking connect on various platforms.
|
||||||
|
|
||||||
|
Mon Sep 6 11:00:47 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
|
* dir.c (dir_s_chdir): the patch to shut up false warning when
|
||||||
|
exception occurred within a block. a patch was given from Johan
|
||||||
|
Holmberg <holmberg@iar.se>. [ruby-core:03292]
|
||||||
|
|
||||||
Mon Sep 6 10:57:40 2004 Hirokazu Yamamoto <ocean@m2.ccsnet.ne.jp>
|
Mon Sep 6 10:57:40 2004 Hirokazu Yamamoto <ocean@m2.ccsnet.ne.jp>
|
||||||
|
|
||||||
* ext/tk/lib/tk/menu.rb(TkOptionMenubutton#insert): call correct method
|
* ext/tk/lib/tk/menu.rb(TkOptionMenubutton#insert): call correct method
|
||||||
|
39
array.c
39
array.c
@ -1923,7 +1923,8 @@ rb_ary_delete(ary, item)
|
|||||||
return Qnil;
|
return Qnil;
|
||||||
}
|
}
|
||||||
|
|
||||||
RARRAY(ary)->len = i2;
|
if (RARRAY(ary)->len > i2)
|
||||||
|
RARRAY(ary)->len = i2;
|
||||||
if (i2 * 2 < RARRAY(ary)->aux.capa &&
|
if (i2 * 2 < RARRAY(ary)->aux.capa &&
|
||||||
RARRAY(ary)->aux.capa > ARY_DEFAULT_SIZE) {
|
RARRAY(ary)->aux.capa > ARY_DEFAULT_SIZE) {
|
||||||
REALLOC_N(RARRAY(ary)->ptr, VALUE, i2 * 2);
|
REALLOC_N(RARRAY(ary)->ptr, VALUE, i2 * 2);
|
||||||
@ -2467,17 +2468,15 @@ VALUE
|
|||||||
rb_ary_assoc(ary, key)
|
rb_ary_assoc(ary, key)
|
||||||
VALUE ary, key;
|
VALUE ary, key;
|
||||||
{
|
{
|
||||||
VALUE *p, *pend;
|
long i;
|
||||||
|
VALUE v;
|
||||||
|
|
||||||
p = RARRAY(ary)->ptr;
|
for (i = 0; i < RARRAY(ary)->len; ++i) {
|
||||||
pend = p + RARRAY(ary)->len;
|
v = RARRAY(ary)->ptr[i];
|
||||||
|
if (TYPE(v) == T_ARRAY &&
|
||||||
while (p < pend) {
|
RARRAY(v)->len > 0 &&
|
||||||
if (TYPE(*p) == T_ARRAY &&
|
rb_equal(RARRAY(v)->ptr[0], key))
|
||||||
RARRAY(*p)->len > 0 &&
|
return v;
|
||||||
rb_equal(RARRAY(*p)->ptr[0], key))
|
|
||||||
return *p;
|
|
||||||
p++;
|
|
||||||
}
|
}
|
||||||
return Qnil;
|
return Qnil;
|
||||||
}
|
}
|
||||||
@ -2500,17 +2499,15 @@ VALUE
|
|||||||
rb_ary_rassoc(ary, value)
|
rb_ary_rassoc(ary, value)
|
||||||
VALUE ary, value;
|
VALUE ary, value;
|
||||||
{
|
{
|
||||||
VALUE *p, *pend;
|
long i;
|
||||||
|
VALUE v;
|
||||||
|
|
||||||
p = RARRAY(ary)->ptr;
|
for (i = 0; i < RARRAY(ary)->len; ++i) {
|
||||||
pend = p + RARRAY(ary)->len;
|
v = RARRAY(ary)->ptr[i];
|
||||||
|
if (TYPE(v) == T_ARRAY &&
|
||||||
while (p < pend) {
|
RARRAY(v)->len > 1 &&
|
||||||
if (TYPE(*p) == T_ARRAY
|
rb_equal(RARRAY(v)->ptr[1], value))
|
||||||
&& RARRAY(*p)->len > 1
|
return v;
|
||||||
&& rb_equal(RARRAY(*p)->ptr[1], value))
|
|
||||||
return *p;
|
|
||||||
p++;
|
|
||||||
}
|
}
|
||||||
return Qnil;
|
return Qnil;
|
||||||
}
|
}
|
||||||
|
22
dir.c
22
dir.c
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
|
|
||||||
dir.c -
|
dir.c -
|
||||||
@ -687,6 +686,19 @@ dir_chdir(path)
|
|||||||
static int chdir_blocking = 0;
|
static int chdir_blocking = 0;
|
||||||
static VALUE chdir_thread = Qnil;
|
static VALUE chdir_thread = Qnil;
|
||||||
|
|
||||||
|
struct chdir_data {
|
||||||
|
char *dist;
|
||||||
|
VALUE path;
|
||||||
|
};
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
chdir_yield(args)
|
||||||
|
struct chdir_data *args;
|
||||||
|
{
|
||||||
|
dir_chdir(args->dist);
|
||||||
|
return rb_yield(args->path);
|
||||||
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
chdir_restore(path)
|
chdir_restore(path)
|
||||||
char *path;
|
char *path;
|
||||||
@ -695,7 +707,6 @@ chdir_restore(path)
|
|||||||
if (chdir_blocking == 0)
|
if (chdir_blocking == 0)
|
||||||
chdir_thread = Qnil;
|
chdir_thread = Qnil;
|
||||||
dir_chdir(path);
|
dir_chdir(path);
|
||||||
free(path);
|
|
||||||
return Qnil;
|
return Qnil;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -767,11 +778,14 @@ dir_s_chdir(argc, argv, obj)
|
|||||||
|
|
||||||
if (rb_block_given_p()) {
|
if (rb_block_given_p()) {
|
||||||
char *cwd = my_getcwd();
|
char *cwd = my_getcwd();
|
||||||
|
struct chdir_data args;
|
||||||
|
|
||||||
chdir_blocking++;
|
chdir_blocking++;
|
||||||
if (chdir_thread == Qnil)
|
if (chdir_thread == Qnil)
|
||||||
chdir_thread = rb_thread_current();
|
chdir_thread = rb_thread_current();
|
||||||
dir_chdir(dist);
|
args.dist = dist;
|
||||||
return rb_ensure(rb_yield, path, chdir_restore, (VALUE)cwd);
|
args.path = path;
|
||||||
|
return rb_ensure(chdir_yield, (VALUE)&args, chdir_restore, (VALUE)cwd);
|
||||||
}
|
}
|
||||||
dir_chdir(dist);
|
dir_chdir(dist);
|
||||||
|
|
||||||
|
@ -149,8 +149,8 @@ rb_digest_base_copy(copy, obj)
|
|||||||
|
|
||||||
if (copy == obj) return copy;
|
if (copy == obj) return copy;
|
||||||
rb_check_frozen(copy);
|
rb_check_frozen(copy);
|
||||||
algo = get_digest_base_metadata(CLASS_OF(copy));
|
algo = get_digest_base_metadata(rb_obj_class(copy));
|
||||||
if (algo != get_digest_base_metadata(CLASS_OF(obj))) {
|
if (algo != get_digest_base_metadata(rb_obj_class(obj))) {
|
||||||
rb_raise(rb_eTypeError, "wrong argument class");
|
rb_raise(rb_eTypeError, "wrong argument class");
|
||||||
}
|
}
|
||||||
Data_Get_Struct(obj, void, pctx1);
|
Data_Get_Struct(obj, void, pctx1);
|
||||||
@ -168,7 +168,7 @@ rb_digest_base_update(self, str)
|
|||||||
void *pctx;
|
void *pctx;
|
||||||
|
|
||||||
StringValue(str);
|
StringValue(str);
|
||||||
algo = get_digest_base_metadata(CLASS_OF(self));
|
algo = get_digest_base_metadata(rb_obj_class(self));
|
||||||
Data_Get_Struct(self, void, pctx);
|
Data_Get_Struct(self, void, pctx);
|
||||||
|
|
||||||
algo->update_func(pctx, RSTRING(str)->ptr, RSTRING(str)->len);
|
algo->update_func(pctx, RSTRING(str)->ptr, RSTRING(str)->len);
|
||||||
@ -201,7 +201,7 @@ rb_digest_base_digest(self)
|
|||||||
size_t len;
|
size_t len;
|
||||||
VALUE str;
|
VALUE str;
|
||||||
|
|
||||||
algo = get_digest_base_metadata(CLASS_OF(self));
|
algo = get_digest_base_metadata(rb_obj_class(self));
|
||||||
Data_Get_Struct(self, void, pctx1);
|
Data_Get_Struct(self, void, pctx1);
|
||||||
|
|
||||||
len = algo->ctx_size;
|
len = algo->ctx_size;
|
||||||
@ -232,7 +232,7 @@ rb_digest_base_hexdigest(self)
|
|||||||
size_t len;
|
size_t len;
|
||||||
VALUE str;
|
VALUE str;
|
||||||
|
|
||||||
algo = get_digest_base_metadata(CLASS_OF(self));
|
algo = get_digest_base_metadata(rb_obj_class(self));
|
||||||
Data_Get_Struct(self, void, pctx1);
|
Data_Get_Struct(self, void, pctx1);
|
||||||
|
|
||||||
len = algo->ctx_size;
|
len = algo->ctx_size;
|
||||||
@ -261,10 +261,10 @@ rb_digest_base_equal(self, other)
|
|||||||
VALUE klass;
|
VALUE klass;
|
||||||
VALUE str1, str2;
|
VALUE str1, str2;
|
||||||
|
|
||||||
klass = CLASS_OF(self);
|
klass = rb_obj_class(self);
|
||||||
algo = get_digest_base_metadata(klass);
|
algo = get_digest_base_metadata(klass);
|
||||||
|
|
||||||
if (CLASS_OF(other) == klass) {
|
if (rb_obj_class(other) == klass) {
|
||||||
void *pctx1, *pctx2;
|
void *pctx1, *pctx2;
|
||||||
|
|
||||||
Data_Get_Struct(self, void, pctx1);
|
Data_Get_Struct(self, void, pctx1);
|
||||||
|
@ -22,7 +22,6 @@ void
|
|||||||
Init_sha1()
|
Init_sha1()
|
||||||
{
|
{
|
||||||
VALUE mDigest, cDigest_Base, cDigest_SHA1;
|
VALUE mDigest, cDigest_Base, cDigest_SHA1;
|
||||||
ID id_metadata;
|
|
||||||
|
|
||||||
rb_require("digest.so");
|
rb_require("digest.so");
|
||||||
|
|
||||||
@ -31,8 +30,6 @@ Init_sha1()
|
|||||||
|
|
||||||
cDigest_SHA1 = rb_define_class_under(mDigest, "SHA1", cDigest_Base);
|
cDigest_SHA1 = rb_define_class_under(mDigest, "SHA1", cDigest_Base);
|
||||||
|
|
||||||
id_metadata = rb_intern("metadata");
|
rb_cvar_set(cDigest_SHA1, rb_intern("metadata"),
|
||||||
|
|
||||||
rb_cvar_set(cDigest_SHA1, id_metadata,
|
|
||||||
Data_Wrap_Struct(rb_cObject, 0, 0, &sha1), Qtrue);
|
Data_Wrap_Struct(rb_cObject, 0, 0, &sha1), Qtrue);
|
||||||
}
|
}
|
||||||
|
7
file.c
7
file.c
@ -2965,18 +2965,21 @@ rb_file_truncate(obj, len)
|
|||||||
VALUE obj, len;
|
VALUE obj, len;
|
||||||
{
|
{
|
||||||
OpenFile *fptr;
|
OpenFile *fptr;
|
||||||
|
FILE *f;
|
||||||
|
|
||||||
rb_secure(2);
|
rb_secure(2);
|
||||||
GetOpenFile(obj, fptr);
|
GetOpenFile(obj, fptr);
|
||||||
if (!(fptr->mode & FMODE_WRITABLE)) {
|
if (!(fptr->mode & FMODE_WRITABLE)) {
|
||||||
rb_raise(rb_eIOError, "not opened for writing");
|
rb_raise(rb_eIOError, "not opened for writing");
|
||||||
}
|
}
|
||||||
|
f = GetWriteFile(fptr);
|
||||||
|
fflush(f);
|
||||||
#ifdef HAVE_TRUNCATE
|
#ifdef HAVE_TRUNCATE
|
||||||
if (ftruncate(fileno(fptr->f), NUM2OFFT(len)) < 0)
|
if (ftruncate(fileno(f), NUM2OFFT(len)) < 0)
|
||||||
rb_sys_fail(fptr->path);
|
rb_sys_fail(fptr->path);
|
||||||
#else
|
#else
|
||||||
# ifdef HAVE_CHSIZE
|
# ifdef HAVE_CHSIZE
|
||||||
if (chsize(fileno(fptr->f), NUM2OFFT(len)) < 0)
|
if (chsize(fileno(f), NUM2OFFT(len)) < 0)
|
||||||
rb_sys_fail(fptr->path);
|
rb_sys_fail(fptr->path);
|
||||||
# else
|
# else
|
||||||
rb_notimplement();
|
rb_notimplement();
|
||||||
|
1
intern.h
1
intern.h
@ -325,7 +325,6 @@ double rb_str_to_dbl _((VALUE, int));
|
|||||||
/* parse.y */
|
/* parse.y */
|
||||||
RUBY_EXTERN int ruby_sourceline;
|
RUBY_EXTERN int ruby_sourceline;
|
||||||
RUBY_EXTERN char *ruby_sourcefile;
|
RUBY_EXTERN char *ruby_sourcefile;
|
||||||
int ruby_yyparse _((void));
|
|
||||||
ID rb_id_attrset _((ID));
|
ID rb_id_attrset _((ID));
|
||||||
void rb_parser_append_print _((void));
|
void rb_parser_append_print _((void));
|
||||||
void rb_parser_while_loop _((int, int));
|
void rb_parser_while_loop _((int, int));
|
||||||
|
@ -458,5 +458,42 @@ class CGI
|
|||||||
GLOBAL_HASH_TABLE.delete(@session_id)
|
GLOBAL_HASH_TABLE.delete(@session_id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Dummy session storage class.
|
||||||
|
#
|
||||||
|
# Implements session storage place holder. No actual storage
|
||||||
|
# will be done.
|
||||||
|
class NullStore
|
||||||
|
# Create a new NullStore instance.
|
||||||
|
#
|
||||||
|
# +session+ is the session this instance is associated with.
|
||||||
|
# +option+ is a list of initialisation options. None are
|
||||||
|
# currently recognised.
|
||||||
|
def initialize(session, option=nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Restore (empty) session state.
|
||||||
|
def restore
|
||||||
|
{}
|
||||||
|
end
|
||||||
|
|
||||||
|
# Update session state.
|
||||||
|
#
|
||||||
|
# A no-op.
|
||||||
|
def update
|
||||||
|
end
|
||||||
|
|
||||||
|
# Close session storage.
|
||||||
|
#
|
||||||
|
# A no-op.
|
||||||
|
def close
|
||||||
|
end
|
||||||
|
|
||||||
|
# Delete the session state.
|
||||||
|
#
|
||||||
|
# A no-op.
|
||||||
|
def delete
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -475,7 +475,7 @@ def checking_for(m)
|
|||||||
r
|
r
|
||||||
end
|
end
|
||||||
|
|
||||||
def have_library(lib, func = nil, &b)
|
def have_library(lib, func = nil, header=nil, &b)
|
||||||
func = "main" if !func or func.empty?
|
func = "main" if !func or func.empty?
|
||||||
lib = with_config(lib+'lib', lib)
|
lib = with_config(lib+'lib', lib)
|
||||||
checking_for "#{func}() in #{LIBARG%lib}" do
|
checking_for "#{func}() in #{LIBARG%lib}" do
|
||||||
@ -483,7 +483,7 @@ def have_library(lib, func = nil, &b)
|
|||||||
true
|
true
|
||||||
else
|
else
|
||||||
libs = append_library($libs, lib)
|
libs = append_library($libs, lib)
|
||||||
if try_func(func, libs, &b)
|
if try_func(func, libs, header, &b)
|
||||||
$libs = libs
|
$libs = libs
|
||||||
true
|
true
|
||||||
else
|
else
|
||||||
|
5
string.c
5
string.c
@ -4352,9 +4352,10 @@ rb_str_crypt(str, salt)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
VALUE
|
VALUE
|
||||||
rb_str_intern(str)
|
rb_str_intern(s)
|
||||||
VALUE str;
|
VALUE s;
|
||||||
{
|
{
|
||||||
|
volatile VALUE str = s;
|
||||||
ID id;
|
ID id;
|
||||||
|
|
||||||
if (!RSTRING(str)->ptr || RSTRING(str)->len == 0) {
|
if (!RSTRING(str)->ptr || RSTRING(str)->len == 0) {
|
||||||
|
@ -89,7 +89,7 @@ class TestDigest < Test::Unit::TestCase
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_instance_eval # [ruby-dev:24202]
|
def test_instance_eval
|
||||||
assert_nothing_raised {
|
assert_nothing_raised {
|
||||||
Digest::SHA1.new.instance_eval { update "a" }
|
Digest::SHA1.new.instance_eval { update "a" }
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user