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

Reply via email to