Class constrains in let .. in or #
Code generation fails when there is a constructor containing a dictionary when the constructor is unwrapped in a #, a let .. in, or a where construct. Workaround is to use a case ... of instead.
The following code show the problem concisely:
:: Constr a b = Constr a b & C1 a & C2 b
test :: Constr a b -> a
test c
// Yields wonky behaviour
# Constr a b = c
= a
Originally communicated by email with John:
` Hallo Haye,
On 9/21/2018 2:08 PM, Böhm, H.M. (Haye) wrote:
Beste John,
Er lijkt een bug in de copying garbage collector te zitten, die niet voorkomt in de marking garbage collector. Dit komt voor op zowel Linux als Windows.
De bug zit niet in de garbage collector. Er wordt incorrecte code gegenereerd voor constructoren die een dictionary bevatten (met een class constraint dus), en die voorkomen in een (irrefutable) pattern van een #, let, where of with. In gewone patterns van functies en cases gaat het wel goed.
In dit geval gaat het om ReadResult in module iTasks.WF.Combinators.Core, functie eval in functie attach.
Daar staat:
# (Ok (ReadResult
progress=:{InstanceProgress|instanceKey,value,attachedTo} _)) = mbProgress
Als je ReadResult matcht in een functie of case pattern gaat het wel goed, bijvoorbeeld:
get_InstanceProgress (Ok (ReadResult progress _)) = progress
# progress=:{InstanceProgress|instanceKey,value,attachedTo} =
get_InstanceProgress mbProgress
Ik laat je nog weten wanneer deze bug in de compiler gerepareerd is.
Met vriendelijke groet,
John
Stappen om te reproduceren:
- Download de kant-en-klare Clean distributie via https://filesender.surf.nl/?s=download&token=b7af90c8-c606-010c-b883-05abc29659a4.https://filesender.surf.nl/?s=download&token=b7af90c8-c606-010c-b883-05abc29659a4 Hier zit de development versie van iTasks bij in, en ook een applicatie die de bug veroorzaakt.
- Start de applicatie, te vinden in Development\iTasks-SDK\Examples\HealthApp\HealthAppMain.prj.
- Navigeer in een willekeurige browser naar http://localhost:80.
- Je krijgt een inlogpagina te zien, klik op "continue" rechts onderin.
- Klik in het midden van de pagina op het knopje "New".[cid:c55d0e07-1fd9-4cae-b075-e594c332e9b5]
- Selecteer de bovenste optie in het lijstje wat links verschijnt.
- Klik op "Start task" rechts onderin
- Constateer dat er een segmentation fault optreedt als de copying GC aanstaat en dat er geen fout optreedt als de marking GC aanstaat. Als er geen fout optreedt, verwacht ik het volgende scherm:
[cid:449eef3a-252d-4227-b754-d0e50fcf5536]
Met vriendelijke groet,
Haye
`