stage4/generate_c/generate_c_inlinefcall.cc
author laurent
Fri, 18 Nov 2011 17:28:37 +0100
changeset 392 9b88b8b6bccd
parent 388 17eaad42ba88
child 399 55b074ea7255
child 453 4733f662362a
permissions -rwxr-xr-x
Fixing generated code for global variables. Adding support for defining global variables with complex type
Fixing bug preventing to generate SFC transition with IL body
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
     1
/*
279
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 238
diff changeset
     2
 *  matiec - a compiler for the programming languages defined in IEC 61131-3
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
     3
 *
279
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 238
diff changeset
     4
 *  Copyright (C) 2003-2011  Mario de Sousa (msousa@fe.up.pt)
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 238
diff changeset
     5
 *  Copyright (C) 2007-2011  Laurent Bessard and Edouard Tisserant
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
     6
 *
279
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 238
diff changeset
     7
 *  This program is free software: you can redistribute it and/or modify
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 238
diff changeset
     8
 *  it under the terms of the GNU General Public License as published by
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 238
diff changeset
     9
 *  the Free Software Foundation, either version 3 of the License, or
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 238
diff changeset
    10
 *  (at your option) any later version.
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 238
diff changeset
    11
 *
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 238
diff changeset
    12
 *  This program is distributed in the hope that it will be useful,
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 238
diff changeset
    13
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 238
diff changeset
    14
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 238
diff changeset
    15
 *  GNU General Public License for more details.
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 238
diff changeset
    16
 *
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 238
diff changeset
    17
 *  You should have received a copy of the GNU General Public License
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 238
diff changeset
    18
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 238
diff changeset
    19
 *
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    20
 *
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    21
 * This code is made available on the understanding that it will not be
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    22
 * used in safety-critical situations without a full and competent review.
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    23
 */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    24
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    25
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    26
#define INLINE_RESULT_TEMP_VAR "__res"
380
b78e59ed4269 Fix bug in generate_c_inlinefcall.cc that prevent to use extendible standard functions
laurent
parents: 355
diff changeset
    27
#define INLINE_PARAM_COUNT "__PARAM_COUNT"
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    28
234
e4d31cd0e6d8 Using function_call_iterator in generate_c_inlinefcall instead of creating a new visitor
laurent
parents: 233
diff changeset
    29
