gdnative_interface.cpp 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688
  1. /*************************************************************************/
  2. /* gdnative_interface.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
  9. /* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
  10. /* */
  11. /* Permission is hereby granted, free of charge, to any person obtaining */
  12. /* a copy of this software and associated documentation files (the */
  13. /* "Software"), to deal in the Software without restriction, including */
  14. /* without limitation the rights to use, copy, modify, merge, publish, */
  15. /* distribute, sublicense, and/or sell copies of the Software, and to */
  16. /* permit persons to whom the Software is furnished to do so, subject to */
  17. /* the following conditions: */
  18. /* */
  19. /* The above copyright notice and this permission notice shall be */
  20. /* included in all copies or substantial portions of the Software. */
  21. /* */
  22. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  23. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  24. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
  25. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  26. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  27. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  28. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  29. /*************************************************************************/
  30. #include "gdnative_interface.h"
  31. #include "core/config/engine.h"
  32. #include "core/object/class_db.h"
  33. #include "core/os/memory.h"
  34. #include "core/variant/variant.h"
  35. #include "core/version.h"
  36. // Memory Functions
  37. static void *gdnative_alloc(size_t p_size) {
  38. return memalloc(p_size);
  39. }
  40. static void *gdnative_realloc(void *p_mem, size_t p_size) {
  41. return memrealloc(p_mem, p_size);
  42. }
  43. static void gdnative_free(void *p_mem) {
  44. memfree(p_mem);
  45. }
  46. // Helper print functions.
  47. static void gdnative_print_error(const char *p_description, const char *p_function, const char *p_file, int32_t p_line) {
  48. _err_print_error(p_function, p_file, p_line, p_description, ERR_HANDLER_ERROR);
  49. }
  50. static void gdnative_print_warning(const char *p_description, const char *p_function, const char *p_file, int32_t p_line) {
  51. _err_print_error(p_function, p_file, p_line, p_description, ERR_HANDLER_WARNING);
  52. }
  53. static void gdnative_print_script_error(const char *p_description, const char *p_function, const char *p_file, int32_t p_line) {
  54. _err_print_error(p_function, p_file, p_line, p_description, ERR_HANDLER_SCRIPT);
  55. }
  56. // Variant functions
  57. static void gdnative_variant_new_copy(GDNativeVariantPtr r_dest, const GDNativeVariantPtr p_src) {
  58. memnew_placement(reinterpret_cast<Variant *>(r_dest), Variant(*reinterpret_cast<Variant *>(p_src)));
  59. }
  60. static void gdnative_variant_new_nil(GDNativeVariantPtr r_dest) {
  61. memnew_placement(reinterpret_cast<Variant *>(r_dest), Variant);
  62. }
  63. static void gdnative_variant_destroy(GDNativeVariantPtr p_self) {
  64. reinterpret_cast<Variant *>(p_self)->~Variant();
  65. }
  66. // variant type
  67. #define memnew_placement_custom(m_placement, m_class, m_constr) _post_initialize(new (m_placement, sizeof(m_class), "") m_constr)
  68. static void gdnative_variant_call(GDNativeVariantPtr p_self, const GDNativeStringNamePtr p_method, const GDNativeVariantPtr *p_args, const GDNativeInt p_argcount, GDNativeVariantPtr r_return, GDNativeCallError *r_error) {
  69. Variant *self = (Variant *)p_self;
  70. const StringName *method = (const StringName *)p_method;
  71. const Variant **args = (const Variant **)p_args;
  72. Variant ret;
  73. Callable::CallError error;
  74. self->call(*method, args, p_argcount, ret, error);
  75. memnew_placement_custom(r_return, Variant, Variant(ret));
  76. if (r_error) {
  77. r_error->error = (GDNativeCallErrorType)(error.error);
  78. r_error->argument = error.argument;
  79. r_error->expected = error.expected;
  80. }
  81. }
  82. static void gdnative_variant_call_static(GDNativeVariantType p_type, const GDNativeStringNamePtr p_method, const GDNativeVariantPtr *p_args, const GDNativeInt p_argcount, GDNativeVariantPtr r_return, GDNativeCallError *r_error) {
  83. Variant::Type type = (Variant::Type)p_type;
  84. const StringName *method = (const StringName *)p_method;
  85. const Variant **args = (const Variant **)p_args;
  86. Variant ret;
  87. Callable::CallError error;
  88. Variant::call_static(type, *method, args, p_argcount, ret, error);
  89. memnew_placement_custom(r_return, Variant, Variant(ret));
  90. if (r_error) {
  91. r_error->error = (GDNativeCallErrorType)error.error;
  92. r_error->argument = error.argument;
  93. r_error->expected = error.expected;
  94. }
  95. }
  96. static void gdnative_variant_evaluate(GDNativeVariantOperator p_op, const GDNativeVariantPtr p_a, const GDNativeVariantPtr p_b, GDNativeVariantPtr r_return, GDNativeBool *r_valid) {
  97. Variant::Operator op = (Variant::Operator)p_op;
  98. const Variant *a = (const Variant *)p_a;
  99. const Variant *b = (const Variant *)p_b;
  100. Variant *ret = (Variant *)r_return;
  101. bool valid;
  102. Variant::evaluate(op, *a, *b, *ret, valid);
  103. *r_valid = valid;
  104. }
  105. static void gdnative_variant_set(GDNativeVariantPtr p_self, const GDNativeVariantPtr p_key, const GDNativeVariantPtr p_value, GDNativeBool *r_valid) {
  106. Variant *self = (Variant *)p_self;
  107. const Variant *key = (const Variant *)p_key;
  108. const Variant *value = (const Variant *)p_value;
  109. bool valid;
  110. self->set(*key, *value, &valid);
  111. *r_valid = valid;
  112. }
  113. static void gdnative_variant_set_named(GDNativeVariantPtr p_self, const GDNativeStringNamePtr p_key, const GDNativeVariantPtr p_value, GDNativeBool *r_valid) {
  114. Variant *self = (Variant *)p_self;
  115. const StringName *key = (const StringName *)p_key;
  116. const Variant *value = (const Variant *)p_value;
  117. bool valid;
  118. self->set_named(*key, *value, valid);
  119. *r_valid = valid;
  120. }
  121. static void gdnative_variant_set_keyed(GDNativeVariantPtr p_self, const GDNativeVariantPtr p_key, const GDNativeVariantPtr p_value, GDNativeBool *r_valid) {
  122. Variant *self = (Variant *)p_self;
  123. const Variant *key = (const Variant *)p_key;
  124. const Variant *value = (const Variant *)p_value;
  125. bool valid;
  126. self->set_keyed(*key, *value, valid);
  127. *r_valid = valid;
  128. }
  129. static void gdnative_variant_set_indexed(GDNativeVariantPtr p_self, GDNativeInt p_index, const GDNativeVariantPtr p_value, GDNativeBool *r_valid, GDNativeBool *r_oob) {
  130. Variant *self = (Variant *)p_self;
  131. const Variant *value = (const Variant *)p_value;
  132. bool valid;
  133. bool oob;
  134. self->set_indexed(p_index, value, valid, oob);
  135. *r_valid = valid;
  136. *r_oob = oob;
  137. }
  138. static void gdnative_variant_get(const GDNativeVariantPtr p_self, const GDNativeVariantPtr p_key, GDNativeVariantPtr r_ret, GDNativeBool *r_valid) {
  139. const Variant *self = (const Variant *)p_self;
  140. const Variant *key = (const Variant *)p_key;
  141. bool valid;
  142. memnew_placement_custom(r_ret, Variant, Variant(self->get(*key, &valid)));
  143. *r_valid = valid;
  144. }
  145. static void gdnative_variant_get_named(const GDNativeVariantPtr p_self, const GDNativeStringNamePtr p_key, GDNativeVariantPtr r_ret, GDNativeBool *r_valid) {
  146. const Variant *self = (const Variant *)p_self;
  147. const StringName *key = (const StringName *)p_key;
  148. bool valid;
  149. memnew_placement_custom(r_ret, Variant, Variant(self->get_named(*key, valid)));
  150. *r_valid = valid;
  151. }
  152. static void gdnative_variant_get_keyed(const GDNativeVariantPtr p_self, const GDNativeVariantPtr p_key, GDNativeVariantPtr r_ret, GDNativeBool *r_valid) {
  153. const Variant *self = (const Variant *)p_self;
  154. const Variant *key = (const Variant *)p_key;
  155. bool valid;
  156. memnew_placement_custom(r_ret, Variant, Variant(self->get_keyed(*key, valid)));
  157. *r_valid = valid;
  158. }
  159. static void gdnative_variant_get_indexed(const GDNativeVariantPtr p_self, GDNativeInt p_index, GDNativeVariantPtr r_ret, GDNativeBool *r_valid, GDNativeBool *r_oob) {
  160. const Variant *self = (const Variant *)p_self;
  161. bool valid;
  162. bool oob;
  163. memnew_placement_custom(r_ret, Variant, Variant(self->get_indexed(p_index, valid, oob)));
  164. *r_valid = valid;
  165. *r_oob = oob;
  166. }
  167. /// Iteration.
  168. static GDNativeBool gdnative_variant_iter_init(const GDNativeVariantPtr p_self, GDNativeVariantPtr r_iter, GDNativeBool *r_valid) {
  169. const Variant *self = (const Variant *)p_self;
  170. Variant *iter = (Variant *)r_iter;
  171. bool valid;
  172. bool ret = self->iter_init(*iter, valid);
  173. *r_valid = valid;
  174. return ret;
  175. }
  176. static GDNativeBool gdnative_variant_iter_next(const GDNativeVariantPtr p_self, GDNativeVariantPtr r_iter, GDNativeBool *r_valid) {
  177. const Variant *self = (const Variant *)p_self;
  178. Variant *iter = (Variant *)r_iter;
  179. bool valid;
  180. bool ret = self->iter_next(*iter, valid);
  181. *r_valid = valid;
  182. return ret;
  183. }
  184. static void gdnative_variant_iter_get(const GDNativeVariantPtr p_self, GDNativeVariantPtr r_iter, GDNativeVariantPtr r_ret, GDNativeBool *r_valid) {
  185. const Variant *self = (const Variant *)p_self;
  186. Variant *iter = (Variant *)r_iter;
  187. bool valid;
  188. memnew_placement_custom(r_ret, Variant, Variant(self->iter_next(*iter, valid)));
  189. *r_valid = valid;
  190. }
  191. /// Variant functions.
  192. static GDNativeBool gdnative_variant_hash_compare(const GDNativeVariantPtr p_self, const GDNativeVariantPtr p_other) {
  193. const Variant *self = (const Variant *)p_self;
  194. const Variant *other = (const Variant *)p_other;
  195. return self->hash_compare(*other);
  196. }
  197. static GDNativeBool gdnative_variant_booleanize(const GDNativeVariantPtr p_self) {
  198. const Variant *self = (const Variant *)p_self;
  199. return self->booleanize();
  200. }
  201. static void gdnative_variant_blend(const GDNativeVariantPtr p_a, const GDNativeVariantPtr p_b, float p_c, GDNativeVariantPtr r_dst) {
  202. const Variant *a = (const Variant *)p_a;
  203. const Variant *b = (const Variant *)p_b;
  204. memnew_placement(r_dst, Variant);
  205. Variant::blend(*a, *b, p_c, *(Variant *)r_dst);
  206. }
  207. static void gdnative_variant_interpolate(const GDNativeVariantPtr p_a, const GDNativeVariantPtr p_b, float p_c, GDNativeVariantPtr r_dst) {
  208. const Variant *a = (const Variant *)p_a;
  209. const Variant *b = (const Variant *)p_b;
  210. memnew_placement(r_dst, Variant);
  211. Variant::interpolate(*a, *b, p_c, *(Variant *)r_dst);
  212. }
  213. static void gdnative_variant_duplicate(const GDNativeVariantPtr p_self, GDNativeVariantPtr r_ret, GDNativeBool p_deep) {
  214. const Variant *self = (const Variant *)p_self;
  215. memnew_placement_custom(r_ret, Variant, Variant(self->duplicate(p_deep)));
  216. }
  217. static void gdnative_variant_stringify(const GDNativeVariantPtr p_self, GDNativeStringPtr r_ret) {
  218. const Variant *self = (const Variant *)p_self;
  219. memnew_placement_custom(r_ret, String, String(*self));
  220. }
  221. static GDNativeVariantType gdnative_variant_get_type(const GDNativeVariantPtr p_self) {
  222. const Variant *self = (const Variant *)p_self;
  223. return (GDNativeVariantType)self->get_type();
  224. }
  225. static GDNativeBool gdnative_variant_has_method(const GDNativeVariantPtr p_self, const GDNativeStringNamePtr p_method) {
  226. const Variant *self = (const Variant *)p_self;
  227. const StringName *method = (const StringName *)p_method;
  228. return self->has_method(*method);
  229. }
  230. static GDNativeBool gdnative_variant_has_member(GDNativeVariantType p_type, const GDNativeStringNamePtr p_member) {
  231. return Variant::has_member((Variant::Type)p_type, *((const StringName *)p_member));
  232. }
  233. static GDNativeBool gdnative_variant_has_key(const GDNativeVariantPtr p_self, const GDNativeVariantPtr p_key, GDNativeBool *r_valid) {
  234. const Variant *self = (const Variant *)p_self;
  235. const Variant *key = (const Variant *)p_key;
  236. bool valid;
  237. return self->has_key(*key, valid);
  238. *r_valid = valid;
  239. }
  240. static void gdnative_variant_get_type_name(GDNativeVariantType p_type, GDNativeStringPtr r_ret) {
  241. String name = Variant::get_type_name((Variant::Type)p_type);
  242. memnew_placement_custom(r_ret, String, String(name));
  243. }
  244. static GDNativeBool gdnative_variant_can_convert(GDNativeVariantType p_from, GDNativeVariantType p_to) {
  245. return Variant::can_convert((Variant::Type)p_from, (Variant::Type)p_to);
  246. }
  247. static GDNativeBool gdnative_variant_can_convert_strict(GDNativeVariantType p_from, GDNativeVariantType p_to) {
  248. return Variant::can_convert_strict((Variant::Type)p_from, (Variant::Type)p_to);
  249. }
  250. // ptrcalls
  251. static GDNativePtrOperatorEvaluator gdnative_variant_get_ptr_operator_evaluator(GDNativeVariantOperator p_operator, GDNativeVariantType p_type_a, GDNativeVariantType p_type_b) {
  252. return (GDNativePtrOperatorEvaluator)Variant::get_ptr_operator_evaluator(Variant::Operator(p_operator), Variant::Type(p_type_a), Variant::Type(p_type_b));
  253. }
  254. static GDNativePtrBuiltInMethod gdnative_variant_get_ptr_builtin_method(GDNativeVariantType p_type, const char *p_method, GDNativeInt p_hash) {
  255. StringName method = p_method;
  256. uint32_t hash = Variant::get_builtin_method_hash(Variant::Type(p_type), method);
  257. if (hash != p_hash) {
  258. ERR_PRINT_ONCE("Error getting method " + String(method) + ", hash mismatch.");
  259. return nullptr;
  260. }
  261. return (GDNativePtrBuiltInMethod)Variant::get_ptr_builtin_method(Variant::Type(p_type), method);
  262. }
  263. static GDNativePtrConstructor gdnative_variant_get_ptr_constructor(GDNativeVariantType p_type, int32_t p_constructor) {
  264. return (GDNativePtrConstructor)Variant::get_ptr_constructor(Variant::Type(p_type), p_constructor);
  265. }
  266. static void gdnative_variant_construct(GDNativeVariantType p_type, GDNativeVariantPtr p_base, const GDNativeVariantPtr *p_args, int32_t p_argument_count, GDNativeCallError *r_error) {
  267. memnew_placement(p_base, Variant);
  268. Callable::CallError error;
  269. Variant::construct(Variant::Type(p_type), *(Variant *)p_base, (const Variant **)p_args, p_argument_count, error);
  270. if (r_error) {
  271. r_error->error = (GDNativeCallErrorType)(error.error);
  272. r_error->argument = error.argument;
  273. r_error->expected = error.expected;
  274. }
  275. }
  276. static GDNativePtrSetter gdnative_variant_get_ptr_setter(GDNativeVariantType p_type, const char *p_member) {
  277. return (GDNativePtrSetter)Variant::get_member_ptr_setter(Variant::Type(p_type), p_member);
  278. }
  279. static GDNativePtrGetter gdnative_variant_get_ptr_getter(GDNativeVariantType p_type, const char *p_member) {
  280. return (GDNativePtrGetter)Variant::get_member_ptr_getter(Variant::Type(p_type), p_member);
  281. }
  282. static GDNativePtrIndexedSetter gdnative_variant_get_ptr_indexed_setter(GDNativeVariantType p_type) {
  283. return (GDNativePtrIndexedSetter)Variant::get_member_ptr_indexed_setter(Variant::Type(p_type));
  284. }
  285. static GDNativePtrIndexedGetter gdnative_variant_get_ptr_indexed_getter(GDNativeVariantType p_type) {
  286. return (GDNativePtrIndexedGetter)Variant::get_member_ptr_indexed_getter(Variant::Type(p_type));
  287. }
  288. static GDNativePtrKeyedSetter gdnative_variant_get_ptr_keyed_setter(GDNativeVariantType p_type) {
  289. return (GDNativePtrKeyedSetter)Variant::get_member_ptr_keyed_setter(Variant::Type(p_type));
  290. }
  291. static GDNativePtrKeyedGetter gdnative_variant_get_ptr_keyed_getter(GDNativeVariantType p_type) {
  292. return (GDNativePtrKeyedGetter)Variant::get_member_ptr_keyed_getter(Variant::Type(p_type));
  293. }
  294. static GDNativePtrKeyedChecker gdnative_variant_get_ptr_keyed_checker(GDNativeVariantType p_type) {
  295. return (GDNativePtrKeyedChecker)Variant::get_member_ptr_keyed_checker(Variant::Type(p_type));
  296. }
  297. static void gdnative_variant_get_constant_value(GDNativeVariantType p_type, const char *p_constant, GDNativeVariantPtr r_ret) {
  298. memnew_placement_custom(r_ret, Variant, Variant(Variant::get_constant_value(Variant::Type(p_type), p_constant)));
  299. }
  300. static GDNativePtrUtilityFunction gdnative_variant_get_ptr_utility_function(const char *p_function, GDNativeInt p_hash) {
  301. StringName function = p_function;
  302. uint32_t hash = Variant::get_utility_function_hash(function);
  303. if (hash != p_hash) {
  304. ERR_PRINT_ONCE("Error getting utility function " + String(function) + ", hash mismatch.");
  305. return nullptr;
  306. }
  307. return (GDNativePtrUtilityFunction)Variant::get_ptr_utility_function(function);
  308. }
  309. //string helpers
  310. static void gdnative_string_new_with_latin1_chars(GDNativeStringPtr r_dest, const char *p_contents) {
  311. String *dest = (String *)r_dest;
  312. memnew_placement(dest, String);
  313. *dest = String(p_contents);
  314. }
  315. static void gdnative_string_new_with_utf8_chars(GDNativeStringPtr r_dest, const char *p_contents) {
  316. String *dest = (String *)r_dest;
  317. memnew_placement(dest, String);
  318. dest->parse_utf8(p_contents);
  319. }
  320. static void gdnative_string_new_with_utf16_chars(GDNativeStringPtr r_dest, const char16_t *p_contents) {
  321. String *dest = (String *)r_dest;
  322. memnew_placement(dest, String);
  323. dest->parse_utf16(p_contents);
  324. }
  325. static void gdnative_string_new_with_utf32_chars(GDNativeStringPtr r_dest, const char32_t *p_contents) {
  326. String *dest = (String *)r_dest;
  327. memnew_placement(dest, String);
  328. *dest = String((const char32_t *)p_contents);
  329. }
  330. static void gdnative_string_new_with_wide_chars(GDNativeStringPtr r_dest, const wchar_t *p_contents) {
  331. String *dest = (String *)r_dest;
  332. if (sizeof(wchar_t) == 2) {
  333. // wchar_t is 16 bit, parse.
  334. memnew_placement(dest, String);
  335. dest->parse_utf16((const char16_t *)p_contents);
  336. } else {
  337. // wchar_t is 32 bit, copy.
  338. memnew_placement(dest, String);
  339. *dest = String((const char32_t *)p_contents);
  340. }
  341. }
  342. static void gdnative_string_new_with_latin1_chars_and_len(GDNativeStringPtr r_dest, const char *p_contents, const GDNativeInt p_size) {
  343. String *dest = (String *)r_dest;
  344. memnew_placement(dest, String);
  345. *dest = String(p_contents, p_size);
  346. }
  347. static void gdnative_string_new_with_utf8_chars_and_len(GDNativeStringPtr r_dest, const char *p_contents, const GDNativeInt p_size) {
  348. String *dest = (String *)r_dest;
  349. memnew_placement(dest, String);
  350. dest->parse_utf8(p_contents, p_size);
  351. }
  352. static void gdnative_string_new_with_utf16_chars_and_len(GDNativeStringPtr r_dest, const char16_t *p_contents, const GDNativeInt p_size) {
  353. String *dest = (String *)r_dest;
  354. memnew_placement(dest, String);
  355. dest->parse_utf16(p_contents, p_size);
  356. }
  357. static void gdnative_string_new_with_utf32_chars_and_len(GDNativeStringPtr r_dest, const char32_t *p_contents, const GDNativeInt p_size) {
  358. String *dest = (String *)r_dest;
  359. memnew_placement(dest, String);
  360. *dest = String((const char32_t *)p_contents, p_size);
  361. }
  362. static void gdnative_string_new_with_wide_chars_and_len(GDNativeStringPtr r_dest, const wchar_t *p_contents, const GDNativeInt p_size) {
  363. String *dest = (String *)r_dest;
  364. if (sizeof(wchar_t) == 2) {
  365. // wchar_t is 16 bit, parse.
  366. memnew_placement(dest, String);
  367. dest->parse_utf16((const char16_t *)p_contents, p_size);
  368. } else {
  369. // wchar_t is 32 bit, copy.
  370. memnew_placement(dest, String);
  371. *dest = String((const char32_t *)p_contents, p_size);
  372. }
  373. }
  374. static GDNativeInt gdnative_string_to_latin1_chars(const GDNativeStringPtr p_self, char *r_text, GDNativeInt p_max_write_length) {
  375. String *self = (String *)p_self;
  376. CharString cs = self->ascii(true);
  377. GDNativeInt len = cs.length();
  378. if (r_text) {
  379. const char *s_text = cs.ptr();
  380. for (GDNativeInt i = 0; i < MIN(len, p_max_write_length); i++) {
  381. r_text[i] = s_text[i];
  382. }
  383. }
  384. return len;
  385. }
  386. static GDNativeInt gdnative_string_to_utf8_chars(const GDNativeStringPtr p_self, char *r_text, GDNativeInt p_max_write_length) {
  387. String *self = (String *)p_self;
  388. CharString cs = self->utf8();
  389. GDNativeInt len = cs.length();
  390. if (r_text) {
  391. const char *s_text = cs.ptr();
  392. for (GDNativeInt i = 0; i < MIN(len, p_max_write_length); i++) {
  393. r_text[i] = s_text[i];
  394. }
  395. }
  396. return len;
  397. }
  398. static GDNativeInt gdnative_string_to_utf16_chars(const GDNativeStringPtr p_self, char16_t *r_text, GDNativeInt p_max_write_length) {
  399. String *self = (String *)p_self;
  400. Char16String cs = self->utf16();
  401. GDNativeInt len = cs.length();
  402. if (r_text) {
  403. const char16_t *s_text = cs.ptr();
  404. for (GDNativeInt i = 0; i < MIN(len, p_max_write_length); i++) {
  405. r_text[i] = s_text[i];
  406. }
  407. }
  408. return len;
  409. }
  410. static GDNativeInt gdnative_string_to_utf32_chars(const GDNativeStringPtr p_self, char32_t *r_text, GDNativeInt p_max_write_length) {
  411. String *self = (String *)p_self;
  412. GDNativeInt len = self->length();
  413. if (r_text) {
  414. const char32_t *s_text = self->ptr();
  415. for (GDNativeInt i = 0; i < MIN(len, p_max_write_length); i++) {
  416. r_text[i] = s_text[i];
  417. }
  418. }
  419. return len;
  420. }
  421. static GDNativeInt gdnative_string_to_wide_chars(const GDNativeStringPtr p_self, wchar_t *r_text, GDNativeInt p_max_write_length) {
  422. if (sizeof(wchar_t) == 4) {
  423. return gdnative_string_to_utf32_chars(p_self, (char32_t *)r_text, p_max_write_length);
  424. } else {
  425. return gdnative_string_to_utf16_chars(p_self, (char16_t *)r_text, p_max_write_length);
  426. }
  427. }
  428. static char32_t *gdnative_string_operator_index(GDNativeStringPtr p_self, GDNativeInt p_index) {
  429. String *self = (String *)p_self;
  430. ERR_FAIL_INDEX_V(p_index, self->length() + 1, nullptr);
  431. return &self->ptrw()[p_index];
  432. }
  433. static const char32_t *gdnative_string_operator_index_const(const GDNativeStringPtr p_self, GDNativeInt p_index) {
  434. const String *self = (const String *)p_self;
  435. ERR_FAIL_INDEX_V(p_index, self->length() + 1, nullptr);
  436. return &self->ptr()[p_index];
  437. }
  438. /* OBJECT API */
  439. static void gdnative_object_method_bind_ptrcall(GDNativeMethodBindPtr p_method_bind, GDNativeObjectPtr p_instance, const GDNativeTypePtr *p_args, GDNativeTypePtr p_ret) {
  440. MethodBind *mb = (MethodBind *)p_method_bind;
  441. Object *o = (Object *)p_instance;
  442. mb->ptrcall(o, (const void **)p_args, p_ret);
  443. }
  444. static void gdnative_object_destroy(GDNativeObjectPtr p_o) {
  445. memdelete((Object *)p_o);
  446. }
  447. static GDNativeObjectPtr gdnative_global_get_singleton(const char *p_name) {
  448. return (GDNativeObjectPtr)Engine::get_singleton()->get_singleton_object(String(p_name));
  449. }
  450. static GDNativeObjectPtr gdnative_object_get_instance_from_id(GDObjectInstanceID p_instance_id) {
  451. return (GDNativeObjectPtr)ObjectDB::get_instance(ObjectID(p_instance_id));
  452. }
  453. static GDNativeObjectPtr gdnative_object_cast_to(const GDNativeObjectPtr p_object, void *p_class_tag) {
  454. if (!p_object) {
  455. return nullptr;
  456. }
  457. Object *o = (Object *)p_object;
  458. return o->is_class_ptr(p_class_tag) ? (GDNativeObjectPtr)o : (GDNativeObjectPtr) nullptr;
  459. }
  460. static GDObjectInstanceID gdnative_object_get_instance_id(const GDNativeObjectPtr p_object) {
  461. const Object *o = (const Object *)p_object;
  462. return (GDObjectInstanceID)o->get_instance_id();
  463. }
  464. static GDNativeMethodBindPtr gdnative_classdb_get_method_bind(const char *p_classname, const char *p_methodname, GDNativeInt p_hash) {
  465. MethodBind *mb = ClassDB::get_method(StringName(p_classname), StringName(p_methodname));
  466. ERR_FAIL_COND_V(!mb, nullptr);
  467. if (mb->get_hash() != p_hash) {
  468. ERR_PRINT_ONCE("Hash mismatch for method '" + String(p_classname) + "." + String(p_methodname) + "'.");
  469. return nullptr;
  470. }
  471. // MethodBind *mb = ClassDB::get_method("Node", "get_name");
  472. return (GDNativeMethodBindPtr)mb;
  473. }
  474. static GDNativeClassConstructor gdnative_classdb_get_constructor(const char *p_classname) {
  475. ClassDB::ClassInfo *class_info = ClassDB::classes.getptr(StringName(p_classname));
  476. if (class_info) {
  477. return (GDNativeClassConstructor)class_info->creation_func;
  478. }
  479. return nullptr;
  480. }
  481. static void *gdnative_classdb_get_class_tag(const char *p_classname) {
  482. ClassDB::ClassInfo *class_info = ClassDB::classes.getptr(p_classname);
  483. return class_info ? class_info->class_ptr : nullptr;
  484. }
  485. void gdnative_setup_interface(GDNativeInterface *p_interface) {
  486. GDNativeInterface &gdni = *p_interface;
  487. gdni.version_major = VERSION_MAJOR;
  488. gdni.version_minor = VERSION_MINOR;
  489. #if VERSION_PATCH
  490. gdni.version_patch = VERSION_PATCH;
  491. #else
  492. gdni.version_patch = 0;
  493. #endif
  494. gdni.version_string = VERSION_FULL_NAME;
  495. /* GODOT CORE */
  496. gdni.mem_alloc = gdnative_alloc;
  497. gdni.mem_realloc = gdnative_realloc;
  498. gdni.mem_free = gdnative_free;
  499. gdni.print_error = gdnative_print_error;
  500. gdni.print_warning = gdnative_print_warning;
  501. gdni.print_script_error = gdnative_print_script_error;
  502. /* GODOT VARIANT */
  503. // variant general
  504. gdni.variant_new_copy = gdnative_variant_new_copy;
  505. gdni.variant_new_nil = gdnative_variant_new_nil;
  506. gdni.variant_destroy = gdnative_variant_destroy;
  507. gdni.variant_call = gdnative_variant_call;
  508. gdni.variant_call_static = gdnative_variant_call_static;
  509. gdni.variant_evaluate = gdnative_variant_evaluate;
  510. gdni.variant_set = gdnative_variant_set;
  511. gdni.variant_set_named = gdnative_variant_set_named;
  512. gdni.variant_set_keyed = gdnative_variant_set_keyed;
  513. gdni.variant_set_indexed = gdnative_variant_set_indexed;
  514. gdni.variant_get = gdnative_variant_get;
  515. gdni.variant_get_named = gdnative_variant_get_named;
  516. gdni.variant_get_keyed = gdnative_variant_get_keyed;
  517. gdni.variant_get_indexed = gdnative_variant_get_indexed;
  518. gdni.variant_iter_init = gdnative_variant_iter_init;
  519. gdni.variant_iter_next = gdnative_variant_iter_next;
  520. gdni.variant_iter_get = gdnative_variant_iter_get;
  521. gdni.variant_hash_compare = gdnative_variant_hash_compare;
  522. gdni.variant_booleanize = gdnative_variant_booleanize;
  523. gdni.variant_blend = gdnative_variant_blend;
  524. gdni.variant_interpolate = gdnative_variant_interpolate;
  525. gdni.variant_duplicate = gdnative_variant_duplicate;
  526. gdni.variant_stringify = gdnative_variant_stringify;
  527. gdni.variant_get_type = gdnative_variant_get_type;
  528. gdni.variant_has_method = gdnative_variant_has_method;
  529. gdni.variant_has_member = gdnative_variant_has_member;
  530. gdni.variant_has_key = gdnative_variant_has_key;
  531. gdni.variant_get_type_name = gdnative_variant_get_type_name;
  532. gdni.variant_can_convert = gdnative_variant_can_convert;
  533. gdni.variant_can_convert_strict = gdnative_variant_can_convert_strict;
  534. //ptrcalls
  535. #if 0
  536. GDNativeVariantFromTypeConstructorFunc (*get_variant_from_type_constructor)(GDNativeVariantType p_type);
  537. GDNativeTypeFromVariantConstructorFunc (*get_variant_to_type_constructor)(GDNativeVariantType p_type);
  538. #endif
  539. gdni.variant_get_ptr_operator_evaluator = gdnative_variant_get_ptr_operator_evaluator;
  540. gdni.variant_get_ptr_builtin_method = gdnative_variant_get_ptr_builtin_method;
  541. gdni.variant_get_ptr_constructor = gdnative_variant_get_ptr_constructor;
  542. gdni.variant_construct = gdnative_variant_construct;
  543. gdni.variant_get_ptr_setter = gdnative_variant_get_ptr_setter;
  544. gdni.variant_get_ptr_getter = gdnative_variant_get_ptr_getter;
  545. gdni.variant_get_ptr_indexed_setter = gdnative_variant_get_ptr_indexed_setter;
  546. gdni.variant_get_ptr_indexed_getter = gdnative_variant_get_ptr_indexed_getter;
  547. gdni.variant_get_ptr_keyed_setter = gdnative_variant_get_ptr_keyed_setter;
  548. gdni.variant_get_ptr_keyed_getter = gdnative_variant_get_ptr_keyed_getter;
  549. gdni.variant_get_ptr_keyed_checker = gdnative_variant_get_ptr_keyed_checker;
  550. gdni.variant_get_constant_value = gdnative_variant_get_constant_value;
  551. gdni.variant_get_ptr_utility_function = gdnative_variant_get_ptr_utility_function;
  552. // extra utilities
  553. gdni.string_new_with_latin1_chars = gdnative_string_new_with_latin1_chars;
  554. gdni.string_new_with_utf8_chars = gdnative_string_new_with_utf8_chars;
  555. gdni.string_new_with_utf16_chars = gdnative_string_new_with_utf16_chars;
  556. gdni.string_new_with_utf32_chars = gdnative_string_new_with_utf32_chars;
  557. gdni.string_new_with_wide_chars = gdnative_string_new_with_wide_chars;
  558. gdni.string_new_with_latin1_chars_and_len = gdnative_string_new_with_latin1_chars_and_len;
  559. gdni.string_new_with_utf8_chars_and_len = gdnative_string_new_with_utf8_chars_and_len;
  560. gdni.string_new_with_utf16_chars_and_len = gdnative_string_new_with_utf16_chars_and_len;
  561. gdni.string_new_with_utf32_chars_and_len = gdnative_string_new_with_utf32_chars_and_len;
  562. gdni.string_new_with_wide_chars_and_len = gdnative_string_new_with_wide_chars_and_len;
  563. gdni.string_to_latin1_chars = gdnative_string_to_latin1_chars;
  564. gdni.string_to_utf8_chars = gdnative_string_to_utf8_chars;
  565. gdni.string_to_utf16_chars = gdnative_string_to_utf16_chars;
  566. gdni.string_to_utf32_chars = gdnative_string_to_utf32_chars;
  567. gdni.string_to_wide_chars = gdnative_string_to_wide_chars;
  568. gdni.string_operator_index = gdnative_string_operator_index;
  569. gdni.string_operator_index_const = gdnative_string_operator_index_const;
  570. /* OBJECT */
  571. gdni.object_method_bind_ptrcall = gdnative_object_method_bind_ptrcall;
  572. gdni.object_destroy = gdnative_object_destroy;
  573. gdni.global_get_singleton = gdnative_global_get_singleton;
  574. gdni.object_cast_to = gdnative_object_cast_to;
  575. gdni.object_get_instance_from_id = gdnative_object_get_instance_from_id;
  576. gdni.object_get_instance_id = gdnative_object_get_instance_id;
  577. /* CLASSDB */
  578. gdni.classdb_get_constructor = gdnative_classdb_get_constructor;
  579. gdni.classdb_get_method_bind = gdnative_classdb_get_method_bind;
  580. gdni.classdb_get_class_tag = gdnative_classdb_get_class_tag;
  581. /* CLASSDB EXTENSION */
  582. //these are filled by implementation, since it will want to keep track of registered classes
  583. gdni.classdb_register_extension_class = nullptr;
  584. gdni.classdb_register_extension_class_method = nullptr;
  585. gdni.classdb_register_extension_class_integer_constant = nullptr;
  586. gdni.classdb_register_extension_class_property = nullptr;
  587. gdni.classdb_register_extension_class_signal = nullptr;
  588. gdni.classdb_unregister_extension_class = nullptr;
  589. }