From 802d50d70b29418eaae3c5724fbc73f96f83ee93 Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Sun, 5 Aug 2007 14:04:34 -0700 Subject: [PATCH] Working around an extremely annoying apple bug in NSTreeController and an NSOutlineView. When the contentArray is bound on an NSTreeController, the observing can go haywire and just crash randomly. * English.lproj/Debugger.nib: Unbinding RegisterController's content array * Source/DebuggerConnection.m: ([DebuggerConnection registerRecieved:]): Sending [_windowController setRegister:] the entire document instead of the rootElement * Source/DebuggerWindowController.h: Removed _register ivar and changed setRegister: to take an NSXMLDocument * Source/DebuggerWindowController.m: ([DebuggerWindowController setRegister:]): Instead of changing a property and letting KVO do the work (and subsequently and randomly crash), force the controller to have new content --- English.lproj/Debugger.nib/keyedobjects.nib | Bin 16828 -> 16676 bytes Source/DebuggerConnection.m | 2 +- Source/DebuggerWindowController.h | 3 +-- Source/DebuggerWindowController.m | 24 +++++++++++++------- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/English.lproj/Debugger.nib/keyedobjects.nib b/English.lproj/Debugger.nib/keyedobjects.nib index 191f5ec6e84574e32bc71e010dc4962423680c27..16861e8125f57d210f2d64e02900f1628c085992 100644 GIT binary patch delta 6019 zcmZWr2Y3`!*WTIOneDr?z4zW`X6I4@k=|P9***cQeg~V8kImjNcqbN5 z2aQ1!&;qmt?La5c8DxWQpa;kWy}@8G7EA>1f=S>#Fd0k%Q^9ml0cL^OU=ElI=7VLR z3M>cJU=14Af{(!_G;Ri;f*ol59P9*pz+P|w90W(fF>o530T;kUa0Oficfb>*@dtPg z{=|84oR6pB02kmwT!f2pC8)wxxEeR1(TrPgHyS;-7o5gJIE^!SZM+Vifxm$_!JFc( z@YeVMd=UOFz6Ae_KZpMVz7_v3z75-iZ^w7wpW{2x$``x`_%8fQd^f%a-^-ta@HoVJ3TcRD&p6Ebi5*>+7L}#K4kwtVR z-XyY#ZbS~zo#>IwOtYBylZbp`FfoKEAchi!L=iEJC??8?5ya??i_->UzD5bGGJ$nZ zU_BC8;{=wIz>*2e*ldtDV5=Ca`)5 zEQ9NM64V3rc{-56YYZBIhDp|2N7xiJTMn9m=E-5+Q2cN4aL@`g7dFdbr zbYBj-gXX-9TvD5vm6_kSSy5qGNl^hBniuBvD|_8cPh_S9nYn|^P~A$)@`kl3tbYc@ z(FfEAeL=sPXc&+O2Jkw9fnX5GPxkUPaSs6nU??aAMPL}xCf6$65t&$A-T|>>72$rda>8{!LTZ1Amhc;3{Y7OD#1*UOiBU+g&%-< z%fUR9xX}TN@wNSce6SEKLiKmu0`ArTbPo&zKOm40MBv91NZ@Di5c~ojfyc?h za3ArnyphYnZ{R6-mOK{@xe+)y{RZV1^e@RP%+4=upVwzV4LmrG6V*6T1CKBA@4Q{Z zrMQgO5tpO9O^vksS5~j#T3m;udL;cZ(%Jv7IB*+oM^Xoh8Fgkf4n(?w^ z7~BsU@{3ZbV^Qkj|77eM9!b?o&6~AS)sjo9b4&6D<|B+s{vv-t-YdmZg0nTng?!XW z>GwkAm*RcX^0Km`!k315rFc5XPL(Mt^YoPB+ck;^_J3=Z;|*&pqHjd~lwyxuRFMBx zD#M%CD5WQ`HghQQ8b%IX0VD!plyZ$!p9T!SBQ?POIQ| z6~n6%#fO@9UdYUqMjgZ?{UK5{tuuaHxIme%;em*G|T za=aSHmZ$VzOqJr|Fg(=xfy;%2`582)F3;P$1 z=#`n3)en7>3$pX`M!aSx_L>O3_Qd8U--#LG|M-mMl8UUdKK+LL!}6Xj^9%C)rH+mx z3iC>Oy!0D;k?Q?;-qIQhr1Ej_)rTXg0kPnu{S#PjG9C6x&V`6JWH+)csV60550WMAWG&J} z3Q3yGAT?xdQc8MA8Oe}Yq?(M80@6T=NfBu#(@7PnB_pJTjFJ?oBm-ni(nh{Xb|yol zm25#mvJTmuB+0I%j`Wc^H4qaeypc<}t}o{0e<5s0)fqAJZ@f{PK#U>ARuN;9BWeZW zv(o0LT~B)g)W8cE@CIrx2Y^!4Oil+2z(-&UY6&l*qvR3z9W{Y`bPNb_2`K1IFV9@Nq8$A3flwG%;< zxE82c%Z;PPY&gLY(}?$p8N^It7BPqTfS6A#Bo-6Pi4TdD#FxZX;vVsc_)`D`gg_zC z2?BzcpsApPAXhL@kS`b_7%C_dj1){2OczuLDg{ZwY{6W?Ji!9NBEb^DcENtZalv`P z6~Q&Z4Z$tJZNWXkeZfycp)e?HAZ#OyX9?dH76?ZQCkiJCCkv+vrwc2DmBKl~1;T3K zX5n_>Zs8%}G2sc}DdAb+b>V&CL*Y}ALZlbDMU1GSsIjQ2sJW=6sI{o0sHZ4jR4f`N zii;AWDWVEdwP=NCm1wnSt!Ss{kmwuHG10f8tD;9@zE~nQh&|$%I78etF3uDW5f2p? ziHpT0;&Sl_@hI_3@jmf6@jdY~2`RBj7)eV>Ye`#4dr79GlcbBJtE87CSJFq)Pcld{ zOj0ZvEg37BD48KyBv~WbB-tt1FS#zcDY-4VE4e3mBzYqFO{$VYX>Dm;X+3F%w1Kpd zw3ReR+Dn=%?IZ0kjTcKtNXJV#=_2V8=`!hZX|;5Pbd_|M^s)3;=~LqWjtWuVg&6drT&66#VRm(n>t&<&+9g!WC9haSu zosylAJ&^n40eMIskyCO;&dO`a8_HYB+sFsV2gwJ=%!W3U|7a1huVN_l; zD!jhr5VD+%lkbr;$ywwa@&j@{xsY5;E+wnTYH|hn5xIukL~bFslH15z zrt-G(vGP~tQ|0e*6|NGfNR?4lTh&&TrOH<2sCuaSsRpY?sS>IwstVNyszs{LRi{)J zRZrAnwN=fkYpLt1>!~x;4b+X)P1McQozz+CH`RUBgVjaqVs)u{qt!B68g66j7p_ZrRYk^j()oM*zw>F}!tIg5&(-vsUwIj5nwBxm$ z_8sk1?R0I0cBOWcc87Mq_JsC#9ibEI#5$=?u2bsNI)l!ntF3FSYoqI;%hipI>n7`_ z>Za=|bTf1_b+dGfbXB@)-3r|*-DTZCMoHm>{Tr_-VxNNv;xNf*|K z4~>tEPmI4ApP4)+XliU~XX;@ZXeu#{GsR5_)4QgrrfG50bW??CmT8V@qiM5gi)pKA zn`wvXOVdHqS<^Ms4bwBzAErOem^sa?HQUTVa|3e^b5HZz=HBMM=Kkhns~A8!ew%4qLvl9J8FToU&ZDJh$?! zd@HaLR-x5uwOgH5x7BN$gTZdcUx305pux_+≀U*wSI2>!g|j7 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 I{L9YzKLtAzOaK4? diff --git a/Source/DebuggerConnection.m b/Source/DebuggerConnection.m index 32fb186..a8cd955 100644 --- a/Source/DebuggerConnection.m +++ b/Source/DebuggerConnection.m @@ -263,7 +263,7 @@ - (void)registerReceived: (NSData *)packet { NSXMLDocument *doc = [[NSXMLDocument alloc] initWithData: packet options: NSXMLDocumentTidyXML error: nil]; - [_windowController setRegister: [doc rootElement]]; + [_windowController setRegister: doc]; [doc release]; } diff --git a/Source/DebuggerWindowController.h b/Source/DebuggerWindowController.h index 26a20fc..e8cfea5 100644 --- a/Source/DebuggerWindowController.h +++ b/Source/DebuggerWindowController.h @@ -25,7 +25,6 @@ IBOutlet NSArrayController *_stackController; NSArray *_stack; - NSXMLElement *_register; IBOutlet NSTreeController *_registerController; IBOutlet NSTextField *_status; @@ -45,7 +44,7 @@ - (void)setStatus: (NSString *)status; - (void)setError: (NSString *)error; - (void)setStack: (NSArray *)node; -- (void)setRegister: (NSXMLElement *)reg; +- (void)setRegister: (NSXMLDocument *)reg; - (void)addChildren: (NSArray *)children toNode: (id)node; diff --git a/Source/DebuggerWindowController.m b/Source/DebuggerWindowController.m index 86482f8..897ea82 100644 --- a/Source/DebuggerWindowController.m +++ b/Source/DebuggerWindowController.m @@ -123,15 +123,23 @@ /** * Sets the stack root element so that the NSOutlineView can display it */ -- (void)setRegister: (NSXMLElement *)elm +- (void)setRegister: (NSXMLDocument *)elm { - if (_register != nil) - { - [_register release]; - } - - _register = elm; - [_register retain]; + /* + [_registerController willChangeValueForKey: @"rootElement.children"]; + [_registerController unbind: @"contentArray"]; + [_registerController bind: @"contentArray" toObject: elm withKeyPath: @"rootElement.children" options: nil]; + [_registerController didChangeValueForKey: @"rootElement.children"]; + */ + // XXX: Doing anything short of this will cause bindings to crash spectacularly for no reason whatsoever, and + // in seemingly arbitrary places. The class that crashes is _NSKeyValueObservationInfoCreateByRemoving. + // http://boredzo.org/blog/archives/2006-01-29/have-you-seen-this-crash says that this means nothing is + // being observed, but I doubt that he was using an NSOutlineView which seems to be one f!cking piece of + // sh!t when used with NSTreeController. http://www.cocoadev.com/index.pl?NSTreeControllerBugOrDeveloperError + // was the inspiration for this fix (below) but the author says that inserting does not work too well, but + // that's okay for us as we just need to replace the entire thing. + [_registerController setContent: nil]; + [_registerController setContent: [[elm rootElement] children]]; } /** -- 2.22.5