class generate_c_inlinefcall_c: public generate_c_typedecl_c {
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    30
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
    31
  public:
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
    32
    typedef enum {
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
    33
      expression_vg,
228
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
    34
      assignment_vg,
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
    35
      complextype_base_vg,
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
    36
      complextype_suffix_vg
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
    37
    } variablegeneration_t;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
    38
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    39
  private:
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    40
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    41
    /* The initial value that should be given to the IL default variable
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    42
	 * imediately after a parenthesis is opened.
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    43
	 * This variable is only used to pass data from the
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    44
	 * il_expression_c visitor to the simple_instr_list_c visitor.
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    45
	 *
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    46
	 * e.g.:
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    47
	 *         LD var1
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    48
	 *         AND ( var2
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    49
	 *         OR var3
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    50
	 *         )
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    51
	 *
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    52
	 * In the above code sample, the line 'AND ( var2' constitutes
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    53
	 * an il_expression_c, where var2 should be loaded into the
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    54
	 * il default variable before continuing with the expression
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    55
	 * inside the parenthesis.
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    56
	 * Unfortunately, only the simple_instr_list_c may do the
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    57
	 * initial laoding of the var2 bariable following the parenthesis,
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    58
	 * so the il_expression_c visitor will have to pass 'var2' as a
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    59
	 * parameter to the simple_instr_list_c visitor.
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    60
	 * Ergo, the existance of the following parameter...!
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    61
	 */
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    62
	symbol_c *il_default_variable_init_value;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    63
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    64
    /* Operand to the IL operation currently being processed... */
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    65
	/* These variables are used to pass data from the
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    66
	 * il_simple_operation_c and il_expression_c visitors
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    67
	 * to the il operator visitors (i.e. LD_operator_c,
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    68
	 * LDN_operator_c, ST_operator_c, STN_operator_c, ...)
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    69
	 */
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    70
	symbol_c *current_operand;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    71
	symbol_c *current_operand_type;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    72
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    73
	 /* The result of the comparison IL operations (GT, EQ, LT, ...)
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    74
	 * is a boolean variable.
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    75
	 * This class keeps track of the current data type stored in the
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    76
	 * il default variable. This is usually done by keeping a reference
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    77
	 * to the data type of the last operand. Nevertheless, in the case of
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    78
	 * the comparison IL operators, the data type of the result (a boolean)
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    79
	 * is not the data type of the operand. We therefore need an object
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    80
	 * of the boolean data type to keep as a reference of the current
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    81
	 * data type.
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    82
	 * The following object is it...
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    83
	 */
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    84
	bool_type_name_c bool_type;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    85
	lint_type_name_c lint_type;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    86
	lword_type_name_c lword_type;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    87
	lreal_type_name_c lreal_type;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    88
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    89
    /* The name of the IL default variable... */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    90
	#define IL_DEFVAR   VAR_LEADER "IL_DEFVAR"
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    91
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    92
	/* The name of the variable used to pass the result of a
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    93
	 * parenthesised instruction list to the immediately preceding
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    94
	 * scope ...
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    95
	 */
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    96
    #define IL_DEFVAR_BACK   VAR_LEADER "IL_DEFVAR_BACK"
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    97
    il_default_variable_c default_variable_name;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
    98
	il_default_variable_c default_variable_back_name;
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    99
228
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   100
	symbol_c* current_array_type;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   101
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   102
	int fcall_number;
388
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   103
	bool generating_inlinefunction;
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   104
	symbol_c *fbname;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   105
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   106
    search_expression_type_c *search_expression_type;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   107
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   108
    search_varfb_instance_type_c *search_varfb_instance_type;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   109
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   110
    search_base_type_c search_base_type;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   111
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
   112
    variablegeneration_t wanted_variablegeneration;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
   113
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   114
  public:
234
e4d31cd0e6d8 Using function_call_iterator in generate_c_inlinefcall instead of creating a new visitor
laurent
parents: 233
diff changeset
   115
    generate_c_inlinefcall_c(stage4out_c *s4o_ptr, symbol_c *name, symbol_c *scope, const char *variable_prefix = NULL)
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   116
    : generate_c_typedecl_c(s4o_ptr),
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   117
      default_variable_name(IL_DEFVAR, NULL),
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   118
      default_variable_back_name(IL_DEFVAR_BACK, NULL)
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   119
    {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   120
      search_expression_type = new search_expression_type_c(scope);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   121
      search_varfb_instance_type = new search_varfb_instance_type_c(scope);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   122
      this->set_variable_prefix(variable_prefix);
392
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 388
diff changeset
   123
      current_operand = NULL;
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 388
diff changeset
   124
      current_operand_type = NULL;
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 388
diff changeset
   125
      il_default_variable_init_value = NULL;
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   126
      fcall_number = 0;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   127
      fbname = name;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
   128
      wanted_variablegeneration = expression_vg;
388
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   129
      generating_inlinefunction = false;
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   130
    }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   131
234
e4d31cd0e6d8 Using function_call_iterator in generate_c_inlinefcall instead of creating a new visitor
laurent
parents: 233
diff changeset
   132
    virtual ~generate_c_inlinefcall_c(void) {
e4d31cd0e6d8 Using function_call_iterator in generate_c_inlinefcall instead of creating a new visitor
laurent
parents: 233
diff changeset
   133
      delete search_expression_type;
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   134
      delete search_varfb_instance_type;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   135
    }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   136
234
e4d31cd0e6d8 Using function_call_iterator in generate_c_inlinefcall instead of creating a new visitor
laurent
parents: 233
diff changeset
   137
    void print(symbol_c* symbol) {
e4d31cd0e6d8 Using function_call_iterator in generate_c_inlinefcall instead of creating a new visitor
laurent
parents: 233
diff changeset
   138
      function_call_iterator_c fc_iterator(symbol);
e4d31cd0e6d8 Using function_call_iterator in generate_c_inlinefcall instead of creating a new visitor
laurent
parents: 233
diff changeset
   139
      symbol_c* function_call;
e4d31cd0e6d8 Using function_call_iterator in generate_c_inlinefcall instead of creating a new visitor
laurent
parents: 233
diff changeset
   140
      while ((function_call = fc_iterator.next()) != NULL) {
e4d31cd0e6d8 Using function_call_iterator in generate_c_inlinefcall instead of creating a new visitor
laurent
parents: 233
diff changeset
   141
    	function_call->accept(*this);
e4d31cd0e6d8 Using function_call_iterator in generate_c_inlinefcall instead of creating a new visitor
laurent
parents: 233
diff changeset
   142
      }
e4d31cd0e6d8 Using function_call_iterator in generate_c_inlinefcall instead of creating a new visitor
laurent
parents: 233
diff changeset
   143
    }
e4d31cd0e6d8 Using function_call_iterator in generate_c_inlinefcall instead of creating a new visitor
laurent
parents: 233
diff changeset
   144
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   145
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   146
234
e4d31cd0e6d8 Using function_call_iterator in generate_c_inlinefcall instead of creating a new visitor
laurent
parents: 233
diff changeset
   147
    void generate_inline(symbol_c *function_name,
235
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   148
            symbol_c *function_type_prefix,
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   149
            symbol_c *function_type_suffix,
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   150
            std::list<FUNCTION_PARAM*> param_list,
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   151
            function_declaration_c *f_decl = NULL) {
388
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   152
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   153
      std::list<FUNCTION_PARAM*>::iterator pt;
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   154
      generating_inlinefunction = true;
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   155
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   156
      fcall_number++;
336
229eb3e29216 Fix bug in function calls with literal parameters
laurent
parents: 332
diff changeset
   157
      function_type_prefix = search_expression_type->default_literal_type(function_type_prefix);
229eb3e29216 Fix bug in function calls with literal parameters
laurent
parents: 332
diff changeset
   158
      if (function_type_suffix) {
229eb3e29216 Fix bug in function calls with literal parameters
laurent
parents: 332
diff changeset
   159
        function_type_suffix = search_expression_type->default_literal_type(function_type_suffix);
332
0f1d91a37506 Fix bug in inline function calls when using function with undetermined type interface with literals as input
laurent
parents: 321
diff changeset
   160
      }
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   161
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   162
      s4o.print(s4o.indent_spaces);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   163
      s4o.print("inline ");
235
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   164
      function_type_prefix->accept(*this);
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   165
      s4o.print(" __");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   166
      fbname->accept(*this);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   167
      s4o.print("_");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   168
      function_name->accept(*this);
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   169
      if (f_decl != NULL) {
383
0b81b59f333b Fix bug generate_c_inlinefcall in inline function name generated
laurent
parents: 380
diff changeset
   170
        /* function being called is overloaded! */
0b81b59f333b Fix bug generate_c_inlinefcall in inline function name generated
laurent
parents: 380
diff changeset
   171
        s4o.print("__");
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   172
        print_function_parameter_data_types_c overloaded_func_suf(&s4o);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   173
        f_decl->accept(overloaded_func_suf);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   174
      }	
336
229eb3e29216 Fix bug in function calls with literal parameters
laurent
parents: 332
diff changeset
   175
      if (function_type_suffix) {
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   176
        function_type_suffix->accept(*this);
336
229eb3e29216 Fix bug in function calls with literal parameters
laurent
parents: 332
diff changeset
   177
      }
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   178
      s4o.print_integer(fcall_number);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   179
      s4o.print("(");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   180
      s4o.indent_right();
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   181
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   182
      PARAM_LIST_ITERATOR() {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   183
        if (PARAM_DIRECTION == function_param_iterator_c::direction_in) {
336
229eb3e29216 Fix bug in function calls with literal parameters
laurent
parents: 332
diff changeset
   184
          search_expression_type->default_literal_type(PARAM_TYPE)->accept(*this);
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   185
          s4o.print(" ");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   186
          PARAM_NAME->accept(*this);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   187
          s4o.print(",\n" + s4o.indent_spaces);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   188
        }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   189
      }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   190
      fbname->accept(*this);
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   191
      s4o.print(" *");
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   192
      s4o.print(FB_FUNCTION_PARAM);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   193
      s4o.indent_left();
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   194
      s4o.print(")\n" + s4o.indent_spaces);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   195
      s4o.print("{\n");
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   196
      s4o.indent_right();
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   197
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   198
      s4o.print(s4o.indent_spaces);
235
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   199
      function_type_prefix->accept(*this);
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   200
      s4o.print(" "),
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   201
      s4o.print(INLINE_RESULT_TEMP_VAR);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   202
      s4o.print(";\n");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   203
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   204
      PARAM_LIST_ITERATOR() {
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   205
        if ((PARAM_DIRECTION == function_param_iterator_c::direction_out ||
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   206
             PARAM_DIRECTION == function_param_iterator_c::direction_inout) &&
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   207
             PARAM_VALUE != NULL) {
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   208
          s4o.print(s4o.indent_spaces);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   209
          PARAM_TYPE->accept(*this);
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   210
          s4o.print(" ");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   211
          s4o.print(TEMP_VAR);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   212
          PARAM_NAME->accept(*this);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   213
          s4o.print(" = ");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   214
          print_check_function(PARAM_TYPE, PARAM_VALUE);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   215
          s4o.print(";\n");
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   216
          }
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   217
        }
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   218
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   219
      s4o.print(s4o.indent_spaces + INLINE_RESULT_TEMP_VAR),
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   220
      s4o.print(" = ");
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   221
      function_name->accept(*this);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   222
      if (f_decl != NULL) {
383
0b81b59f333b Fix bug generate_c_inlinefcall in inline function name generated
laurent
parents: 380
diff changeset
   223
    	/* function being called is overloaded! */
0b81b59f333b Fix bug generate_c_inlinefcall in inline function name generated
laurent
parents: 380
diff changeset
   224
    	s4o.print("__");
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   225
        print_function_parameter_data_types_c overloaded_func_suf(&s4o);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   226
        f_decl->accept(overloaded_func_suf);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   227
      }
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   228
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   229
      if (function_type_suffix)
235
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   230
        function_type_suffix->accept(*this);
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   231
      s4o.print("(");
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   232
      s4o.indent_right();
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   233
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   234
      PARAM_LIST_ITERATOR() {
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   235
        if (pt != param_list.begin())
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   236
        s4o.print(",\n" + s4o.indent_spaces);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   237
        if (PARAM_DIRECTION == function_param_iterator_c::direction_in)
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   238
          PARAM_NAME->accept(*this);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   239
        else if (PARAM_VALUE != NULL){
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   240
          s4o.print("&");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   241
          s4o.print(TEMP_VAR);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   242
          PARAM_NAME->accept(*this);
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   243
        } else {
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   244
          s4o.print("NULL");
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   245
         }
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   246
      }
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   247
      s4o.print(");\n");
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   248
      s4o.indent_left();
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   249
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   250
      PARAM_LIST_ITERATOR() {
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   251
        if ((PARAM_DIRECTION == function_param_iterator_c::direction_out ||
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   252
             PARAM_DIRECTION == function_param_iterator_c::direction_inout) &&
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   253
             PARAM_VALUE != NULL) {
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   254
          s4o.print(s4o.indent_spaces);
228
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   255
          print_setter(PARAM_VALUE, PARAM_TYPE, PARAM_NAME);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   256
          s4o.print(";\n");
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   257
        }
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   258
      }
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   259
      s4o.print(s4o.indent_spaces + "return ");
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   260
      s4o.print(INLINE_RESULT_TEMP_VAR);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   261
      s4o.print(";\n");
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   262
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   263
      s4o.indent_left();
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   264
      s4o.print(s4o.indent_spaces + "}\n\n");
388
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   265
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   266
      generating_inlinefunction = false;
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   267
    }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   268
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   269
  private:
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   270
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   271
    /* A helper function... */
345
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   272
	void CMP_operator_result_type() {
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   273
	  /* the data type resulting from this operation... */
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   274
	  this->default_variable_name.current_type = &(this->bool_type);
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   275
	}
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   276
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   277
	/* A helper function... */
345
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   278
    void BYTE_operator_result_type(void) {
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   279
	  if (search_expression_type->is_literal_integer_type(this->default_variable_name.current_type)) {
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   280
		if (search_expression_type->is_literal_integer_type(this->current_operand_type))
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   281
		  this->default_variable_name.current_type = &(this->lword_type);
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   282
		else
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   283
		  this->default_variable_name.current_type = this->current_operand_type;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   284
	  }
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   285
	  else if (search_expression_type->is_literal_integer_type(this->current_operand_type))
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   286
		  this->current_operand_type = this->default_variable_name.current_type;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   287
	}
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   288
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   289
    /* A helper function... */
345
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   290
    void NUM_operator_result_type(void) {
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   291
	  if (search_expression_type->is_literal_real_type(this->default_variable_name.current_type)) {
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   292
		if (search_expression_type->is_literal_integer_type(this->current_operand_type) ||
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   293
			search_expression_type->is_literal_real_type(this->current_operand_type))
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   294
		  this->default_variable_name.current_type = &(this->lreal_type);
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   295
		else
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   296
		  this->default_variable_name.current_type = this->current_operand_type;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   297
	  }
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   298
	  else if (search_expression_type->is_literal_integer_type(this->default_variable_name.current_type)) {
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   299
		if (search_expression_type->is_literal_integer_type(this->current_operand_type))
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   300
		  this->default_variable_name.current_type = &(this->lint_type);
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   301
		else if (search_expression_type->is_literal_real_type(this->current_operand_type))
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   302
		  this->default_variable_name.current_type = &(this->lreal_type);
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   303
		else
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   304
		  this->default_variable_name.current_type = this->current_operand_type;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   305
	  }
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   306
	  else if (search_expression_type->is_literal_integer_type(this->current_operand_type) ||
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   307
			   search_expression_type->is_literal_real_type(this->current_operand_type))
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   308
		this->current_operand_type = this->default_variable_name.current_type;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   309
	}
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   310
228
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   311
    void *print_getter(symbol_c *symbol) {
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   312
      unsigned int vartype = search_varfb_instance_type->get_vartype(symbol);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   313
      if (vartype == search_var_instance_decl_c::external_vt)
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   314
    	s4o.print(GET_EXTERNAL);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   315
      else if (vartype == search_var_instance_decl_c::located_vt)
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   316
    	s4o.print(GET_LOCATED);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   317
      else
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   318
    	s4o.print(GET_VAR);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   319
      s4o.print("(");
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   320
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   321
      wanted_variablegeneration = complextype_base_vg;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   322
      symbol->accept(*this);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   323
      if (search_varfb_instance_type->type_is_complex())
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   324
    	s4o.print(",");
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   325
      wanted_variablegeneration = complextype_suffix_vg;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   326
      symbol->accept(*this);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   327
      s4o.print(")");
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   328
      wanted_variablegeneration = expression_vg;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   329
      return NULL;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   330
    }
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   331
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   332
    void *print_setter(symbol_c* symbol,
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   333
    		symbol_c* type,
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   334
    		symbol_c* value) {
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   335
      unsigned int vartype = search_varfb_instance_type->get_vartype(symbol);
392
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 388
diff changeset
   336
      if (vartype == search_var_instance_decl_c::external_vt)
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 388
diff changeset
   337
        s4o.print(SET_EXTERNAL);
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 388
diff changeset
   338
      else if (vartype == search_var_instance_decl_c::located_vt)
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 388
diff changeset
   339
        s4o.print(SET_LOCATED);
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 388
diff changeset
   340
      else
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 388
diff changeset
   341
        s4o.print(SET_VAR);
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 388
diff changeset
   342
      s4o.print("(,");
228
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   343
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   344
      wanted_variablegeneration = complextype_base_vg;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   345
      symbol->accept(*this);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   346
      s4o.print(",");
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   347
      wanted_variablegeneration = expression_vg;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   348
      print_check_function(type, value, NULL, true);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   349
      if (search_varfb_instance_type->type_is_complex()) {
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   350
        s4o.print(",");
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   351
        wanted_variablegeneration = complextype_suffix_vg;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   352
        symbol->accept(*this);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   353
      }
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   354
      s4o.print(")");
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   355
      wanted_variablegeneration = expression_vg;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   356
      return NULL;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   357
    }
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   358
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   359
    /*********************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   360
    /* B 1.4 - Variables */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   361
    /*********************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   362
    void *visit(symbolic_variable_c *symbol) {
228
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   363
      unsigned int vartype;
388
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   364
      if (generating_inlinefunction) {
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   365
        if (wanted_variablegeneration == complextype_base_vg)
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   366
          generate_c_base_c::visit(symbol);
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   367
        else if (wanted_variablegeneration == complextype_suffix_vg)
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   368
          return NULL;
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   369
        else
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   370
          print_getter(symbol);
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   371
      }
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   372
      return NULL;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   373
    }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   374
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   375
    /********************************************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   376
    /* B.1.4.1   Directly Represented Variables */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   377
    /********************************************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   378
    // direct_variable: direct_variable_token   {$$ = new direct_variable_c($1);};
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   379
    void *visit(direct_variable_c *symbol) {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   380
      TRACE("direct_variable_c");
388
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   381
      if (generating_inlinefunction) {
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   382
        /* Do not use print_token() as it will change everything into uppercase */
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   383
        if (strlen(symbol->value) == 0) ERROR;
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   384
        s4o.print(GET_LOCATED);
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   385
        s4o.print("(");
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   386
        this->print_variable_prefix();
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   387
        s4o.printlocation(symbol->value + 1);
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   388
        s4o.print(")");
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   389
      }
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   390
      return NULL;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   391
    }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   392
