From: Brian Durand Date: 2010-12-18T01:57:58+09:00 Subject: [ruby-core:33763] [Ruby 1.9-Bug#4168][Open] WeakRef is unsafe to use in Ruby 1.9 --mimepart_4d0b96895ac55_1fb75bf429e375 Content-Type: text/plain Content-Transfer-Encoding: Quoted-printable Content-Disposition: inline Bug #4168: WeakRef is unsafe to use in Ruby 1.9 http://redmine.ruby-lang.org/issues/show/4168 Author: Brian Durand Status: Open, Priority: Normal Category: lib, Target version: 1.9.x ruby -v: ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-darwin10.4.0] I've found a couple issues with the implementation of WeakRef in Ruby 1.9= . 1. WeakRef is unsafe to use because the ObjectSpace will recycle object i= ds for use with newly allocated objects after the old objects have been g= arbage collected. This problem was not present in 1.8, but with the 1.9 t= hreading improvements there is no guarantee that the garbage collector th= read has finished running the finalizers before new objects are allocated= . This can result in a WeakRef returning a different object than the one = it originally referenced. 2. In Ruby 1.9 a Mutex is used to synchronize access to the shared data s= tructures. However, Mutexes are not reentrant and the finalizers are sile= ntly throwing deadlock errors if they run while new WeakRefs are being cr= eated. I've included in my patch a reimplementation of WeakRef called WeakRefere= nce that does not extend Delegator. This code is based on the original We= akRef code but has been rewritten so the variable names are a little clea= rer. It replaces the Mutex with a Monitor and adds an additional check to= make sure that the object returned by the reference is the same one it o= riginally referred to. WeakRef is rewritten as a Delegator wrapper around= a WeakReference for backward compatibility. I went this route because in some Ruby implementations (like Ruby 1.8), D= elegator is very heavy weight to instantiate and creating a collection of= thousands of WeakRefs will be slow and use up far too much memory (in fa= ct, it would be nice to either backport this patch to Ruby 1.8 or the del= egate changes from 1.9 to 1.8 if possible). I also don't really see the v= alue of having weak references be delegators since is very unsafe to do a= nything without wrapping the call in a "rescue RefError" block. The objec= t can be reclaimed at any time so the only safe method to be sure you sti= ll have it is to create a strong reference to the object at which point y= ou might as well use that reference instead of the delegated methods on t= he WeakRef. It also should be simpler for other implementations of Ruby l= ike Jruby or Rubinius to map native weak references to a simpler interfac= e. Sample code with WeakReference orig =3D Object.new ref =3D WeakReference.new(orig) # ... obj =3D ref.object if obj # Do something end = I also have a version of the patch which just fixes WeakRef to work witho= ut introducing a new class, but I feel this version is the right way to g= o. Also included are unit tests for weak references but the test that checks= for the broken functionality is not 100% reliable since garbage collecti= on is not deterministic. I've also included a script that shows the probl= em in more detail with the existing weak reference implementation. ruby show_bug.rb 100000 # Run 100,000 iterations on the current i= mplementation of WeakRef and report any problems ruby -I. show_bug.rb 100000 # Run 100,000 iterations on the new imple= mentation of WeakRef and report any problems ---------------------------------------- http://redmine.ruby-lang.org --mimepart_4d0b96895ac55_1fb75bf429e375 Content-Type: text/x-ruby-script; name=weakref.rb Content-Transfer-Encoding: Base64 Content-Disposition: attachment; filename=weakref.rb cmVxdWlyZSAnbW9uaXRvcicKCiMgV2Vha1JlZmVyZW5jZSBpcyBhIGNsYXNz IHRvIHJlcHJlc2VudCBhIHJlZmVyZW5jZSB0byBhbiBvYmplY3QgdGhhdCBp cyBub3Qgc2VlbiBieQojIHRoZSB0cmFjaW5nIHBoYXNlIG9mIHRoZSBnYXJi YWdlIGNvbGxlY3Rvci4gIFRoaXMgYWxsb3dzIHRoZSByZWZlcmVuY2VkCiMg b2JqZWN0IHRvIGJlIGdhcmJhZ2UgY29sbGVjdGVkIGFzIGlmIG5vdGhpbmcg aXMgcmVmZXJyaW5nIHRvIGl0LgojCiMgVGhlIGRpZmZlcmVuY2UgYmV0d2Vl biB0aGlzIGNsYXNzIGFuZCBXZWFrUmVmIGlzIHRoYXQgdGhpcyBjbGFzcyBk b2VzIG5vdAojIHVzZSB0aGUgZGVsZWdhdG9yIHBhdHRlcm4gYW5kIHNvIGhh cyBhbiBpbnRlcmZhY2UgbW9yZSBzdWl0ZWQgZm9yIGRldGVjdGluZwojIGlm IHRoZSByZWZlcmVuY2VkIG9iamVjdCBoYXMgYmVlbiByZWNsYWltZWQuCiMK IyBVc2FnZToKIwojICAgZm9vID0gT2JqZWN0Lm5ldwojICAgcmVmID0gQWN0 aXZlU3VwcG9ydDo6V2Vha1JlZmVyZW5jZS5uZXcoZm9vKQojICAgcmVmLmFs aXZlPwkJCSMgc2hvdWxkIGJlIHRydWUKIyAgIHJlZi5vYmplY3QJCQkjIHNo b3VsZCBiZSBmb28KIyAgIE9iamVjdFNwYWNlLmdhcmJhZ2VfY29sbGVjdAoj ICAgcmVmLmFsaXZlPwkJCSMgc2hvdWxkIGJlIGZhbHNlCiMgICByZWYub2Jq ZWN0CQkJIyBzaG91bGQgYmUgbmlsCmNsYXNzIFdlYWtSZWZlcmVuY2UKICBh dHRyX3JlYWRlciA6cmVmZXJlbmNlZF9vYmplY3RfaWQKICAKICAjIE1hcCBv ZiByZWZlcmVuY2VzIHRvIHRoZSBvYmplY3RfaWQncyB0aGV5IHJlZmVyIHRv LgogIEBAcmVmZXJlbmNlZF9vYmplY3RfaWRzID0ge30KCiAgIyBNYXAgb2Yg b2JqZWN0X2lkcyB0byByZWZlcmVuY2VzIHRvIHRoZW0uCiAgQEBvYmplY3Rf aWRfcmVmZXJlbmNlcyA9IHt9CgogIEBAbW9uaXRvciA9IE1vbml0b3IubmV3 CgogICMgRmluYWxpemVyIHRoYXQgY2xlYW5zIHVwIHdlYWsgcmVmZXJlbmNl cyB3aGVuIGFuIG9iamVjdCBpcyBkZXN0cm95ZWQuCiAgQEBvYmplY3RfZmlu YWxpemVyID0gbGFtYmRhIGRvIHxvYmplY3RfaWR8CiAgICBAQG1vbml0b3Iu c3luY2hyb25pemUgZG8KICAgICAgcmVmZXJlbmNlX2lkcyA9IEBAb2JqZWN0 X2lkX3JlZmVyZW5jZXNbb2JqZWN0X2lkXQogICAgICBpZiByZWZlcmVuY2Vf aWRzCiAgICAJICByZWZlcmVuY2VfaWRzLmVhY2ggZG8gfHJlZmVyZW5jZV9v YmplY3RfaWR8CiAgICAJICAgIEBAcmVmZXJlbmNlZF9vYmplY3RfaWRzLmRl bGV0ZShyZWZlcmVuY2Vfb2JqZWN0X2lkKQogICAgCSAgZW5kCiAgICAJICBA QG9iamVjdF9pZF9yZWZlcmVuY2VzLmRlbGV0ZShvYmplY3RfaWQpCiAgCSAg ZW5kCiAgICBlbmQKICBlbmQKCiAgIyBGaW5hbGl6ZXIgdGhhdCBjbGVhbnMg dXAgd2VhayByZWZlcmVuY2VzIHdoZW4gcmVmZXJlbmNlcyBhcmUgZGVzdHJv eWVkLgogIEBAcmVmZXJlbmNlX2ZpbmFsaXplciA9IGxhbWJkYSBkbyB8b2Jq ZWN0X2lkfAogICAgQEBtb25pdG9yLnN5bmNocm9uaXplIGRvCiAgICAgIHJl ZmVyZW5jZWRfaWQgPSBAQHJlZmVyZW5jZWRfb2JqZWN0X2lkcy5kZWxldGUo b2JqZWN0X2lkKQogICAgICBpZiByZWZlcmVuY2VkX2lkCiAgICAgICAgb2Jq ID0gT2JqZWN0U3BhY2UuX2lkMnJlZihyZWZlcmVuY2VkX29iamVjdF9pZCkg cmVzY3VlIG5pbAogICAgICAgIGlmIG9iagogICAgICAgICAgYmFja3JlZmVy ZW5jZXMgPSBvYmouaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDpAX193ZWFrX2Jh Y2tyZWZlcmVuY2VzX18pIGlmIG9iai5pbnN0YW5jZV92YXJpYWJsZV9kZWZp bmVkPyg6QF9fd2Vha19iYWNrcmVmZXJlbmNlc19fKQogICAgICAgICAgaWYg YmFja3JlZmVyZW5jZXMKICAgICAgICAgICAgYmFja3JlZmVyZW5jZXMuZGVs ZXRlKG9iamVjdF9pZCkKICAgICAgICAgICAgb2JqLnJlbW92ZV9pbnN0YW5j ZV92YXJpYWJsZSg6QF9fd2Vha19iYWNrcmVmZXJlbmNlc19fKSBpZiBiYWNr cmVmZXJlbmNlcy5lbXB0eT8KICAgICAgICAgIGVuZAogICAgICAgIGVuZAog ICAgICAgIHJlZmVyZW5jZXMgPSBAQG9iamVjdF9pZF9yZWZlcmVuY2VzW3Jl ZmVyZW5jZWRfaWRdCiAgICAgICAgaWYgcmVmZXJlbmNlcwogICAgICAgICAg cmVmZXJlbmNlcy5kZWxldGUob2JqZWN0X2lkKQogICAgICAJICBAQG9iamVj dF9pZF9yZWZlcmVuY2VzLmRlbGV0ZShyZWZlcmVuY2VkX2lkKSBpZiByZWZl cmVuY2VzLmVtcHR5PwogICAgCSAgZW5kCiAgCSAgZW5kCiAgICBlbmQKICBl bmQKCiAgIyBDcmVhdGUgYSBuZXcgd2VhayByZWZlcmVuY2UgdG8gYW4gb2Jq ZWN0LiBUaGUgZXhpc3RlbmNlIG9mIHRoZSB3ZWFrIHJlZmVyZW5jZQogICMg d2lsbCBub3QgcHJldmVudCB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgZnJvbSBy ZWNsYWltaW5nIHRoZSByZWZlcmVuY2VkIG9iamVjdC4KICBkZWYgaW5pdGlh bGl6ZShvYmopCiAgICBAcmVmZXJlbmNlZF9vYmplY3RfaWQgPSBvYmouX19p ZF9fCiAgICBPYmplY3RTcGFjZS5kZWZpbmVfZmluYWxpemVyKG9iaiwgQEBv YmplY3RfZmluYWxpemVyKQogICAgT2JqZWN0U3BhY2UuZGVmaW5lX2ZpbmFs aXplcihzZWxmLCBAQHJlZmVyZW5jZV9maW5hbGl6ZXIpCiAgICBAQG1vbml0 b3Iuc3luY2hyb25pemUgZG8KICAgICAgQEByZWZlcmVuY2VkX29iamVjdF9p ZHNbc2VsZi5fX2lkX19dID0gb2JqLl9faWRfXwogICAgICBhZGRfYmFja3Jl ZmVyZW5jZShvYmopCiAgICAgIHJlZmVyZW5jZXMgPSBAQG9iamVjdF9pZF9y ZWZlcmVuY2VzW29iai5fX2lkX19dCiAgICAgIHVubGVzcyByZWZlcmVuY2Vz CiAgICAgICAgcmVmZXJlbmNlcyA9IFtdCiAgICAgICAgQEBvYmplY3RfaWRf cmVmZXJlbmNlc1tvYmouX19pZF9fXSA9IHJlZmVyZW5jZXMKICAgICAgZW5k CiAgICAgIHJlZmVyZW5jZXMucHVzaChzZWxmLl9faWRfXykKICAgIGVuZAog IGVuZAoKICAjIEdldCB0aGUgcmVmZXJlbmNlIG9iamVjdC4gSWYgdGhlIG9i amVjdCBoYXMgYWxyZWFkeSBiZWVuIGdhcmJhZ2UgY29sbGVjdGVkLAogICMg dGhlbiB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBuaWwuCiAgZGVmIG9iamVj dAogICAgb2JqID0gbmlsCiAgICBiZWdpbgogICAgICBpZiByZWZlcmVuY2Vk X29iamVjdF9pZCA9PSBAQHJlZmVyZW5jZWRfb2JqZWN0X2lkc1tzZWxmLm9i amVjdF9pZF0KICAgICAgICBvYmogPSBPYmplY3RTcGFjZS5faWQycmVmKHJl ZmVyZW5jZWRfb2JqZWN0X2lkKQogICAgICAgIG9iaiA9IG5pbCB1bmxlc3Mg dmVyaWZ5X2JhY2tyZWZlcmVuY2VzKG9iaikKICAgICAgZW5kCiAgICByZXNj dWUgUmFuZ2VFcnJvcgogICAgICAjIE9iamVjdCBoYXMgYmVlbiBnYXJiYWdl IGNvbGxlY3RlZC4KICAgIGVuZAogICAgb2JqCiAgZW5kCgogIHByaXZhdGUK CiAgICBkZWYgYWRkX2JhY2tyZWZlcmVuY2Uob2JqKQogICAgICBiYWNrcmVm ZXJlbmNlcyA9IG9iai5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOkBfX3dlYWtf YmFja3JlZmVyZW5jZXNfXykgaWYgb2JqLmluc3RhbmNlX3ZhcmlhYmxlX2Rl ZmluZWQ/KDpAX193ZWFrX2JhY2tyZWZlcmVuY2VzX18pCiAgICAgIHVubGVz cyBiYWNrcmVmZXJlbmNlcwogICAgICAgIGJhY2tyZWZlcmVuY2VzID0gW10K ICAgICAgICBvYmouaW5zdGFuY2VfdmFyaWFibGVfc2V0KDpAX193ZWFrX2Jh Y2tyZWZlcmVuY2VzX18sIGJhY2tyZWZlcmVuY2VzKQogICAgICBlbmQKICAg ICAgYmFja3JlZmVyZW5jZXMgPDwgb2JqZWN0X2lkCiAgICBlbmQKCiAgICBk ZWYgdmVyaWZ5X2JhY2tyZWZlcmVuY2VzKG9iaikKICAgICAgYmFja3JlZmVy ZW5jZXMgPSBvYmouaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDpAX193ZWFrX2Jh Y2tyZWZlcmVuY2VzX18pIGlmIG9iai5pbnN0YW5jZV92YXJpYWJsZV9kZWZp bmVkPyg6QF9fd2Vha19iYWNrcmVmZXJlbmNlc19fKQogICAgICBiYWNrcmVm ZXJlbmNlcyAmJiBiYWNrcmVmZXJlbmNlcy5pbmNsdWRlPyhvYmplY3RfaWQp CiAgICBlbmQKZW5kCgpyZXF1aXJlICJkZWxlZ2F0ZSIKCiMgV2Vha1JlZiBp cyBhIGNsYXNzIHRvIHJlcHJlc2VudCBhIHJlZmVyZW5jZSB0byBhbiBvYmpl Y3QgdGhhdCBpcyBub3Qgc2VlbiBieSB0aGUgdHJhY2luZwojIHBoYXNlIG9m IHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4gVGhpcyBhbGxvd3MgdGhlIHJlZmVy ZW5jZWQgb2JqZWN0IHRvIGJlIGdhcmJhZ2UgY29sbGVjdGVkCiMgYXMgaWYg bm90aGluZyBpcyByZWZlcnJpbmcgdG8gaXQuIEJlY2F1c2UgV2Vha1JlZiBk ZWxlZ2F0ZXMgbWV0aG9kIGNhbGxzIHRvIHRoZSByZWZlcmVuY2VkCiMgb2Jq ZWN0LCBpdCBtYXkgYmUgdXNlZCBpbiBwbGFjZSBvZiB0aGF0IG9iamVjdCwg aS5lLiBpdCBpcyBvZiB0aGUgc2FtZSBkdWNrIHR5cGUuCiMKIyBJZiB5b3Ug ZG9uJ3QgbmVlZCB0byB1c2UgdGhlIGRlbGVnYXRvciBwYXR0ZXJuLCB5b3Ug Y2FuIHVzZSBXZWFrUmVmZXJlbmNlIGluc3RlYWQuCiMKIyBVc2FnZToKIyAg IGZvbyA9IE9iamVjdC5uZXcKIyAgIGZvbyA9IE9iamVjdC5uZXcKIyAgIHAg Zm9vLnRvX3MJCQkjIG9yaWdpbmFsJ3MgY2xhc3MKIyAgIGZvbyA9IFdlYWtS ZWYubmV3KGZvbykKIyAgIHAgZm9vLnRvX3MJCQkjIHNob3VsZCBiZSBzYW1l IGNsYXNzCiMgICBPYmplY3RTcGFjZS5nYXJiYWdlX2NvbGxlY3QKIyAgIHAg Zm9vLnRvX3MJCQkjIHNob3VsZCByYWlzZSBleGNlcHRpb24gKHJlY3ljbGVk KQpjbGFzcyBXZWFrUmVmIDwgRGVsZWdhdG9yCiAgY2xhc3MgUmVmRXJyb3Ig PCBTdGFuZGFyZEVycm9yCiAgZW5kCiAgCiAgZGVmIGluaXRpYWxpemUob2Jq KQogICAgc3VwZXIKICBlbmQKICAKICBkZWYgX19nZXRvYmpfXwogICAgb2Jq ID0gQHJlZmVyZW5jZS5vYmplY3QKICAgIEtlcm5lbDo6cmFpc2UoUmVmRXJy b3IsICJJbnZhbGlkIFJlZmVyZW5jZSAtIHByb2JhYmx5IHJlY3ljbGVkIiwg S2VybmVsOjpjYWxsZXIoMSkpIHVubGVzcyBvYmoKICAgIG9iagogIGVuZAog IAogIGRlZiBfX3NldG9ial9fKG9iaikKICAgIEByZWZlcmVuY2UgPSBXZWFr UmVmZXJlbmNlLm5ldyhvYmopCiAgZW5kCiAgCiAgZGVmIHdlYWtyZWZfYWxp dmU/CiAgICAhIUByZWZlcmVuY2Uub2JqZWN0CiAgZW5kCmVuZAoKaWYgX19G SUxFX18gPT0gJDAKICBmb28gPSBPYmplY3QubmV3CiAgcCBmb28udG9fcwkJ CSMgb3JpZ2luYWwncyBjbGFzcwogIGZvbyA9IFdlYWtSZWYubmV3KGZvbykK ICBwIGZvby50b19zCQkJIyBzaG91bGQgYmUgc2FtZSBjbGFzcwogIE9iamVj dFNwYWNlLmdhcmJhZ2VfY29sbGVjdAogIE9iamVjdFNwYWNlLmdhcmJhZ2Vf Y29sbGVjdAogIHAgZm9vLnRvX3MJCQkjIHNob3VsZCByYWlzZSBleGNlcHRp b24gKHJlY3ljbGVkKQplbmQK --mimepart_4d0b96895ac55_1fb75bf429e375 Content-Type: text/x-ruby-script; name=test_weakref.rb Content-Transfer-Encoding: Base64 Content-Disposition: attachment; filename=test_weakref.rb cmVxdWlyZSAndGVzdC91bml0JwpyZXF1aXJlICd3ZWFrcmVmJwoKY2xhc3Mg VGVzdFdlYWtSZWYgPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQogIGRlZiB0ZXN0 X2Nhbl9nZXRfbm9uX2dhcmJhZ2VfY29sbGVjdGVkX29iamVjdHMKICAgIG9i aiA9IE9iamVjdC5uZXcKICAgIHJlZiA9IFdlYWtSZWYubmV3KG9iaikKICAg IGFzc2VydF9lcXVhbCBvYmosIHJlZi5fX2dldG9ial9fCiAgICBhc3NlcnRf ZXF1YWwgdHJ1ZSwgcmVmLndlYWtyZWZfYWxpdmU/CiAgZW5kCgogIGRlZiB0 ZXN0X2dldF90aGVfY29ycmVjdF9vYmplY3QKICAgICMgU2luY2Ugd2UgY2Fu J3QgcmVsaWFibHkgY29udHJvbCB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IsIHRo aXMgaXMgYSBicnV0ZSBmb3JjZSB0ZXN0LgogICAgIyBJdCBtaWdodCBub3Qg YWx3YXlzIGZhaWwgaWYgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIGFuZCBtZW1v cnkgYWxsb2NhdG9yIGRvbid0CiAgICAjIGNvb3BlcmF0ZSwgYnV0IGl0IHNo b3VsZCBmYWlsIG9mdGVuIGVub3VnaCBvbiBjb250aW51b3VzIGludGVncmF0 aW9uIHRvCiAgICAjIGhpbGl0ZSBhbnkgcHJvYmxlbXMuCiAgICBpZF90b19y ZWYgPSB7fQogICAgNTAwMDAudGltZXMgZG8gfGl8CiAgICAgIG9iaiA9IE9i amVjdC5uZXcKICAgICAgaWYgaWRfdG9fcmVmLmtleT8ob2JqLm9iamVjdF9p ZCkKICAgICAgICByZWYgPSBpZF90b19yZWZbb2JqLm9iamVjdF9pZF0KICAg ICAgICByZWZvYmogPSByZWYuX19nZXRvYmpfXyByZXNjdWUgbmlsCiAgICAg ICAgaWYgcmVmb2JqCiAgICAgICAgICBmbHVuayAid2VhayByZWZlcmVuY2Ug Zm91bmQgd2l0aCBhIGxpdmUgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCB0aGF0 IHdhcyBub3QgdGhlIG9uZSBpdCB3YXMgY3JlYXRlZCB3aXRoIgogICAgICAg ICAgYnJlYWsKICAgICAgICBlbmQKICAgICAgZW5kCiAgICAgICV3KEhlcmUg YXJlIGEgYnVuY2ggb2Ygb2JqZWN0cyB0aGF0IGFyZSBhbGxvY2F0ZWQgYW5k IGNhbiB0aGVuIGJlIGNsZWFuZWQgdXAgYnkgdGhlIGdhcmJhZ2UgY29sbGVj dG9yKQogICAgICBpZF90b19yZWZbb2JqLm9iamVjdF9pZF0gPSBXZWFrUmVm Lm5ldyhvYmopCiAgICAgIGlmIGkgJSAxMDAwID09IDAKICAgICAgICBHQy5z dGFydAogICAgICAgIHNsZWVwKDAuMDEpCiAgICAgIGVuZAogICAgZW5kCiAg ZW5kCmVuZAoKY2xhc3MgVGVzdFdlYWtSZWZlcmVuY2UgPCBUZXN0OjpVbml0 OjpUZXN0Q2FzZQogIGRlZiB0ZXN0X2Nhbl9nZXRfbm9uX2dhcmJhZ2VfY29s bGVjdGVkX29iamVjdHMKICAgIG9iaiA9IE9iamVjdC5uZXcKICAgIHJlZiA9 IFdlYWtSZWZlcmVuY2UubmV3KG9iaikKICAgIGFzc2VydF9lcXVhbCBvYmos IHJlZi5vYmplY3QKICAgIGFzc2VydF9lcXVhbCBvYmoub2JqZWN0X2lkLCBy ZWYucmVmZXJlbmNlZF9vYmplY3RfaWQKICBlbmQKCiAgZGVmIHRlc3RfZ2V0 X3RoZV9jb3JyZWN0X29iamVjdAogICAgIyBTaW5jZSB3ZSBjYW4ndCByZWxp YWJseSBjb250cm9sIHRoZSBnYXJiYWdlIGNvbGxlY3RvciwgdGhpcyBpcyBh IGJydXRlIGZvcmNlIHRlc3QuCiAgICAjIEl0IG1pZ2h0IG5vdCBhbHdheXMg ZmFpbCBpZiB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgYW5kIG1lbW9yeSBhbGxv Y2F0b3IgZG9uJ3QKICAgICMgY29vcGVyYXRlLCBidXQgaXQgc2hvdWxkIGZh aWwgb2Z0ZW4gZW5vdWdoIG9uIGNvbnRpbnVvdXMgaW50ZWdyYXRpb24gdG8K ICAgICMgaGlsaXRlIGFueSBwcm9ibGVtcy4KICAgIGlkX3RvX3JlZiA9IHt9 CiAgICA1MDAwMC50aW1lcyBkbyB8aXwKICAgICAgb2JqID0gT2JqZWN0Lm5l dwogICAgICBpZiBpZF90b19yZWYua2V5PyhvYmoub2JqZWN0X2lkKQogICAg ICAgIHJlZiA9IGlkX3RvX3JlZltvYmoub2JqZWN0X2lkXQogICAgICAgIGlm IHJlZi5vYmplY3QKICAgICAgICAgIGZsdW5rICJ3ZWFrIHJlZmVyZW5jZSBm b3VuZCB3aXRoIGEgbGl2ZSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IHRoYXQg d2FzIG5vdCB0aGUgb25lIGl0IHdhcyBjcmVhdGVkIHdpdGgiCiAgICAgICAg ICBicmVhawogICAgICAgIGVuZAogICAgICBlbmQKICAgICAgJXcoSGVyZSBh cmUgYSBidW5jaCBvZiBvYmplY3RzIHRoYXQgYXJlIGFsbG9jYXRlZCBhbmQg Y2FuIHRoZW4gYmUgY2xlYW5lZCB1cCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0 b3IpCiAgICAgIGlkX3RvX3JlZltvYmoub2JqZWN0X2lkXSA9IFdlYWtSZWZl cmVuY2UubmV3KG9iaikKICAgICAgaWYgaSAlIDEwMDAgPT0gMAogICAgICAg IEdDLnN0YXJ0CiAgICAgICAgc2xlZXAoMC4wMSkKICAgICAgZW5kCiAgICBl bmQKICBlbmQKCiAgZGVmIHRlc3RfaW5zcGVjdAogICAgcmVmID0gV2Vha1Jl ZmVyZW5jZS5uZXcoT2JqZWN0Lm5ldykKICAgIGFzc2VydCByZWYuaW5zcGVj dAogICAgR0Muc3RhcnQKICAgIEdDLnN0YXJ0CiAgICBhc3NlcnQgcmVmLmlu c3BlY3QKICBlbmQKZW5kCg== --mimepart_4d0b96895ac55_1fb75bf429e375 Content-Type: text/x-ruby-script; name=show_bug.rb Content-Transfer-Encoding: Base64 Content-Disposition: attachment; filename=show_bug.rb cmVxdWlyZSAnd2Vha3JlZicKCmRlZiB0ZXN0X3dlYWtfcmVmZXJlbmNlcyhr bGFzcywgaXRlcmF0aW9ucykKICBwdXRzICJUZXN0aW5nIGlmIG9iamVjdCBp ZCdzIGNhbiBiZSByZXVzZWQgYnkgI3trbGFzc30uLi4iCiAgaSA9IDAKICBu ID0gMAogIGlkX3RvX3JlZiA9IHt9CiAgZmFpbHVyZXMgPSAwCiAgaXRlcmF0 aW9ucyA9IDEwMDAwMCBpZiBpdGVyYXRpb25zIDw9IDAKICAKICBpdGVyYXRp b25zLnRpbWVzIGRvCiAgICBpICs9IDEKICAgIG9iaiA9IE9iamVjdC5uZXcK CiAgICBpZiBpZF90b19yZWYua2V5PyhvYmoub2JqZWN0X2lkKQogICAgICBu ICs9IDEKICAgICAgcmVmID0gaWRfdG9fcmVmW29iai5vYmplY3RfaWRdCiAg ICAgIGlmIHJlZi53ZWFrcmVmX2FsaXZlPwogICAgICAgIFNURE9VVC53cml0 ZSgneCcpCiAgICAgICAgU1RET1VULmZsdXNoCiAgICAgICAgZmFpbHVyZXMg Kz0gMQogICAgICBlbmQKICAgIGVuZAoKICAgIHJlZiA9IGtsYXNzLm5ldyhv YmopCiAgICBpZF90b19yZWZbb2JqLm9iamVjdF9pZF0gPSByZWYKICAgIHJh aXNlICIje2tsYXNzfSBkaWQgbm90IHJldHVybiB0aGUgY29ycmVjdCBvYmpl Y3QhIiB1bmxlc3MgKGtsYXNzLm5hbWUgPT0gIldlYWtSZWZlcmVuY2UiID8g cmVmLm9iamVjdCA6IHJlZi5fX2dldG9ial9fKSA9PSBvYmoKICAgIGlmIGkg JSA1MDAwID09IDAKICAgICAgU1RET1VULndyaXRlKCcuJykKICAgICAgU1RE T1VULmZsdXNoCiAgICBlbmQKICBlbmQKICBTVERPVVQud3JpdGUoIlxuIikK ICAKICBjb2xsZWN0ZWQgPSBuCiAgaWRfdG9fcmVmLnZhbHVlcy5lYWNoIGRv IHxyZWZ8CiAgICBjb2xsZWN0ZWQgKz0gMSBpZiByZWYud2Vha3JlZl9hbGl2 ZT8KICBlbmQKICBwdXRzICIje2NvbGxlY3RlZH0gaW5zdGFuY2VzIG91dCBv ZiAje2l0ZXJhdGlvbnN9ICgjeygoY29sbGVjdGVkLnRvX2YgLyBpdGVyYXRp b25zKSAqIDEwMCkucm91bmR9JSkgb2JqZWN0cyByZWZlcmVyZW5jZWQgYnkg I3trbGFzc30gd2VyZSByZWNsYWltZWQgYnkgdGhlIGdhcmJhZ2UgY29sbGVj dG9yIgogIAogIGlmIGZhaWx1cmVzID09IDAKICAgIHB1dHMgIlNVQ0NFU1M6 IGV2ZW4gd2l0aCAje259IG9iamVjdCBpZCdzIGJlaW5nIHJldXNlZCBpbiAj e2l0ZXJhdGlvbnN9IGl0ZXJhdGlvbnMiCiAgZWxzZQogICAgcHV0cyAiRkFJ TFVSRTogI3tmYWlsdXJlc30gaW5zdGFuY2VzIG9mIG9iamVjdCBpZHMgYmVp bmcgaW5jb3JyZWN0bHkgcmVmZXJlbmNlZCBpbiAje2l0ZXJhdGlvbnN9IGl0 ZXJhdGlvbnMiCiAgZW5kCmVuZAoKaWYgJDAgPT0gX19GSUxFX18KICBpdGVy YXRpb25zID0gQVJHVi5maXJzdC50b19pCiAgaWYgZGVmaW5lZD8oV2Vha1Jl ZmVyZW5jZSkKICAgICMgQ29tcGF0aWJpbHR5IGhhY2sgdG8gbWFrZSBXZWFr UmVmZXJlbmNlIGR1Y2sgdHlwZSBsaWtlIGEgV2Vha1JlZiBmb3IgdGhlIHRl c3QuCiAgICBtb2R1bGUgV2Vha1JlZkNvbXBhdGliaWxpdHkKICAgICAgZGVm IF9fZ2V0b2JqX18KICAgICAgICBvYmplY3QKICAgICAgZW5kCiAgICAgIAog ICAgICBkZWYgd2Vha3JlZl9hbGl2ZT8KICAgICAgICBvYmplY3QgIT0gbmls CiAgICAgIGVuZAogICAgZW5kCiAgICBXZWFrUmVmZXJlbmNlLnNlbmQoOmlu Y2x1ZGUsIFdlYWtSZWZDb21wYXRpYmlsaXR5KQogICAgdGVzdF93ZWFrX3Jl ZmVyZW5jZXMgV2Vha1JlZmVyZW5jZSwgaXRlcmF0aW9ucwogIGVuZAogIHRl c3Rfd2Vha19yZWZlcmVuY2VzIFdlYWtSZWYsIGl0ZXJhdGlvbnMKZW5kCg== --mimepart_4d0b96895ac55_1fb75bf429e375 Content-Type: application/octet-stream; name=weakref_patch.diff Content-Transfer-Encoding: Base64 Content-Disposition: attachment; filename=weakref_patch.diff MTNjMTMKPCByZXF1aXJlICd0aHJlYWQnCi0tLQo+IHJlcXVpcmUgJ21vbml0 b3InCjIyLDI0YzIyLDI1CjwgICBAQG11dGV4ID0gTXV0ZXgubmV3CjwgICBA QGZpbmFsID0gbGFtYmRhIHt8aWR8CjwgICAgIEBAbXV0ZXguc3luY2hyb25p emUgewotLS0KPiAgIEBAbW9uaXRvciA9IE1vbml0b3IubmV3Cj4gCj4gICBA QG9iamVjdF9maW5hbGl6ZXIgPSBsYW1iZGEgZG8gfGlkfAo+ICAgICBAQG1v bml0b3Iuc3luY2hyb25pemUgZG8KMjcsMzBjMjgsMzEKPCAJZm9yIHJpZCBp biByaWRzCjwgCSAgQEBpZF9yZXZfbWFwLmRlbGV0ZShyaWQpCjwgCWVuZAo8 IAlAQGlkX21hcC5kZWxldGUoaWQpCi0tLQo+ICAgICAgICAgcmlkcy5lYWNo IGRvIHxyaWR8Cj4gICAgICAgICAgIEBAaWRfcmV2X21hcC5kZWxldGUocmlk KQo+ICAgICAgICAgZW5kCj4gICAgICAgICBAQGlkX21hcC5kZWxldGUoaWQp CjMxYTMzLDM3Cj4gICAgIGVuZAo+ICAgZW5kCj4gICAKPiAgIEBAcmVmZXJl bmNlX2ZpbmFsaXplciA9IGxhbWJkYSBkbyB8aWR8Cj4gICAgIEBAbW9uaXRv ci5zeW5jaHJvbml6ZSBkbwozNCwzNmM0MCw1MAo8IAlAQGlkX3Jldl9tYXAu ZGVsZXRlKGlkKQo8IAlAQGlkX21hcFtyaWRdLmRlbGV0ZShpZCkKPCAJQEBp ZF9tYXAuZGVsZXRlKHJpZCkgaWYgQEBpZF9tYXBbcmlkXS5lbXB0eT8KLS0t Cj4gICAgICAgICBvYmogPSBPYmplY3RTcGFjZS5faWQycmVmKHJlZmVyZW5j ZWRfb2JqZWN0X2lkKSByZXNjdWUgbmlsCj4gICAgICAgICBpZiBvYmoKPiAg ICAgICAgICAgYmFja3JlZmVyZW5jZXMgPSBvYmouaW5zdGFuY2VfdmFyaWFi bGVfZ2V0KDpAX193ZWFrX2JhY2tyZWZlcmVuY2VzX18pIGlmIG9iai5pbnN0 YW5jZV92YXJpYWJsZV9kZWZpbmVkPyg6QF9fd2Vha19iYWNrcmVmZXJlbmNl c19fKQo+ICAgICAgICAgICBpZiBiYWNrcmVmZXJlbmNlcwo+ICAgICAgICAg ICAgIGJhY2tyZWZlcmVuY2VzLmRlbGV0ZShvYmplY3RfaWQpCj4gICAgICAg ICAgICAgb2JqLnJlbW92ZV9pbnN0YW5jZV92YXJpYWJsZSg6QF9fd2Vha19i YWNrcmVmZXJlbmNlc19fKSBpZiBiYWNrcmVmZXJlbmNlcy5lbXB0eT8KPiAg ICAgICAgICAgZW5kCj4gICAgICAgICBlbmQKPiAgICAgICAgIEBAaWRfcmV2 X21hcC5kZWxldGUoaWQpCj4gICAgICAgICBAQGlkX21hcFtyaWRdLmRlbGV0 ZShpZCkKPiAgICAgICAgIEBAaWRfbWFwLmRlbGV0ZShyaWQpIGlmIEBAaWRf bWFwW3JpZF0uZW1wdHk/CjM4LDM5YzUyLDUzCjwgICAgIH0KPCAgIH0KLS0t Cj4gICAgIGVuZAo+ICAgZW5kCjQyLDQ1YzU2LDU5CjwgICAgIEBfX2lkID0g b3JpZy5vYmplY3RfaWQKPCAgICAgT2JqZWN0U3BhY2UuZGVmaW5lX2ZpbmFs aXplciBvcmlnLCBAQGZpbmFsCjwgICAgIE9iamVjdFNwYWNlLmRlZmluZV9m aW5hbGl6ZXIgc2VsZiwgQEBmaW5hbAo8ICAgICBAQG11dGV4LnN5bmNocm9u aXplIHsKLS0tCj4gICAgIEBfX2lkID0gb3JpZy5fX2lkX18KPiAgICAgT2Jq ZWN0U3BhY2UuZGVmaW5lX2ZpbmFsaXplciBvcmlnLCBAQG9iamVjdF9maW5h bGl6ZXIKPiAgICAgT2JqZWN0U3BhY2UuZGVmaW5lX2ZpbmFsaXplciBzZWxm LCBAQHJlZmVyZW5jZV9maW5hbGl6ZXIKPiAgICAgQEBtb25pdG9yLnN5bmNo cm9uaXplIGRvCjQ3LDQ5YzYxLDY0CjwgICAgIH0KPCAgICAgQEBpZF9tYXBb QF9faWRdLnB1c2ggc2VsZi5vYmplY3RfaWQKPCAgICAgQEBpZF9yZXZfbWFw W3NlbGYub2JqZWN0X2lkXSA9IEBfX2lkCi0tLQo+ICAgICAgIEBAaWRfbWFw W0BfX2lkXS5wdXNoIHNlbGYuX19pZF9fCj4gICAgICAgQEBpZF9yZXZfbWFw W19faWRfX10gPSBAX19pZAo+ICAgICAgIF9fYWRkX3dlYWtyZWZfYmFja3Jl ZmVyZW5jZV9fKG9yaWcpCj4gICAgIGVuZAo1NCw1NmM2OQo8ICAgICB1bmxl c3MgQEBpZF9yZXZfbWFwW3NlbGYub2JqZWN0X2lkXSA9PSBAX19pZAo8ICAg ICAgIEtlcm5lbDo6cmFpc2UgUmVmRXJyb3IsICJJbnZhbGlkIFJlZmVyZW5j ZSAtIHByb2JhYmx5IHJlY3ljbGVkIiwgS2VybmVsOjpjYWxsZXIoMikKPCAg ICAgZW5kCi0tLQo+ICAgICBvYmogPSBuaWwKNThjNzEsNzQKPCAgICAgICBP YmplY3RTcGFjZS5faWQycmVmKEBfX2lkKQotLS0KPiAgICAgICBpZiBAQGlk X3Jldl9tYXBbc2VsZi5fX2lkX19dID09IEBfX2lkCj4gICAgICAgICBvYmog PSBPYmplY3RTcGFjZS5faWQycmVmKEBfX2lkKQo+ICAgICAgICAgb2JqID0g bmlsIHVubGVzcyBfX3ZlcmlmeV93ZWFrcmVmX2JhY2tyZWZlcmVuY2VfXyhv YmopCj4gICAgICAgZW5kCjYwYzc2CjwgICAgICAgS2VybmVsOjpyYWlzZSBS ZWZFcnJvciwgIkludmFsaWQgUmVmZXJlbmNlIC0gcHJvYmFibHkgcmVjeWNs ZWQiLCBLZXJuZWw6OmNhbGxlcigyKQotLS0KPiAgICAgICAjIE9iamVjdCBo YXMgYmVlbiBnYXJiYWdlIGNvbGxlY3RlZC4KNjFhNzgsNzkKPiAgICAgS2Vy bmVsOjpyYWlzZShSZWZFcnJvciwgIkludmFsaWQgUmVmZXJlbmNlIC0gcHJv YmFibHkgcmVjeWNsZWQiLCBLZXJuZWw6OmNhbGxlcigxKSkgdW5sZXNzIG9i ago+ICAgICBvYmoKNjJhODEKPiAgIAo2N2M4Niw5Mwo8ICAgICBAQGlkX3Jl dl9tYXBbc2VsZi5vYmplY3RfaWRdID09IEBfX2lkCi0tLQo+ICAgICBpZiBA QGlkX3Jldl9tYXBbc2VsZi5fX2lkX19dID09IEBfX2lkCj4gICAgICAgb2Jq ID0gT2JqZWN0U3BhY2UuX2lkMnJlZihAX19pZCkKPiAgICAgICBfX3Zlcmlm eV93ZWFrcmVmX2JhY2tyZWZlcmVuY2VfXyhvYmopCj4gICAgIGVsc2UKPiAg ICAgICBmYWxzZQo+ICAgICBlbmQKPiAgIHJlc2N1ZSBSYW5nZUVycm9yCj4g ICAgIGZhbHNlCjY4YTk1LDExNgo+ICAgCj4gICBwcml2YXRlCj4gCj4gICAg ICMgQWRkIGEgYmFja3JlZmVyZW5jZSB0byB0aGUgd2Vha3JlZiBvYmplY3Qg aWQgaW4gdGhlIHJlZmVyZW5jZWQgb2JqZWN0IHRvIHByb3RlY3QKPiAgICAg IyBhZ2FpbnN0IHRoZSBvYmplY3QgaWQgYmVpbmcgcmVjeWNsZWQgYmVmb3Jl IHRoZSBmaW5hbGl6ZXJzIGhhdmUgYSBjaGFuY2UgdG8gcnVuLgo+ICAgICBk ZWYgX19hZGRfd2Vha3JlZl9iYWNrcmVmZXJlbmNlX18ob2JqKQo+ICAgICAg IGJhY2tyZWZlcmVuY2VzID0gb2JqLmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6 QF9fd2Vha19iYWNrcmVmZXJlbmNlc19fKSBpZiBvYmouaW5zdGFuY2VfdmFy aWFibGVfZGVmaW5lZD8oOkBfX3dlYWtfYmFja3JlZmVyZW5jZXNfXykKPiAg ICAgICB1bmxlc3MgYmFja3JlZmVyZW5jZXMKPiAgICAgICAgIGJhY2tyZWZl cmVuY2VzID0gW10KPiAgICAgICAgIG9iai5pbnN0YW5jZV92YXJpYWJsZV9z ZXQoOkBfX3dlYWtfYmFja3JlZmVyZW5jZXNfXywgYmFja3JlZmVyZW5jZXMp Cj4gICAgICAgZW5kCj4gICAgICAgYmFja3JlZmVyZW5jZXMgPDwgb2JqZWN0 X2lkCj4gICAgIGVuZAo+IAo+ICAgICAjIFZlcmlmeSB0aGF0IHRoZSBvYmpl Y3QgaXMgdGhlIG9uZSB0aGUgd2Vha3JlZiB0aGlua3MgaXQgaXMuIE9uIHJ1 bnRpbWVzIHdoZXJlCj4gICAgICMgb2JqZWN0IGlkcyBhcmUgcmVjeWNsZWQg YWZ0ZXIgZ2FyYmFnZSBjb2xsZWN0aW9uIGFuZCByZWFsbG9jYXRlZCB0byBu ZXcgb2JqZWN0cywKPiAgICAgIyB0aGVyZSBpcyBhIGNoYW5jZSB0aGF0IHRo ZSByZWZlcmVuY2UgY291bGQgZmluZCBhbiBvYmplY3QgYXQgdGhlIHNwZWNp ZmllZAo+ICAgICAjIGxvY2F0aW9uIGluIHRoZSBPYmplY3RTcGFjZSB0aGF0 IGlzIG5vdCB0aGUgb25lIGl0IG9yaWdpbmFsbHkgcmVmZXJlbmNlZC4KPiAg ICAgZGVmIF9fdmVyaWZ5X3dlYWtyZWZfYmFja3JlZmVyZW5jZV9fKG9iaikK PiAgICAgICBiYWNrcmVmZXJlbmNlcyA9IG9iai5pbnN0YW5jZV92YXJpYWJs ZV9nZXQoOkBfX3dlYWtfYmFja3JlZmVyZW5jZXNfXykgaWYgb2JqLmluc3Rh bmNlX3ZhcmlhYmxlX2RlZmluZWQ/KDpAX193ZWFrX2JhY2tyZWZlcmVuY2Vz X18pCj4gICAgICAgYmFja3JlZmVyZW5jZXMgJiYgYmFja3JlZmVyZW5jZXMu aW5jbHVkZT8oc2VsZi5fX2lkX18pCj4gICAgIGVuZAo3MmMxMjAKPCAjICBy ZXF1aXJlICd0aHJlYWQnCi0tLQo+ICAgIyAgcmVxdWlyZSAndGhyZWFkJwo= --mimepart_4d0b96895ac55_1fb75bf429e375--