aboutsummaryrefslogtreecommitdiffstats
path: root/hash.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-07-30 02:56:30 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-07-30 02:56:30 +0000
commitae878bdd9f070059f1cf3b2c2fbeb9515d99ef1b (patch)
tree6a76898c015972f2e3fb1c3bdbf558fb35946c93 /hash.c
parentff6da69a78d7256009faf19f1edc140c6aa4191f (diff)
downloadruby-ae878bdd9f070059f1cf3b2c2fbeb9515d99ef1b.tar.gz
hash.c: refactor env_enc_str_new
* hash.c (env_enc_str_new): convert to the expected encoding without intermediate string, and set econv flags if default internal encoding is set too. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59449 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'hash.c')
-rw-r--r--hash.c24
1 files changed, 7 insertions, 17 deletions
diff --git a/hash.c b/hash.c
index c47f21ee9f..d8d08e5b36 100644
--- a/hash.c
+++ b/hash.c
@@ -3168,27 +3168,17 @@ extern char **environ;
#define ENVNMATCH(s1, s2, n) (memcmp((s1), (s2), (n)) == 0)
#endif
-#ifdef _WIN32
-static VALUE
-env_str_transcode(VALUE str, rb_encoding *enc)
-{
- rb_encoding *internal = rb_default_internal_encoding();
- if (!internal) {
- return rb_str_conv_enc_opts(str, NULL, enc,
- ECONV_INVALID_REPLACE | ECONV_UNDEF_REPLACE,
- Qnil);
- }
- else {
- return rb_external_str_with_enc(str, rb_utf8_encoding());
- }
-}
-#endif
-
static VALUE
env_enc_str_new(const char *ptr, long len, rb_encoding *enc)
{
#ifdef _WIN32
- VALUE str = env_str_transcode(rb_utf8_str_new(ptr, len), enc);
+ rb_encoding *internal = rb_default_internal_encoding();
+ const int ecflags = ECONV_INVALID_REPLACE | ECONV_UNDEF_REPLACE;
+ rb_encoding *utf8 = rb_utf8_encoding();
+ VALUE str = rb_enc_str_new(NULL, 0, (internal ? internal : enc));
+ if (NIL_P(rb_str_cat_conv_enc_opts(str, 0, ptr, len, utf8, ecflags, Qnil))) {
+ rb_str_initialize(str, ptr, len, utf8);
+ }
#else
VALUE str = rb_external_str_new_with_enc(ptr, len, enc);
#endif