228
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   393
    /*************************************/
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   394
    /* B.1.4.2   Multi-element Variables */
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   395
    /*************************************/
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   396
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   397
    // SYM_REF2(structured_variable_c, record_variable, field_selector)
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   398
    void *visit(structured_variable_c *symbol) {
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   399
      TRACE("structured_variable_c");
388
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   400
      if (generating_inlinefunction) {
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   401
        switch (wanted_variablegeneration) {
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   402
          case complextype_base_vg:
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   403
            symbol->record_variable->accept(*this);
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   404
            break;
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   405
          case complextype_suffix_vg:
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   406
            symbol->record_variable->accept(*this);
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   407
            s4o.print(".");
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   408
            symbol->field_selector->accept(*this);
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   409
            break;
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   410
          default:
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   411
            print_getter(symbol);
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   412
            break;
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   413
        }
228
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   414
      }
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   415
      return NULL;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   416
    }
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   417
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   418
    /*  subscripted_variable '[' subscript_list ']' */
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   419
    //SYM_REF2(array_variable_c, subscripted_variable, subscript_list)
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   420
    void *visit(array_variable_c *symbol) {
388
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   421
      if (generating_inlinefunction) {
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   422
        switch (wanted_variablegeneration) {
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   423
          case complextype_base_vg:
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   424
            symbol->subscripted_variable->accept(*this);
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   425
            break;
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   426
          case complextype_suffix_vg:
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   427
            symbol->subscripted_variable->accept(*this);
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   428
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   429
            current_array_type = search_varfb_instance_type->get_type_id(symbol->subscripted_variable);
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   430
            if (current_array_type == NULL) ERROR;
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   431
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   432
            s4o.print(".table");
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   433
            symbol->subscript_list->accept(*this);
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   434
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   435
            current_array_type = NULL;
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   436
            break;
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   437
          default:
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   438
            print_getter(symbol);
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   439
            break;
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
   440
        }
228
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   441
      }
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   442
      return NULL;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   443
    }
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   444
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   445
    /****************************************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   446
    /* B.2 - Language IL (Instruction List) */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   447
    /****************************************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   448
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   449
    /***********************************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   450
    /* B 2.1 Instructions and Operands */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   451
    /***********************************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   452
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   453
    /* | label ':' [il_incomplete_instruction] eol_list */
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   454
    // SYM_REF2(il_instruction_c, label, il_instruction)
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   455
    void *visit(il_instruction_c *symbol) {
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   456
      if (NULL != symbol->il_instruction) {
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   457
        symbol->il_instruction->accept(*this);
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   458
      }
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   459
      return NULL;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   460
    }
