--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 ids for use with newly allocated objects after the old objects have been garbage collected. This problem was not present in 1.8, but with the 1.9 threading improvements there is no guarantee that the garbage collector thread 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 structures. However, Mutexes are not reentrant and the finalizers are silently throwing deadlock errors if they run while new WeakRefs are being created.

I've included in my patch a reimplementation of WeakRef called WeakReference that does not extend Delegator. This code is based on the original WeakRef code but has been rewritten so the variable names are a little clearer. It replaces the Mutex with a Monitor and adds an additional check toake sure that the object returned by the reference is the same one it originally referred to. WeakRef is rewritten as a Delegator wrapper aroundeakReference for backward compatibility.

I went this route because in some Ruby implementations (like Ruby 1.8), Delegator is very heavy weight to instantiate and creating a collection ofhousands of WeakRefs will be slow and use up far too much memory (in fact, it would be nice to either backport this patch to Ruby 1.8 or the delegate changes from 1.9 to 1.8 if possible). I also don't really see the value of having weak references be delegators since is very unsafe to do anything without wrapping the call in a "rescue RefError" block. The object can be reclaimed at any time so the only safe method to be sure you still have it is to create a strong reference to the object at which point you might as well use that reference instead of the delegated methods on the WeakRef. It also should be simpler for other implementations of Ruby like Jruby or Rubinius to map native weak references to a simpler interface.

Sample code with WeakReference

    orig = Object.new
    ref = WeakReference.new(orig)
    # ...
    obj = ref.object
    if obj
      # Do something
    end
    lso have a version of the patch which just fixes WeakRef to work without introducing a new class, but I feel this version is the right way to go.

Also included are unit tests for weak references but the test that checksor the broken functionality is not 100% reliable since garbage collection is not deterministic. I've also included a script that shows the problem in more detail with the existing weak reference implementation.

    ruby show_bug.rb 100000     # Run 100,000 iterations on the current implementation of WeakRef and report any problems
    ruby -I. show_bug.rb 100000 # Run 100,000 iterations on the new implementation 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--