stage3/fill_candidate_datatypes.cc
changeset 607 be9ba3531afb
parent 605 06caf4782e51
child 609 9ab033d2bb55
equal deleted inserted replaced
606:d2122a32ec86 607:be9ba3531afb
    63 #include <string>
    63 #include <string>
    64 #include <string.h>
    64 #include <string.h>
    65 #include <strings.h>
    65 #include <strings.h>
    66 
    66 
    67 #define GET_CVALUE(dtype, symbol)             ((symbol)->const_value_##dtype->value)
    67 #define GET_CVALUE(dtype, symbol)             ((symbol)->const_value_##dtype->value)
    68 #define IS_UNDEF(dtype, symbol)               (NULL == (symbol)->const_value_##dtype)
       
    69 #define VALID_CVALUE(dtype, symbol)           ((NULL != (symbol)->const_value_##dtype) && (symbol_c::cs_const_value == (symbol)->const_value_##dtype->status))
    68 #define VALID_CVALUE(dtype, symbol)           ((NULL != (symbol)->const_value_##dtype) && (symbol_c::cs_const_value == (symbol)->const_value_##dtype->status))
    70 #define IS_OVERFLOW(dtype, symbol)            (symbol_c::cs_overflow == (symbol)->const_value_##dtype->status)
    69 #define IS_OVERFLOW(dtype, symbol)            ((NULL != (symbol)->const_value_##dtype) && (symbol_c::cs_overflow == (symbol)->const_value_##dtype->status))
    71 
    70 
    72 /* set to 1 to see debug info during execution */
    71 /* set to 1 to see debug info during execution */
    73 static int debug = 0;
    72 static int debug = 0;
    74 
    73 
    75 fill_candidate_datatypes_c::fill_candidate_datatypes_c(symbol_c *ignore) {
    74 fill_candidate_datatypes_c::fill_candidate_datatypes_c(symbol_c *ignore) {
   111   add_datatype_to_candidate_list(symbol, datatype1);
   110   add_datatype_to_candidate_list(symbol, datatype1);
   112   add_datatype_to_candidate_list(symbol, datatype2);
   111   add_datatype_to_candidate_list(symbol, datatype2);
   113   return true;
   112   return true;
   114 }
   113 }
   115 
   114 
       
   115 
       
   116 
   116 void fill_candidate_datatypes_c::remove_incompatible_datatypes(symbol_c *symbol) {
   117 void fill_candidate_datatypes_c::remove_incompatible_datatypes(symbol_c *symbol) {
   117   /* Remove unsigned data types */
   118   #ifdef __REMOVE__
   118   if (! IS_UNDEF( uint64, symbol)) {
   119     #error __REMOVE__ macro already exists. Choose another name!
   119     if (VALID_CVALUE( uint64, symbol)) {
   120   #endif
   120       uint64_t value = GET_CVALUE(uint64, symbol);
   121   #define __REMOVE__(datatype)\
   121       if (value > 1) {
   122       remove_from_candidate_datatype_list(&search_constant_type_c::datatype,       symbol->candidate_datatypes);\
   122     	  remove_from_candidate_datatype_list(&search_constant_type_c::bool_type_name,       symbol->candidate_datatypes);
   123       remove_from_candidate_datatype_list(&search_constant_type_c::safe##datatype, symbol->candidate_datatypes);
   123     	  remove_from_candidate_datatype_list(&search_constant_type_c::safebool_type_name,   symbol->candidate_datatypes);
   124   
   124       }
   125   {/* Remove unsigned data types */
   125       if (value > UINT8_MAX  ) {
   126     uint64_t value = 0;
   126     	  remove_from_candidate_datatype_list(&search_constant_type_c::usint_type_name,      symbol->candidate_datatypes);
   127     if (VALID_CVALUE( uint64, symbol)) value = GET_CVALUE(uint64, symbol);
   127     	  remove_from_candidate_datatype_list(&search_constant_type_c::safeusint_type_name,  symbol->candidate_datatypes);
   128     if (IS_OVERFLOW ( uint64, symbol)) value = (uint64_t)UINT32_MAX + (uint64_t)1;
   128 	      remove_from_candidate_datatype_list(&search_constant_type_c::byte_type_name,       symbol->candidate_datatypes);
   129     
   129 	      remove_from_candidate_datatype_list(&search_constant_type_c::safebyte_type_name,   symbol->candidate_datatypes);
   130     if (value > 1          )          {__REMOVE__(bool_type_name);}
   130       }
   131     if (value > UINT8_MAX  )          {__REMOVE__(usint_type_name);  __REMOVE__( byte_type_name);}
   131       if (value > UINT16_MAX ) {
   132     if (value > UINT16_MAX )          {__REMOVE__( uint_type_name);  __REMOVE__( word_type_name);}
   132     	  remove_from_candidate_datatype_list(&search_constant_type_c::uint_type_name,       symbol->candidate_datatypes);
   133     if (value > UINT32_MAX )          {__REMOVE__(udint_type_name);  __REMOVE__(dword_type_name);}
   133     	  remove_from_candidate_datatype_list(&search_constant_type_c::safeuint_type_name,   symbol->candidate_datatypes);
   134     if (IS_OVERFLOW( uint64, symbol)) {__REMOVE__(ulint_type_name);  __REMOVE__(lword_type_name);}
   134           remove_from_candidate_datatype_list(&search_constant_type_c::word_type_name,       symbol->candidate_datatypes);
       
   135           remove_from_candidate_datatype_list(&search_constant_type_c::safeword_type_name,   symbol->candidate_datatypes);
       
   136       }
       
   137       if (value > UINT32_MAX ) {
       
   138     	  remove_from_candidate_datatype_list(&search_constant_type_c::udint_type_name,      symbol->candidate_datatypes);
       
   139     	  remove_from_candidate_datatype_list(&search_constant_type_c::safeudint_type_name,  symbol->candidate_datatypes);
       
   140           remove_from_candidate_datatype_list(&search_constant_type_c::dword_type_name,      symbol->candidate_datatypes);
       
   141           remove_from_candidate_datatype_list(&search_constant_type_c::safedword_type_name,  symbol->candidate_datatypes);
       
   142       }
       
   143     }
       
   144     if (IS_OVERFLOW( uint64, symbol)) {
       
   145 	remove_from_candidate_datatype_list(&search_constant_type_c::bool_type_name,       symbol->candidate_datatypes);
       
   146 	remove_from_candidate_datatype_list(&search_constant_type_c::safebool_type_name,   symbol->candidate_datatypes);
       
   147 	remove_from_candidate_datatype_list(&search_constant_type_c::usint_type_name,      symbol->candidate_datatypes);
       
   148 	remove_from_candidate_datatype_list(&search_constant_type_c::safeusint_type_name,  symbol->candidate_datatypes);
       
   149 	remove_from_candidate_datatype_list(&search_constant_type_c::byte_type_name,       symbol->candidate_datatypes);
       
   150 	remove_from_candidate_datatype_list(&search_constant_type_c::safebyte_type_name,   symbol->candidate_datatypes);
       
   151 	remove_from_candidate_datatype_list(&search_constant_type_c::uint_type_name,       symbol->candidate_datatypes);
       
   152 	remove_from_candidate_datatype_list(&search_constant_type_c::safeuint_type_name,   symbol->candidate_datatypes);
       
   153 	remove_from_candidate_datatype_list(&search_constant_type_c::word_type_name,       symbol->candidate_datatypes);
       
   154 	remove_from_candidate_datatype_list(&search_constant_type_c::safeword_type_name,   symbol->candidate_datatypes);
       
   155 	remove_from_candidate_datatype_list(&search_constant_type_c::udint_type_name,      symbol->candidate_datatypes);
       
   156 	remove_from_candidate_datatype_list(&search_constant_type_c::safeudint_type_name,  symbol->candidate_datatypes);
       
   157 	remove_from_candidate_datatype_list(&search_constant_type_c::dword_type_name,      symbol->candidate_datatypes);
       
   158 	remove_from_candidate_datatype_list(&search_constant_type_c::safedword_type_name,  symbol->candidate_datatypes);
       
   159 	remove_from_candidate_datatype_list(&search_constant_type_c::ulint_type_name,      symbol->candidate_datatypes);
       
   160 	remove_from_candidate_datatype_list(&search_constant_type_c::safeulint_type_name,  symbol->candidate_datatypes);
       
   161 	remove_from_candidate_datatype_list(&search_constant_type_c::lword_type_name,      symbol->candidate_datatypes);
       
   162 	remove_from_candidate_datatype_list(&search_constant_type_c::safelword_type_name,  symbol->candidate_datatypes);
       
   163     }
       
   164   }
   135   }
   165   /* Remove signed data types */
   136 
   166   if (! IS_UNDEF( int64, symbol)) {
   137   {/* Remove signed data types */
   167  	if (VALID_CVALUE( int64, symbol)) {
   138     int64_t value = 0;
   168       int64_t value = GET_CVALUE(int64, symbol);
   139     if (VALID_CVALUE(  int64, symbol)) value = GET_CVALUE(int64, symbol);
   169       if (value < 0 || value > 1) {
   140     if (IS_OVERFLOW (  int64, symbol)) value = (int64_t)INT32_MAX + (int64_t)1;
   170     	  remove_from_candidate_datatype_list(&search_constant_type_c::bool_type_name,       symbol->candidate_datatypes);
   141     
   171     	  remove_from_candidate_datatype_list(&search_constant_type_c::safebool_type_name,   symbol->candidate_datatypes);
   142     if ((value < 0) || (value > 1))                 {__REMOVE__( bool_type_name);}
   172       }
   143     if ((value <  INT8_MIN) || (value >  INT8_MAX)) {__REMOVE__(sint_type_name);  __REMOVE__( byte_type_name);}
   173  	  if  ((value < INT8_MIN  ) || (value > INT8_MAX )) {
   144     if ((value < INT16_MIN) || (value > INT16_MAX)) {__REMOVE__( int_type_name);  __REMOVE__( word_type_name);}
   174  	      remove_from_candidate_datatype_list(&search_constant_type_c::sint_type_name,       symbol->candidate_datatypes);
   145     if ((value < INT32_MIN) || (value > INT32_MAX)) {__REMOVE__(dint_type_name);  __REMOVE__(dword_type_name);}
   175  	      remove_from_candidate_datatype_list(&search_constant_type_c::safesint_type_name,   symbol->candidate_datatypes);
   146     if (IS_OVERFLOW( int64, symbol))                {__REMOVE__(lint_type_name);  __REMOVE__(lword_type_name);}
   176 	      remove_from_candidate_datatype_list(&search_constant_type_c::byte_type_name,       symbol->candidate_datatypes);
       
   177 	      remove_from_candidate_datatype_list(&search_constant_type_c::safebyte_type_name,   symbol->candidate_datatypes);
       
   178  	  }
       
   179       if  ((value < INT16_MIN ) || (value > INT16_MAX)) {
       
   180           remove_from_candidate_datatype_list(&search_constant_type_c::int_type_name,        symbol->candidate_datatypes);
       
   181           remove_from_candidate_datatype_list(&search_constant_type_c::safeint_type_name,    symbol->candidate_datatypes);
       
   182           remove_from_candidate_datatype_list(&search_constant_type_c::word_type_name,       symbol->candidate_datatypes);
       
   183           remove_from_candidate_datatype_list(&search_constant_type_c::safeword_type_name,   symbol->candidate_datatypes);
       
   184       }
       
   185       if  ((value < INT32_MIN ) || (value > INT32_MAX)) {
       
   186           remove_from_candidate_datatype_list(&search_constant_type_c::dint_type_name,       symbol->candidate_datatypes);
       
   187           remove_from_candidate_datatype_list(&search_constant_type_c::safedint_type_name,   symbol->candidate_datatypes);
       
   188           remove_from_candidate_datatype_list(&search_constant_type_c::dword_type_name,      symbol->candidate_datatypes);
       
   189           remove_from_candidate_datatype_list(&search_constant_type_c::safedword_type_name,  symbol->candidate_datatypes);
       
   190       }
       
   191  	}
       
   192     if  (IS_OVERFLOW( int64, symbol)) {
       
   193     	  /* Not exist a valid signed integer data types it can represent the current value */
       
   194     	  remove_from_candidate_datatype_list(&search_constant_type_c::sint_type_name,       symbol->candidate_datatypes);
       
   195     	  remove_from_candidate_datatype_list(&search_constant_type_c::safesint_type_name,   symbol->candidate_datatypes);
       
   196     	  remove_from_candidate_datatype_list(&search_constant_type_c::int_type_name,        symbol->candidate_datatypes);
       
   197     	  remove_from_candidate_datatype_list(&search_constant_type_c::safeint_type_name,    symbol->candidate_datatypes);
       
   198     	  remove_from_candidate_datatype_list(&search_constant_type_c::dint_type_name,       symbol->candidate_datatypes);
       
   199     	  remove_from_candidate_datatype_list(&search_constant_type_c::safedint_type_name,   symbol->candidate_datatypes);
       
   200     	  remove_from_candidate_datatype_list(&search_constant_type_c::lint_type_name,       symbol->candidate_datatypes);
       
   201     	  remove_from_candidate_datatype_list(&search_constant_type_c::safelint_type_name,   symbol->candidate_datatypes);
       
   202 	      remove_from_candidate_datatype_list(&search_constant_type_c::byte_type_name,       symbol->candidate_datatypes);
       
   203 	      remove_from_candidate_datatype_list(&search_constant_type_c::safebyte_type_name,   symbol->candidate_datatypes);
       
   204           remove_from_candidate_datatype_list(&search_constant_type_c::word_type_name,       symbol->candidate_datatypes);
       
   205           remove_from_candidate_datatype_list(&search_constant_type_c::safeword_type_name,   symbol->candidate_datatypes);
       
   206           remove_from_candidate_datatype_list(&search_constant_type_c::dword_type_name,      symbol->candidate_datatypes);
       
   207           remove_from_candidate_datatype_list(&search_constant_type_c::safedword_type_name,  symbol->candidate_datatypes);
       
   208           remove_from_candidate_datatype_list(&search_constant_type_c::lword_type_name,      symbol->candidate_datatypes);
       
   209           remove_from_candidate_datatype_list(&search_constant_type_c::safelword_type_name,  symbol->candidate_datatypes);
       
   210     }
       
   211   }
   147   }
   212   /* Remove floating point data types */
   148     
   213   if (! IS_UNDEF( real64, symbol)) {
   149   {/* Remove floating point data types */
   214 	  if (VALID_CVALUE( real64, symbol)) {
   150     real64_t value = 0;
   215 		  real64_t value = GET_CVALUE(real64, symbol);
   151     if (VALID_CVALUE( real64, symbol)) value = GET_CVALUE(real64, symbol);
   216 		  /*  We need a way to understand when lost precision happen and overflow for single precision.
   152     if (value >  REAL32_MAX )         {__REMOVE__( real_type_name);}
   217 		   *  In this way we can remove REAL data type when a value has a mantissa or exponent too large.
   153     if (value < -REAL32_MAX )         {__REMOVE__( real_type_name);}
   218 		   */
   154     if (IS_OVERFLOW( real64, symbol)) {__REMOVE__(lreal_type_name);}
   219 	  }
       
   220 	  if  (IS_OVERFLOW( real64, symbol)) {
       
   221 		  /* Not exist a valid real data types that it can represent the current value */
       
   222 	      remove_from_candidate_datatype_list(&search_constant_type_c::real_type_name,      symbol->candidate_datatypes);
       
   223 	      remove_from_candidate_datatype_list(&search_constant_type_c::safereal_type_name,  symbol->candidate_datatypes);
       
   224 	      remove_from_candidate_datatype_list(&search_constant_type_c::lreal_type_name,     symbol->candidate_datatypes);
       
   225 	      remove_from_candidate_datatype_list(&search_constant_type_c::safelreal_type_name, symbol->candidate_datatypes);
       
   226 	  }
       
   227   }
   155   }
       
   156   #undef __REMOVE__
   228 }
   157 }
   229     
   158     
   230 
   159 
   231 /* returns true if compatible function/FB invocation, otherwise returns false */
   160 /* returns true if compatible function/FB invocation, otherwise returns false */
   232 /* Assumes that the candidate_datatype lists of all the parameters being passed haved already been filled in */
   161 /* Assumes that the candidate_datatype lists of all the parameters being passed haved already been filled in */