stage4/generate_c/generate_c_vardecl.cc
changeset 377 60b012b7793f
parent 334 63b52a8a12f3
child 392 9b88b8b6bccd
--- a/stage4/generate_c/generate_c_vardecl.cc	Fri Sep 09 12:03:15 2011 +0200
+++ b/stage4/generate_c/generate_c_vardecl.cc	Wed Sep 14 22:58:39 2011 +0200
@@ -105,7 +105,6 @@
 
       current_mode = typedecl_am;
       array_specification->accept(*this);
-
       s4o.print(" temp = ");
 
       init_array_values(array_initialization);
@@ -188,14 +187,21 @@
     
     /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
     void *visit(array_specification_c *symbol) {
-      symbol->array_subrange_list->accept(*this);
+      identifier_c* type_name;
       switch (current_mode) {
         case arraysize_am:
+          symbol->array_subrange_list->accept(*this);
           array_base_type = symbol->non_generic_type_name;
           array_default_value = (symbol_c *)symbol->non_generic_type_name->accept(*type_initial_value_c::instance());;
           if (array_default_value == NULL) ERROR;
           break;
+        case typedecl_am:
+          s4o.print("__");
+          symbol->non_generic_type_name->accept(*this);
+          symbol->array_subrange_list->accept(*this);
+          break;
         default:
+          symbol->array_subrange_list->accept(*this);
           break;
       } 
       return NULL;
@@ -204,9 +210,14 @@
     /*  signed_integer DOTDOT signed_integer */
     //SYM_REF2(subrange_c, lower_limit, upper_limit)
     void *visit(subrange_c *symbol) {
+      int dimension = extract_integer(symbol->upper_limit) - extract_integer(symbol->lower_limit) + 1;
       switch (current_mode) {
         case arraysize_am:
-          array_size *= extract_integer(symbol->upper_limit) - extract_integer(symbol->lower_limit) + 1;
+          array_size *= dimension;
+          break;
+        case typedecl_am:
+          s4o.print("_");
+          s4o.print_integer(dimension);
           break;
         default:
           break;
@@ -1379,6 +1390,23 @@
   return NULL;
 }
 
+/* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
+void *visit(array_specification_c *symbol) {
+  s4o.print("__");
+  symbol->non_generic_type_name->accept(*this);
+  symbol->array_subrange_list->accept(*this);
+  return NULL;
+}
+
+/*  signed_integer DOTDOT signed_integer */
+//SYM_REF2(subrange_c, lower_limit, upper_limit)
+void *visit(subrange_c *symbol) {
+  int dimension = extract_integer(symbol->upper_limit) - extract_integer(symbol->lower_limit) + 1;
+  s4o.print("_");
+  print_integer(dimension);
+  return NULL;
+}
+
 /*  var1_list ':' initialized_structure */
 // SYM_REF2(structured_var_init_decl_c, var1_list, initialized_structure)
 void *visit(structured_var_init_decl_c *symbol) {
@@ -1521,7 +1549,7 @@
 }
 
 void *visit(array_initial_elements_list_c *symbol) {
-  if (wanted_varformat == localinit_vf) {
+  if (wanted_varformat == localinit_vf || wanted_varformat == constructorinit_vf) {
 	generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o);
 	array_initialization->init_array_size(this->current_var_type_symbol);
 	array_initialization->init_array_values(this->current_var_init_symbol);
@@ -1952,12 +1980,15 @@
 	    s4o.print(nv->get());
 	    s4o.print(INIT_GLOBAL);
 	    s4o.print("(");
+	    this->current_var_type_symbol->accept(*this);
+	    s4o.print(",");
 	    if (symbol->global_var_name != NULL)
 		  symbol->global_var_name->accept(*this);
 	    else
 		  symbol->location->accept(*this);
-	    s4o.print(",");
+	    s4o.print(",__INITIAL_VALUE(");
 	    this->current_var_init_symbol->accept(*this);
+	    s4o.print(")");
 	    print_retain();
 	    s4o.print(")");
       }
@@ -2013,9 +2044,12 @@
 
           s4o.print(INIT_GLOBAL);
           s4o.print("(");
+          this->current_var_type_symbol->accept(*this);
+          s4o.print(",");
           list->elements[i]->accept(*this);
-          s4o.print(",");
+          s4o.print(",__INITIAL_VALUE(");
           this->current_var_init_symbol->accept(*this);
+          s4o.print(")");
           print_retain();
           s4o.print(")");
 #if 0