Fix a long-standing but obscure bug in worker-wrapper generation
authorsimonpj@microsoft.com <unknown>
Wed, 1 Nov 2006 11:04:42 +0000 (11:04 +0000)
committersimonpj@microsoft.com <unknown>
Wed, 1 Nov 2006 11:04:42 +0000 (11:04 +0000)
Worker/wrapper generation sometimes has to add a dummy void (State#) argument
to retain laziness.  But when generating the strictness signature for the
worker, I forgot to take account of the extra argument, resulting in a
bogus strictness signature.

Result, chaos.  Trac 317 shows this up, and this patch fixes it.

compiler/stranal/WwLib.lhs

index f10cb22..08fcec4 100644 (file)
@@ -134,7 +134,7 @@ mkWwBodies fun_ty demands res_info one_shots
        returnUs (id, id, res_ty)
     )                                  `thenUs` \ (wrap_fn_cpr, work_fn_cpr,  _cpr_res_ty) ->
 
-    returnUs ([idNewDemandInfo v | v <- work_args, isId v],
+    returnUs ([idNewDemandInfo v | v <- work_call_args, isId v],
              Note InlineMe . wrap_fn_args . wrap_fn_cpr . wrap_fn_str . applyToVars work_call_args . Var,
              mkLams work_lam_args. work_fn_str . work_fn_cpr . work_fn_args)
        -- We use an INLINE unconditionally, even if the wrapper turns out to be