[Vm-dev] regression: TestObjectsAsMethods crash in 4.19.5 (not in 4.16.7)

David T. Lewis lewis at mail.msen.com
Sun Feb 21 17:20:52 UTC 2021


I'm not yet sure what to do about it, but the problem was introduced last
April in VMMaker-dtl.415. Apparently the obsolete primitiveInvokeObjectAsMethod
was not quite as obsolete as I thought it was.

Dave


Name: VMMaker-dtl.415
Author: dtl
Time: 19 April 2020, 5:30:30.208 pm
UUID: 747f8591-57e6-4950-858a-c7fbc22ad1c2
Ancestors: VMMaker-dtl.414

VMMaker 4.19.1
Required for Squeak trunk Collections-eem.885 and above.

Install primitiveArrayBecomeOneWayNoCopyHash as primitive 248, replacing obsolete primitiveInvokeObjectAsMethod.

Fix 128 primitiveArrayBecome to match oscog logic. This a fix from VMMaker.oscog-eem.647 which Eliot explained as follows:
Fix primitiveArrayBecome (the two-way become); it should /not/
specify copyHash.  ObjectMemory ignores the copyHash flag when doing a two-way become, hence the wrong sense of the flag had
no effect.  Hence correctly evaluate testBecomeIdentityHash.

The primitives now do this:
  primitive 72: twoWay: false copyHash: true
  primitive 128: twoWay: true copyHash: false
  primitive 248: twoWay: false copyHash: false
  primitive 249: twoWay: false copyHash: <arg 3 value>



On Sun, Feb 21, 2021 at 11:29:13AM -0500, David T. Lewis wrote:
>  
> Thanks.
> 
> Confirmed on Linux amd64, so it is not Solaris/OpenIndiana issue.
> 
> Dave
> 
> On Sun, Feb 21, 2021 at 04:02:38PM +0100, stes at PANDORA.BE wrote:
> >  
> > -----BEGIN PGP SIGNED MESSAGE-----
> > Hash: SHA256
> > 
> > 
> > As can be seen in the screenshot at:
> > 
> > http://docs.openindiana.org/handbook/community/squeak/index.html
> > 
> > I'm deselecting the Tests-ObjectsAsMethods test (1 test),
> > because it causes (reproducible) SIGSEGV on Solaris cc/OpenIndiana gcc.
> > 
> > I think the segmentation fault is new in recent 4.19, I think it didn't happen
> > a while ago in 4.16.
> > 
> > I can test this as follows: when I install an older version
> > 
> > squeak -version
> > 4.16.7-3775
> > 
> > then I go into test runner: Tests-ObjectsAsMethods and select 
> > TestObjectsAsMethods that works in 4.16.7
> > 
> > Test Runner
> > 
> > ...
> > TestObjectsAsMethods
> > 
> > 3 run, 3 passes, 0 expected failures, 0 failures, 0 errors, 0 unexpected passes
> > 
> > But it stopped working in 4.19.x which is from I believe from:
> > 
> > ContextInterpreter VMMaker-dtl.422 uuid: e72b95a0-204e-45a1-a4e4-3ac3c9e7a51a
> > 
> > the interp.c file is automatically generated from VMMaker-dtl.422.
> > 
> > It's reproducible in the sense that if I deselect all tests, and just select
> > that one single test, I can repeatedly and reproducible SIGSEGV the VM.
> > 
> > When I run the VM under a debugger:
> > 
> > dbx: warning: Bad transition in runtime linker interface. CONSISTENT->CONSISTENT
> > t at 1 (l at 1) signal SEGV (no mapping at the fault address) in interpret at line 9120 in file "interp.c"
> >  9120   					foo->freeContexts = longAt((newContext + (BASE_HEADER_SIZE)) + (0 << (SHIFT_FOR_WORD)));
> > 
> > (dbx) where
> > current thread: t at 1
> > =>[1] interpret(), line 9120 in "interp.c"
> >   [2] main(argc = 1, argv = 0xfeffe250, envp = 0xfeffe258), line 1484 in "sqUnixMain.c"
> > 
> > The above is from Solaris with cc/dbx but the same thing appears to happen
> > for me on OpenIndiana with gcc/gdb.
> > 
> > Unfortunately because the code of interp.c is automatically generated,
> > it looks complicated to me and I don't see what's wrong with those "
> > freeContext" code.
> > 
> > The crash appears to be in:
> > 
> >                                 /* begin internalActivateNewMethod */
> >                                 methodHeader = longAt((foo->newMethod + (BASE_HEADER_SIZE)) + (HeaderIndex << (SHIFT_FOR_WORD)));
> >                                 needsLarge = methodHeader & LargeContextBit;
> >                                 if ((needsLarge == 0) && (foo->freeContexts != NilContext)) {
> >                                         newContext = foo->freeContexts;
> >                                         /* begin setFreeContextsAfter: */
> >                                         foo->freeContexts = longAt((newContext + (BASE_HEADER_SIZE)) + (0 << (SHIFT_FOR_WORD)));
> >                                 } else {
> >                                         /* begin externalizeIPandSP */
> > 
> > Has anyone seen this ?
> > 
> > Also what is the test 
> > TestObjectsAsMethods
> > actually doing please ? what is it testing ?
> > 
> > 
> > Regards,
> > David Stes
> > 
> > 
> > 
> > -----BEGIN PGP SIGNATURE-----
> > Version: GnuPG v2
> > 
> > iQEcBAEBCAAGBQJgMnV5AAoJEAwpOKXMq1MafEgH/3EWQxaSaVm2g4r/2p99Wc21
> > P+U+ijqKpVTDfJ1smwV/GsgF0V8ZrZky0k7BzRDAyq3Gi/HGVm0e2bqOAKa1fo2Y
> > MUS9JHOW4Lys+9qWgT0aLiWypjYlzThtYS0/Lfh013tsF1bBv2eppTceUyq/Zitv
> > 6J0IFvDOspMN/zHwBw/ux3H6uR049boZ3mvk23sp3KIHDc2Yw2kF4TAXBwjZXmVO
> > UFlIAC4EAahrtNZyLZSIBDbsXOl+wJGmQTsOIBG81pfSFpP6RBrIARcu6enZC3Wc
> > bwsvWYADs49SKgVq3NBovfyzkZBIW30V82xlVKpOnp6A4FnOYXxQiVm9sNaOVXc=
> > =34TJ
> > -----END PGP SIGNATURE-----


More information about the Vm-dev mailing list