[Vm-dev] [Bug] Failure to check number of argument in primitive 83 (#perform:)

Boris Shingarov boris at shingarov.com
Fri Dec 16 12:36:04 UTC 2022


I built the latest VM and now everything works.  Thank you so much Eliot!!

*Huge sigh of relief*  When I first came across this problem, for a 
moment I was very scared that it might be just the tip-of-the-iceberg of 
some much larger problem (because in my test scenario the behavior 
seemed to correlate with whether or not an outer context has 
materialized, and *that* part is insanely complex).  I am really happy 
that it's much simpler than I feared (in fact the diff is easy to 
understand and makes perfectly straightforward sense).  Thanks again!

On 12/12/22 12:40, Eliot Miranda wrote:
> Thanks Juan., Thanks Boris,
>
>     that was easy to fix. The JIT primitive simply forgot to check 
> the the target method;'s argument count  a bad oversight on my part.  
> I think what you're seeing in your example is the JIT 
> primitive falling back on the interpreter version the first 
> time, because either GC has voided the method cache or the target 
> method isn't yet jitted (cuz it's never been used). The interpreter 
> version has always correctly checked the target method;'s argument 
> count.  I'll generate new sources soon.
>
> On Mon, Dec 12, 2022 at 5:32 AM Juan Vuletich <juan at cuis.st> wrote:
>
>
>     Hi Folks,
>
>     There seems to be a problem in the validation of the number of
>     arguments
>     passed to #perform: (primitive 83, presumably also 84 and 100). I can
>     reproduce the problem consistently in Cuis using OpenSmalltalk Mac
>     x64
>     Cog Spur VMs. Tried releases from 2022-05 and 2022-06. Also tried
>     build
>     from 2022-11-21. I observe the same behavior on a fresh
>     Squeak6.0-22104
>     Mac bundle from squeak.org <http://squeak.org>.
>
>     To reproduce the problem, print the result of this snippet:
>
>     results := Bag new.
>     n := 100.
>     c := 0.
>     n timesRepeat: [
>          "Smalltalk garbageCollect."
>          b := [ 7 perform: #isDivisibleBy: ] on: Error do: [
>     #errorAsExpected ].
>          results add: b.
>          b = #errorAsExpected ifFalse: [ c := c + 1 ]].
>     {c. 'failures out of'. n}
>
>     I get 98 or 99 failures out of 100. The results bag shows that the
>     answer of #isDivisibleBy: without any argument is false (when the
>     Error
>     is not raised). Adding this line:
>
>     true ifTrue: [ ^ {self. aNumber} ].
>
>     to the the start of #isDivisibleBy: shows that the argument passed to
>     the method is the #isDivisibleBy: symbol itself, i.e. the argument to
>     #perform:.
>
>     As a last experiment, if I activate the call to garbage
>     collection, it
>     works as expected, the Error is always raised, and there are zero
>     failures. So, whatever got broken, GC fixes it.
>
>     I don't know the related VM internals in enough detail to work
>     this out.
>     Can you please take a look?
>
>     Thanks!
>
>     -- 
>     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>
>
>
>
> -- 
> _,,,^..^,,,_
> best, Eliot


More information about the Vm-dev mailing list