summaryrefslogtreecommitdiff
path: root/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'util.c')
-rw-r--r--util.c36
1 files changed, 17 insertions, 19 deletions
diff --git a/util.c b/util.c
index 3e8ae590a8..3315eb575e 100644
--- a/util.c
+++ b/util.c
@@ -529,45 +529,43 @@ ruby_strdup(const char *str)
char *
ruby_getcwd(void)
{
- VALUE guard = rb_imemo_tmpbuf_auto_free_pointer();
int size = 200;
char *buf = xmalloc(size);
while (!getcwd(buf, size)) {
int e = errno;
if (e != ERANGE) {
- rb_free_tmp_buffer(&guard);
+ xfree(buf);
rb_syserr_fail(e, "getcwd");
}
size *= 2;
- rb_imemo_tmpbuf_set_ptr(guard, buf);
- buf = xrealloc(buf, size);
+ xfree(buf);
+ buf = xmalloc(size);
}
- rb_imemo_tmpbuf_set_ptr(guard, NULL);
return buf;
}
# else
-static const rb_data_type_t getcwd_buffer_guard_type = {
- .wrap_struct_name = "ruby_getcwd_guard",
- .function = {
- .dfree = free // not xfree.
- },
- .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED
-};
+static VALUE
+getcwd_strdup(VALUE arg)
+{
+ return (VALUE)ruby_strdup((const char *)arg);
+}
+
+static VALUE
+getcwd_free(VALUE arg)
+{
+ free((void *)arg);
+ return Qnil;
+}
char *
ruby_getcwd(void)
{
- VALUE guard = TypedData_Wrap_Struct((VALUE)0, &getcwd_buffer_guard_type, NULL);
- char *buf, *cwd = getcwd(NULL, 0);
- RTYPEDDATA_DATA(guard) = cwd;
+ char *cwd = getcwd(NULL, 0);
if (!cwd) rb_sys_fail("getcwd");
- buf = ruby_strdup(cwd); /* allocate by xmalloc */
- free(cwd);
- RTYPEDDATA_DATA(RB_GC_GUARD(guard)) = NULL;
- return buf;
+ return (char *)rb_ensure(getcwd_strdup, (VALUE)cwd, getcwd_free, (VALUE)cwd);
}
# endif