diff --git a/ChangeLog b/ChangeLog index 78d43ea7b2..49d3f1e530 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Tue Jul 9 11:04:35 2013 NAKAMURA Usaku + + * ext/{dl,fiddle}/win32/lib/win32/registry.rb (Win32::Regstry#check): + should report the position of the error. + + * ext/{dl,fiddle}/win32/lib/win32/registry.rb + (Win32::Regstry#QueryValue): workaround for test-all crash. + Tue Jul 9 10:27:56 2013 NAKAMURA Usaku * ext/{dl,fiddle}/win32/lib/win32/registry.rb diff --git a/ext/dl/win32/lib/win32/registry.rb b/ext/dl/win32/lib/win32/registry.rb index d9ba5519f9..5be711c0e6 100644 --- a/ext/dl/win32/lib/win32/registry.rb +++ b/ext/dl/win32/lib/win32/registry.rb @@ -232,7 +232,7 @@ For detail, see the MSDN[http://msdn.microsoft.com/library/en-us/sysinfo/base/pr module_function def check(result) - raise Error, result, caller(2) if result != 0 + raise Error, result, caller(1) if result != 0 end def packdw(dw) @@ -283,13 +283,18 @@ For detail, see the MSDN[http://msdn.microsoft.com/library/en-us/sysinfo/base/pr end def QueryValue(hkey, name) - type = packdw(0) - size = packdw(0) - name = name.encode(WCHAR) - check RegQueryValueExW.call(hkey, name, 0, type, 0, size) - data = WCHAR_SPACE * unpackdw(size) - check RegQueryValueExW.call(hkey, name, 0, type, data, size) - [ unpackdw(type), data[0, unpackdw(size)].encode ] + prev_gc = GC.disable + begin + type = packdw(0) + size = packdw(0) + name = name.encode(WCHAR) + check RegQueryValueExW.call(hkey, name, 0, type, 0, size) + data = WCHAR_SPACE * unpackdw(size) + check RegQueryValueExW.call(hkey, name, 0, type, data, size) + [ unpackdw(type), data[0, unpackdw(size)].encode ] + ensure + GC.enable if prev_gc + end end def SetValue(hkey, name, type, data, size) diff --git a/ext/fiddle/win32/lib/win32/registry.rb b/ext/fiddle/win32/lib/win32/registry.rb index 401a795df9..5fc9626e2d 100644 --- a/ext/fiddle/win32/lib/win32/registry.rb +++ b/ext/fiddle/win32/lib/win32/registry.rb @@ -232,7 +232,7 @@ For detail, see the MSDN[http://msdn.microsoft.com/library/en-us/sysinfo/base/pr module_function def check(result) - raise Error, result, caller(2) if result != 0 + raise Error, result, caller(1) if result != 0 end def packdw(dw) @@ -283,13 +283,18 @@ For detail, see the MSDN[http://msdn.microsoft.com/library/en-us/sysinfo/base/pr end def QueryValue(hkey, name) - type = packdw(0) - size = packdw(0) - name = name.encode(WCHAR) - check RegQueryValueExW.call(hkey, name, 0, type, 0, size) - data = WCHAR_SPACE * unpackdw(size) - check RegQueryValueExW.call(hkey, name, 0, type, data, size) - [ unpackdw(type), data[0, unpackdw(size)].encode ] + prev_gc = GC.disable + begin + type = packdw(0) + size = packdw(0) + name = name.encode(WCHAR) + check RegQueryValueExW.call(hkey, name, 0, type, 0, size) + data = WCHAR_SPACE * unpackdw(size) + check RegQueryValueExW.call(hkey, name, 0, type, data, size) + [ unpackdw(type), data[0, unpackdw(size)].encode ] + ensure + GC.enable if prev_gc + end end def SetValue(hkey, name, type, data, size)