diff options
Diffstat (limited to 'util.c')
| -rw-r--r-- | util.c | 36 |
1 files changed, 17 insertions, 19 deletions
@@ -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 |
