ruby-changes:6120
From: nobu <ko1@a...>
Date: Sat, 28 Jun 2008 20:49:36 +0900 (JST)
Subject: [ruby-changes:6120] Ruby:r17632 (mvm): * merge from trunk r17612:17631.
nobu 2008-06-28 20:49:15 +0900 (Sat, 28 Jun 2008) New Revision: 17632 Modified files: branches/mvm/ChangeLog branches/mvm/ext/win32ole/win32ole.c branches/mvm/struct.c branches/mvm/test/ruby/test_argf.rb branches/mvm/test/ruby/test_time.rb branches/mvm/test/rubygems/test_gem.rb branches/mvm/test/win32ole/test_win32ole.rb branches/mvm/time.c branches/mvm/version.h Log: * merge from trunk r17612:17631. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/mvm/version.h?r1=17632&r2=17631&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/mvm/ext/win32ole/win32ole.c?r1=17632&r2=17631&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/mvm/struct.c?r1=17632&r2=17631&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/mvm/ChangeLog?r1=17632&r2=17631&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/mvm/time.c?r1=17632&r2=17631&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/mvm/test/ruby/test_time.rb?r1=17632&r2=17631&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/mvm/test/ruby/test_argf.rb?r1=17632&r2=17631&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/mvm/test/win32ole/test_win32ole.rb?r1=17632&r2=17631&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/mvm/test/rubygems/test_gem.rb?r1=17632&r2=17631&diff_format=u Index: mvm/time.c =================================================================== --- mvm/time.c (revision 17631) +++ mvm/time.c (revision 17632) @@ -201,6 +201,10 @@ double f, d; d = modf(RFLOAT_VALUE(num), &f); + if (d < 0) { + d += 1; + f -= 1; + } t.tv_sec = (time_t)f; if (f != t.tv_sec) { rb_raise(rb_eRangeError, "%f out of Time range", RFLOAT_VALUE(num)); Index: mvm/ChangeLog =================================================================== --- mvm/ChangeLog (revision 17631) +++ mvm/ChangeLog (revision 17632) @@ -1,3 +1,24 @@ +Sat Jun 28 13:12:06 2008 Tanaka Akira <akr@f...> + + * test/rubygems/test_gem.rb (test_self_path_APPLE_GEM_HOME): don't use + fixed /tmp/apple_gem_home directory. + +Sat Jun 28 08:40:18 2008 Masaki Suketa <masaki.suketa@n...> + + * ext/win32ole/win32ole.c : check String encoding when + converting String to VT_BSTR in OLE. + + * test/win32ole/test_win32ole.rb : ditto. + +Sat Jun 28 01:08:42 2008 Tanaka Akira <akr@f...> + + * time.c (time_timespec): fix rounding negative float. + +Fri Jun 27 21:38:57 2008 Tanaka Akira <akr@f...> + + * struct.c: __size__ removed. use the length of __members__ instead. + (num_members): new function. + Fri Jun 27 21:19:08 2008 Nobuyoshi Nakada <nobu@r...> * test/inlinetest.rb (InlineTest.in_progname): workaround for frozen Index: mvm/struct.c =================================================================== --- mvm/struct.c (revision 17631) +++ mvm/struct.c (revision 17632) @@ -193,7 +193,6 @@ } nstr = rb_define_class_under(klass, rb_id2name(id), klass); } - rb_iv_set(nstr, "__size__", LONG2NUM(RARRAY_LEN(members))); rb_iv_set(nstr, "__members__", members); rb_define_alloc_func(nstr, struct_alloc); @@ -249,7 +248,6 @@ rb_class_inherited(super, klass); } - rb_iv_set(klass, "__size__", LONG2NUM(RARRAY_LEN(members))); rb_iv_set(klass, "__members__", members); if (alloc) @@ -340,6 +338,17 @@ return st; } +static size_t +num_members(VALUE klass) +{ + VALUE members; + members = rb_struct_iv_get(klass, "__members__"); + if (TYPE(members) != T_ARRAY) { + rb_raise(rb_eTypeError, "broken members"); + } + return RARRAY_LEN(members); +} + /* */ @@ -347,12 +356,10 @@ rb_struct_initialize(VALUE self, VALUE values) { VALUE klass = rb_obj_class(self); - VALUE size; long n; rb_struct_modify(self); - size = rb_struct_iv_get(klass, "__size__"); - n = FIX2LONG(size); + n = num_members(klass); if (n < RARRAY_LEN(values)) { rb_raise(rb_eArgError, "struct size differs"); } @@ -367,13 +374,11 @@ static VALUE struct_alloc(VALUE klass) { - VALUE size; long n; NEWOBJ(st, struct RStruct); OBJSETUP(st, klass, T_STRUCT); - size = rb_struct_iv_get(klass, "__size__"); - n = FIX2LONG(size); + n = num_members(klass); if (0 < n && n <= RSTRUCT_EMBED_LEN_MAX) { RBASIC(st)->flags &= ~RSTRUCT_EMBED_LEN_MASK; @@ -398,12 +403,11 @@ VALUE rb_struct_new(VALUE klass, ...) { - VALUE sz, *mem; + VALUE *mem; long size, i; va_list args; - sz = rb_struct_iv_get(klass, "__size__"); - size = FIX2LONG(sz); + size = num_members(klass); mem = ALLOCA_N(VALUE, size); va_start(args, klass); for (i=0; i<size; i++) { Index: mvm/ext/win32ole/win32ole.c =================================================================== --- mvm/ext/win32ole/win32ole.c (revision 17631) +++ mvm/ext/win32ole/win32ole.c (revision 17632) @@ -116,7 +116,7 @@ #define WC2VSTR(x) ole_wc2vstr((x), TRUE) -#define WIN32OLE_VERSION "1.1.5" +#define WIN32OLE_VERSION "1.1.6" typedef HRESULT (STDAPICALLTYPE FNCOCREATEINSTANCEEX) (REFCLSID, IUnknown*, DWORD, COSERVERINFO*, DWORD, MULTI_QI*); @@ -201,6 +201,7 @@ static UINT g_cp_to_check = CP_ACP; static char g_lcid_to_check[8 + 1]; static VARTYPE g_nil_to = VT_ERROR; +static st_table *enc2cp_table; struct oledata { IDispatch *pDispatch; @@ -274,6 +275,7 @@ static void olemethod_free(struct olemethoddata *polemethod); static void olevariable_free(struct olevariabledata *polevar); static void oleparam_free(struct oleparamdata *pole); +static LPWSTR ole_vstr2wc(VALUE vstr); static LPWSTR ole_mb2wc(char *pm, int len); static VALUE ole_wc2vstr(LPWSTR pw, BOOL isfree); static VALUE ole_ary_m_entry(VALUE val, long *pid); @@ -518,6 +520,8 @@ static VALUE folevariant_value(VALUE self); static VALUE folevariant_vartype(VALUE self); static VALUE folevariant_set_value(VALUE self, VALUE val); +static void init_enc2cp(); +static void free_enc2cp(); typedef struct _Win32OLEIDispatch { @@ -1106,6 +1110,38 @@ } static LPWSTR +ole_vstr2wc(VALUE vstr) +{ + rb_encoding *enc; + int cp; + int size; + LPWSTR pw; + st_data_t data; + enc = rb_enc_get(vstr); + if (st_lookup(enc2cp_table, (st_data_t)enc, &data)) { + cp = data; + } else { + cp = ole_encoding2cp(enc); + if (code_page_installed(cp) || + cp == CP_ACP || + cp == CP_OEMCP || + cp == CP_MACCP || + cp == CP_THREAD_ACP || + cp == CP_SYMBOL || + cp == CP_UTF7 || + cp == CP_UTF8 ) { + st_insert(enc2cp_table, (st_data_t)enc, (st_data_t)cp); + } else { + rb_raise(eWIN32OLERuntimeError, "not installed Windows codepage(%d) according to `%s'", cp, rb_enc_name(enc)); + } + } + size = MultiByteToWideChar(cp, 0, StringValuePtr(vstr), -1, NULL, 0); + pw = SysAllocStringLen(NULL, size - 1); + MultiByteToWideChar(cp, 0, StringValuePtr(vstr), -1, pw, size); + return pw; +} + +static LPWSTR ole_mb2wc(char *pm, int len) { int size; @@ -1387,7 +1423,7 @@ break; case T_STRING: V_VT(var) = VT_BSTR; - V_BSTR(var) = ole_mb2wc(StringValuePtr(val), -1); + V_BSTR(var) = ole_vstr2wc(val); break; case T_FIXNUM: V_VT(var) = VT_I4; @@ -1465,7 +1501,7 @@ switch (TYPE(val)) { case T_STRING: if (V_VT(var) == (VT_BSTR | VT_BYREF)) { - *V_BSTRREF(var) = ole_mb2wc(StringValuePtr(val), -1); + *V_BSTRREF(var) = ole_vstr2wc(val); } break; case T_FIXNUM: @@ -2347,7 +2383,7 @@ rb_raise(rb_eRuntimeError, "CoCreateInstanceEx is not supported in this environment"); rb_scan_args(argc, argv, "2*", &ole, &host, &others); - pbuf = ole_mb2wc(StringValuePtr(ole), -1); + pbuf = ole_vstr2wc(ole); hr = CLSIDFromProgID(pbuf, &clsid); if (FAILED(hr)) hr = clsid_from_remote(host, ole, &clsid); @@ -2359,7 +2395,7 @@ "unknown OLE server: `%s'", StringValuePtr(ole)); memset(&serverinfo, 0, sizeof(COSERVERINFO)); - serverinfo.pwszName = ole_mb2wc(StringValuePtr(host), -1); + serverinfo.pwszName = ole_vstr2wc(host); memset(&multi_qi, 0, sizeof(MULTI_QI)); multi_qi.pIID = &IID_IDispatch; hr = gCoCreateInstanceEx(&clsid, NULL, clsctx, &serverinfo, 1, &multi_qi); @@ -2392,7 +2428,7 @@ "failed to create bind context"); } - pbuf = ole_mb2wc(StringValuePtr(moniker), -1); + pbuf = ole_vstr2wc(moniker); hr = MkParseDisplayName(pBindCtx, pbuf, &eaten, &pMoniker); SysFreeString(pbuf); if(FAILED(hr)) { @@ -2446,7 +2482,7 @@ } /* get CLSID from OLE server name */ - pBuf = ole_mb2wc(StringValuePtr(svr_name), -1); + pBuf = ole_vstr2wc(svr_name); hr = CLSIDFromProgID(pBuf, &clsid); if(FAILED(hr)) { hr = CLSIDFromString(pBuf, &clsid); @@ -2551,7 +2587,7 @@ if (file == Qnil) { file = ole; } - pBuf = ole_mb2wc(StringValuePtr(file), -1); + pBuf = ole_vstr2wc(file); hr = LoadTypeLibEx(pBuf, REGKIND_NONE, &pTypeLib); SysFreeString(pBuf); if (FAILED(hr)) @@ -2954,7 +2990,7 @@ } /* get CLSID from OLE server name */ - pBuf = ole_mb2wc(StringValuePtr(svr_name), -1); + pBuf = ole_vstr2wc(svr_name); hr = CLSIDFromProgID(pBuf, &clsid); if(FAILED(hr)) { hr = CLSIDFromString(pBuf, &clsid); @@ -3007,7 +3043,7 @@ } /* pNamedArgs[0] is <method name>, so "index + 1" */ - pOp->pNamedArgs[index + 1] = ole_mb2wc(StringValuePtr(key), -1); + pOp->pNamedArgs[index + 1] = ole_vstr2wc(key); value = rb_ary_entry(pair, 1); VariantInit(&(pOp->dp.rgvarg[index])); @@ -3075,7 +3111,7 @@ argc += 1; rb_funcall(paramS, rb_intern("unshift"), 1, cmd); } else { - wcmdname = ole_mb2wc(StringValuePtr(cmd), -1); + wcmdname = ole_vstr2wc(cmd); hr = pole->pDispatch->lpVtbl->GetIDsOfNames( pole->pDispatch, &IID_NULL, &wcmdname, 1, lcid, &DispID); SysFreeString(wcmdname); @@ -3103,7 +3139,7 @@ rb_block_call(param, rb_intern("each"), 0, 0, hash2named_arg, (VALUE)&op); pDispID = ALLOCA_N(DISPID, cNamedArgs + 1); - op.pNamedArgs[0] = ole_mb2wc(StringValuePtr(cmd), -1); + op.pNamedArgs[0] = ole_vstr2wc(cmd); hr = pole->pDispatch->lpVtbl->GetIDsOfNames(pole->pDispatch, &IID_NULL, op.pNamedArgs, @@ -3614,7 +3650,7 @@ OLEData_Get_Struct(self, pole); /* get ID from property name */ - pBuf[0] = ole_mb2wc(StringValuePtr(property), -1); + pBuf[0] = ole_vstr2wc(property); hr = pole->pDispatch->lpVtbl->GetIDsOfNames(pole->pDispatch, &IID_NULL, pBuf, 1, lcid, &dispID); SysFreeString(pBuf[0]); @@ -4210,7 +4246,7 @@ struct oledata *pole; IDispatch *pDispatch; - pBuf = ole_mb2wc(StringValuePtr(str_iid), -1); + pBuf = ole_vstr2wc(str_iid); hr = CLSIDFromString(pBuf, &iid); SysFreeString(pBuf); if(FAILED(hr)) { @@ -4868,7 +4904,7 @@ found = oletypelib_search_registry2(self, args); } if (found == Qfalse) { - pbuf = ole_mb2wc(StringValuePtr(typelib), -1); + pbuf = ole_vstr2wc(typelib); hr = LoadTypeLibEx(pbuf, REGKIND_NONE, &pTypeLib); SysFreeString(pbuf); if (SUCCEEDED(hr)) { @@ -5029,7 +5065,7 @@ HRESULT hr = S_OK; path = rb_funcall(self, rb_intern("path"), 0); if (path != Qnil) { - pbuf = ole_mb2wc(StringValuePtr(path), -1); + pbuf = ole_vstr2wc(path); hr = LoadTypeLibEx(pbuf, REGKIND_NONE, ppTypeLib); SysFreeString(pbuf); if (FAILED(hr)) @@ -5166,7 +5202,7 @@ if (file == Qnil) { file = typelib; } - pbuf = ole_mb2wc(StringValuePtr(file), -1); + pbuf = ole_vstr2wc(file); hr = LoadTypeLibEx(pbuf, REGKIND_NONE, &pTypeLib); if (FAILED(hr)) ole_raise(hr, eWIN32OLERuntimeError, "failed to LoadTypeLibEx"); @@ -8108,6 +8144,18 @@ return Qnil; } +static void +init_enc2cp() +{ + enc2cp_table = st_init_numtable(); +} + +static void +free_enc2cp() +{ + st_free_table(enc2cp_table); +} + void Init_win32ole() { @@ -8327,6 +8375,8 @@ eWIN32OLERuntimeError = rb_define_class("WIN32OLERuntimeError", rb_eRuntimeError); + init_enc2cp(); + atexit((void (*)(void))free_enc2cp); ole_init_cp(); cWIN32OLE_enc = ole_cp2encoding(cWIN32OLE_cp); } Index: mvm/version.h =================================================================== --- mvm/version.h (revision 17631) +++ mvm/version.h (revision 17632) @@ -1,7 +1,7 @@ #define RUBY_VERSION "1.9.0" -#define RUBY_RELEASE_DATE "2008-06-27" +#define RUBY_RELEASE_DATE "2008-06-28" #define RUBY_VERSION_CODE 190 -#define RUBY_RELEASE_CODE 20080627 +#define RUBY_RELEASE_CODE 20080628 #define RUBY_PATCHLEVEL 0 #define RUBY_VERSION_MAJOR 1 @@ -9,7 +9,7 @@ #define RUBY_VERSION_TEENY 0 #define RUBY_RELEASE_YEAR 2008 #define RUBY_RELEASE_MONTH 6 -#define RUBY_RELEASE_DAY 27 +#define RUBY_RELEASE_DAY 28 #ifdef RUBY_EXTERN RUBY_EXTERN const char ruby_version[]; Index: mvm/test/ruby/test_argf.rb =================================================================== --- mvm/test/ruby/test_argf.rb (revision 17631) +++ mvm/test/ruby/test_argf.rb (revision 17632) @@ -582,6 +582,16 @@ end end + def test_each_line_paragraph + EnvUtil.rubyexec('-e', 'ARGF.each_line("") {|para| p para}') do |w, r, e| + w << "a\n\nb\n" + w.close + assert_equal("\"a\\n\\n\"\n", r.gets, "[ruby-dev:34958]") + assert_equal("\"b\\n\"\n", r.gets) + assert_equal(nil, r.gets) + end + end + def test_each_byte ruby('-e', <<-SRC, @t1.path, @t2.path, @t3.path) do |f| s = [] Index: mvm/test/ruby/test_time.rb =================================================================== --- mvm/test/ruby/test_time.rb (revision 17631) +++ mvm/test/ruby/test_time.rb (revision 17632) @@ -105,6 +105,18 @@ assert_equal(100, Time.at(0.0000001).nsec) assert_equal(10, Time.at(0.00000001).nsec) assert_equal(1, Time.at(0.000000001).nsec) + assert_equal(0, Time.at(1e-10).nsec) + assert_equal(0, Time.at(4e-10).nsec) + assert_equal(1, Time.at(6e-10).nsec) + assert_equal(1, Time.at(14e-10).nsec) + assert_equal(2, Time.at(16e-10).nsec) + if negative_time_t? + assert_equal(0, Time.at(-1e-10).nsec) + assert_equal(0, Time.at(-4e-10).nsec) + assert_equal(999999999, Time.at(-6e-10).nsec) + assert_equal(999999999, Time.at(-14e-10).nsec) + assert_equal(999999998, Time.at(-16e-10).nsec) + end end def test_at2 Index: mvm/test/win32ole/test_win32ole.rb =================================================================== --- mvm/test/win32ole/test_win32ole.rb (revision 17631) +++ mvm/test/win32ole/test_win32ole.rb (revision 17632) @@ -282,8 +282,8 @@ fso = WIN32OLE.new("Scripting.FileSystemObject") fname = fso.getTempName begin + obj = WIN32OLE_VARIANT.new([0x3042].pack("U*").force_encoding("UTF-8")) WIN32OLE.codepage = WIN32OLE::CP_UTF8 - obj = WIN32OLE_VARIANT.new([0x3042].pack("U*")) assert_equal("\xE3\x81\x82".force_encoding("CP65001"), obj.value) begin @@ -302,9 +302,9 @@ assert_equal("\xA4\xA2".force_encoding("CP20932"), obj.value) end - WIN32OLE.codepage = WIN32OLE::CP_UTF8 + WIN32OLE.codepage = cp file = fso.opentextfile(fname, 2, true) - file.write [0x3042].pack("U*") + file.write [0x3042].pack("U*").force_encoding("UTF-8") file.close str = "" open(fname, "r:ascii-8bit") {|ifs| @@ -318,8 +318,9 @@ rescue WIN32OLERuntimeError end if (WIN32OLE.codepage == 20932) + WIN32OLE.codepage = cp file = fso.opentextfile(fname, 2, true) - file.write [164, 162].pack("c*") + file.write [164, 162].pack("c*").force_encoding("EUC-JP") file.close open(fname, "r:ascii-8bit") {|ifs| str = ifs.read Index: mvm/test/rubygems/test_gem.rb =================================================================== --- mvm/test/rubygems/test_gem.rb (revision 17631) +++ mvm/test/rubygems/test_gem.rb (revision 17632) @@ -3,6 +3,7 @@ require 'rubygems/gem_openssl' require 'rubygems/installer' require 'pathname' +require 'tmpdir' class TestGem < RubyGemTestCase @@ -260,9 +261,10 @@ unless win_platform? def test_self_path_APPLE_GEM_HOME Gem.clear_paths - Gem.const_set :APPLE_GEM_HOME, '/tmp/apple_gem_home' - - assert Gem.path.include?('/tmp/apple_gem_home') + Dir.mktmpdir("apple_gem_home") {|d| + Gem.const_set :APPLE_GEM_HOME, d + assert Gem.path.include?(d) + } ensure Gem.send :remove_const, :APPLE_GEM_HOME end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/