summaryrefslogtreecommitdiff
path: root/dir.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-09-17 09:24:13 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-09-17 09:24:13 +0000
commite77ddaf0d1d421da2f655832a45f237558e23115 (patch)
treeb20cb859d6ca1886f525e4b7477601bb1a5fbe31 /dir.c
parent7b66963f61609fe8edea2380cba43289381a43d7 (diff)
* 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
Diffstat (limited to 'dir.c')
-rw-r--r--dir.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/dir.c b/dir.c
index c3301bc51f..d432b20b8d 100644
--- a/dir.c
+++ b/dir.c
@@ -1,4 +1,3 @@
-
/**********************************************************************
dir.c -
@@ -687,6 +686,19 @@ dir_chdir(path)
static int chdir_blocking = 0;
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
chdir_restore(path)
char *path;
@@ -695,7 +707,6 @@ chdir_restore(path)
if (chdir_blocking == 0)
chdir_thread = Qnil;
dir_chdir(path);
- free(path);
return Qnil;
}
@@ -767,11 +778,14 @@ dir_s_chdir(argc, argv, obj)
if (rb_block_given_p()) {
char *cwd = my_getcwd();
+ struct chdir_data args;
+
chdir_blocking++;
if (chdir_thread == Qnil)
chdir_thread = rb_thread_current();
- dir_chdir(dist);
- return rb_ensure(rb_yield, path, chdir_restore, (VALUE)cwd);
+ args.dist = dist;
+ args.path = path;
+ return rb_ensure(chdir_yield, (VALUE)&args, chdir_restore, (VALUE)cwd);
}
dir_chdir(dist);