Awesome!! Thank you so much for fixing it so quickly and being tolerant of my lack of knowledge. I have to say I am once again impressed by the smalltalk community. Thank you. On Wed, Jun 29, 2011 at 11:11 PM, Ramon Leon <ramon.leon@allresnet.com>wrote:
On 06/29/2011 05:40 PM, David Zmick wrote:
Okay. So I wrote a test case with similar behavior and it worked correctly, but the difference between the test case objects and my objects is that all of the test case objects are active records that get saved, not just the top level object as in my code.
Nope, that wasn't the difference that mattered. You did find a bug, an interesting one, but your test code was overly complex hiding what was really going on. Here's a simpler test case that exposes the bug more directly.
testObjectFoundMultipleTimesIn**Aggregate | obj key | obj := SDPersonMock new. obj children: Dictionary new. key := Object new.
"store ref to key in two places" obj children at: key put: 1. obj children at: 1 put: key.
self deny: (obj children keys includes: nil). self deny: (obj children values includes: nil). obj save. self flushAndReload. self deny: (obj children keys includes: nil). self deny: (obj children values includes: nil)
The bug has been fixed, pull down the latest code from SqueakSource and your code with work fine. As you can see from the test case above, the issue was related to an object being references in multiple places inside an active record. During serialization, this exposed a silly bug in the deep copy that I think I introduced recently with a round of refactoring. Thanks for the bug report.
-- Ramon Leon http://onsmalltalk.com
-- David Zmick dpzmick@gmail.com