diff options
author | Takashi Tamura <tamuratak@users.noreply.github.com> | 2017-02-21 17:33:10 +0900 |
---|---|---|
committer | Takashi Tamura <tamuratak@users.noreply.github.com> | 2017-02-21 21:25:14 +0900 |
commit | e7eece9bcded750f51518e3356da2120eb4c05fd (patch) | |
tree | 8db91f28dcaea923a9af08074dfffa0783a7a7c2 /Lib/ruby/rubywstrings.swg | |
parent | 89695255e63c8051266c2fd291400288aafad6ac (diff) | |
download | swig-e7eece9bcded750f51518e3356da2120eb4c05fd.tar.gz |
[ruby] * use static variable to avoid creating stirngs every time.
* fix possible overflow.
Diffstat (limited to 'Lib/ruby/rubywstrings.swg')
-rw-r--r-- | Lib/ruby/rubywstrings.swg | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/Lib/ruby/rubywstrings.swg b/Lib/ruby/rubywstrings.swg index 043f213bc..54724b268 100644 --- a/Lib/ruby/rubywstrings.swg +++ b/Lib/ruby/rubywstrings.swg @@ -8,23 +8,23 @@ SWIGINTERN int SWIG_AsWCharPtrAndSize(VALUE obj, wchar_t **cptr, size_t *psize, int *alloc) { + static rb_encoding* wstr_enc = rb_to_encoding(rb_str_new_cstr( SWIG_RUBY_WSTRING_ENCODING )); if (TYPE(obj) == T_STRING) { - VALUE tmp = rb_str_conv_enc(obj, rb_enc_get(obj), - rb_to_encoding(rb_str_new_cstr( SWIG_RUBY_WSTRING_ENCODING )) ); - wchar_t* cstr = (wchar_t*) StringValuePtr(tmp); - size_t size = RSTRING_LEN(tmp) / sizeof(wchar_t) + 1; + VALUE rstr = rb_str_conv_enc(obj, rb_enc_get(obj), wstr_enc); + wchar_t* cstr = (wchar_t*) StringValuePtr(rstr); + size_t size = RSTRING_LEN(rstr) / sizeof(wchar_t) + 1; - if( RSTRING_LEN(tmp) % sizeof(wchar_t) != 0 ) { + if ( RSTRING_LEN(rstr) % sizeof(wchar_t) != 0 ) { rb_raise(rb_eRuntimeError, "The length of the byte sequence of converted string is not a multiplier of sizeof(wchar_t). Invalid byte sequence is given. Or invalid SWIG_RUBY_WSTRING_ENCODING is given when compiling this binding."); } if (cptr && alloc) { *alloc = SWIG_NEWOBJ; *cptr = %new_array(size, wchar_t); - memmove(*cptr, cstr, RSTRING_LEN(tmp)); + memmove(*cptr, cstr, RSTRING_LEN(rstr)); } - if(psize) *psize = size; + if (psize) *psize = size; return SWIG_OK; } else { @@ -37,16 +37,18 @@ SWIG_AsWCharPtrAndSize(VALUE obj, wchar_t **cptr, size_t *psize, int *alloc) SWIGINTERNINLINE VALUE SWIG_FromWCharPtrAndSize(const wchar_t * carray, size_t size) { - if (carray && size <= LONG_MAX) { - VALUE ret = rb_str_new( (const char*)carray, %numeric_cast(size*sizeof(wchar_t),long) ); - rb_encoding* new_enc = rb_default_internal_encoding(); + static rb_encoding* wstr_enc = rb_to_encoding(rb_str_new_cstr( SWIG_RUBY_WSTRING_ENCODING )); + static rb_encoding* rb_enc = rb_to_encoding(rb_str_new_cstr( SWIG_RUBY_INTERNAL_ENCODING )); - rb_enc_associate(ret, rb_to_encoding(rb_str_new_cstr( SWIG_RUBY_WSTRING_ENCODING )) ); + if (carray && size <= LONG_MAX/sizeof(wchar_t)) { + VALUE rstr = rb_str_new( (const char*)carray, %numeric_cast(size*sizeof(wchar_t),long) ); + rb_encoding* new_enc = rb_default_internal_encoding(); - if( !new_enc ) { - new_enc = rb_to_encoding(rb_str_new_cstr( SWIG_RUBY_INTERNAL_ENCODING )); + rb_enc_associate(rstr, wstr_enc); + if ( !new_enc ) { + new_enc = rb_enc; } - return rb_str_conv_enc(ret, rb_enc_get(ret), new_enc); + return rb_str_conv_enc(rstr, wstr_enc, new_enc); } else { return Qnil; } |