* ext/win32ole/lib/win32ole.rb: use TracePoint to hook all thread
  creation not only by Thread.new and to get rid of interference with
  svar scope.  [Bug #7681] [ruby-core:51365]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38848 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2013-01-16 09:45:48 +00:00
Родитель 2d59c39978
Коммит 0c61c3b67b
3 изменённых файлов: 27 добавлений и 23 удалений

Просмотреть файл

@ -1,3 +1,9 @@
Wed Jan 16 18:45:46 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
* ext/win32ole/lib/win32ole.rb: use TracePoint to hook all thread
creation not only by Thread.new and to get rid of interference with
svar scope. [Bug #7681] [ruby-core:51365]
Wed Jan 16 09:35:53 2013 Eric Hodel <drbrain@segment7.net>
* .document: Removed extra space

Просмотреть файл

@ -3,20 +3,5 @@ require 'win32ole.so'
# re-define Thread#initialize
# bug #2618(ruby-core:27634)
class Thread
alias :org_initialize :initialize
def initialize(*arg, &block)
if block
org_initialize(*arg) {
WIN32OLE.ole_initialize
begin
block.call(*arg)
ensure
WIN32OLE.ole_uninitialize
end
}
else
org_initialize(*arg)
end
end
end
TracePoint.trace(:thread_begin) {WIN32OLE.ole_initialize}
TracePoint.trace(:thread_end) {WIN32OLE.ole_uninitialize}

Просмотреть файл

@ -9,12 +9,25 @@ if defined?(WIN32OLE)
#
# test for Bug #2618(ruby-core:27634)
#
def test_creating_win32ole_object_in_thread
t = Thread.new do
dict = WIN32OLE.new('Scripting.Dictionary')
assert(true)
end
t.join
def assert_creating_win32ole_object_in_thread(meth)
t = Thread.__send__(meth) {
WIN32OLE.new('Scripting.Dictionary')
}
assert_nothing_raised(WIN32OLERuntimeError, "[Bug #2618] Thread.#{meth}") {
t.join
}
end
def test_creating_win32ole_object_in_thread_new
assert_creating_win32ole_object_in_thread(:new)
end
def test_creating_win32ole_object_in_thread_start
assert_creating_win32ole_object_in_thread(:start)
end
def test_creating_win32ole_object_in_thread_fork
assert_creating_win32ole_object_in_thread(:fork)
end
end
end