diff options
Diffstat (limited to 'backendC/CleanCompilerSources/set_scope_numbers.c')
-rw-r--r-- | backendC/CleanCompilerSources/set_scope_numbers.c | 69 |
1 files changed, 50 insertions, 19 deletions
diff --git a/backendC/CleanCompilerSources/set_scope_numbers.c b/backendC/CleanCompilerSources/set_scope_numbers.c index f68417c..993e211 100644 --- a/backendC/CleanCompilerSources/set_scope_numbers.c +++ b/backendC/CleanCompilerSources/set_scope_numbers.c @@ -30,27 +30,58 @@ 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) { - if (node_p->node_kind==IfNode){ - int new_local_scope; - ArgP arg_p; - - node_p->node_if_scope=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); +/* RWS added switch nodes */ + switch (node_p->node_kind) + { + case IfNode: + { + int new_local_scope; + ArgP arg_p; + + node_p->node_if_scope=local_scope; + + new_local_scope=scope+2; + scope+=3; - ++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); + 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; + + for_l (arg_p,node_p->node_arguments,arg_next){ + NodeP node; - ++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); + node=arg_p->arg_node; + if (node->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){ + 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); + } else + ErrorInCompiler ("set_scope_numbers.c", "set_root_scope_numbers", ""); + } + } + break; } } |