ruby-changes:6693
From: nobu <ko1@a...>
Date: Fri, 25 Jul 2008 16:22:26 +0900 (JST)
Subject: [ruby-changes:6693] Ruby:r18209 (mvm): * thread.c (ruby_thread_getcwd): fix for non-openat platforms.
nobu 2008-07-25 16:21:26 +0900 (Fri, 25 Jul 2008) New Revision: 18209 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=18209 Log: * thread.c (ruby_thread_getcwd): fix for non-openat platforms. * util.c (ruby_sys_getcwd): renamed and reverted. Modified files: branches/mvm/ChangeLog branches/mvm/iseq.c branches/mvm/thread.c branches/mvm/util.c branches/mvm/variable.c Index: mvm/ChangeLog =================================================================== --- mvm/ChangeLog (revision 18208) +++ mvm/ChangeLog (revision 18209) @@ -1,9 +1,13 @@ -Fri Jul 25 15:05:42 2008 Nobuyoshi Nakada <nobu@r...> +Fri Jul 25 16:21:14 2008 Nobuyoshi Nakada <nobu@r...> * include/ruby/io.h (ruby_absolute_path_p): published. * io.c (rb_sysopen_prepare): fix for non-openat platforms. + * thread.c (ruby_thread_getcwd): fix for non-openat platforms. + + * util.c (ruby_sys_getcwd): renamed and reverted. + Fri Jul 25 10:00:00 2008 Martin Duerst <duerst@i...> * test/ruby/test_transcode.rb: refactoring/cleanup of Index: mvm/variable.c =================================================================== --- mvm/variable.c (revision 18208) +++ mvm/variable.c (revision 18209) @@ -409,7 +409,7 @@ static void vm_marker(void *var) { - rb_gc_mark(*rb_vm_specific_ptr((int)var)); + rb_gc_mark(*rb_vm_specific_ptr((int)(VALUE)var)); } static void @@ -484,7 +484,7 @@ gvar = rb_global_entry(id)->var; if (vmkey != -1) { gvar->flags |= gv_vm_specific_storage; - gvar->data = (void*)vmkey; + gvar->data = (void*)(VALUE)vmkey; gvar->marker = vm_marker; } else { @@ -538,7 +538,7 @@ id = global_id(name); gvar = rb_global_entry(id)->var; gvar->flags |= gv_vm_specific_storage; - gvar->data = (void*)vmkey; + gvar->data = (void*)(VALUE)vmkey; gvar->getter = getter; gvar->setter = setter; gvar->marker = vm_marker; @@ -682,7 +682,7 @@ struct global_variable *var = entry->var; void *data = var->data; if (var->flags & gv_vm_specific_storage) { - data = (void *)rb_vm_specific_ptr((int)data); + data = rb_vm_specific_ptr((int)(VALUE)data); } return (*var->getter)(entry->id, data, var); } @@ -722,7 +722,7 @@ if (rb_safe_level() >= 4) rb_raise(rb_eSecurityError, "Insecure: can't change global variable value"); if (var->flags & gv_vm_specific_storage) { - data = (void *)rb_vm_specific_ptr((int)data); + data = rb_vm_specific_ptr((int)(VALUE)data); } (*var->setter)(val, entry->id, data, var); Index: mvm/iseq.c =================================================================== --- mvm/iseq.c (revision 18208) +++ mvm/iseq.c (revision 18209) @@ -731,7 +731,7 @@ } else { rb_str_catf(str, "%04d %-16.*s ", pos, - strcspn(insn_name_buff, "_"), insn_name_buff); + (int)strcspn(insn_name_buff, "_"), insn_name_buff); } for (j = 0; types[j]; j++) { Index: mvm/thread.c =================================================================== --- mvm/thread.c (revision 18208) +++ mvm/thread.c (revision 18209) @@ -3467,17 +3467,21 @@ char * ruby_thread_getcwd(rb_thread_t *th) { + char *ruby_sys_getcwd(void); + char *cwd; #if USE_OPENAT && defined HAVE_READLINK extern char *ruby_readlink(const char *, long *); static const char fdpat[] = "/proc/self/fd/%d"; - char fdname[sizeof(fdpat) + sizeof(int) * 5 / 2], *cwd; + char fdname[sizeof(fdpat) + sizeof(int) * 5 / 2]; long len; snprintf(fdname, sizeof(fdname), fdpat, th->cwd.fd); cwd = ruby_readlink(fdname, &len); if (cwd) return cwd; #endif - return ruby_strdup(th->cwd.path); + if ((cwd = th->cwd.path) != 0) + return ruby_strdup(cwd); + return ruby_sys_getcwd(); } char * Index: mvm/util.c =================================================================== --- mvm/util.c (revision 18208) +++ mvm/util.c (revision 18209) @@ -739,6 +739,35 @@ return tmp; } +char * +ruby_sys_getcwd(void) +{ +#ifdef HAVE_GETCWD + int size = 200; + char *buf = xmalloc(size); + + while (!getcwd(buf, size)) { + if (errno != ERANGE) { + xfree(buf); + rb_sys_fail("getcwd"); + } + size *= 2; + buf = xrealloc(buf, size); + } +#else +# ifndef PATH_MAX +# define PATH_MAX 8192 +# endif + char *buf = xmalloc(PATH_MAX+1); + + if (!getwd(buf)) { + xfree(buf); + rb_sys_fail("getwd"); + } +#endif + return buf; +} + /**************************************************************** * * The author of this software is David M. Gay. -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/