I added more tests to WACurrentRequestDebuggingTest. If you see, all tests
work except #callbackAndHalt.

At a later point we will likely need to do this for the rest of the
WADynamicVariable subclasses (they are 3 in total).

Cheers,

On Fri, Dec 4, 2015 at 7:17 PM, Mariano Martinez Peck <marianop...@gmail.com
> wrote:

> OK, I tested it and it works. I added only one test but I plan to add
> more.
>
> On Fri, Dec 4, 2015 at 4:59 PM, Mariano Martinez Peck <
> marianop...@gmail.com> wrote:
>
>> OK, I started publishing here:
>> http://smalltalkhub.com/mc/marianopeck/MarianoPublic/main   package
>> called SeasidePharoDebugging
>> I did not even have the time to try it..just committed.
>> I must leave now.
>>
>> byw
>>
>> On Fri, Dec 4, 2015 at 2:43 PM, Mariano Martinez Peck <
>> marianop...@gmail.com> wrote:
>>
>>> 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
>>>
>>
>>
>>
>> --
>> Mariano
>> http://marianopeck.wordpress.com
>>
>
>
>
> --
> Mariano
> http://marianopeck.wordpress.com
>



-- 
Mariano
http://marianopeck.wordpress.com

Reply via email to