diff options
Diffstat (limited to 'backendC/CleanCompilerSources')
-rw-r--r-- | backendC/CleanCompilerSources/instructions.h | 6 | ||||
-rw-r--r-- | backendC/CleanCompilerSources/optimisations.c | 92 | ||||
-rw-r--r-- | backendC/CleanCompilerSources/pattern_match_2.c | 5 | ||||
-rw-r--r-- | backendC/CleanCompilerSources/sa.c | 12 | ||||
-rw-r--r-- | backendC/CleanCompilerSources/set_scope_numbers.c | 105 | ||||
-rw-r--r-- | backendC/CleanCompilerSources/statesgen.c | 73 | ||||
-rw-r--r-- | backendC/CleanCompilerSources/statesgen.h | 2 |
7 files changed, 226 insertions, 69 deletions
diff --git a/backendC/CleanCompilerSources/instructions.h b/backendC/CleanCompilerSources/instructions.h index 21b4dce..e218cca 100644 --- a/backendC/CleanCompilerSources/instructions.h +++ b/backendC/CleanCompilerSources/instructions.h @@ -27,6 +27,7 @@ void PushBasicOnB (ObjectKind state, int offset); void UpdateBasic (int size, int srcoffset, int dstoffset); void CallFunction (Label label, SymbDef def, Bool isjsr, Node root); +void CallFunction1 (Label label, SymbDef def, StateS root_state, Args fun_args, int arity); void CallArrayFunction (SymbDef def,Bool isjsr,StateP node_state_p); @@ -66,6 +67,9 @@ void GenBuildU (Label symblab,int a_size,int b_size,Label contlab); void GenBuildArray (int argoffset); void GenBuildString (SymbValue val); +void GenPushZ (SymbValue val); +void GenPushZR (SymbValue val); + void GenBuildFieldSelector (Label symblab,Label contlab,char *record_name,int arity); void GenFillFieldSelector (Label symblab,Label contlab,char *record_name,int arity,int offset,FillKind fkind); @@ -91,6 +95,7 @@ void GenJsrAp (int n_args); void GenJmpEval (void); void GenJmpAp (int n_args); void GenJmpApUpd (int n_args); +void GenJmpNotEqZ (SymbValue val,Label tolab); void GenJmpUpd (Label tolab); void GenPopA (int nr); void GenPopB (int nr); @@ -168,6 +173,7 @@ void GenApplyEntryDirective (int arity,Label label); void GenLazyRecordNodeEntryDirective (int arity,Label label,Label label2); void GenFieldNodeEntryDirective (int arity, Label label, Label label2,char *record_name); void GenConstructorDescriptorAndExport (SymbDef sdef); +void GenConstructor0DescriptorAndExport (SymbDef sdef,int constructor_n); void GenFunctionDescriptorAndExportNodeAndDescriptor (SymbDef sdef); void GenConstructorFunctionDescriptorAndExportNodeAndDescriptor (SymbDef sdef); #if OPTIMIZE_LAZY_TUPLE_RECURSION diff --git a/backendC/CleanCompilerSources/optimisations.c b/backendC/CleanCompilerSources/optimisations.c index 0a396e9..3914329 100644 --- a/backendC/CleanCompilerSources/optimisations.c +++ b/backendC/CleanCompilerSources/optimisations.c @@ -497,9 +497,9 @@ static Node copy_root_node (Node old) case_node_arg_p=case_node_p->node_arguments; - new_case_node_p->node_su.su_u.u_case=CompAllocType (CaseNodeContentsS); - if (case_node_p->node_kind==CaseNode){ + new_case_node_p->node_su.su_u.u_case=CompAllocType (CaseNodeContentsS); + new_case_node_p->node_node_defs = copy_rhs_node_ids_of_node_defs (case_node_p->node_node_defs,NULL); if (case_node_arg_p->arg_node->node_kind==PushNode){ @@ -570,9 +570,49 @@ static Node copy_root_node (Node old) new_case_node_arg_p->arg_node = copy_root_node (case_node_arg_p->arg_node); } } else if (case_node_p->node_kind==DefaultNode){ + new_case_node_p->node_su.su_u.u_case=CompAllocType (CaseNodeContentsS); + + new_case_node_p->node_node_defs = copy_rhs_node_ids_of_node_defs (case_node_p->node_node_defs,NULL); + copy_nodes_of_node_defs (new_case_node_p->node_node_defs,False); + new_case_node_arg_p->arg_node = copy_root_node (case_node_arg_p->arg_node); + + } else if (case_node_p->node_kind==OverloadedCaseNode){ + NodeP new_overloaded_case_node_p; + ArgP new_overloaded_case_node_arg2_p; + + new_overloaded_case_node_arg2_p=CompAllocType (ArgS); + new_overloaded_case_node_arg2_p->arg_state=LazyState; + + new_overloaded_case_node_arg2_p->arg_next=NULL; + new_case_node_arg_p->arg_next=new_overloaded_case_node_arg2_p; + + new_case_node_arg_p->arg_node=copy_node (case_node_arg_p->arg_node,False); + new_overloaded_case_node_arg2_p->arg_node=copy_node (case_node_arg_p->arg_next->arg_node,False); + + case_node_p=case_node_p->node_node; + new_overloaded_case_node_p=new_case_node_p; + + new_case_node_p = CompAllocType (NodeS); + *new_case_node_p = *case_node_p; + + new_overloaded_case_node_p->node_node = new_case_node_p; + + new_case_node_arg_p=CompAllocType (ArgS); + new_case_node_arg_p->arg_state=LazyState; + + new_case_node_p->node_arguments=new_case_node_arg_p; + new_case_node_arg_p->arg_next=NULL; + + case_node_arg_p=case_node_p->node_arguments; + + new_case_node_p->node_su.su_u.u_case=CompAllocType (CaseNodeContentsS); + new_case_node_p->node_node_defs = copy_rhs_node_ids_of_node_defs (case_node_p->node_node_defs,NULL); + copy_nodes_of_node_defs (new_case_node_p->node_node_defs,False); new_case_node_arg_p->arg_node = copy_root_node (case_node_arg_p->arg_node); + + } else error_in_function ("copy_root_node"); @@ -3086,6 +3126,23 @@ static void optimise_root_node (NodeP node,NodeDefP node_defs,FreeUniqueNodeIdsP optimise_root_node (case_alt_node_p,case_node->node_node_defs,case_f_node_ids); set_global_reference_counts (case_node); + + } else if (case_node->node_kind==OverloadedCaseNode){ + NodeP case_alt_node_p; + FreeUniqueNodeIdsP case_f_node_ids; + + case_node=case_node->node_node; + + case_f_node_ids=f_node_ids; + + case_alt_node_p=case_node->node_arguments->arg_node; + + set_local_reference_counts (case_node); + + optimise_root_node (case_alt_node_p,case_node->node_node_defs,case_f_node_ids); + + set_global_reference_counts (case_node); + } else error_in_function ("optimise_root_node"); } @@ -3609,10 +3666,21 @@ static void ReorderNodeDefinitionsAndDetermineUsedEntries (NodeDefs *def_p,Node error_in_function ("ReorderNodeDefinitionsAndDetermineUsedEntries"); for_l (arg,root->node_arguments,arg_next){ - if (arg->arg_node->node_kind!=CaseNode && arg->arg_node->node_kind!=DefaultNode) - error_in_function ("ReorderNodeDefinitionsAndDetermineUsedEntries"); + if (arg->arg_node->node_kind==OverloadedCaseNode){ + NodeP overloaded_case_node_p,case_node_p; + + overloaded_case_node_p=arg->arg_node; + MarkDependentNodeDefs (overloaded_case_node_p->node_arguments->arg_node); + MarkDependentNodeDefs (overloaded_case_node_p->node_arguments->arg_next->arg_node); + + case_node_p=overloaded_case_node_p->node_node; + ReorderNodeDefinitionsAndDetermineUsedEntries (&case_node_p->node_node_defs,case_node_p->node_arguments->arg_node); + } else { + if (arg->arg_node->node_kind!=CaseNode && arg->arg_node->node_kind!=DefaultNode && arg->arg_node->node_kind!=OverloadedCaseNode) + error_in_function ("ReorderNodeDefinitionsAndDetermineUsedEntries"); - ReorderNodeDefinitionsAndDetermineUsedEntries (&arg->arg_node->node_node_defs,arg->arg_node->node_arguments->arg_node); + ReorderNodeDefinitionsAndDetermineUsedEntries (&arg->arg_node->node_node_defs,arg->arg_node->node_arguments->arg_node); + } } return; @@ -3621,7 +3689,7 @@ static void ReorderNodeDefinitionsAndDetermineUsedEntries (NodeDefs *def_p,Node ReorderNodeDefinitionsAndDetermineUsedEntries (&root->node_node_defs,root->node_arguments->arg_next->arg_node); return; } - + reordered_defs_p=&reordered_defs; MarkNodeDefsWithProperty (*def_p,&IsObservedDef); @@ -3847,6 +3915,18 @@ static void determine_then_else_ref_counts (NodeP node) set_global_reference_counts (case_node); --node->node_node_id->nid_refcount; + + } else if (case_node->node_kind==OverloadedCaseNode){ + case_node=case_node->node_node; + + ++node->node_node_id->nid_refcount; + set_local_reference_counts (case_node); + + determine_then_else_ref_counts (case_node->node_arguments->arg_node); + + set_global_reference_counts (case_node); + --node->node_node_id->nid_refcount; + } else error_in_function ("determine_then_else_ref_counts"); } diff --git a/backendC/CleanCompilerSources/pattern_match_2.c b/backendC/CleanCompilerSources/pattern_match_2.c index 9a7e53c..2065abc 100644 --- a/backendC/CleanCompilerSources/pattern_match_2.c +++ b/backendC/CleanCompilerSources/pattern_match_2.c @@ -776,7 +776,7 @@ static int determine_failing_cases_and_adjust_ref_counts (NodeP node,NodeIdRefCo node_id_ref_count_list_sorted=0; for (arg=node->node_arguments; arg!=NULL; arg=arg->arg_next) - if (arg->arg_node->node_kind!=CaseNode) + if (arg->arg_node->node_kind!=CaseNode && arg->arg_node->node_kind!=OverloadedCaseNode) break; default_may_fail=1; @@ -853,6 +853,9 @@ static int determine_failing_cases_and_adjust_ref_counts (NodeP node,NodeIdRefCo arg_node=arg->arg_node; switch (arg_node->node_kind){ + case OverloadedCaseNode: + arg_node = arg_node->node_node; + /* no break */ case CaseNode: { int case_may_fail; diff --git a/backendC/CleanCompilerSources/sa.c b/backendC/CleanCompilerSources/sa.c index bb9f3a0..fed8c65 100644 --- a/backendC/CleanCompilerSources/sa.c +++ b/backendC/CleanCompilerSources/sa.c @@ -2136,6 +2136,11 @@ static void InitNode (Node node) InitNode (case_alt_node_p); InitNodeDefs (node_p->node_node_defs); + } else if (node_p->node_kind==OverloadedCaseNode){ + node_p=node_p->node_node; + InitNode (node_p->node_arguments->arg_node); + InitNodeDefs (node_p->node_node_defs); + } else if (node_p->node_kind==DefaultNode){ InitNode (node_p->node_arguments->arg_node); InitNodeDefs (node_p->node_node_defs); @@ -2683,7 +2688,12 @@ static void convert_switch_node (NodeP switch_node_p,Alts fun_alt_p) } } else if (node_p->node_kind==DefaultNode){ case_alt_node_p=node_p->node_arguments->arg_node; - case_alt_p->fun_lhs=NULL; + case_alt_p->fun_lhs=NULL; + } else if (node_p->node_kind==OverloadedCaseNode){ + node_p=node_p->node_node; + case_alt_node_p=node_p->node_arguments->arg_node; + case_alt_p->fun_lhs=⊤ + } else error_in_function ("convert_switch_node"); diff --git a/backendC/CleanCompilerSources/set_scope_numbers.c b/backendC/CleanCompilerSources/set_scope_numbers.c index 351d022..98ac7c8 100644 --- a/backendC/CleanCompilerSources/set_scope_numbers.c +++ b/backendC/CleanCompilerSources/set_scope_numbers.c @@ -31,64 +31,69 @@ static void set_node_id_scope_numbers (NodeDefP node_defs,int local_scope) static void set_root_scope_numbers (NodeP node_p,int local_scope) { -/* RWS added switch nodes */ - switch (node_p->node_kind) - { + switch (node_p->node_kind){ case IfNode: - { - int new_local_scope; - ArgP arg_p; - - node_p->node_if_scope=scope; + { + int new_local_scope; + ArgP arg_p; + + node_p->node_if_scope=scope; + + new_local_scope=scope+2; + scope+=3; + + arg_p=node_p->node_arguments; + set_root_scope_numbers (arg_p->arg_node,local_scope); + + ++scope; + arg_p=arg_p->arg_next; + set_root_scope_numbers (arg_p->arg_node,new_local_scope); + set_node_id_scope_numbers (node_p->node_then_node_defs,new_local_scope); + + ++scope; + arg_p=arg_p->arg_next; + set_root_scope_numbers (arg_p->arg_node,new_local_scope); + set_node_id_scope_numbers (node_p->node_else_node_defs,new_local_scope); - new_local_scope=scope+2; - scope+=3; - - arg_p=node_p->node_arguments; - set_root_scope_numbers (arg_p->arg_node,local_scope); - - ++scope; - arg_p=arg_p->arg_next; - set_root_scope_numbers (arg_p->arg_node,new_local_scope); - set_node_id_scope_numbers (node_p->node_then_node_defs,new_local_scope); - - ++scope; - arg_p=arg_p->arg_next; - set_root_scope_numbers (arg_p->arg_node,new_local_scope); - set_node_id_scope_numbers (node_p->node_else_node_defs,new_local_scope); - } break; + } case SwitchNode: - { - ArgP arg_p; - int old_scope; - - old_scope=scope; - - for_l (arg_p,node_p->node_arguments,arg_next){ - NodeP node_p; - - scope=old_scope; - - node_p=arg_p->arg_node; - if (node_p->node_kind==CaseNode){ - NodeP case_alt_node_p; - - case_alt_node_p=node_p->node_arguments->arg_node; - /* Cedewarrior bug if (case_alt_node_p->node_kind==PushNode) */ - if (node_p->node_arguments->arg_node->node_kind==PushNode) - set_root_scope_numbers (case_alt_node_p->node_arguments->arg_next->arg_node, local_scope); - else - set_root_scope_numbers (node_p->node_arguments->arg_node, local_scope); - } else if (node_p->node_kind==DefaultNode){ + { + ArgP arg_p; + int old_scope; + + old_scope=scope; + + for_l (arg_p,node_p->node_arguments,arg_next){ + NodeP node_p; + + scope=old_scope; + + node_p=arg_p->arg_node; + if (node_p->node_kind==CaseNode){ + NodeP case_alt_node_p; + + case_alt_node_p=node_p->node_arguments->arg_node; +/* Cedewarrior bug if (case_alt_node_p->node_kind==PushNode) */ + if (node_p->node_arguments->arg_node->node_kind==PushNode) + set_root_scope_numbers (case_alt_node_p->node_arguments->arg_next->arg_node, local_scope); + else set_root_scope_numbers (node_p->node_arguments->arg_node, local_scope); - } else - ErrorInCompiler ("set_scope_numbers.c", "set_root_scope_numbers", ""); + } else if (node_p->node_kind==DefaultNode){ + set_root_scope_numbers (node_p->node_arguments->arg_node, local_scope); + + } else if (node_p->node_kind==OverloadedCaseNode){ + node_p=node_p->node_node; + set_root_scope_numbers (node_p->node_arguments->arg_node, local_scope); - set_node_id_scope_numbers (node_p->node_node_defs,local_scope); - } + } else + ErrorInCompiler ("set_scope_numbers.c", "set_root_scope_numbers", ""); + + set_node_id_scope_numbers (node_p->node_node_defs,local_scope); } + break; + } case GuardNode: { int old_scope; diff --git a/backendC/CleanCompilerSources/statesgen.c b/backendC/CleanCompilerSources/statesgen.c index 5fbb731..f9d3e8a 100644 --- a/backendC/CleanCompilerSources/statesgen.c +++ b/backendC/CleanCompilerSources/statesgen.c @@ -420,7 +420,7 @@ static void GenResultStatesOfLazyFields (SymbDef sdef) for (i=0, fields = rectype->type_fields; fields; i++, fields = fields->fl_next){ TypeNode field_type_node = fields->fl_type; - + if (field_type_node->type_node_annotation!=StrictAnnot){ if (field_type_node->type_node_is_var || field_type_node->type_node_symbol->symb_kind==apply_symb) SetUnaryState (&fields->fl_state, LazyRedirection, UnknownObj); @@ -570,6 +570,10 @@ static void ChangeElementStateForStrictAbsTypeFields (SymbDef icl_sdef,SymbDef d } } +#ifdef CLEAN2 +SymbDefP special_types[2]; +#endif + void GenerateStatesForRecords (Symbol symbols) { Symbol symb; @@ -609,6 +613,11 @@ void GenerateStatesForRecords (Symbol symbols) } } } + +#ifdef CLEAN2 + if (special_types[0]!=NULL) + BasicSymbolStates[integer_denot] = special_types[0]->sdef_record_state; +#endif } /* @@ -2034,7 +2043,7 @@ static Bool NodeInAStrictContext (Node node,StateS demanded_state,int local_scop } definition_state_p = GetStateOfArguments (sdef,node->node_arity); - + if (definition_state_p!=NULL){ #ifdef FASTER_STRICT_AND_OR if (sdef->sdef_module==StdBoolId->ident_name && node->node_arity==2){ @@ -2117,7 +2126,7 @@ static Bool NodeInAStrictContext (Node node,StateS demanded_state,int local_scop } default: if (rootsymb->symb_kind < Nr_Of_Predef_Types){ - node->node_state = BasicSymbolStates [rootsymb->symb_kind]; + node->node_state = BasicSymbolStates [rootsymb->symb_kind]; node->node_state.state_kind = demanded_state.state_kind; } break; @@ -2385,6 +2394,15 @@ static void DetermineStatesSwitchRootNode (Node root_node, StateS demstate, int DetermineStatesOfRootNodeAndDefs (node->node_arguments->arg_node,&node->node_node_defs,demstate,local_scope); } else if (node->node_kind==DefaultNode){ DetermineStatesOfRootNodeAndDefs (node->node_arguments->arg_node,&node->node_node_defs,demstate,local_scope); + } else if (node->node_kind==OverloadedCaseNode){ + NodeP case_node_p; + + DetermineStrictArgContext (node->node_arguments,StrictState,local_scope); + if (ShouldDecrRefCount) + DecrRefCountCopiesOfArg (node->node_arguments->arg_next IF_OPTIMIZE_LAZY_TUPLE_RECURSION(local_scope)); + + case_node_p=node->node_node; + DetermineStatesOfRootNodeAndDefs (case_node_p->node_arguments->arg_node,&case_node_p->node_node_defs,demstate,local_scope); } else error_in_function ("DetermineStatesSwitchRootNode"); } @@ -2785,6 +2803,8 @@ static void DetermineStatesOfNodeAndDefs (Node root_node,NodeDefs node_defs,Stat DetermineStatesOfNodeAndDefs (case_alt_node_p,arg_node_p->node_node_defs,demstate,local_scope); } else if (arg_node_p->node_kind==DefaultNode){ DetermineStatesOfNodeAndDefs (arg_node_p->node_arguments->arg_node,arg_node_p->node_node_defs,demstate,local_scope); + } else if (arg_node_p->node_kind==OverloadedCaseNode){ + DetermineStatesOfNodeAndDefs (arg_node_p->node_node->node_arguments->arg_node,arg_node_p->node_node->node_node_defs,demstate,local_scope); } else error_in_function ("DetermineStatesOfNodeAndDefs"); } @@ -3160,6 +3180,8 @@ static NodeP add_argument_to_switch_node (NodeP rhs_root_p,NodeIdP new_node_id_p node_h=&(*node_h)->node_arguments->arg_next->arg_node; } else if (node_p->node_kind==DefaultNode){ node_h=&node_p->node_arguments->arg_node; + } else if (node_p->node_kind==OverloadedCaseNode){ + node_h=&node_p->node_node->node_arguments->arg_node; } else error_in_function ("add_argument_to_switch_node"); @@ -3680,8 +3702,7 @@ static NodeDefs *CollectSharedNodeIdsInRootNode (Node* node_p,NodeId parent_node root_node=*node_p; - switch (root_node->node_kind) - { + switch (root_node->node_kind){ case SwitchNode: { ArgP arg_p; @@ -3697,9 +3718,8 @@ static NodeDefs *CollectSharedNodeIdsInRootNode (Node* node_p,NodeId parent_node case_alt_node_p=node->node_arguments->arg_node; case_last=&node->node_node_defs; /* Codewarrior bug if (case_alt_node_p->node_kind==PushNode){ */ - if (node->node_arguments->arg_node->node_kind==PushNode){ + if (node->node_arguments->arg_node->node_kind==PushNode) case_last=CollectSharedNodeIdsInRootNode (&case_alt_node_p->node_arguments->arg_next->arg_node, parent_node_id, case_last); - } else case_last=CollectSharedNodeIdsInRootNode (&node->node_arguments->arg_node, parent_node_id, case_last); *case_last=NULL; @@ -3709,6 +3729,22 @@ static NodeDefs *CollectSharedNodeIdsInRootNode (Node* node_p,NodeId parent_node default_last=&node->node_node_defs; default_last=CollectSharedNodeIdsInRootNode (&node->node_arguments->arg_node, parent_node_id, default_last); *default_last=NULL; + } else if (node->node_kind==OverloadedCaseNode){ + NodeP case_node_p; + NodeDefs *case_last; + ArgP arg; + + arg=node->node_arguments; + arg->arg_state=LazyState; + last = CollectSharedNodeIdsInNode (&arg->arg_node,parent_node_id,last); + arg=arg->arg_next; + arg->arg_state=LazyState; + last = CollectSharedNodeIdsInNode (&arg->arg_node,parent_node_id,last); + + case_node_p=node->node_node; + case_last=&case_node_p->node_node_defs; + case_last=CollectSharedNodeIdsInRootNode (&case_node_p->node_arguments->arg_node, parent_node_id, case_last); + *case_last=NULL; } else error_in_function ("CollectSharedNodeIdsInRootNode"); } @@ -3765,11 +3801,11 @@ static void CollectSharedAndAnnotatedNodesInRhs (NodeS **root_p,NodeDefS **defs_ if ((imp_rule_p->rule_mark & RULE_LAMBDA_FUNCTION_MASK) && root_node->node_symbol->symb_def->sdef_arity==root_node->node_arity && imp_rule_p->rule_alts->alt_next==NULL - # ifdef TRANSFORM_PATTERNS_BEFORE_STRICTNESS_ANALYSIS +# ifdef TRANSFORM_PATTERNS_BEFORE_STRICTNESS_ANALYSIS && ! (imp_rule_p->rule_alts->alt_rhs_root->node_kind==SwitchNode || imp_rule_p->rule_alts->alt_rhs_root->node_kind==GuardNode || imp_rule_p->rule_alts->alt_rhs_root->node_kind==IfNode) - # endif +# endif ) { ArgP call_arg_p,lhs_arg_p; @@ -3905,8 +3941,7 @@ static void AnnotateStrictNodeIds (Node node,StrictNodeIdP strict_node_ids,NodeD node_id->nid_node->node_annotation=StrictAnnot; } - switch (node->node_kind) - { + switch (node->node_kind){ case IfNode: { ArgS *arg; @@ -3938,6 +3973,11 @@ static void AnnotateStrictNodeIds (Node node,StrictNodeIdP strict_node_ids,NodeD AnnotateStrictNodeIds (node->node_arguments->arg_node,node->node_strict_node_ids,&node->node_node_defs); } else if (node->node_kind==DefaultNode){ AnnotateStrictNodeIds (node->node_arguments->arg_node,node->node_strict_node_ids,&node->node_node_defs); + } else if (node->node_kind==OverloadedCaseNode){ + NodeP case_node_p; + + case_node_p=node->node_node; + AnnotateStrictNodeIds (case_node_p->node_arguments->arg_node,case_node_p->node_strict_node_ids,&case_node_p->node_node_defs); } else error_in_function ("AnnotateStrictNodeIds"); } @@ -4091,6 +4131,16 @@ static void reset_states_and_ref_count_copies_of_root_node (NodeP node_p) } else if (node_p->node_kind==DefaultNode){ reset_states_and_ref_count_copies_of_root_node (node_p->node_arguments->arg_node); reset_states_and_ref_count_copies_of_node_defs (node_p->node_node_defs); + } else if (node_p->node_kind==OverloadedCaseNode){ + NodeP case_node_p; + + case_node_p=node_p->node_node; + + reset_states_and_ref_count_copies_of_root_node (case_node_p->node_arguments->arg_node); + reset_states_and_ref_count_copies_of_node_defs (case_node_p->node_node_defs); + + reset_states_and_ref_count_copies_of_node (node_p->node_arguments->arg_node); + reset_states_and_ref_count_copies_of_node (node_p->node_arguments->arg_next->arg_node); } else error_in_function ("reset_states_and_ref_count_copies_of_root_node"); } @@ -4200,5 +4250,6 @@ void InitStatesGen (void) SetUnaryState (& BasicSymbolStates[tuple_type], StrictOnA, TupleObj); #ifdef CLEAN2 SetUnaryState (& BasicSymbolStates[dynamic_type], StrictOnA, DynamicObj); + SetUnaryState (& BasicSymbolStates[rational_denot], StrictOnA, UnknownObj); #endif } diff --git a/backendC/CleanCompilerSources/statesgen.h b/backendC/CleanCompilerSources/statesgen.h index c8f9f8e..2a8edac 100644 --- a/backendC/CleanCompilerSources/statesgen.h +++ b/backendC/CleanCompilerSources/statesgen.h @@ -32,3 +32,5 @@ extern void ConvertTypeToState (TypeNode type,States state,StateKind kind); extern int optimise_strict_tuple_result_functions; extern PolyList UserDefinedArrayFunctions; + +extern SymbDefP special_types[]; |