OK, I solved the Halt problem. I did it by adding: WADebugErrorHandler class >> exceptionSelector ^ super exceptionSelector, Halt
And this override: WAErrorHandler >> handleException: anException (Error handles: anException) ifTrue: [ ^ self handleError: anException ]. (Warning handles: anException) ifTrue: [ ^ self handleWarning: anException ]. (Halt handles: anException) ifTrue: [ "Lets debug Halt as an error so that we can take advantage of the #openDebuggerOn: hook" ^ self handleError: anException ]. ^ super handleException: anException Can you try that too? if it gets complicated to test, I can fire a first version of a package and publish it in Shub. On Fri, Dec 4, 2015 at 2:12 PM, Mariano Martinez Peck <marianop...@gmail.com > wrote: > > > On Fri, Dec 4, 2015 at 1:29 PM, Mariano Martinez Peck < > marianop...@gmail.com> wrote: > >> OK. But be aware it is very very little tested and probably still a hack, >> and it still need overrides. Hopefully you will help me to polish it until >> we get a "SeasidePharoDebugging" package with no override :) >> >> All what I mention here is tested in Pharo 4.0 with Seaside 3.1.4.1. >> >> These are the steps: >> >> 1) Create a >> >> ProcessLocalVariable subclass: #WACurrentRequestContextPLV >> instanceVariableNames: '' >> classVariableNames: '' >> category: 'SeasidePharoDebugging' >> >> 2) Override GRPharoPlatform >> openDebuggerOn (see highlighted lines) >> The idea is to simply store the WACurrentRequestContext into a processor >> local variable before we loose it. >> >> openDebuggerOn: anError >> | process currentRequest | >> process := Processor activeProcess. >> currentRequest := WACurrentRequestContext value. >> >> "If we are running in the UI process, we don't want to suspend the active >> process. The >> error was presumably triggered while stepping in the Debugger. If we >> simply immediately >> signal an UnhandledError, the debugger will catch this and display the >> signaling context. >> It isn't perfect or pretty but it works." >> (ProcessBrowser isUIProcess: process) >> ifTrue: [ >> UnhandledError signalForException: anError ] >> ifFalse: [ >> WorldState addDeferredUIMessage: [ >> WACurrentRequestContextPLV value: currentRequest. >> process >> debug: anError signalerContext >> title: anError description >> full: true. >> ]. >> process suspend ] >> >> >> 3) Override WACurrentRequestContext class >> defaultValue >> >> defaultValue >> ^ WACurrentRequestContextPLV value ifNil: [ WARequestContextNotFound >> signal ] >> 4) Set WADebugErrorHandler as the error handler in your seaside app (I am >> not sure if this step is needed). >> >> And that's all. Try to put a "self whateverMethodThatCausesDNU" and then, >> try to evalaute something from the debugger that calls #session or >> #requestContext etc... for example, evaluate "WAComponent new session" and >> that should work: >> >> Besides the overrides I still have doubts: >> >> a) do we need WADebugErrorHandler ? >> > > Yes, we do, because we are hooking in #openDebuggerOn: and that's only > called from WADebugErrorHandler. > > >> b) it seems "Halt halt" does not work but sending a message that causes >> dnu does work. Maybe related to WADebugErrorHandler. >> > > I guess problem is that while MessageNotUnderstood is indeed a subclass of > Error, Halt is not. Anyway, the real problem is that with halt, the hooked > method #openDebuggerOn: is not called... I tried to find out which > method handled Halt but I failed. > > > c) what happens if we have multiple debuggers opened? I am worried about >> the "soleInstance" of ProcessSpecificVariable. >> >> >> Thoughts? Can you tell me if this works for you? >> >> >> >> >> On Fri, Dec 4, 2015 at 1:13 PM, Max Leske <maxle...@gmail.com> wrote: >> >>> >>> On 04 Dec 2015, at 17:11, Mariano Martinez Peck <marianop...@gmail.com> >>> wrote: >>> >>> I found a way!!!! Much cleaner and easier. Awesome! >>> I will clean it, test it a bit more and try to package it for public >>> usage :) >>> >>> >>> Give me a snippet! I want to play with it! :D >>> >>> >>> On Fri, Dec 4, 2015 at 12:31 PM, Mariano Martinez Peck < >>> marianop...@gmail.com> wrote: >>> >>>> >>>> >>>> On Fri, Dec 4, 2015 at 12:05 PM, Max Leske <maxle...@gmail.com> wrote: >>>> >>>>> >>>>> On 04 Dec 2015, at 14:29, Mariano Martinez Peck <marianop...@gmail.com> >>>>> wrote: >>>>> >>>>> Max...Seaside uses WADynamicVariable (NOT DynamicVariable) which >>>>> are completely different. WADynamicVariable uses exception mechanism >>>>> while DynamicVariable uses the ProcessSpecificVariable. >>>>> But thanks anyway! >>>>> >>>>> >>>>> Oh man…. Sorry :) >>>>> >>>>> I wonder, why WADynamicVariable *isn’t* a DynamicVariable. The >>>>> semantics are the same if I’m not mistaken (e.g. only available in the >>>>> current process) and I think access to a dynamic variable may even be >>>>> faster because it *doesn’t* use the exception mechanism (i.e. no need to >>>>> walk down the stack). >>>>> If someone knows the answer, I’d be happy to hear it. >>>>> >>>>> >>>> I bet it's because of portability. For example, i remember in GemStone >>>> the ProcessorLocalVariable did not behave the same as in Pharo. And it was >>>> actually an experiment. I think you cannot expect all this stuff to be ansi >>>> (or easily portable), while exceptions do. >>>> >>>> >>>>> I’ve played around with Process>>signalException: and >>>>> Context>>handleSignal: (which looked quite promising) but didn’t get any >>>>> results. I’m out of ideas. >>>>> >>>>> >>>> I have played all morning with an idea of using local variables. I >>>> arrive to the point where I DO HAVE the request context at hand, but I >>>> don't find an easy way to hook into do-its, print-it etc so that the >>>> closure evaluated gets the request context plugged. In other ways... let's >>>> say I have the context stored somewhere. I am at the SmalltalkEditor >> >>>> evaluateSelectionAndDo: aBlock >>>> >>>> and so..somewhere I need to do something like: >>>> >>>> WACurrentRequestContext use: self storedContextSomewhere during: [ >>>> self theSelectionToBeEvaluated ] >>>> >>>> and that's where I am now :) >>>> >>>> >>>> >>>> >>>>> Cheers, >>>>> Max >>>>> >>>>> >>>>> On Fri, Dec 4, 2015 at 7:32 AM, Max Leske <maxle...@gmail.com> wrote: >>>>> >>>>>> Here’s a snippet to play with: >>>>>> >>>>>> p := Processor activeProcess. >>>>>> x := 2. >>>>>> v := TestDynamicVariable value: x during: [ >>>>>> ((p instVarNamed: 'env') ifNotNil: [ :env| >>>>>> env copyWithout: nil ]) inspect >>>>>> ]. >>>>>> >>>>>> ((p instVarNamed: 'env') ifNotNil: [ :env| >>>>>> env copyWithout: nil ]) inspect >>>>>> >>>>>> Cheers, >>>>>> Max >>>>>> >>>>>> On 04 Dec 2015, at 10:47, Max Leske <maxle...@gmail.com> wrote: >>>>>> >>>>>> I feel you :) >>>>>> >>>>>> Without having thought this through completely: if you look at the >>>>>> implementation of DynamicVariable>>value:during: you’ll see that the way >>>>>> it >>>>>> works is that the variable is bound to the active process. In the >>>>>> debugger >>>>>> you have access to the process that is being debugged and thus you should >>>>>> have access to the variables bound to it. You could try accessing all >>>>>> such >>>>>> variables by iterating over them (which I think will require an extension >>>>>> on Process because you’d need to access at least the PSKeys class >>>>>> variable). >>>>>> >>>>>> Cheers, >>>>>> Max >>>>>> >>>>>> On 04 Dec 2015, at 00:34, Mariano Martinez Peck < >>>>>> marianop...@gmail.com> wrote: >>>>>> >>>>>> Hi guys, >>>>>> >>>>>> This thing I will ask in this email it's in my mind since YEARS. But >>>>>> I have always thought it was like that and that there was nothing we >>>>>> could >>>>>> do. However, I think it's time I ask again :) >>>>>> >>>>>> For those that have used Seaside, and you try to debug, you know that >>>>>> upon request processing seaside uses Exceptions mechanisim to always have >>>>>> access to the request, session, etc. They way that is done is very smart >>>>>> :) >>>>>> >>>>>> WACurrentRequestContext use: self during: aBlock >>>>>> >>>>>> In that case, "self" is the request instance and aBlock the closure >>>>>> that takes care of the request processing. So, inside that closure, >>>>>> everywhere you do "WACurrentRequestContext value" you get the correct >>>>>> request instance. >>>>>> >>>>>> So..that's great for Seaside, but debugging gets complicated. While >>>>>> you can restart, proceed, etc, once inside debugger, you cannot evaluate >>>>>> any piece of code that will use the session or request because you get >>>>>> a WARequestContextNotFound. Of course, because I guess the evaluation you >>>>>> do from cmd+d on a piece of text or via the debugger inspector, creates >>>>>> another closure/context which does not receive the >>>>>> WACurrentRequestContext >>>>>> instance. >>>>>> >>>>>> Now....besides WACurrentRequestContext I have my own class >>>>>> UserContextInformation where I basically have a bunch of stuff associated >>>>>> to the logged user. And I do exactly the same as the >>>>>> WACurrentRequestContext. And I have the same problem. I really want to be >>>>>> able to fix this. >>>>>> >>>>>> Anyone have an idea on how can I do it? I guess I can change the >>>>>> debugger, in the place where I evaluate code so that I wrap that >>>>>> evaluation >>>>>> with my request context instance??? >>>>>> >>>>>> Thoughts? >>>>>> >>>>>> >>>>>> -- >>>>>> Mariano >>>>>> http://marianopeck.wordpress.com >>>>>> >>>>>> >>>>>> >>>>>> >>>>> >>>>> >>>>> -- >>>>> Mariano >>>>> http://marianopeck.wordpress.com >>>>> >>>>> >>>>> >>>> >>>> >>>> -- >>>> Mariano >>>> http://marianopeck.wordpress.com >>>> >>> >>> >>> >>> -- >>> Mariano >>> http://marianopeck.wordpress.com >>> >>> >>> >> >> >> -- >> Mariano >> http://marianopeck.wordpress.com >> > > > > -- > Mariano > http://marianopeck.wordpress.com > -- Mariano http://marianopeck.wordpress.com