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.

122 lines
3.7 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. #pragma once
  2. #include "gp/containers/vector.hpp"
  3. #include "gp/dynamic/compiler/type/type.hpp"
  4. #include "gp/dynamic/compiler/mangle/decls.hpp"
  5. struct gr_function;
  6. namespace _hidden {
  7. constexpr auto append = [] (string& target, auto... var) {
  8. constexpr auto append_str = [] (string& target, auto& var) {
  9. if constexpr (std::is_same_v<decltype(var), const char*&>) {
  10. for(auto it = var; *it != 0; it++) {
  11. char c = *it;
  12. target.push_back(c);
  13. }
  14. } else {
  15. for(char c : var) {
  16. target.push_back(c);
  17. }
  18. }
  19. };
  20. (append_str(target, var), ...);
  21. };
  22. }
  23. string gr_mangle_function(gp::vector<gr_type> signature, gp::allocator& alloc) {
  24. string mangledName(alloc);
  25. for(auto& type : signature) {
  26. _hidden::append(mangledName, "$");
  27. switch(type.base_type){
  28. case gr_base_type::void_:
  29. _hidden::append(mangledName, "*");
  30. break;
  31. case gr_base_type::null_:
  32. _hidden::append(mangledName, "0");
  33. break;
  34. case gr_base_type::int_:
  35. _hidden::append(mangledName, "i");
  36. break;
  37. case gr_base_type::float_:
  38. _hidden::append(mangledName, "r");
  39. break;
  40. case gr_base_type::bool_:
  41. _hidden::append(mangledName, "b");
  42. break;
  43. case gr_base_type::string_:
  44. _hidden::append(mangledName, "s");
  45. break;
  46. case gr_base_type::array_:
  47. _hidden::append(mangledName, "n(", type.mangled_type, ")");
  48. break;
  49. case gr_base_type::class_:
  50. _hidden::append(mangledName, "p(", type.mangled_type, ")");
  51. break;
  52. case gr_base_type::enum_:
  53. _hidden::append(mangledName, "e(", type.mangled_type, ")");
  54. break;
  55. case gr_base_type::foreign:
  56. _hidden::append(mangledName, "u(", type.mangled_type, ")");
  57. break;
  58. case gr_base_type::function_:
  59. _hidden::append(mangledName, "f(", type.mangled_type, ")(", type.mangled_return_type, ")");
  60. break;
  61. case gr_base_type::task:
  62. _hidden::append(mangledName, "t(", type.mangled_type, ")");
  63. break;
  64. case gr_base_type::chan:
  65. _hidden::append(mangledName, "c(", type.mangled_type, ")");
  66. break;
  67. case gr_base_type::reference:
  68. _hidden::append(mangledName, "h(", type.mangled_type, ")");
  69. break;
  70. case gr_base_type::internalTuple:
  71. gp_config::assertion(false, "Trying to mangle a tuple. Tuples should not exist here.");
  72. }
  73. }
  74. return mangledName;
  75. }
  76. string gr_mangle_named_function(string name,gp::vector<gr_type> signature, gp::allocator& alloc) {
  77. string mangledName(alloc);
  78. _hidden::append(mangledName, name, grMangleFunction(signature, alloc));
  79. return mangledName;
  80. }
  81. gr_type gr_get_function_as_type(gr_function func, gp::allocator&);/* {
  82. GrType type = func.isTask ? GrBaseType.task : GrBaseType.function_;
  83. type.mangledType = grMangleNamedFunction("", func.inSignature);
  84. type.mangledReturnType = grMangleNamedFunction("", func.outSignature);
  85. return type;
  86. }*/
  87. string gr_unmangle_sub_function(string mangledSignature, int& i, gp::allocator& alloc) {
  88. string subString(alloc);
  89. int blockCount = 1;
  90. if(i >= mangledSignature.length && mangledSignature[i] != '(')
  91. throw new Exception("Invalid subType mangling format, missing (");
  92. i ++;
  93. for(; i < mangledSignature.length; i ++) {
  94. switch(mangledSignature[i]) {
  95. case '(':
  96. blockCount ++;
  97. break;
  98. case ')':
  99. blockCount --;
  100. if(blockCount == 0) {
  101. return subString;
  102. }
  103. break;
  104. default:
  105. break;
  106. }
  107. subString ~= mangledSignature[i];
  108. }
  109. throw new Exception("Invalid subType mangling format, missing )");
  110. }