diff --git a/src/util/std_types.h b/src/util/std_types.h index 726c210e52e..6d3fc23d704 100644 --- a/src/util/std_types.h +++ b/src/util/std_types.h @@ -890,6 +890,26 @@ class code_typet:public typet result.push_back(it->get_identifier()); return result; } + + typedef + std::unordered_map parameter_indicest; + + /// Get a map from parameter name to its index + parameter_indicest parameter_indices() const + { + parameter_indicest parameter_indices; + const parameterst &p = parameters(); + parameter_indices.reserve(p.size()); + std::size_t index = 0; + for(const auto &p : parameters()) + { + const irep_idt &id = p.get_identifier(); + if(!id.empty()) + parameter_indices.insert({ id, index }); + ++index; + } + return parameter_indices; + } }; /*! \brief Cast a generic typet to a \ref code_typet diff --git a/unit/Makefile b/unit/Makefile index 043d8ef8d37..e28e5e7e561 100644 --- a/unit/Makefile +++ b/unit/Makefile @@ -35,6 +35,7 @@ SRC += unit_tests.cpp \ util/expr_cast/expr_cast.cpp \ util/expr_iterator.cpp \ util/message.cpp \ + util/parameter_indices.cpp \ util/simplify_expr.cpp \ util/symbol_table.cpp \ catch_example.cpp \ diff --git a/unit/util/ParameterIndicesTest.class b/unit/util/ParameterIndicesTest.class new file mode 100644 index 00000000000..2e891b2a29a Binary files /dev/null and b/unit/util/ParameterIndicesTest.class differ diff --git a/unit/util/ParameterIndicesTest.java b/unit/util/ParameterIndicesTest.java new file mode 100644 index 00000000000..cfa82f637b7 --- /dev/null +++ b/unit/util/ParameterIndicesTest.java @@ -0,0 +1,8 @@ + +public class ParameterIndicesTest { + + public void f(ParameterIndicesTest param1, int param2) {} + + public static void g(float param1, ParameterIndicesTest param2) {} + +} diff --git a/unit/util/parameter_indices.cpp b/unit/util/parameter_indices.cpp new file mode 100644 index 00000000000..5961d32e822 --- /dev/null +++ b/unit/util/parameter_indices.cpp @@ -0,0 +1,33 @@ +/*******************************************************************\ + + Module: Parameter indices test + + Author: Diffblue Limited. All rights reserved. + +\*******************************************************************/ + +#include +#include +#include + +void check_consistency(const symbolt &symbol) +{ + const auto &code_type = to_code_type(symbol.type); + auto parameter_ids = code_type.parameter_identifiers(); + auto parameter_indices = code_type.parameter_indices(); + + REQUIRE(parameter_ids.size() == parameter_indices.size()); + for(std::size_t i = 0; i < parameter_ids.size(); ++i) + REQUIRE(parameter_indices.at(parameter_ids.at(i)) == i); +} + +TEST_CASE("Parmeter indices consistency", "[core][util][parameter_indices]") +{ + symbol_tablet symbol_table = load_java_class("ParameterIndicesTest", "util/"); + check_consistency( + symbol_table.lookup_ref( + "java::ParameterIndicesTest.f:(LParameterIndicesTest;I)V")); + check_consistency( + symbol_table.lookup_ref( + "java::ParameterIndicesTest.g:(FLParameterIndicesTest;)V")); +}