[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]