stage3/fill_candidate_datatypes.cc
changeset 453 4733f662362a
parent 452 79ac274d1cc4
child 454 099aa5d655de
--- a/stage3/fill_candidate_datatypes.cc	Mon Feb 20 19:44:40 2012 +0000
+++ b/stage3/fill_candidate_datatypes.cc	Tue Feb 21 17:39:57 2012 +0000
@@ -45,7 +45,7 @@
 #include <strings.h>
 
 /* set to 1 to see debug info during execution */
-static int debug = 0;
+static int debug = 1;
 
 fill_candidate_datatypes_c::fill_candidate_datatypes_c(symbol_c *ignore) {
 }
@@ -904,25 +904,17 @@
 /* | il_expr_operator '(' [il_operand] eol_list [simple_instr_list] ')' */
 // SYM_REF3(il_expression_c, il_expr_operator, il_operand, simple_instr_list);
 void *fill_candidate_datatypes_c::visit(il_expression_c *symbol) {
+  symbol_c *prev_il_instruction_backup = prev_il_instruction;
+  il_parenthesis_level++;
+  
   if (NULL != symbol->il_operand)
     symbol->il_operand->accept(*this);
-  
-  il_parenthesis_level++;
-
-  /* Note that prev_il_instruction will actually be used to get the current value store in the il_default_variable */
-  /* If a symbol->il_operand is provided, then that will be the result before executing the simple_instr_list.
-   * If this symbol is NULL, then the current result is also NULL, which is correct for what we want to do!
-   */
-  symbol_c *prev_il_instruction_backup = prev_il_instruction;
-  prev_il_instruction = symbol->il_operand;
-  
-  if(symbol->simple_instr_list != NULL) {
+
+  if(symbol->simple_instr_list != NULL)
     symbol->simple_instr_list->accept(*this);
-  }
 
   il_parenthesis_level--;
   if (il_parenthesis_level < 0) ERROR;
-
   
   /* Now check the if the data type semantics of operation are correct,  */
   il_operand = symbol->simple_instr_list;
@@ -1006,18 +998,33 @@
 /* | simple_instr_list il_simple_instruction */
 /* This object is referenced by il_expression_c objects */
 void *fill_candidate_datatypes_c::visit(simple_instr_list_c *symbol) {
-  int i;
-  for(i = 0; i < symbol->n; i++)    
+std::cout << "simple_instr_list_c [filling starting]\n";
+  if (symbol->n <= 0)
+    return NULL;  /* List is empty! Nothing to do. */
+    
+  for(int i = 0; i < symbol->n; i++)
     symbol->elements[i]->accept(*this);
-  /* This object has (inherits) the same candidate datatypes as the last il_instruction (if it exists!) */
-  if (i > 0)  
-    copy_candidate_datatype_list(symbol->elements[i-1] /*from*/, symbol /*to*/);	
+
+  /* This object has (inherits) the same candidate datatypes as the last il_instruction */
+  copy_candidate_datatype_list(symbol->elements[symbol->n-1] /*from*/, symbol /*to*/);	
   
   if (debug) std::cout << "simple_instr_list_c [" << symbol->candidate_datatypes.size() << "] result.\n";
 std::cout << "simple_instr_list_c [" << symbol->candidate_datatypes.size() << "] result.\n";
   return NULL;
 }
 
+// SYM_REF1(il_simple_instruction_c, il_simple_instruction, symbol_c *prev_il_instruction;)
+void *fill_candidate_datatypes_c::visit(il_simple_instruction_c *symbol) {
+  prev_il_instruction = symbol->prev_il_instruction;
+  symbol->il_simple_instruction->accept(*this);
+  prev_il_instruction = NULL;
+
+  /* This object has (inherits) the same candidate datatypes as the il_simple_instruction it points to */
+  copy_candidate_datatype_list(symbol->il_simple_instruction /*from*/, symbol /*to*/);	
+  return NULL;
+}
+
+
 /*
     void *visit(il_param_list_c *symbol);
     void *visit(il_param_assignment_c *symbol);
@@ -1171,6 +1178,7 @@
 				symbol->candidate_datatypes.push_back(prev_instruction_type);
 		}
 	}
+	if (debug) std::cout <<  "AND [" << prev_il_instruction->candidate_datatypes.size() << "," << il_operand->candidate_datatypes.size() << "] ==> "  << symbol->candidate_datatypes.size() << " result.\n";
 	return NULL;
 }
 
@@ -1187,6 +1195,7 @@
 				symbol->candidate_datatypes.push_back(prev_instruction_type);
 		}
 	}
+	if (debug) std::cout <<  "OR [" << prev_il_instruction->candidate_datatypes.size() << "," << il_operand->candidate_datatypes.size() << "] ==> "  << symbol->candidate_datatypes.size() << " result.\n";
 	return NULL;
 }
 
@@ -1203,6 +1212,7 @@
 				symbol->candidate_datatypes.push_back(prev_instruction_type);
 		}
 	}
+	if (debug) std::cout <<  "XOR [" << prev_il_instruction->candidate_datatypes.size() << "," << il_operand->candidate_datatypes.size() << "] ==> "  << symbol->candidate_datatypes.size() << " result.\n";
 	return NULL;
 }
 
@@ -1219,6 +1229,7 @@
 				symbol->candidate_datatypes.push_back(prev_instruction_type);
 		}
 	}
+	if (debug) std::cout <<  "ANDN [" << prev_il_instruction->candidate_datatypes.size() << "," << il_operand->candidate_datatypes.size() << "] ==> "  << symbol->candidate_datatypes.size() << " result.\n";
 	return NULL;
 }
 
@@ -1235,6 +1246,7 @@
 				symbol->candidate_datatypes.push_back(prev_instruction_type);
 		}
 	}
+	if (debug) std::cout <<  "ORN [" << prev_il_instruction->candidate_datatypes.size() << "," << il_operand->candidate_datatypes.size() << "] ==> "  << symbol->candidate_datatypes.size() << " result.\n";
 	return NULL;
 }
 
@@ -1251,6 +1263,7 @@
 				symbol->candidate_datatypes.push_back(prev_instruction_type);
 		}
 	}
+	if (debug) std::cout <<  "XORN [" << prev_il_instruction->candidate_datatypes.size() << "," << il_operand->candidate_datatypes.size() << "] ==> "  << symbol->candidate_datatypes.size() << " result.\n";
 	return NULL;
 }