* dir.c (dir_s_chdir): block form of Dir.chdir. (RCR#U016).

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1256 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2001-03-16 08:30:09 +00:00
parent 7f74a38b72
commit b842d5f571
7 changed files with 53 additions and 23 deletions

View File

@ -1,3 +1,7 @@
Thu Mar 15 01:28:02 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
* dir.c (dir_s_chdir): block form of Dir.chdir. (RCR#U016).
Fri Mar 16 17:14:17 2001 Akinori MUSHA <knu@iDaemons.org> Fri Mar 16 17:14:17 2001 Akinori MUSHA <knu@iDaemons.org>
* configure.in: Set SOLIBS properly for all ELF and * configure.in: Set SOLIBS properly for all ELF and

5
README
View File

@ -120,9 +120,8 @@ You can redistribute it and/or modify it under either the terms of the GPL
software (possibly commercial). But some files in the distribution software (possibly commercial). But some files in the distribution
are not written by the author, so that they are not under this terms. are not written by the author, so that they are not under this terms.
They are gc.c(partly), utils.c(partly), regex.[ch], st.[ch] and some They are utils.c(partly), regex.[ch], st.[ch] and some files under
files under the ./missing directory. See each file for the copying the ./missing directory. See each file for the copying condition.
condition.
5. The scripts and library files supplied as input to or produced as 5. The scripts and library files supplied as input to or produced as
output from the software do not automatically fall under the output from the software do not automatically fall under the

View File

@ -178,10 +178,9 @@ Public License)
だし,本プログラムに含まれる他の作者によるコードは,そ だし,本プログラムに含まれる他の作者によるコードは,そ
れぞれの作者の意向による制限が加えられる場合があります. れぞれの作者の意向による制限が加えられる場合があります.
具体的にはgc.c(一部)util.c(一部)st.[ch]regex.[ch] 具体的にはutil.c(一部)st.[ch]regex.[ch] および
および ./missingディレクトリ下のファイル群が該当します ./missingディレクトリ下のファイル群が該当しますそれぞ
それぞれの配布条件などに付いては各ファイルを参照してく れの配布条件などに付いては各ファイルを参照してください.
ださい.
5. 本プログラムへの入力となるスクリプトおよび,本プログラ 5. 本プログラムへの入力となるスクリプトおよび,本プログラ
ムからの出力の権利は本プログラムの作者ではなく,それぞ ムからの出力の権利は本プログラムの作者ではなく,それぞ

49
dir.c
View File

@ -389,13 +389,38 @@ dir_close(dir)
return Qnil; return Qnil;
} }
static void
dir_chdir(path)
const char *path;
{
if (chdir(path) < 0)
rb_sys_fail(path);
}
static int chdir_blocking = 0;
static VALUE
chdir_restore(path)
const char *path;
{
chdir_blocking--;
dir_chdir(path);
return Qnil;
}
#ifdef HAVE_GETCWD
#define GETCWD(path) if (getcwd(path, sizeof(path)) == 0) rb_sys_fail(path)
#else
#define GETCWD(path) if (getwd(path) == 0) rb_sys_fail(path)
#endif
static VALUE static VALUE
dir_s_chdir(argc, argv, obj) dir_s_chdir(argc, argv, obj)
int argc; int argc;
VALUE *argv; VALUE *argv;
VALUE obj; VALUE obj;
{ {
VALUE path; VALUE path = Qnil;
char *dist = ""; char *dist = "";
rb_secure(2); rb_secure(2);
@ -410,8 +435,18 @@ dir_s_chdir(argc, argv, obj)
} }
} }
if (chdir(dist) < 0) if (chdir_blocking > 0)
rb_sys_fail(dist); rb_warn("chdir during chdir block");
if (rb_block_given_p()) {
char cwd[MAXPATHLEN];
GETCWD(cwd);
chdir_blocking++;
dir_chdir(dist);
return rb_ensure(rb_yield, path, chdir_restore, (VALUE)cwd);
}
dir_chdir(dist);
return INT2FIX(0); return INT2FIX(0);
} }
@ -422,13 +457,7 @@ dir_s_getwd(dir)
{ {
char path[MAXPATHLEN]; char path[MAXPATHLEN];
#ifdef HAVE_GETCWD GETCWD(path);
if (getcwd(path, sizeof(path)) == 0) rb_sys_fail(path);
#else
extern char *getwd();
if (getwd(path) == 0) rb_sys_fail(path);
#endif
return rb_tainted_str_new2(path); return rb_tainted_str_new2(path);
} }

3
eval.c
View File

@ -775,7 +775,6 @@ static struct tag *prot_tag;
_tag.frame = ruby_frame; \ _tag.frame = ruby_frame; \
_tag.iter = ruby_iter; \ _tag.iter = ruby_iter; \
_tag.prev = prot_tag; \ _tag.prev = prot_tag; \
_tag.retval = Qnil; \
_tag.scope = ruby_scope; \ _tag.scope = ruby_scope; \
_tag.tag = ptag; \ _tag.tag = ptag; \
_tag.dst = 0; \ _tag.dst = 0; \
@ -6332,7 +6331,7 @@ proc_eq(self, other)
struct BLOCK *data, *data2; struct BLOCK *data, *data2;
if (TYPE(other) != T_DATA) return Qfalse; if (TYPE(other) != T_DATA) return Qfalse;
if (RDATA(other)->dmark != blk_mark) Qfalse; if (RDATA(other)->dmark != (RUBY_DATA_FUNC)blk_mark) Qfalse;
Data_Get_Struct(self, struct BLOCK, data); Data_Get_Struct(self, struct BLOCK, data);
Data_Get_Struct(other, struct BLOCK, data2); Data_Get_Struct(other, struct BLOCK, data2);
if (data->tag == data2->tag) return Qtrue; if (data->tag == data2->tag) return Qtrue;

View File

@ -182,8 +182,8 @@ char *rb_find_file _((char*));
void rb_gc_mark_locations _((VALUE*, VALUE*)); void rb_gc_mark_locations _((VALUE*, VALUE*));
void rb_mark_tbl _((struct st_table*)); void rb_mark_tbl _((struct st_table*));
void rb_mark_hash _((struct st_table*)); void rb_mark_hash _((struct st_table*));
void rb_gc_mark_maybe(); void rb_gc_mark_maybe _((void*));
void rb_gc_mark(); void rb_gc_mark _((void*));
void rb_gc_force_recycle _((VALUE)); void rb_gc_force_recycle _((VALUE));
void rb_gc _((void)); void rb_gc _((void));
void rb_gc_call_finalizer_at_exit _((void)); void rb_gc_call_finalizer_at_exit _((void));

View File

@ -1,4 +1,4 @@
#define RUBY_VERSION "1.7.0" #define RUBY_VERSION "1.7.0"
#define RUBY_RELEASE_DATE "2001-03-14" #define RUBY_RELEASE_DATE "2001-03-16"
#define RUBY_VERSION_CODE 170 #define RUBY_VERSION_CODE 170
#define RUBY_RELEASE_CODE 20010314 #define RUBY_RELEASE_CODE 20010316