diff options
Diffstat (limited to 'backendC')
-rw-r--r-- | backendC/CleanCompilerSources/codegen3.c | 76 |
1 files changed, 50 insertions, 26 deletions
diff --git a/backendC/CleanCompilerSources/codegen3.c b/backendC/CleanCompilerSources/codegen3.c index 21c8703..f2a2504 100644 --- a/backendC/CleanCompilerSources/codegen3.c +++ b/backendC/CleanCompilerSources/codegen3.c @@ -756,38 +756,62 @@ static void CodeNormalRootNode (Node root,NodeId rootid,int asp,int bsp,CodeGenN CodeRootSymbolApplication (root,rootid,rootsymb->symb_unboxed_cons_sdef_p,asp,bsp,code_gen_node_ids_p,resultstate); return; } else { - LabDef *strict_cons_lab_p; - int a_size; - - BuildArgs (root->node_arguments,&asp,&bsp,code_gen_node_ids_p); - - if (rootsymb->symb_head_strictness==4){ - int b_size; + if (IsSemiStrictState (root->node_state)){ + LabDef d_cons_lab,n_cons_lab; - strict_cons_lab_p=unboxed_cons_label (rootsymb); + if (rootsymb->symb_head_strictness==4){ + MakeSymbolLabel (&d_cons_lab,rootsymb->symb_unboxed_cons_sdef_p->sdef_module,d_pref,rootsymb->symb_unboxed_cons_sdef_p,0); + } else { + if (rootsymb->symb_head_strictness>1){ + if (rootsymb->symb_tail_strictness) + d_cons_lab=conssts_lab; + else + d_cons_lab=conss_lab; + } else + d_cons_lab=consts_lab; + + d_cons_lab.lab_pref=d_pref; + } - DetermineSizeOfArguments (root->node_arguments,&a_size,&b_size); - GenFillR (strict_cons_lab_p,a_size,b_size,asp,0,0,ReleaseAndFill,True); - bsp-=b_size; + n_cons_lab = d_cons_lab; + n_cons_lab.lab_pref = n_pref; + + CreateSemiStrictRootNode (&d_cons_lab,&n_cons_lab,root,rootid,asp,bsp,code_gen_node_ids_p,resultstate); + return; } else { - if (rootsymb->symb_head_strictness>1){ - if (rootsymb->symb_tail_strictness) - strict_cons_lab_p=&conssts_lab; - else - strict_cons_lab_p=&conss_lab; - } else - strict_cons_lab_p=&consts_lab; + LabDef *strict_cons_lab_p; + int a_size; - a_size=root->node_arity; - GenFillh (root->node_arity==2 ? &cons_lab : strict_cons_lab_p,a_size,asp,ReleaseAndFill); - } + BuildArgs (root->node_arguments,&asp,&bsp,code_gen_node_ids_p); - asp-=a_size; + if (rootsymb->symb_head_strictness==4){ + int b_size; - GenPopA (asp); - GenPopB (bsp); - GenRtn (1,0,OnAState); - return; + strict_cons_lab_p=unboxed_cons_label (rootsymb); + + DetermineSizeOfArguments (root->node_arguments,&a_size,&b_size); + GenFillR (strict_cons_lab_p,a_size,b_size,asp,0,0,ReleaseAndFill,True); + bsp-=b_size; + } else { + if (rootsymb->symb_head_strictness>1){ + if (rootsymb->symb_tail_strictness) + strict_cons_lab_p=&conssts_lab; + else + strict_cons_lab_p=&conss_lab; + } else + strict_cons_lab_p=&consts_lab; + + a_size=root->node_arity; + GenFillh (root->node_arity==2 ? &cons_lab : strict_cons_lab_p,a_size,asp,ReleaseAndFill); + } + + asp-=a_size; + + GenPopA (asp); + GenPopB (bsp); + GenRtn (1,0,OnAState); + return; + } } } #endif |