On Thu, Dec 10, 2015 at 4:12 PM, Mariano Martinez Peck <marianopeck@gmail.com> wrote:


On Thu, Dec 10, 2015 at 7:27 AM, Max Leske <maxleske@gmail.com> wrote:

On 07 Dec 2015, at 17:17, Mariano Martinez Peck <marianopeck@gmail.com> wrote:

OK Max. In the last version you can find the "likely" final version. It's extremely simple, easy to use, and very very little code. Only one override. All WADynamicVariables subclasses handled automatically. All you need to do is to register the handler:

app filter configuration at: #exceptionHandler put: WAPharoDebuggererErrorHandler.

It works for exceptions and both Halt too. The only limit is only the "last opened debugger" will be correct and all previous will be wrong since they will be using another values for dynamic variables.��

I will see if people want to integrate this directly into Seaside.

Very nice! And since you provide a separate error handler it���s easy to integrate into seaside too by simply adding it to the handler chain.


Exactly. The only issue to fix is the override in WADynamicVariable >> defaultAction.��
And that's not easy. Why? Because at that level, we know nothing about the current seaside app or anything. We don't know which seaside app those signal came from. Of course, I can still do the check to the handler to see if that has that variable stored. But... What if now you have set another error handler? Or what about OTHER possible registered apps which use a different error handler. ��
Thoughts?�� I have some HACKS in mind, but they are hacks and none solves all problems. And only for Pharo.��
Any idea to solve this would be nice.��


Assuming you are using GTDebugger (should be very easy to adapt for normal debugger), we can do this:

defaultAction
" This is an override from SeasidePharoDebugging because before raising a signal we��
first check if we have the value stored. That way, everywhere��
we evaluate code in a debugger that end ups doing 'WACurrentRequestContext value' will simply ��
get up to this place. Since in WAPharoDebuggererErrorHandler >> #open: ��we
stored the dynamic variables, we should have the value "
| openedSeasideErrorDebuggers |
openedSeasideErrorDebuggers := ((UIManager default currentWorld submorphs select: [ :each | each model isKindOf: GTGenericStackDebugger ])��
collect: [ :each | each model ])
select: [ :each2 | (each2 session interruptedProcess suspendedContext method selector = #openDebuggerOn:)
and: (each2 session interruptedProcess suspendedContext sender receiver class = WADynamicVariablesErrorHandler) ].
^ openedSeasideErrorDebuggers��
ifEmpty: [ self class defaultValue ]
ifNotEmpty: [ ��
(WADynamicVariablesErrorHandler storedDynamicVariable: self class)
ifNil: [ self class defaultValue ]
]

But that..the only thing it solves is that we would not be getting the value of dynamic variables from previous errors if there is none debugger opened from a seaside continuation. If you let a debugger opened debugging a seaside error, then there is no magic we can do I think.��
Imagine you were in a debugger and you evaluated: "WAComponent new session". The signal raised from there knows NOTHING about the debugger where that was evaluated... so at #defaultAction level you know nothing about what triggered that.
��
The only thing to solve this would be to hook into the do-it, print it, inspect etc...too complicated.��


Thoughts?
��

��
��
Two tiny things:
- you���re not using the #reset method you wrote but instead manually assign nil to the variable

yes, thanks.��
��
- I guess the dictionary in the handler could be a SmallDictionary. There won���t be many entries.


Well..since there will be likely.. less than 10 entries I don't care which Dictionary to use. However, I would prefer to keep Dictionary. Or if not GRSmallDictionary.��
��
Thanks a lot for this. I���ll probably port this back to Seaside 2.8 so I can use it too :)

No problem. Thanks for reviewing and give feedback.��
��

��

On Sat, Dec 5, 2015 at 11:36 AM, Max Leske <maxleske@gmail.com> wrote:

On 05 Dec 2015, at 12:58, Mariano Martinez Peck <marianopeck@gmail.com> wrote:

Can you try with the latest version that does not use LPC if it works?

Works perfectly!



--




--



--