392
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 388
diff changeset
   461
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   462
    /* | il_simple_operator [il_operand] */
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   463
    //SYM_REF2(il_simple_operation_c, il_simple_operator, il_operand)
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   464
    void *visit(il_simple_operation_c *symbol) {
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   465
      this->current_operand = symbol->il_operand;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   466
      if (NULL == this->current_operand) {
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   467
        this->current_operand_type = NULL;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   468
      } else {
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   469
        this->current_operand_type = search_expression_type->get_type(this->current_operand);
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   470
        if (NULL == this->current_operand_type) ERROR;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   471
      }
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   472
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   473
      symbol->il_simple_operator->accept(*this);
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   474
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   475
      this->current_operand = NULL;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   476
      this->current_operand_type = NULL;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   477
      return NULL;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   478
    }
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   479
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   480
    void *visit(il_function_call_c *symbol) {
235
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   481
      symbol_c* function_type_prefix = NULL;
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   482
      symbol_c* function_name = NULL;     
235
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   483
      symbol_c* function_type_suffix = NULL;
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   484
      DECLARE_PARAM_LIST()
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   485
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   486
      symbol_c *param_data_type = default_variable_name.current_type;
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   487
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   488
      function_call_param_iterator_c function_call_param_iterator(symbol);
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   489
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   490
      function_declaration_c *f_decl = (function_declaration_c *)symbol->called_function_declaration;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   491
      if (f_decl == NULL) ERROR;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   492
      
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   493
      /* determine the base data type returned by the function being called... */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   494
      search_base_type_c search_base_type;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   495
      function_type_prefix = (symbol_c *)f_decl->type_name->accept(search_base_type);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   496
      
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   497
      function_name = symbol->function_name;      
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   498
      
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   499
      /* loop through each function parameter, find the value we should pass
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   500
       * to it, and then output the c equivalent...
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   501
       */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   502
      
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   503
      function_param_iterator_c fp_iterator(f_decl);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   504
      identifier_c *param_name;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   505
        /* flag to remember whether we have already used the value stored in the default variable to pass to the first parameter */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   506
      bool used_defvar = false;       
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   507
        /* flag to cirreclty handle calls to extensible standard functions (i.e. functions with variable number of input parameters) */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   508
      bool found_first_extensible_parameter = false;  
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   509
      for(int i = 1; (param_name = fp_iterator.next()) != NULL; i++) {
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   510
        if (fp_iterator.is_extensible_param() && (!found_first_extensible_parameter)) {
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   511
          /* We are calling an extensible function. Before passing the extensible
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   512
           * parameters, we must add a dummy paramater value to tell the called
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   513
           * function how many extensible parameters we will be passing.
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   514
           *
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   515
           * Note that stage 3 has already determined the number of extensible
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   516
           * paramters, and stored that info in the abstract syntax tree. We simply
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   517
           * re-use that value.
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   518
           */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   519
          /* NOTE: we are not freeing the malloc'd memory. This is not really a bug.
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   520
           *       Since we are writing a compiler, which runs to termination quickly,
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   521
           *       we can consider this as just memory required for the compilation process
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   522
           *       that will be free'd when the program terminates.
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   523
           */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   524
          char *tmp = (char *)malloc(32); /* enough space for a call with 10^31 (larger than 2^64) input parameters! */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   525
          if (tmp == NULL) ERROR;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   526
          int res = snprintf(tmp, 32, "%d", symbol->extensible_param_count);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   527
          if ((res >= 32) || (res < 0)) ERROR;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   528
          identifier_c *param_value = new identifier_c(tmp);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   529
          uint_type_name_c *param_type  = new uint_type_name_c();
380
b78e59ed4269 Fix bug in generate_c_inlinefcall.cc that prevent to use extendible standard functions
laurent
parents: 355
diff changeset
   530
          identifier_c *param_name = new identifier_c(INLINE_PARAM_COUNT);
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   531
          ADD_PARAM_LIST(param_name, param_value, param_type, function_param_iterator_c::direction_in)
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   532
          found_first_extensible_parameter = true;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   533
        }
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   534
    
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   535
        symbol_c *param_type = fp_iterator.param_type();
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   536
        if (param_type == NULL) ERROR;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   537
      
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   538
        function_param_iterator_c::param_direction_t param_direction = fp_iterator.param_direction();
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   539
      
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   540
        symbol_c *param_value = NULL;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   541
      
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   542
        /* Get the value from a foo(<param_name> = <param_value>) style call */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   543
        /* NOTE: the following line of code is not required in this case, but it doesn't
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   544
         * harm to leave it in, as in the case of a non-formal syntax function call,
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   545
         * it will always return NULL.
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   546
         * We leave it in in case we later decide to merge this part of the code together
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   547
         * with the function calling code in generate_c_st_c, which does require
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   548
         * the following line...
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   549
         */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   550
        if (param_value == NULL)
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   551
          param_value = function_call_param_iterator.search_f(param_name);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   552
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   553
        /* if it is the first parameter in a non-formal function call (which is the
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   554
         * case being handled!), semantics specifies that we should
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   555
         * get the value off the IL default variable!
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   556
         *
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   557
         * However, if the parameter is an implicitly defined EN or ENO parameter, we should not
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   558
         * use the default variable as a source of data to pass to those parameters!
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   559
         */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   560
        if ((param_value == NULL) && (!used_defvar) && !fp_iterator.is_en_eno_param_implicit()) {
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   561
          param_value = &this->default_variable_name;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   562
          used_defvar = true;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   563
        }
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   564
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   565
        /* Get the value from a foo(<param_value>) style call */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   566
        if ((param_value == NULL) && !fp_iterator.is_en_eno_param_implicit()) {
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   567
          param_value = function_call_param_iterator.next_nf();
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   568
        }
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   569
        
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   570
        /* if no more parameter values in function call, and the current parameter
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   571
         * of the function declaration is an extensible parameter, we
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   572
         * have reached the end, and should simply jump out of the for loop.
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   573
         */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   574
        if ((param_value == NULL) && (fp_iterator.is_extensible_param())) {
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   575
          break;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   576
        }
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   577
      
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   578
        if ((param_value == NULL) && (param_direction == function_param_iterator_c::direction_in)) {
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   579
          /* No value given for parameter, so we must use the default... */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   580
          /* First check whether default value specified in function declaration...*/
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   581
          param_value = fp_iterator.default_value();
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   582
        }
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   583
      
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   584
        ADD_PARAM_LIST(param_name, param_value, param_type, fp_iterator.param_direction())
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   585
      } /* for(...) */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   586
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   587
      if (function_call_param_iterator.next_nf() != NULL) ERROR;
235
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   588
      if (NULL == function_type_prefix) ERROR;
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   589
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   590
      bool has_output_params = false;
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   591
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   592
      PARAM_LIST_ITERATOR() {
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   593
        if ((PARAM_DIRECTION == function_param_iterator_c::direction_out ||
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   594
             PARAM_DIRECTION == function_param_iterator_c::direction_inout) &&
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   595
             PARAM_VALUE != NULL) {
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   596
          has_output_params = true;
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   597
        }
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   598
      }
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   599
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   600
      /* Check whether we are calling an overloaded function! */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   601
      /* (fdecl_mutiplicity==2)  => calling overloaded function */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   602
      int fdecl_mutiplicity =  function_symtable.multiplicity(symbol->function_name);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   603
      if (fdecl_mutiplicity == 0) ERROR;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   604
      if (fdecl_mutiplicity == 1) 
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   605
        /* function being called is NOT overloaded! */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   606
        f_decl = NULL; 
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   607
235
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   608
      if (has_output_params)
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   609
        generate_inline(function_name, function_type_prefix, function_type_suffix, param_list, f_decl);
235
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   610
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   611
      CLEAR_PARAM_LIST()
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   612
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   613
      /* the data type resulting from this operation... */
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   614
      default_variable_name.current_type = function_type_prefix;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   615
      return NULL;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   616
    }
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   617
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   618
    /* | il_expr_operator '(' [il_operand] eol_list [simple_instr_list] ')' */
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   619
    //SYM_REF4(il_expression_c, il_expr_operator, il_operand, simple_instr_list, unused)
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   620
    void *visit(il_expression_c *symbol) {
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   621
      /* We will be recursevely interpreting an instruction list,
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   622
       * so we store a backup of the data type of the value currently stored
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   623
       * in the default variable, and set the current data type to NULL
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   624
       */
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   625
      symbol_c *old_current_default_variable_data_type = this->default_variable_name.current_type;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   626
      this->default_variable_name.current_type = NULL;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   627
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   628
     /* Pass the symbol->il_operand to the simple_instr_list visitor
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   629
      * using the il_default_variable_init_value parameter...
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   630
      * Note that the simple_instr_list_c visitor will set this parameter
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   631
      * to NULL as soon as it does not require it any longer,
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   632
      * so we don't do it here again after the
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   633
      *   symbol->simple_instr_list->accept(*this);
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   634
      * returns...
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   635
      */
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   636
      this->il_default_variable_init_value = symbol->il_operand;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   637
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   638
      /* Now do the parenthesised instructions... */
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   639
      /* NOTE: the following code line will get the variable
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   640
       * this->default_variable_name.current_type updated!
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   641
       */
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   642
      symbol->simple_instr_list->accept(*this);
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   643
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   644
      /* Now do the operation, using the previous result! */
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   645
      /* NOTE: The result of the previous instruction list will be stored
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   646
       * in a variable named IL_DEFVAR_BACK. This is done in the visitor
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   647
       * to instruction_list_c objects...
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   648
       */
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   649
      this->current_operand = &(this->default_variable_back_name);
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   650
      this->current_operand_type = this->default_variable_back_name.current_type;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   651
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   652
      this->default_variable_name.current_type = old_current_default_variable_data_type;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   653
      if (NULL == this->current_operand_type) ERROR;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   654
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   655
      symbol->il_expr_operator->accept(*this);
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   656
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   657
      this->current_operand = NULL;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   658
      this->current_operand_type = NULL;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   659
      this->default_variable_back_name.current_type = NULL;
235
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   660
      return NULL;
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   661
    }
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   662
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   663
    /* | function_name '(' eol_list [il_param_list] ')' */
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   664
    // SYM_REF2(il_formal_funct_call_c, function_name, il_param_list)
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   665
    void *visit(il_formal_funct_call_c *symbol) {
235
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   666
      symbol_c* function_type_prefix = NULL;
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   667
      symbol_c* function_name = NULL;
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   668
      symbol_c* function_type_suffix = NULL;
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   669
      DECLARE_PARAM_LIST()
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   670
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   671
      function_call_param_iterator_c function_call_param_iterator(symbol);
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   672
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   673
      function_declaration_c *f_decl = (function_declaration_c *)symbol->called_function_declaration;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   674
      if (f_decl == NULL) ERROR;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   675
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   676
      /* determine the base data type returned by the function being called... */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   677
      search_base_type_c search_base_type;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   678
      function_type_prefix = (symbol_c *)f_decl->type_name->accept(search_base_type);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   679
      if (NULL == function_type_prefix) ERROR;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   680
      
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   681
      function_name = symbol->function_name;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   682
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   683
      /* loop through each function parameter, find the value we should pass
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   684
       * to it, and then output the c equivalent...
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   685
       */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   686
      function_param_iterator_c fp_iterator(f_decl);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   687
      identifier_c *param_name;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   688
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   689
        /* flag to cirreclty handle calls to extensible standard functions (i.e. functions with variable number of input parameters) */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   690
      bool found_first_extensible_parameter = false;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   691
      for(int i = 1; (param_name = fp_iterator.next()) != NULL; i++) {
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   692
        if (fp_iterator.is_extensible_param() && (!found_first_extensible_parameter)) {
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   693
          /* We are calling an extensible function. Before passing the extensible
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   694
           * parameters, we must add a dummy paramater value to tell the called
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   695
           * function how many extensible parameters we will be passing.
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   696
           *
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   697
           * Note that stage 3 has already determined the number of extensible
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   698
           * paramters, and stored that info in the abstract syntax tree. We simply
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   699
           * re-use that value.
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   700
           */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   701
          /* NOTE: we are not freeing the malloc'd memory. This is not really a bug.
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   702
           *       Since we are writing a compiler, which runs to termination quickly,
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   703
           *       we can consider this as just memory required for the compilation process
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   704
           *       that will be free'd when the program terminates.
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   705
           */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   706
          char *tmp = (char *)malloc(32); /* enough space for a call with 10^31 (larger than 2^64) input parameters! */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   707
          if (tmp == NULL) ERROR;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   708
          int res = snprintf(tmp, 32, "%d", symbol->extensible_param_count);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   709
          if ((res >= 32) || (res < 0)) ERROR;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   710
          identifier_c *param_value = new identifier_c(tmp);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   711
          uint_type_name_c *param_type  = new uint_type_name_c();
380
b78e59ed4269 Fix bug in generate_c_inlinefcall.cc that prevent to use extendible standard functions
laurent
parents: 355
diff changeset
   712
          identifier_c *param_name = new identifier_c(INLINE_PARAM_COUNT);
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   713
          ADD_PARAM_LIST(param_name, param_value, param_type, function_param_iterator_c::direction_in)
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   714
          found_first_extensible_parameter = true;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   715
        }
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   716
        
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   717
        if (fp_iterator.is_extensible_param()) {      
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   718
          /* since we are handling an extensible parameter, we must add the index to the
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   719
           * parameter name so we can go looking for the value passed to the correct
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   720
           * extended parameter (e.g. IN1, IN2, IN3, IN4, ...)
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   721
           */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   722
          char *tmp = (char *)malloc(32); /* enough space for a call with 10^31 (larger than 2^64) input parameters! */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   723
          int res = snprintf(tmp, 32, "%d", fp_iterator.extensible_param_index());
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   724
          if ((res >= 32) || (res < 0)) ERROR;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   725
          param_name = new identifier_c(strdup2(param_name->value, tmp));
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   726
          if (param_name->value == NULL) ERROR;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   727
        }
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   728
    
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   729
        symbol_c *param_type = fp_iterator.param_type();
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   730
        if (param_type == NULL) ERROR;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   731
      
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   732
        function_param_iterator_c::param_direction_t param_direction = fp_iterator.param_direction();
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   733
      
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   734
        symbol_c *param_value = NULL;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   735
      
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   736
        /* Get the value from a foo(<param_name> = <param_value>) style call */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   737
        if (param_value == NULL)
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   738
          param_value = function_call_param_iterator.search_f(param_name);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   739
      
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   740
        /* Get the value from a foo(<param_value>) style call */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   741
        /* NOTE: the following line of code is not required in this case, but it doesn't
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   742
         * harm to leave it in, as in the case of a formal syntax function call,
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   743
         * it will always return NULL.
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   744
         * We leave it in in case we later decide to merge this part of the code together
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   745
         * with the function calling code in generate_c_st_c, which does require
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   746
         * the following line...
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   747
         */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   748
        if ((param_value == NULL) && !fp_iterator.is_en_eno_param_implicit()) {
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   749
          param_value = function_call_param_iterator.next_nf();
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   750
        }
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   751
        
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   752
        /* if no more parameter values in function call, and the current parameter
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   753
         * of the function declaration is an extensible parameter, we
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   754
         * have reached the end, and should simply jump out of the for loop.
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   755
         */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   756
        if ((param_value == NULL) && (fp_iterator.is_extensible_param())) {
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   757
          break;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   758
        }
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   759
    
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   760
        if ((param_value == NULL) && (param_direction == function_param_iterator_c::direction_in)) {
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   761
          /* No value given for parameter, so we must use the default... */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   762
          /* First check whether default value specified in function declaration...*/
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   763
          param_value = fp_iterator.default_value();
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   764
        }
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   765
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   766
        ADD_PARAM_LIST(param_name, param_value, param_type, fp_iterator.param_direction())
235
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   767
      }
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   768
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   769
      if (function_call_param_iterator.next_nf() != NULL) ERROR;
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   770
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   771
      bool has_output_params = false;
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   772
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   773
      PARAM_LIST_ITERATOR() {
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   774
        if ((PARAM_DIRECTION == function_param_iterator_c::direction_out ||
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   775
             PARAM_DIRECTION == function_param_iterator_c::direction_inout) &&
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   776
             PARAM_VALUE != NULL) {
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   777
          has_output_params = true;
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   778
        }
235
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   779
      }
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   780
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   781
      /* Check whether we are calling an overloaded function! */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   782
      /* (fdecl_mutiplicity==2)  => calling overloaded function */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   783
      int fdecl_mutiplicity =  function_symtable.multiplicity(symbol->function_name);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   784
      if (fdecl_mutiplicity == 0) ERROR;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   785
      if (fdecl_mutiplicity == 1) 
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   786
        /* function being called is NOT overloaded! */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   787
        f_decl = NULL; 
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   788
235
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   789
      if (has_output_params)
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
   790
        generate_inline(function_name, function_type_prefix, function_type_suffix, param_list, f_decl);
235
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   791
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   792
      CLEAR_PARAM_LIST()
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
   793
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   794
      /* the data type resulting from this operation... */
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   795
      default_variable_name.current_type = function_type_prefix;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   796
      return NULL;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   797
    }
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   798
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   799
    /* | simple_instr_list il_simple_instruction */
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   800
    // SYM_LIST(simple_instr_list_c)
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   801
    void *visit(simple_instr_list_c *symbol) {
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   802
      /* Check whether we should initiliase the il default variable... */
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   803
      if (NULL != this->il_default_variable_init_value) {
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   804
        /* Yes, we must... */
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   805
        /* We will do it by instatiating a LD operator, and having this
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   806
         * same generate_c_il_c class visiting it!
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   807
         */
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   808
        LD_operator_c ld_oper;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   809
        il_simple_operation_c il_simple_oper(&ld_oper, this->il_default_variable_init_value);
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   810
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   811
        il_simple_oper.accept(*this);
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   812
      }
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   813
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   814
      /* this parameter no longer required... */
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   815
      this->il_default_variable_init_value = NULL;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   816
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   817
      iterator_visitor_c::visit(symbol);
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   818
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   819
      /* copy the result in the default variable to the variable
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   820
	   * used to pass the data out to the scope enclosing
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   821
	   * the current scope!
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   822
	   *
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   823
	   * We also need to update the data type currently stored within
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   824
	   * the variable used to pass the data to the outside scope...
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   825
	   */
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   826
	  this->default_variable_back_name.current_type = this->default_variable_name.current_type;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   827
	  return NULL;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   828
    }
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   829
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   830
    void *visit(LD_operator_c *symbol)	{
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   831
      /* the data type resulting from this operation... */
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   832
      this->default_variable_name.current_type = this->current_operand_type;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   833
      return NULL;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   834
    }
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   835
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   836
    void *visit(LDN_operator_c *symbol)	{
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   837
      /* the data type resulting from this operation... */
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   838
      this->default_variable_name.current_type = this->current_operand_type;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   839
      return NULL;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   840
    }
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   841
346
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   842
    void *visit(AND_operator_c *symbol)	{
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   843
      if (search_expression_type->is_binary_type(this->default_variable_name.current_type) &&
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   844
          search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) {
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   845
    	BYTE_operator_result_type();
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   846
      }
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   847
      else {ERROR;}
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   848
      return NULL;
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   849
    }
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   850
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   851
    void *visit(OR_operator_c *symbol)	{
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   852
      if (search_expression_type->is_binary_type(this->default_variable_name.current_type) &&
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   853
          search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) {
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   854
    	BYTE_operator_result_type();
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   855
      }
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   856
      else {ERROR;}
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   857
      return NULL;
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   858
    }
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   859
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   860
    void *visit(XOR_operator_c *symbol)	{
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   861
      if (search_expression_type->is_binary_type(this->default_variable_name.current_type) &&
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   862
          search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) {
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   863
    	BYTE_operator_result_type();
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   864
      }
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   865
      else {ERROR;}
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   866
      return NULL;
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   867
    }
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   868
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   869
    void *visit(ANDN_operator_c *symbol)	{
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   870
      if (search_expression_type->is_binary_type(this->default_variable_name.current_type) &&
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   871
          search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) {
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   872
    	BYTE_operator_result_type();
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   873
      }
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   874
      else {ERROR;}
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   875
      return NULL;
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   876
    }
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   877
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   878
    void *visit(ORN_operator_c *symbol)	{
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   879
      if (search_expression_type->is_binary_type(this->default_variable_name.current_type) &&
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   880
          search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) {
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   881
    	BYTE_operator_result_type();
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   882
      }
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   883
      else {ERROR;}
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   884
      return NULL;
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   885
    }
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   886
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   887
    void *visit(XORN_operator_c *symbol)	{
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   888
      if (search_expression_type->is_binary_type(this->default_variable_name.current_type) &&
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   889
          search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) {
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   890
    	BYTE_operator_result_type();
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   891
      }
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   892
      else {ERROR;}
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   893
      return NULL;
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   894
    }
