[squeak-dev] Recursive errors

Nicolas Cellier nicolas.cellier.aka.nice at gmail.com
Wed Apr 14 23:57:47 UTC 2021


Hi all,
with the new exception handling, I have encountered some recursive error.
Very hard to debug because the stack grows too fast.
The origin is when trying to browse revisions of a removed method.
I have a:

MethodReference >>timestamp
      receiver: a MethodReference Parser >> #externalFunctionDeclaration
UndefinedObject(Object)>>doesNotUnderstand: #timeStamp
...
Debugger class>>openOn:context:label:contents:fullView:
...
SmalltalkImage>>logError:inContext:to:
...
Context>>printDetails:
...
[] in Context>>printDetails:
Context>>tempsAndValuesLimitedTo:indent:
Context>>tempNames
Context(InstructionStream)>>debuggerMap
CompiledMethod>>debuggerMap
    receiver: (MCRepository class>>#browseMethodRevisionsService "a
CompiledMethod(2459914)")
   receiver isInstalled ==> false !!! (because I did recompileAll at one point)
DebuggerMethodMap class>>forMethod:
...
CompiledMethod>>methodNode
    [source]: a Text for 'Vw6ilbntYC3Kf9Bz3g3T3YJ+J74W7Mmk9gPb...
    note that the source is broken, I don't know where it comes from,
the compiledMethod is not installed...
   this context will catch SyntaxErrorNotificationSignal
...
Parser>>parseCue:noPattern:ifFail:
   this context will catch ReparseAfterSourceEditing
...
SyntaxErrorNotification(Exception)>>signal
   expected, the source is broken...
...
Context>>handleSignal:
Context>>handleSignal:
   ^2 consecutive handleSIgnal: here...
   the first one (parseCue:noPattern:ifFail:) only catch
ReparseAfterSourceEditing
    the second one (methodNode) does catch our SyntaxErrorNotification
        on: SyntaxErrorNotification
        do: [:ex | ex return: self decompileWithTemps]
...
CompiledMethod>>decompileWithTemps
   oh but this one tries to get the tempNames by parsing the source!
   let's go for a cycle...
...
Parser>>parseCue:noPattern:ifFail:
   this context will catch ReparseAfterSourceEditing
...
SyntaxErrorNotification(Exception)>>signal
Context>>handleSignal:
Context>>handleSignal:
Context>>handleSignal:
   ouch, I have 3 of them now
   what happens? it's all normal, I now have 2 parseCue:... in the
stack catching ReparseAfterSourceEditing
  the 3rd is catching SyntaxErrorNotification and retries parsing tempNames...
  and we're back to another cycle.
...
tada, there's more than 1000 handleSignal: in the stack when I
interrupted the process, and it's impossible to debug, and I thought
the new exception handling had a problem...
It doesn't so far.
We have another problem with broken source for an uninstalled
CompiledMethod, that tries to decompile using broken source...

I'm happy that I'm not the root cause, but this is most annoying.
IMO, if we decompile a block, we might want to find the temp names
from the method source, but if we decompile a method, what's the
point???


More information about the Squeak-dev mailing list