Fix bug in SFC generated code. Action state was declared in the list of variables to debug, but wasn't stored using structure with flags. This error had side effects that makes Beremiz debug crash.
authorLaurent Bessard
Tue, 11 Sep 2012 01:05:24 +0200
changeset 628 fe0d516fe291
parent 627 e7caa7d32ef5
child 629 06abc9867095
Fix bug in SFC generated code. Action state was declared in the list of variables to debug, but wasn't stored using structure with flags. This error had side effects that makes Beremiz debug crash.
lib/iec_types_all.h
stage4/generate_c/generate_c_sfc.cc
stage4/generate_c/generate_c_sfcdecl.cc
--- a/lib/iec_types_all.h	Tue Sep 04 18:02:06 2012 +0200
+++ b/lib/iec_types_all.h	Tue Sep 11 01:05:24 2012 +0200
@@ -131,7 +131,7 @@
 
 typedef struct {
   BOOL stored;  // action storing state. 0 : not stored, 1: stored
-  BOOL state; // current action state. 0 : inative, 1: active
+  __IEC_BOOL_t state; // current action state. 0 : inative, 1: active
   BOOL set;   // set have been requested (reset each time the body is evaluated)
   BOOL reset; // reset have been requested (reset each time the body is evaluated)
   TIME set_remaining_time;    // time before set will be requested
--- a/stage4/generate_c/generate_c_sfc.cc	Tue Sep 04 18:02:06 2012 +0200
+++ b/stage4/generate_c/generate_c_sfc.cc	Tue Sep 11 01:05:24 2012 +0200
@@ -398,11 +398,13 @@
       switch (wanted_sfcgeneration) {
         case actionbody_sg:
           s4o.print(s4o.indent_spaces + "if(");
+          s4o.print(GET_VAR);
+          s4o.print("(");
           print_variable_prefix();
           s4o.print("__action_list[");
           s4o.print(SFC_STEP_ACTION_PREFIX);
           symbol->action_name->accept(*this);
-          s4o.print("].state) {\n");
+          s4o.print("].state)) {\n");
           s4o.indent_right();
           
           // generate action code
@@ -497,8 +499,10 @@
             s4o.print(")) {\n");
             s4o.indent_right();
             s4o.print(s4o.indent_spaces);
-            print_action_argument(symbol->action_name, "state");
-            s4o.print(" = 1;\n");
+            s4o.print(SET_VAR);
+            s4o.print("(");
+            print_action_argument(symbol->action_name, "state", true);
+            s4o.print(",1);\n");
             s4o.indent_left();
             s4o.print(s4o.indent_spaces + "}");
           }
@@ -545,8 +549,10 @@
             if (strcmp(qualifier, "N") == 0 || strcmp(qualifier, "P") == 0 ||
                 strcmp(qualifier, "D") == 0 || strcmp(qualifier, "L") == 0 ||
                 strcmp(qualifier, "P0") == 0 || strcmp(qualifier, "P1") == 0) {
-              print_action_argument(current_action, "state");
-              s4o.print(" = 1;\n");  
+              s4o.print(SET_VAR);
+              s4o.print("(");
+              print_action_argument(current_action, "state", true);
+              s4o.print(",1);\n");
             }
             if (strcmp(qualifier, "S") == 0 || strcmp(qualifier, "SL") == 0) {
               print_action_argument(current_action, "set");
@@ -719,8 +725,10 @@
       s4o.print("__nb_actions; i++) {\n");
       s4o.indent_right();
       s4o.print(s4o.indent_spaces);
-      print_variable_prefix();
-      s4o.print("__action_list[i].state = 0;\n");
+      s4o.print(SET_VAR);
+      s4o.print("(");
+      print_variable_prefix();
+      s4o.print(",__action_list[i].state,0);\n");
       s4o.print(s4o.indent_spaces);
       print_variable_prefix();
       s4o.print("__action_list[i].set = 0;\n");
@@ -839,10 +847,16 @@
       s4o.print("__action_list[i].stored = 0;\n");
       s4o.indent_left();
       s4o.print(s4o.indent_spaces + "}\n" + s4o.indent_spaces);
-      print_variable_prefix();
-      s4o.print("__action_list[i].state |= ");
-      print_variable_prefix();
-      s4o.print("__action_list[i].stored;\n");
+      s4o.print(SET_VAR);
+      s4o.print("(");
+      print_variable_prefix();
+      s4o.print(",__action_list[i].state,");
+      s4o.print(GET_VAR);
+      s4o.print("(");
+      print_variable_prefix();
+      s4o.print("__action_list[i].state) | ");
+      print_variable_prefix();
+      s4o.print("__action_list[i].stored);\n");
       s4o.indent_left();
       s4o.print(s4o.indent_spaces + "}\n\n");
       
@@ -867,11 +881,13 @@
           	s4o.print(",");
           	pt->symbol->accept(*this);
             s4o.print(",");
+            s4o.print(GET_VAR);
+            s4o.print("(");
             print_variable_prefix();
             s4o.print("__action_list[");
             s4o.print(SFC_STEP_ACTION_PREFIX);
             pt->symbol->accept(*this);
-            s4o.print("].state);\n");
+            s4o.print("].state));\n");
           }
         }
       }
--- a/stage4/generate_c/generate_c_sfcdecl.cc	Tue Sep 04 18:02:06 2012 +0200
+++ b/stage4/generate_c/generate_c_sfcdecl.cc	Tue Sep 11 01:05:24 2012 +0200
@@ -156,7 +156,7 @@
           wanted_sfcdeclaration = sfcinit_sd;
           
           /* actions table initialisation */
-          s4o.print(s4o.indent_spaces + "static const ACTION temp_action = {0, 0, 0, 0, {0, 0}, {0, 0}};\n");
+          s4o.print(s4o.indent_spaces + "static const ACTION temp_action = {0, {0, 0}, 0, 0, {0, 0}, {0, 0}};\n");
           s4o.print(s4o.indent_spaces + "for(i = 0; i < ");
           print_variable_prefix();
           s4o.print("__nb_actions; i++) {\n");