620fd98a021d Adding BYTE operators visit functions in inlinefcall
laurent
parents: 345
diff changeset
   895
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   896
    void *visit(ADD_operator_c *symbol)	{
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   897
      if (search_expression_type->is_time_type(this->default_variable_name.current_type) &&
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   898
          search_expression_type->is_time_type(this->current_operand_type)) {
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   899
        /* the data type resulting from this operation... */
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   900
        this->default_variable_name.current_type = this->current_operand_type;
345
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   901
      }
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   902
      else if (search_expression_type->is_num_type(this->default_variable_name.current_type) &&
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   903
          search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) {
345
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   904
        NUM_operator_result_type();
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   905
      }
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   906
      else {ERROR;}
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   907
      return NULL;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   908
    }
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   909
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   910
    void *visit(SUB_operator_c *symbol)	{
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   911
      if (search_expression_type->is_time_type(this->default_variable_name.current_type) &&
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   912
          search_expression_type->is_time_type(this->current_operand_type)) {
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   913
        /* the data type resulting from this operation... */
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   914
        this->default_variable_name.current_type = this->current_operand_type;
345
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   915
      }
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   916
      else if (search_expression_type->is_num_type(this->default_variable_name.current_type) &&
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   917
          search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) {
345
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   918
    	NUM_operator_result_type();
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   919
      }
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   920
      else {ERROR;}
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   921
      return NULL;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   922
    }
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   923
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   924
    void *visit(MUL_operator_c *symbol)	{
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   925
      if (search_expression_type->is_time_type(this->default_variable_name.current_type) &&
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   926
          search_expression_type->is_integer_type(this->current_operand_type)) {
345
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   927
        /* the data type resulting from this operation is unchanged! */
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   928
      }
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   929
      else if (search_expression_type->is_num_type(this->default_variable_name.current_type) &&
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   930
          search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) {
345
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   931
    	NUM_operator_result_type();
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   932
      }
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   933
      else {ERROR;}
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   934
      return NULL;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   935
    }
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   936
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   937
    void *visit(DIV_operator_c *symbol)	{
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   938
      if (search_expression_type->is_time_type(this->default_variable_name.current_type) &&
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   939
          search_expression_type->is_integer_type(this->current_operand_type)) {
345
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   940
        /* the data type resulting from this operation is unchanged! */
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   941
      }
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   942
      else if (search_expression_type->is_num_type(this->default_variable_name.current_type) &&
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   943
          search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) {
345
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   944
        NUM_operator_result_type();
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   945
      }
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   946
      else {ERROR;}
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   947
      return NULL;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   948
    }
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   949
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   950
    void *visit(MOD_operator_c *symbol)	{
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   951
      if (search_expression_type->is_num_type(this->default_variable_name.current_type) &&
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   952
          search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) {
345
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   953
        NUM_operator_result_type();
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   954
      }
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   955
      else {ERROR;}
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   956
      return NULL;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   957
    }
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   958
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   959
    void *visit(GT_operator_c *symbol)	{
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   960
      if (!search_base_type.type_is_enumerated(this->default_variable_name.current_type) &&
345
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   961
          search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) {
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   962
        CMP_operator_result_type();
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   963
      }
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   964
      else {ERROR;}
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   965
      return NULL;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   966
    }
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   967
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   968
    void *visit(GE_operator_c *symbol)	{
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   969
      if (!search_base_type.type_is_enumerated(this->default_variable_name.current_type) &&
345
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   970
          search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) {
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   971
        CMP_operator_result_type();
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   972
      }
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   973
      else {ERROR;}
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   974
      return NULL;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   975
    }
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   976
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   977
    void *visit(EQ_operator_c *symbol)	{
345
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   978
      if (search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) {
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   979
        CMP_operator_result_type();
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   980
      }
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   981
      else {ERROR;}
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   982
      return NULL;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   983
    }
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   984
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   985
    void *visit(LT_operator_c *symbol)	{
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   986
      if (!search_base_type.type_is_enumerated(this->default_variable_name.current_type) &&
345
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   987
          search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) {
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   988
        CMP_operator_result_type();
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   989
      }
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   990
      else {ERROR;}
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   991
      return NULL;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   992
    }
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   993
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   994
    void *visit(LE_operator_c *symbol)	{
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
   995
      if (!search_base_type.type_is_enumerated(this->default_variable_name.current_type) &&
345
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   996
          search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) {
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   997
        CMP_operator_result_type();
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   998
      }
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
   999
      else {ERROR;}
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
  1000
      return NULL;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
  1001
    }
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
  1002
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
  1003
    void *visit(NE_operator_c *symbol)	{
345
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
  1004
      if (search_expression_type->is_same_type(this->default_variable_name.current_type, this->current_operand_type)) {
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
  1005
        CMP_operator_result_type();
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
  1006
      }
894c0e6d951c Fix bug with DIV and MOD operator in IL code generator
laurent
parents: 337
diff changeset
  1007
      else {ERROR;}
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
  1008
      return NULL;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
  1009
    }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
  1010
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
  1011
    /***************************************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
  1012
    /* B.3 - Language ST (Structured Text) */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
  1013
    /***************************************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
  1014
    /***********************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
  1015
    /* B 3.1 - Expressions */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
  1016
    /***********************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
  1017
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
  1018
    void *visit(statement_list_c *symbol) {
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
  1019
	  function_call_iterator_c fc_iterator(symbol);
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
  1020
	  symbol_c* function_call;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
  1021
	  while ((function_call = fc_iterator.next()) != NULL) {
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
  1022
		function_call->accept(*this);
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
  1023
	  }
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
  1024
	  return NULL;
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
  1025
	}
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
  1026
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
  1027
    void *visit(function_invocation_c *symbol) {
235
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
  1028
      symbol_c* function_type_prefix = NULL;
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
  1029
      symbol_c* function_name = NULL;
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
  1030
      symbol_c* function_type_suffix = NULL;
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
  1031
      DECLARE_PARAM_LIST()
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
  1032
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
  1033
      symbol_c *parameter_assignment_list = NULL;
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
  1034
      if (NULL != symbol->   formal_param_list) parameter_assignment_list = symbol->   formal_param_list;
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
  1035
      if (NULL != symbol->nonformal_param_list) parameter_assignment_list = symbol->nonformal_param_list;
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
  1036
      if (NULL == parameter_assignment_list) ERROR;
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
  1037
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
  1038
      function_call_param_iterator_c function_call_param_iterator(symbol);
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
  1039
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1040
      function_declaration_c *f_decl = (function_declaration_c *)symbol->called_function_declaration;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1041
      if (f_decl == NULL) ERROR;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1042
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1043
      function_name = symbol->function_name;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1044
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1045
      /* determine the base data type returned by the function being called... */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1046
      search_base_type_c search_base_type;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1047
      function_type_prefix = (symbol_c *)f_decl->type_name->accept(search_base_type);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1048
      if (NULL == function_type_prefix) ERROR;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1049
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1050
      /* loop through each function parameter, find the value we should pass
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1051
       * to it, and then output the c equivalent...
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1052
       */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1053
      function_param_iterator_c fp_iterator(f_decl);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1054
      identifier_c *param_name;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1055
        /* flag to cirreclty handle calls to extensible standard functions (i.e. functions with variable number of input parameters) */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1056
      bool found_first_extensible_parameter = false;  
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1057
      for(int i = 1; (param_name = fp_iterator.next()) != NULL; i++) {
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1058
        if (fp_iterator.is_extensible_param() && (!found_first_extensible_parameter)) {
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1059
          /* We are calling an extensible function. Before passing the extensible
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1060
           * parameters, we must add a dummy paramater value to tell the called
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1061
           * function how many extensible parameters we will be passing.
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1062
           *
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1063
           * Note that stage 3 has already determined the number of extensible
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1064
           * paramters, and stored that info in the abstract syntax tree. We simply
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1065
           * re-use that value.
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1066
           */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1067
          /* NOTE: we are not freeing the malloc'd memory. This is not really a bug.
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1068
           *       Since we are writing a compiler, which runs to termination quickly,
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1069
           *       we can consider this as just memory required for the compilation process
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1070
           *       that will be free'd when the program terminates.
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1071
           */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1072
          char *tmp = (char *)malloc(32); /* enough space for a call with 10^31 (larger than 2^64) input parameters! */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1073
          if (tmp == NULL) ERROR;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1074
          int res = snprintf(tmp, 32, "%d", symbol->extensible_param_count);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1075
          if ((res >= 32) || (res < 0)) ERROR;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1076
          identifier_c *param_value = new identifier_c(tmp);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1077
          uint_type_name_c *param_type  = new uint_type_name_c();
380
b78e59ed4269 Fix bug in generate_c_inlinefcall.cc that prevent to use extendible standard functions
laurent
parents: 355
diff changeset
  1078
          identifier_c *param_name = new identifier_c(INLINE_PARAM_COUNT);
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1079
          ADD_PARAM_LIST(param_name, param_value, param_type, function_param_iterator_c::direction_in)
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1080
          found_first_extensible_parameter = true;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1081
        }
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1082
    
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1083
        if (fp_iterator.is_extensible_param()) {      
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1084
          /* since we are handling an extensible parameter, we must add the index to the
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1085
           * parameter name so we can go looking for the value passed to the correct
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1086
           * extended parameter (e.g. IN1, IN2, IN3, IN4, ...)
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1087
           */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1088
          char *tmp = (char *)malloc(32); /* enough space for a call with 10^31 (larger than 2^64) input parameters! */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1089
          int res = snprintf(tmp, 32, "%d", fp_iterator.extensible_param_index());
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1090
          if ((res >= 32) || (res < 0)) ERROR;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1091
          param_name = new identifier_c(strdup2(param_name->value, tmp));
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1092
          if (param_name->value == NULL) ERROR;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1093
        }
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1094
        
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1095
        symbol_c *param_type = fp_iterator.param_type();
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1096
        if (param_type == NULL) ERROR;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1097
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1098
        function_param_iterator_c::param_direction_t param_direction = fp_iterator.param_direction();
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1099
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1100
        symbol_c *param_value = NULL;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1101
    
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1102
        /* Get the value from a foo(<param_name> = <param_value>) style call */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1103
        if (param_value == NULL)
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1104
          param_value = function_call_param_iterator.search_f(param_name);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1105
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1106
        /* Get the value from a foo(<param_value>) style call */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1107
        if ((param_value == NULL) && !fp_iterator.is_en_eno_param_implicit()) {
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1108
          param_value = function_call_param_iterator.next_nf();
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1109
        }
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1110
        
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1111
        /* if no more parameter values in function call, and the current parameter
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1112
         * of the function declaration is an extensible parameter, we
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1113
         * have reached the end, and should simply jump out of the for loop.
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
  1114
         */
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1115
        if ((param_value == NULL) && (fp_iterator.is_extensible_param())) {
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1116
          break;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1117
        }
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1118
    
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1119
        if ((param_value == NULL) && (param_direction == function_param_iterator_c::direction_in)) {
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1120
          /* No value given for parameter, so we must use the default... */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1121
          /* First check whether default value specified in function declaration...*/
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1122
          param_value = fp_iterator.default_value();
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1123
        }
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1124
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1125
        ADD_PARAM_LIST(param_name, param_value, param_type, param_direction)
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1126
      } /* for(...) */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1127
      // symbol->parameter_assignment->accept(*this);
