[Cuis-dev] Allow debugger to step into quick return methods
Juan Vuletich
juan at cuis.st
Thu Nov 23 05:55:38 PST 2023
Hi Facu, Hernán,
I went whead and just pushed the changes as described below.
Thank you Folks!
Cheers,
On 11/21/2023 5:45 PM, Hernán Wilkinson via Cuis-dev wrote:
> I agree!
>
> On Tue, Nov 21, 2023 at 4:36 PM Juan Vuletich <juan at cuis.st
> <mailto:juan at cuis.st>> wrote:
>
> Hi Folks,
>
> Great work!
>
> WRT Hernáns concern about modifying #resume, I agree, and suggest
> modifying #resumeProcess instead, so that the modified line reads:
>
> interruptedProcess resolvePendingQuickReturns; resume ].
>
> WRT the fix to the problem shown by Hernán's example, it looks OK
> to me.
>
> If you both agreen, I'm willing to push the changes to GitHub.
>
> Thanks!
>
> On 11/18/2023 7:05 PM, Hernán Wilkinson via Cuis-dev wrote:
>> Hi Facu,
>>
>> I'm looking into it—these errors are really tough to debug!
>> The problem arises when you try to debug an exception: in
>> your code example, Customer class>>#importCustomers throws an
>> exception because the file input.txt does not exist,
>> therefore line is nil.
>>
>>
>> oh! that is because I forgot to send you the file, but create a
>> file called input.txt or replace the file with a ReadStream. That
>> is not the problem I had.
>> Replace the opening of the file with:
>> inputStream := ReadStream on: 'C,a,b,d,1122'.
>> That will help you reproduce the error. You have to step over
>> until the [ line notNil ]
>>
>>
>> 📝 Here's what I've found so far:
>> In my previous changeset, I changed the
>> InstructionStream>>#willReturn method so that it'll stop
>> before actually performing a quick return once you step into
>> it. This is used from
>> ContextPart>>#stepToSendOrReturn (👈 notice the message name).
>> While I was debugging this issue, I realized that there's
>> also another place where something similar is done:
>> ContextPart>>#runUntilErrorOrReturnFrom:. This is used, for
>> example, when you perform a "through" action. As a quick
>> return method can only return an object, I changed
>> #runUntilErrorOrReturnFrom: to just do that instead of going
>> through the rest of the logic.
>>
>> I attach a fileout of the changes to
>> ContextPart>>#runUntilErrorOrReturnFrom:. It should be
>> filed-in after having applied the original changeset, and it
>> should fix the problem.
>> I don't think this is an elegant solution, but I want you to
>> try it to see if it works on your tests or if you find more
>> problems.
>>
>>
>> With this fix, the problem I describe above is gone, so it fixes
>> the issue.
>>
>> Cheers!
>> Hernan.
>>
>>
>> I'll keep looking into it!
>> Cheers!
>> Facu
>>
>>
>>
>> El mar, 14 nov 2023 a las 9:35, Hernán Wilkinson
>> (<hernan.wilkinson at 10pines.com
>> <mailto:hernan.wilkinson at 10pines.com>>) escribió:
>>
>> Hi Facu,
>> there is an error with this change. I do not know
>> exactly what it is, but you can reproduce it by filing in
>> the attached file and debugging importCustomers from
>> Customer class (it is a class method). The error happens
>> when doing step over in [ line notNil ] whileTrue: ...
>>
>> On Tue, Nov 14, 2023 at 8:07 AM Hernán Wilkinson
>> <hernan.wilkinson at 10pines.com
>> <mailto:hernan.wilkinson at 10pines.com>> wrote:
>>
>> This is so great!! It is a really important feature
>> when doing TDD and the first implementation of a
>> method is a ^true or similar.
>> The only concern I have is the change in
>> Process>>#resume, because that impacts all the
>> situations where #resume is sent... I know the impact
>> is low, but is it possible to restrict that change to
>> the debugger only or not?
>>
>> Cheers!
>> Hernan.
>>
>> On Mon, Nov 13, 2023 at 8:28 PM Facundo Javier
>> Gelatti via Cuis-dev <cuis-dev at lists.cuis.st
>> <mailto:cuis-dev at lists.cuis.st>> wrote:
>>
>> Hi!
>> I attach some code to be able to step into quick
>> return methods from the debugger, and there's
>> also a demo video
>> <https://drive.google.com/file/d/1Iv5-hJ4TNjmR0pG-qm02KpTxCvKzsDZC/view?usp=sharing>.
>> Being able to step into a quick return method is
>> very useful, especially in situations where we
>> are doing TDD (because the first implementation
>> of a method probably ends up being a quick return).
>>
>> Most of these changes were developed during the
>> Camp Smalltalk event of the Smalltalks 2023
>> conference by me, Juan Vuletich and Felipe Zak
>> (thank you guys!).
>>
>> I included automated tests for various debugging
>> scenarios. The class
>> QuickReturnDebuggingTest should probably be moved
>> to an appropriate category (it's currently in the
>> "Smalltalks 2023" category, just because the
>> changes were developed during the conference) or
>> be merged into another existing test class (I
>> wasn't sure where to put it).
>>
>> ℹ️ Extra interesting info: there are other places
>> in which we're currently treating quick return
>> methods in a special way. See for example
>> Debugger>>#contents:notifying:, which handles the
>> special case of a normal method becoming a quick
>> return method after saving the changes on the
>> debugger (the stack frame is removed in that
>> case, try it!). As a curiosity, another quirk
>> related to quick returns is that you cannot debug
>> an expression that will compile to a quick return
>> (e.g. ^2), the debugger simply doesn't show up!
>> None of this is modified on the code I'm submitting.
>>
>> I include a summary of the changes below, that
>> could be useful during code review 👇
>>
>> Cheers!
>> Facu
>>
>> ------------------------------------------------------------------------
>> 📝 Changes summary:
>>
>> * Do not run a quick return as a primitive in
>> ContextPart>>#send:to:with:lookupIn:, treat
>> it as a normal instruction —before which we
>> can stop— and create a new stack frame for it.
>> * Refactor: extracted an isPrimitive variable
>> in ContextPart>>#send:to:with:lookupIn:, to
>> avoid having repeated code.
>> * Changed InstructionStream>>#willReturn to
>> include quick returns there. This ends up
>> telling the debugger that it's possible to
>> pause the execution there.
>> * In Process>>#resume, resolve pending quick
>> returns before running #primitiveResume, so
>> that the VM can resume the process without
>> having an unexpected stack frame (if you
>> remove this, the VM crashes).
>> * Refactor: extracted the method Debugger
>> class>>#newDebugging:, which is useful for
>> tests (because it does not open the
>> debugger UI).
>>
>> --
>> Cuis-dev mailing list
>> Cuis-dev at lists.cuis.st
>> <mailto:Cuis-dev at lists.cuis.st>
>> https://lists.cuis.st/mailman/listinfo/cuis-dev
>>
>>
>>
>> --
>> *Hernán Wilkinson
>> Agile Software Development, Teaching & Coaching*
>> *Phone: +54-011*-4893-2057
>> *Twitter: @HernanWilkinson*
>> *site: http://www.10Pines.com <http://www.10pines.com/>*
>> Address: Alem 896, Floor 6, Buenos Aires, Argentina
>>
>>
>>
>> --
>> *Hernán Wilkinson
>> Agile Software Development, Teaching & Coaching*
>> *Phone: +54-011*-4893-2057
>> *Twitter: @HernanWilkinson*
>> *site: http://www.10Pines.com <http://www.10pines.com/>*
>> Address: Alem 896, Floor 6, Buenos Aires, Argentina
>>
>>
>>
>> --
>> *Hernán Wilkinson
>> Agile Software Development, Teaching & Coaching*
>> *Phone: +54-011*-4893-2057
>> *Twitter: @HernanWilkinson*
>> *site: http://www.10Pines.com <http://www.10pines.com/>*
>> Address: Alem 896, Floor 6, Buenos Aires, Argentina
>
>
> --
> Juan Vuletich
> cuis.st <http://cuis.st>
> github.com/jvuletich <http://github.com/jvuletich>
> researchgate.net/profile/Juan-Vuletich <http://researchgate.net/profile/Juan-Vuletich>
> independent.academia.edu/JuanVuletich <http://independent.academia.edu/JuanVuletich>
> patents.justia.com/inventor/juan-manuel-vuletich <http://patents.justia.com/inventor/juan-manuel-vuletich>
> linkedin.com/in/juan-vuletich-75611b3 <http://linkedin.com/in/juan-vuletich-75611b3>
> twitter.com/JuanVuletich <http://twitter.com/JuanVuletich>
>
>
>
> --
> *Hernán Wilkinson
> Agile Software Development, Teaching & Coaching*
> *Phone: +54-011*-4893-2057
> *Twitter: @HernanWilkinson*
> *site: http://www.10Pines.com <http://www.10pines.com/>*
> Address: Alem 896, Floor 6, Buenos Aires, Argentina
--
Juan Vuletich
cuis.st
github.com/jvuletich
researchgate.net/profile/Juan-Vuletich
independent.academia.edu/JuanVuletich
patents.justia.com/inventor/juan-manuel-vuletich
linkedin.com/in/juan-vuletich-75611b3
twitter.com/JuanVuletich
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cuis.st/mailman/archives/cuis-dev/attachments/20231123/b7cbec7f/attachment-0001.htm>
More information about the Cuis-dev
mailing list