--- a/absyntax_utils/get_datatype_info.cc Sun Jul 06 23:31:08 2014 +0100
+++ b/absyntax_utils/get_datatype_info.cc Sun Jul 13 12:26:58 2014 +0100
@@ -79,23 +79,25 @@
/* B 1.3.3 - Derived data types */
/********************************/
/* simple_type_name ':' simple_spec_init */
- void *visit(simple_type_declaration_c *symbol) {return symbol->simple_type_name;}
+ void *visit(simple_type_declaration_c *symbol) {return symbol->simple_type_name;}
/* subrange_type_name ':' subrange_spec_init */
- void *visit(subrange_type_declaration_c *symbol) {return symbol->subrange_type_name;}
+ void *visit(subrange_type_declaration_c *symbol) {return symbol->subrange_type_name;}
/* enumerated_type_name ':' enumerated_spec_init */
void *visit(enumerated_type_declaration_c *symbol) {return symbol->enumerated_type_name;}
/* identifier ':' array_spec_init */
- void *visit(array_type_declaration_c *symbol) {return symbol->identifier;}
+ void *visit(array_type_declaration_c *symbol) {return symbol->identifier;}
/* structure_type_name ':' structure_specification */
- void *visit(structure_type_declaration_c *symbol) {return symbol->structure_type_name;}
+ void *visit(structure_type_declaration_c *symbol) {return symbol->structure_type_name;}
/* string_type_name ':' elementary_string_type_name string_type_declaration_size string_type_declaration_init */
- void *visit(string_type_declaration_c *symbol) {return symbol->string_type_name;}
+ void *visit(string_type_declaration_c *symbol) {return symbol->string_type_name;}
+ /* ref_type_decl: identifier ':' ref_spec_init */
+ void *visit(ref_type_decl_c *symbol) {return symbol->ref_type_name;}
/*****************************/
/* B 1.5.2 - Function Blocks */
/*****************************/
/* FUNCTION_BLOCK derived_function_block_name io_OR_other_var_declarations function_block_body END_FUNCTION_BLOCK */
- void *visit(function_block_declaration_c *symbol) {return symbol->fblock_name;}
+ void *visit(function_block_declaration_c *symbol) {return symbol->fblock_name;}
}; // get_datatype_id_c
get_datatype_id_c *get_datatype_id_c::singleton = NULL;
@@ -189,23 +191,25 @@
/* B 1.3.3 - Derived data types */
/********************************/
/* simple_type_name ':' simple_spec_init */
- void *visit(simple_type_declaration_c *symbol) {return symbol->simple_type_name->accept(*this);}
+ void *visit(simple_type_declaration_c *symbol) {return symbol->simple_type_name->accept(*this);}
/* subrange_type_name ':' subrange_spec_init */
- void *visit(subrange_type_declaration_c *symbol) {return symbol->subrange_type_name->accept(*this);}
+ void *visit(subrange_type_declaration_c *symbol) {return symbol->subrange_type_name->accept(*this);}
/* enumerated_type_name ':' enumerated_spec_init */
void *visit(enumerated_type_declaration_c *symbol) {return symbol->enumerated_type_name->accept(*this);}
/* identifier ':' array_spec_init */
- void *visit(array_type_declaration_c *symbol) {return symbol->identifier->accept(*this);}
+ void *visit(array_type_declaration_c *symbol) {return symbol->identifier->accept(*this);}
/* structure_type_name ':' structure_specification */
- void *visit(structure_type_declaration_c *symbol) {return symbol->structure_type_name->accept(*this);}
+ void *visit(structure_type_declaration_c *symbol) {return symbol->structure_type_name->accept(*this);}
/* string_type_name ':' elementary_string_type_name string_type_declaration_size string_type_declaration_init */
- void *visit(string_type_declaration_c *symbol) {return symbol->string_type_name->accept(*this);}
+ void *visit(string_type_declaration_c *symbol) {return symbol->string_type_name->accept(*this);}
+ /* ref_type_decl: identifier ':' ref_spec_init */
+ void *visit(ref_type_decl_c *symbol) {return symbol->ref_type_name->accept(*this);}
/*****************************/
/* B 1.5.2 - Function Blocks */
/*****************************/
/* FUNCTION_BLOCK derived_function_block_name io_OR_other_var_declarations function_block_body END_FUNCTION_BLOCK */
- void *visit(function_block_declaration_c *symbol) {return symbol->fblock_name->accept(*this);}
+ void *visit(function_block_declaration_c *symbol) {return symbol->fblock_name->accept(*this);}
};
get_datatype_id_str_c *get_datatype_id_str_c::singleton = NULL;
@@ -239,9 +243,15 @@
if (typeid(* first_type) == typeid(invalid_type_name_c)) {return false;}
if (typeid(*second_type) == typeid(invalid_type_name_c)) {return false;}
- if ((get_datatype_info_c::is_ANY_ELEMENTARY(first_type)) &&
+ /* ANY_ELEMENTARY */
+ if ((is_ANY_ELEMENTARY(first_type)) &&
(typeid(*first_type) == typeid(*second_type))) {return true;}
+
/* ANY_DERIVED */
+ if (is_ref_to(first_type) && is_ref_to(second_type))
+ return is_type_equal(search_base_type_c::get_basetype_decl(get_ref_to(first_type )),
+ search_base_type_c::get_basetype_decl(get_ref_to(second_type)));
+
return (first_type == second_type);
}
@@ -258,6 +268,39 @@
+
+/* returns the datatype the REF_TO datatype references/points to... */
+symbol_c *get_datatype_info_c::get_ref_to(symbol_c *type_symbol) {
+ ref_type_decl_c *type1 = dynamic_cast<ref_type_decl_c *>(type_symbol);
+ if (NULL != type1) type_symbol = type1->ref_spec_init;
+
+ ref_spec_init_c *type2 = dynamic_cast<ref_spec_init_c *>(type_symbol);
+ if (NULL != type2) type_symbol = type2->ref_spec;
+
+ ref_spec_c *type3 = dynamic_cast<ref_spec_c *>(type_symbol);
+ if (NULL != type3) return type3->type_name;
+
+ return NULL; /* this is not a ref datatype!! */
+}
+
+
+
+
+
+
+bool get_datatype_info_c::is_ref_to(symbol_c *type_symbol) {
+ symbol_c *type_decl = search_base_type_c::get_basetype_decl(type_symbol);
+ if (NULL == type_decl) {return false;}
+
+ if (typeid(*type_decl) == typeid(ref_type_decl_c)) {return true;} /* identifier ':' ref_spec_init */
+ if (typeid(*type_decl) == typeid(ref_spec_init_c)) {return true;} /* ref_spec [ ASSIGN ref_initialization ]; */
+ if (typeid(*type_decl) == typeid(ref_spec_c)) {return true;} /* REF_TO (non_generic_type_name | function_block_type_name) */
+ return false;
+}
+
+
+
+
bool get_datatype_info_c::is_sfc_initstep(symbol_c *type_symbol) {
symbol_c *type_decl = search_base_type_c::get_basetype_decl(type_symbol);
if (NULL == type_decl) {return false;}
@@ -267,8 +310,6 @@
-
-
bool get_datatype_info_c::is_sfc_step(symbol_c *type_symbol) {
symbol_c *type_decl = search_base_type_c::get_basetype_decl(type_symbol);
if (NULL == type_decl) {return false;}
@@ -360,10 +401,6 @@
-
-
-
-
bool get_datatype_info_c::is_ANY_ELEMENTARY(symbol_c *type_symbol) {
if (type_symbol == NULL) {return false;}
if (is_ANY_MAGNITUDE(type_symbol)) {return true;}