stage4/generate_c/generate_c_inlinefcall.cc
changeset 234 e4d31cd0e6d8
parent 233 3d23a68183d3
child 235 ed66dc50f31a
equal deleted inserted replaced
233:3d23a68183d3 234:e4d31cd0e6d8
    30  */
    30  */
    31 
    31 
    32 
    32 
    33 #define INLINE_RESULT_TEMP_VAR "__res"
    33 #define INLINE_RESULT_TEMP_VAR "__res"
    34 
    34 
    35 class generate_c_inline_c: public generate_c_typedecl_c {
    35 class generate_c_inlinefcall_c: public generate_c_typedecl_c {
    36 
    36 
    37   public:
    37   public:
    38     typedef enum {
    38     typedef enum {
    39       expression_vg,
    39       expression_vg,
    40       assignment_vg,
    40       assignment_vg,
    64     search_base_type_c search_base_type;
    64     search_base_type_c search_base_type;
    65 
    65 
    66     variablegeneration_t wanted_variablegeneration;
    66     variablegeneration_t wanted_variablegeneration;
    67 
    67 
    68   public:
    68   public:
    69     generate_c_inline_c(stage4out_c *s4o_ptr, symbol_c *name, symbol_c *scope, const char *variable_prefix = NULL)
    69     generate_c_inlinefcall_c(stage4out_c *s4o_ptr, symbol_c *name, symbol_c *scope, const char *variable_prefix = NULL)
    70     : generate_c_typedecl_c(s4o_ptr),
    70     : generate_c_typedecl_c(s4o_ptr),
    71       default_variable_name(IL_DEFVAR, NULL)
    71       default_variable_name(IL_DEFVAR, NULL)
    72     {
    72     {
    73       search_expression_type = new search_expression_type_c(scope);
    73       search_expression_type = new search_expression_type_c(scope);
    74       search_varfb_instance_type = new search_varfb_instance_type_c(scope);
    74       search_varfb_instance_type = new search_varfb_instance_type_c(scope);
    76       fcall_number = 0;
    76       fcall_number = 0;
    77       fbname = name;
    77       fbname = name;
    78       wanted_variablegeneration = expression_vg;
    78       wanted_variablegeneration = expression_vg;
    79     }
    79     }
    80 
    80 
    81     virtual ~generate_c_inline_c(void) {
    81     virtual ~generate_c_inlinefcall_c(void) {
       
    82       delete search_expression_type;
    82       delete search_varfb_instance_type;
    83       delete search_varfb_instance_type;
    83     }
    84     }
    84 
    85 
    85     void *generate_inline(symbol_c *function_name,
    86     void print(symbol_c* symbol) {
    86     		symbol_c *return_data_type,
    87       function_call_iterator_c fc_iterator(symbol);
    87     		std::list<FUNCTION_PARAM*> param_list) {
    88       symbol_c* function_call;
    88       std::list<FUNCTION_PARAM*>::iterator pt;
    89       while ((function_call = fc_iterator.next()) != NULL) {
       
    90     	function_call->accept(*this);
       
    91       }
       
    92     }
       
    93 
       
    94     void generate_inline(symbol_c *function_name,
       
    95             symbol_c *return_data_type,
       
    96             std::list<FUNCTION_PARAM*> param_list) {
       
    97             std::list<FUNCTION_PARAM*>::iterator pt;
    89 
    98 
    90       fcall_number++;
    99       fcall_number++;
    91 
   100 
    92       s4o.print(s4o.indent_spaces);
   101       s4o.print(s4o.indent_spaces);
    93       s4o.print("inline ");
   102       s4o.print("inline ");
   174 	  s4o.print(INLINE_RESULT_TEMP_VAR);
   183 	  s4o.print(INLINE_RESULT_TEMP_VAR);
   175 	  s4o.print(";\n");
   184 	  s4o.print(";\n");
   176 
   185 
   177       s4o.indent_left();
   186       s4o.indent_left();
   178       s4o.print(s4o.indent_spaces + "}\n\n");
   187       s4o.print(s4o.indent_spaces + "}\n\n");
   179 
       
   180       return NULL;
       
   181     }
   188     }
   182 
   189 
   183   private:
   190   private:
   184 
   191 
   185     void *print_getter(symbol_c *symbol) {
   192     void *print_getter(symbol_c *symbol) {
   579         CLEAR_PARAM_LIST()
   586         CLEAR_PARAM_LIST()
   580       }
   587       }
   581 	  return NULL;
   588 	  return NULL;
   582     }
   589     }
   583 
   590 
   584 };  /* generate_c_inline_c */
   591 };  /* generate_c_inlinefcall_c */
   585 
   592 
   586 
   593 
   587 /***********************************************************************/
       
   588 /***********************************************************************/
       
   589 /***********************************************************************/
       
   590 /***********************************************************************/
       
   591 
       
   592 
       
   593 class generate_c_inlinefcall_c: public iterator_visitor_c {
       
   594 
       
   595   private:
       
   596 	generate_c_inline_c *generate_c_inline;
       
   597 
       
   598   public:
       
   599 	generate_c_inlinefcall_c(stage4out_c *s4o_ptr, symbol_c *name, symbol_c *scope, const char *variable_prefix = NULL) {
       
   600 	  generate_c_inline = new generate_c_inline_c(s4o_ptr, name, scope, variable_prefix);
       
   601 	}
       
   602 
       
   603 	virtual ~generate_c_inlinefcall_c(void) {
       
   604 	  delete generate_c_inline;
       
   605 	}
       
   606 
       
   607   private:
       
   608 
       
   609 	void *visit(function_invocation_c *symbol) {
       
   610 	  return symbol->accept(*generate_c_inline);
       
   611 	}
       
   612 
       
   613 	void *visit(il_function_call_c *symbol) {
       
   614 	  return symbol->accept(*generate_c_inline);
       
   615 	}
       
   616 
       
   617 	void *visit(il_formal_funct_call_c *symbol) {
       
   618 	  return symbol->accept(*generate_c_inline);
       
   619 	}
       
   620 }; /* generate_c_inlinefcall_c */
       
   621 
       
   622 
       
   623