diff -r f332b62cd2c1 -r c6aed7e5f070 stage4/generate_c/generate_c_st.cc --- a/stage4/generate_c/generate_c_st.cc Tue Dec 01 09:03:33 2009 +0100 +++ b/stage4/generate_c/generate_c_st.cc Wed Dec 02 16:11:01 2009 +0100 @@ -119,22 +119,19 @@ unsigned int vartype = search_varfb_instance_type->get_vartype(symbol); if (this->is_variable_prefix_null()) { if (wanted_variablegeneration == fparam_output_vg) { - if (vartype == search_var_instance_decl_c::external_vt) { + if (vartype == search_var_instance_decl_c::external_vt) s4o.print(GET_EXTERNAL); - s4o.print("("); - symbol->var_name->accept(*this); - } - else { - s4o.print("&("); - generate_c_base_c::visit(symbol); - } + else + s4o.print("&"); + s4o.print("("); + generate_c_base_c::visit(symbol); s4o.print(")"); } else { if (vartype == search_var_instance_decl_c::external_vt) { s4o.print(GET_EXTERNAL); s4o.print("("); - symbol->var_name->accept(*this); + generate_c_base_c::visit(symbol); s4o.print(")"); } else @@ -144,42 +141,29 @@ else { switch (wanted_variablegeneration) { case expression_vg: - if (vartype == search_var_instance_decl_c::external_vt) { + if (vartype == search_var_instance_decl_c::external_vt) s4o.print(GET_EXTERNAL); - s4o.print("("); - symbol->var_name->accept(*this); - } - else { - if (vartype == search_var_instance_decl_c::located_vt) - s4o.print(GET_LOCATED); - else - s4o.print(GET_VAR); - s4o.print("("); - generate_c_base_c::visit(symbol); - } + else if (vartype == search_var_instance_decl_c::located_vt) + s4o.print(GET_LOCATED); + else + s4o.print(GET_VAR); + s4o.print("("); + generate_c_base_c::visit(symbol); s4o.print(")"); break; case fparam_output_vg: - if (vartype == search_var_instance_decl_c::external_vt) { + if (vartype == search_var_instance_decl_c::external_vt) s4o.print(GET_EXTERNAL_BY_REF); - s4o.print("("); - symbol->var_name->accept(*this); - } - else { - if (vartype == search_var_instance_decl_c::located_vt) - s4o.print(GET_LOCATED_BY_REF); - else - s4o.print(GET_VAR_BY_REF); - s4o.print("("); - generate_c_base_c::visit(symbol); - } + else if (vartype == search_var_instance_decl_c::located_vt) + s4o.print(GET_LOCATED_BY_REF); + else + s4o.print(GET_VAR_BY_REF); + s4o.print("("); + generate_c_base_c::visit(symbol); s4o.print(")"); break; default: - if (vartype == search_var_instance_decl_c::external_vt) - symbol->var_name->accept(*this); - else - generate_c_base_c::visit(symbol); + generate_c_base_c::visit(symbol); break; } } @@ -224,6 +208,67 @@ /* B.1.4.2 Multi-element Variables */ /*************************************/ +// SYM_REF2(structured_variable_c, record_variable, field_selector) +void *visit(structured_variable_c *symbol) { + TRACE("structured_variable_c"); + + unsigned int vartype = search_varfb_instance_type->get_vartype(symbol->record_variable); + if (this->is_variable_prefix_null()) { + symbol->record_variable->accept(*this); + s4o.print("."); + symbol->field_selector->accept(*this); + } + else { + variablegeneration_t old_wanted_variablegeneration = wanted_variablegeneration; + switch (wanted_variablegeneration) { + case expression_vg: + wanted_variablegeneration = assignment_vg; + if (vartype == search_var_instance_decl_c::external_vt) { + s4o.print(GET_EXTERNAL); + s4o.print("("); + symbol->record_variable->accept(*this); + s4o.print(")."); + symbol->field_selector->accept(*this); + } + else { + if (vartype == search_var_instance_decl_c::located_vt) + s4o.print(GET_LOCATED); + else + s4o.print(GET_VAR); + s4o.print("("); + symbol->record_variable->accept(*this); + s4o.print("."); + symbol->field_selector->accept(*this); + s4o.print(")"); + } + wanted_variablegeneration = old_wanted_variablegeneration; + break; + case fparam_output_vg: + wanted_variablegeneration = assignment_vg; + s4o.print("&("); + if (vartype == search_var_instance_decl_c::external_vt) + s4o.print(GET_EXTERNAL); + else if (vartype == search_var_instance_decl_c::located_vt) + s4o.print(GET_LOCATED); + else + s4o.print(GET_VAR); + s4o.print("("); + symbol->record_variable->accept(*this); + s4o.print(")."); + symbol->field_selector->accept(*this); + s4o.print("))"); + wanted_variablegeneration = old_wanted_variablegeneration; + break; + default: + symbol->record_variable->accept(*this); + s4o.print("."); + symbol->field_selector->accept(*this); + break; + } + } + return NULL; +} + /* subscripted_variable '[' subscript_list ']' */ //SYM_REF2(array_variable_c, subscripted_variable, subscript_list) void *visit(array_variable_c *symbol) {