General Purpose library for Freestanding C++ and POSIX systems
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

81 lines
2.4 KiB

  1. #pragma once
  2. #include "gp/containers/vector.hpp"
  3. #include "gp/dynamic/compiler/mangle/decls.hpp"
  4. constexpr auto append = [] (string& target, auto... var) {
  5. constexpr auto append_str = [] (string& target, auto& var) {
  6. if constexpr (std::is_same_v<decltype(var), const char*&>) {
  7. for(auto it = var; *it != 0; it++) {
  8. char c = *it;
  9. target.push_back(c);
  10. }
  11. } else {
  12. for(char c : var) {
  13. target.push_back(c);
  14. }
  15. }
  16. };
  17. (append_str(target, var), ...);
  18. };
  19. string grMangleFunction(gp::vector<gr_type> signature, gp::allocator& alloc) {
  20. string mangledName(alloc);
  21. for(auto& type : signature) {
  22. append(mangledName, "$");
  23. switch(type.base_type){
  24. case gr_base_type::void_:
  25. append(mangledName, "*");
  26. break;
  27. case gr_base_type::null_:
  28. append(mangledName, "0");
  29. break;
  30. case gr_base_type::int_:
  31. append(mangledName, "i");
  32. break;
  33. case gr_base_type::float_:
  34. append(mangledName, "r");
  35. break;
  36. case gr_base_type::bool_:
  37. append(mangledName, "b");
  38. break;
  39. case gr_base_type::string_:
  40. append(mangledName, "s");
  41. break;
  42. case gr_base_type::array_:
  43. append(mangledName, "n(", type.mangled_type, ")");
  44. break;
  45. case gr_base_type::class_:
  46. append(mangledName, "p(", type.mangled_type, ")");
  47. break;
  48. case gr_base_type::enum_:
  49. append(mangledName, "e(", type.mangled_type, ")");
  50. break;
  51. case gr_base_type::foreign:
  52. append(mangledName, "u(", type.mangled_type, ")");
  53. break;
  54. case gr_base_type::function_:
  55. append(mangledName, "f(", type.mangled_type, ")(", type.mangled_return_type, ")");
  56. break;
  57. case gr_base_type::task:
  58. append(mangledName, "t(", type.mangled_type, ")");
  59. break;
  60. case gr_base_type::chan:
  61. append(mangledName, "c(", type.mangled_type, ")");
  62. break;
  63. case gr_base_type::reference:
  64. append(mangledName, "h(", type.mangled_type, ")");
  65. break;
  66. case gr_base_type::internalTuple:
  67. gp_config::assertion(false, "Trying to mangle a tuple. Tuples should not exist here.");
  68. }
  69. }
  70. return mangledName;
  71. }
  72. string grMangleNamedFunction(string name,gp::vector<gr_type> signature, gp::allocator& alloc) {
  73. string mangledName(alloc);
  74. append(mangledName, name, grMangleFunction(signature, alloc));
  75. return mangledName;
  76. }