From a1c46ae2dd18252d57a66baf6217c208b9b93070 Mon Sep 17 00:00:00 2001
From: johnvg
Date: Fri, 8 Feb 2002 14:11:40 +0000
Subject: fix bug in scope numbers

git-svn-id: https://svn.cs.ru.nl/repos/clean-compiler/trunk@1011 1f8540f1-abd5-4d5b-9d24-4c5ce8603e2d
---
 backendC/CleanCompilerSources/set_scope_numbers.c | 41 ++++++++++++++++-------
 backendC/CleanCompilerSources/statesgen.c         | 39 +++++++++++++--------
 2 files changed, 53 insertions(+), 27 deletions(-)

(limited to 'backendC')

diff --git a/backendC/CleanCompilerSources/set_scope_numbers.c b/backendC/CleanCompilerSources/set_scope_numbers.c
index 9cb4e3f..351d022 100644
--- a/backendC/CleanCompilerSources/set_scope_numbers.c
+++ b/backendC/CleanCompilerSources/set_scope_numbers.c
@@ -39,8 +39,8 @@ static void set_root_scope_numbers (NodeP node_p,int local_scope)
 				int new_local_scope;
 				ArgP arg_p;
 		
-				node_p->node_if_scope=local_scope;
-		
+				node_p->node_if_scope=scope;
+
 				new_local_scope=scope+2;
 				scope+=3;
 		
@@ -61,33 +61,48 @@ static void set_root_scope_numbers (NodeP node_p,int local_scope)
 		case SwitchNode:
 			{
 				ArgP arg_p;
+				int old_scope;
+				
+				old_scope=scope;
 				
 				for_l (arg_p,node_p->node_arguments,arg_next){
-					NodeP node;
-		
-					node=arg_p->arg_node;
-					if (node->node_kind==CaseNode){
+					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->node_arguments->arg_node;
-		/*	Cedewarrior bug			if (case_alt_node_p->node_kind==PushNode){ */
-						if (node->node_arguments->arg_node->node_kind==PushNode){
+						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->node_arguments->arg_node, local_scope);
-					} else if (node->node_kind==DefaultNode){
-						set_root_scope_numbers (node->node_arguments->arg_node, local_scope);
+							set_root_scope_numbers (node_p->node_arguments->arg_node, local_scope);
+					} else if (node_p->node_kind==DefaultNode){
+						set_root_scope_numbers (node_p->node_arguments->arg_node, 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;
+		
+ 			old_scope=scope;
+
 			set_root_scope_numbers (node_p->node_arguments->arg_node,local_scope);
+
+			scope=old_scope;
+
 			set_root_scope_numbers (node_p->node_arguments->arg_next->arg_node,local_scope);
 			set_node_id_scope_numbers (node_p->node_node_defs,local_scope);
 			break;
+		}
 	}
 }
 
diff --git a/backendC/CleanCompilerSources/statesgen.c b/backendC/CleanCompilerSources/statesgen.c
index 1c13dcf..8837f33 100644
--- a/backendC/CleanCompilerSources/statesgen.c
+++ b/backendC/CleanCompilerSources/statesgen.c
@@ -1530,6 +1530,11 @@ static Bool AdjustState (StateS *old_state_p, StateS newstate)
 		return False;
 }
 
+#if 0
+# include "dbprint.h"
+extern File rules_file;
+#endif
+
 static void DetermineStateOfThenOrElse (Args t_or_e_args, NodeDefs *t_or_e_defs, StateS demstate,int local_scope)
 {
 	Node node;
@@ -1542,8 +1547,12 @@ static void DetermineStateOfThenOrElse (Args t_or_e_args, NodeDefs *t_or_e_defs,
 		node_id=node->node_node_id;
 		if (node_id->nid_ref_count_copy>=0)
 			--node_id->nid_ref_count_copy__;	
-	} else
+	} else {
+#if 0
+		FPrintF (rules_file,"DetermineStateOfThenOrElse %d\n",local_scope);
+#endif
 		DetermineStatesOfRootNodeAndDefs (node,t_or_e_defs,demstate, local_scope);
+	}
 
 	AdjustState (&t_or_e_args->arg_state,demstate);
 }
@@ -1554,10 +1563,6 @@ static void DecrementRefCountCopy (NodeId nid)
 		--nid->nid_ref_count_copy__;
 }
 
-#if 0
-# include "dbprint.h"
-#endif
-
 static Bool AdjustStateOfSharedNode (NodeId nid, StateS demstate, int local_scope)
 {
 	/*
@@ -1581,9 +1586,9 @@ static Bool AdjustStateOfSharedNode (NodeId nid, StateS demstate, int local_scop
 				node_id_scope=-node_id_scope;
 
 #if 0
-			printf ("AdjustStateOfSharedNode ");
-			DPrintNodeId (nid,StdOut);
-			printf (" %d %d\n",node_id_scope,local_scope);
+			FPrintF (rules_file,"AdjustStateOfSharedNode ");
+			DPrintNodeId (nid,rules_file);
+			FPrintF (rules_file," %d %d\n",node_id_scope,local_scope);
 #endif
 
 			if (node_id_scope>=local_scope){
@@ -1845,9 +1850,9 @@ static Bool NodeInAStrictContext (Node node,StateS demanded_state,int local_scop
 							node_id_scope=-node_id_scope;
 
 #if 0
-						printf ("NodeInAStrictContext select_symb ");
-						DPrintNodeId (node_id,StdOut);
-						printf (" %d %d\n",node_id_scope,local_scope);
+						FPrintF (rules_file,"NodeInAStrictContext select_symb %d ",node->node_arity);
+						DPrintNodeId (node_id,rules_file);
+						FPrintF (rules_file," %d %d\n",node_id_scope,local_scope);
 #endif
 						if (node_id_scope>=local_scope){
 							if (IsSimpleState (argnode->node_state)){
@@ -1873,6 +1878,11 @@ static Bool NodeInAStrictContext (Node node,StateS demanded_state,int local_scop
 								AdjustState (&argnode->node_state.state_tuple_arguments[node->node_arity-1],demanded_state);
 							}
 						}
+						
+#if 0
+						PrintState (argnode->node_state,rules_file);
+						FPrintF (rules_file,"\n");
+#endif
 					}
 				}
 				node->node_state = demanded_state;
@@ -3594,7 +3604,7 @@ static NodeDefs *CollectSharedNodeIdsInRootNode (Node* node_p,NodeId parent_node
 		
 			for_l (arg_p,root_node->node_arguments,arg_next){
 				NodeP node;
-
+				
 				node=arg_p->arg_node;
 				if (node->node_kind==CaseNode){
 					NodeP case_alt_node_p;
@@ -3631,6 +3641,7 @@ static NodeDefs *CollectSharedNodeIdsInRootNode (Node* node_p,NodeId parent_node
 			break;
 		}
 		default:
+			scope=1;
 			last=CollectSharedNodeIdsInNode (node_p,parent_node_id,last);
 			break;
 
@@ -3644,9 +3655,9 @@ static void CollectSharedAndAnnotatedNodesInRhs (NodeS **root_p,NodeDefS **defs_
 {
 	NodeDefS **last;
 	NodeP root_node;
-	
+/*	
 	scope=1;
-
+*/
 	NodeIdCount=1;
 	NodeIdStackTop = (NodeId)-1;
 
-- 
cgit v1.2.3