235
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
  1128
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
  1129
      if (function_call_param_iterator.next_nf() != NULL) ERROR;
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1130
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1131
      bool has_output_params = false;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1132
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1133
      PARAM_LIST_ITERATOR() {
235
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
  1134
        if ((PARAM_DIRECTION == function_param_iterator_c::direction_out ||
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
  1135
             PARAM_DIRECTION == function_param_iterator_c::direction_inout) &&
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
  1136
             PARAM_VALUE != NULL) {
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
  1137
          has_output_params = true;
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
  1138
        }
235
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
  1139
      }
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
  1140
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1141
      /* Check whether we are calling an overloaded function! */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1142
      /* (fdecl_mutiplicity==2)  => calling overloaded function */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1143
      int fdecl_mutiplicity =  function_symtable.multiplicity(symbol->function_name);
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1144
      if (fdecl_mutiplicity == 0) ERROR;
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1145
      if (fdecl_mutiplicity == 1) 
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1146
        /* function being called is NOT overloaded! */
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1147
        f_decl = NULL; 
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1148
235
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
  1149
      if (has_output_params)
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 336
diff changeset
  1150
        generate_inline(function_name, function_type_prefix, function_type_suffix, param_list, f_decl);
235
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
  1151
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
  1152
      CLEAR_PARAM_LIST()
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 234
diff changeset
  1153
