make_wrappers.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. proto_mod = """
  2. #define MODBIND$VER($RETTYPE m_name$ARG) \\
  3. virtual $RETVAL _##m_name($FUNCARGS) $CONST; \\
  4. _FORCE_INLINE_ virtual $RETVAL m_name($FUNCARGS) $CONST override { \\
  5. $RETX _##m_name($CALLARGS);\\
  6. }
  7. """
  8. def generate_mod_version(argcount, const=False, returns=False):
  9. s = proto_mod
  10. sproto = str(argcount)
  11. if returns:
  12. sproto += "R"
  13. s = s.replace("$RETTYPE", "m_ret, ")
  14. s = s.replace("$RETVAL", "m_ret")
  15. s = s.replace("$RETX", "return")
  16. else:
  17. s = s.replace("$RETTYPE", "")
  18. s = s.replace("$RETVAL", "void")
  19. s = s.replace("$RETX", "")
  20. if const:
  21. sproto += "C"
  22. s = s.replace("$CONST", "const")
  23. else:
  24. s = s.replace("$CONST", "")
  25. s = s.replace("$VER", sproto)
  26. argtext = ""
  27. funcargs = ""
  28. callargs = ""
  29. for i in range(argcount):
  30. if i > 0:
  31. funcargs += ", "
  32. callargs += ", "
  33. argtext += ", m_type" + str(i + 1)
  34. funcargs += "m_type" + str(i + 1) + " arg" + str(i + 1)
  35. callargs += "arg" + str(i + 1)
  36. if argcount:
  37. s = s.replace("$ARG", argtext)
  38. s = s.replace("$FUNCARGS", funcargs)
  39. s = s.replace("$CALLARGS", callargs)
  40. else:
  41. s = s.replace("$ARG", "")
  42. s = s.replace("$FUNCARGS", funcargs)
  43. s = s.replace("$CALLARGS", callargs)
  44. return s
  45. proto_ex = """
  46. #define EXBIND$VER($RETTYPE m_name$ARG) \\
  47. GDVIRTUAL$VER_REQUIRED($RETTYPE_##m_name$ARG)\\
  48. virtual $RETVAL m_name($FUNCARGS) $CONST override { \\
  49. $RETPRE\\
  50. GDVIRTUAL_CALL(_##m_name$CALLARGS$RETREF);\\
  51. $RETPOST\\
  52. }
  53. """
  54. def generate_ex_version(argcount, const=False, returns=False):
  55. s = proto_ex
  56. sproto = str(argcount)
  57. if returns:
  58. sproto += "R"
  59. s = s.replace("$RETTYPE", "m_ret, ")
  60. s = s.replace("$RETVAL", "m_ret")
  61. s = s.replace("$RETPRE", "m_ret ret; ZeroInitializer<m_ret>::initialize(ret);\\\n")
  62. s = s.replace("$RETPOST", "return ret;\\\n")
  63. else:
  64. s = s.replace("$RETTYPE", "")
  65. s = s.replace("$RETVAL", "void")
  66. s = s.replace("$RETPRE", "")
  67. s = s.replace("$RETPOST", "return;")
  68. if const:
  69. sproto += "C"
  70. s = s.replace("$CONST", "const")
  71. else:
  72. s = s.replace("$CONST", "")
  73. s = s.replace("$VER", sproto)
  74. argtext = ""
  75. funcargs = ""
  76. callargs = ""
  77. for i in range(argcount):
  78. if i > 0:
  79. funcargs += ", "
  80. argtext += ", m_type" + str(i + 1)
  81. funcargs += "m_type" + str(i + 1) + " arg" + str(i + 1)
  82. callargs += ", arg" + str(i + 1)
  83. if argcount:
  84. s = s.replace("$ARG", argtext)
  85. s = s.replace("$FUNCARGS", funcargs)
  86. s = s.replace("$CALLARGS", callargs)
  87. else:
  88. s = s.replace("$ARG", "")
  89. s = s.replace("$FUNCARGS", funcargs)
  90. s = s.replace("$CALLARGS", callargs)
  91. if returns:
  92. s = s.replace("$RETREF", ", ret")
  93. else:
  94. s = s.replace("$RETREF", "")
  95. return s
  96. def run(target, source, env):
  97. max_versions = 12
  98. txt = """
  99. #ifndef GDEXTENSION_WRAPPERS_GEN_H
  100. #define GDEXTENSION_WRAPPERS_GEN_H
  101. """
  102. for i in range(max_versions + 1):
  103. txt += "\n/* Extension Wrapper " + str(i) + " Arguments */\n"
  104. txt += generate_ex_version(i, False, False)
  105. txt += generate_ex_version(i, False, True)
  106. txt += generate_ex_version(i, True, False)
  107. txt += generate_ex_version(i, True, True)
  108. for i in range(max_versions + 1):
  109. txt += "\n/* Module Wrapper " + str(i) + " Arguments */\n"
  110. txt += generate_mod_version(i, False, False)
  111. txt += generate_mod_version(i, False, True)
  112. txt += generate_mod_version(i, True, False)
  113. txt += generate_mod_version(i, True, True)
  114. txt += "\n#endif\n"
  115. with open(str(target[0]), "w", encoding="utf-8", newline="\n") as f:
  116. f.write(txt)