summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-08-05 08:04:04 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-08-05 08:04:04 +0000
commitcb0cde7f2429a52e71ae1f0c8568b69c64b17be0 (patch)
tree42620002620fd7b7a8d89256f3aa94cd458bcbdf
parentdd96e0c76a66fe48dcc32eac400b7e2f1b42c81e (diff)
hash.c: call w32_getenv pointer
* hash.c (w32_getenv): call rb_w32_getenv and rb_w32_ugetenv via this pointer without further comparisons. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55813 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--hash.c20
2 files changed, 17 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index 762f61e..b09b879 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Fri Aug 5 17:04:02 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * hash.c (w32_getenv): call rb_w32_getenv and rb_w32_ugetenv via
+ this pointer without further comparisons.
+
Thu Aug 4 11:54:30 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
* hash.c (env_assoc): the encoding of the value should be the
diff --git a/hash.c b/hash.c
index d6bfc8a..3af3762 100644
--- a/hash.c
+++ b/hash.c
@@ -2896,17 +2896,21 @@ static char **my_environ;
#undef environ
#define environ my_environ
#undef getenv
-static inline char *
-w32_getenv(const char *name)
+static char *(*w32_getenv)(const char*);
+static char *
+w32_getenv_unknown(const char *name)
{
- static int binary = -1;
- static int locale = -1;
- if (binary < 0) {
- binary = rb_ascii8bit_encindex();
- locale = rb_locale_encindex();
+ char *(*func)(const char*);
+ if (rb_locale_encindex() == rb_ascii8bit_encindex()) {
+ func = rb_w32_getenv;
}
- return locale == binary ? rb_w32_getenv(name) : rb_w32_ugetenv(name);
+ else {
+ func = rb_w32_ugetenv;
+ }
+ /* atomic assignment in flat memory model */
+ return (w32_getenv = func)(name);
}
+static char *(*w32_getenv)(const char*) = w32_getenv_unknown;
#define getenv(n) w32_getenv(n)
#elif defined(__APPLE__)
#undef environ