337
9a2262fb7994 Fix bug with inline function call in POU programmed in IL
laurent
parents: 336
diff changeset
  1154
      return NULL;
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
  1155
    }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
  1156
388
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1157
	/*********************************************/
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1158
	/* B.1.6  Sequential function chart elements */
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1159
	/*********************************************/
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1160
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1161
	void *visit(initial_step_c *symbol) {
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1162
		return NULL;
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1163
	}
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1164
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1165
	void *visit(step_c *symbol) {
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1166
		return NULL;
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1167
	}
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1168
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1169
	void *visit(transition_c *symbol) {
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1170
		return symbol->transition_condition->accept(*this);
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1171
	}
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1172
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1173
	void *visit(transition_condition_c *symbol) {
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1174
		// Transition condition is in IL
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1175
		if (symbol->transition_condition_il != NULL) {
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1176
			symbol->transition_condition_il->accept(*this);
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1177
		}
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1178
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1179
		// Transition condition is in ST
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1180
		if (symbol->transition_condition_st != NULL) {
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1181
			symbol->transition_condition_st->accept(*this);
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1182
		}
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1183
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1184
		return NULL;
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1185
	}
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1186
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1187
	void *visit(action_c *symbol) {
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1188
		return symbol->function_block_body->accept(*this);
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1189
	}
17eaad42ba88 Fix bug in generate_c_inlinefcall. Was not handling textual SFC elements
laurent
parents: 383
diff changeset
  1190
234
e4d31cd0e6d8 Using function_call_iterator in generate_c_inlinefcall instead of creating a new visitor
laurent
parents: 233
diff changeset
  1191
};  /* generate_c_inlinefcall_c */
e4d31cd0e6d8 Using function_call_iterator in generate_c_inlinefcall instead of creating a new visitor
laurent
parents: 233
diff changeset
  1192