stage3/narrow_candidate_datatypes.cc
changeset 453 4733f662362a
parent 452 79ac274d1cc4
child 454 099aa5d655de
--- a/stage3/narrow_candidate_datatypes.cc	Mon Feb 20 19:44:40 2012 +0000
+++ b/stage3/narrow_candidate_datatypes.cc	Tue Feb 21 17:39:57 2012 +0000
@@ -570,14 +570,15 @@
 /* | il_expr_operator '(' [il_operand] eol_list [simple_instr_list] ')' */
 // SYM_REF3(il_expression_c, il_expr_operator, il_operand, simple_instr_list);
 void *narrow_candidate_datatypes_c::visit(il_expression_c *symbol) {
-  symbol_c *save_prev_il_instruction = prev_il_instruction;
-  
-  symbol->simple_instr_list->datatype = symbol->datatype;
+  /* first handle the operation (il_expr_operator) that will use the result coming from the parenthesised IL list (i.e. simple_instr_list) */
+  symbol->il_expr_operator->datatype = symbol->datatype;
+  il_operand = symbol->il_operand;
+  symbol->il_expr_operator->accept(*this);
+
+  /* now give the parenthesised IL list a chance to narrow the datatypes */
+  symbol_c *save_prev_il_instruction = prev_il_instruction; /*this is not really necessary, but lets play it safe */
   symbol->simple_instr_list->accept(*this);
-
   prev_il_instruction = save_prev_il_instruction;
-
-  /* TODO: finish this */
 return NULL;
 }
 
@@ -641,6 +642,10 @@
 
 
 //     void *visit(il_operand_list_c *symbol);
+
+
+/* | simple_instr_list il_simple_instruction */
+/* This object is referenced by il_expression_c objects */
 void *narrow_candidate_datatypes_c::visit(simple_instr_list_c *symbol) {
 	if (symbol->n > 0)
 		symbol->elements[symbol->n - 1]->datatype = symbol->datatype;
@@ -651,6 +656,16 @@
 	return NULL;
 }
 
+
+// SYM_REF1(il_simple_instruction_c, il_simple_instruction, symbol_c *prev_il_instruction;)
+void *narrow_candidate_datatypes_c::visit(il_simple_instruction_c *symbol)	{
+  prev_il_instruction = symbol->prev_il_instruction;
+  symbol->il_simple_instruction->datatype = symbol->datatype;
+  symbol->il_simple_instruction->accept(*this);
+  prev_il_instruction = NULL;
+  return NULL;
+}
+
 //     void *visit(il_param_list_c *symbol);
 //     void *visit(il_param_assignment_c *symbol);
 //     void *visit(il_param_out_assignment_c *symbol);