Skip to content

Commit 4218f93

Browse files
authored
Merge pull request #1821 from dsnopek/mem-alloc-pad-align
Update to use `mem_alloc2`, `mem_realloc2` and `mem_free2`
2 parents 12db068 + 48d02db commit 4218f93

File tree

4 files changed

+54
-53
lines changed

4 files changed

+54
-53
lines changed

gdextension/gdextension_interface.h

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -858,6 +858,7 @@ typedef void (*GDExtensionInterfaceGetGodotVersion2)(GDExtensionGodotVersion2 *r
858858
/**
859859
* @name mem_alloc
860860
* @since 4.1
861+
* @deprecated in Godot 4.6. Use `mem_alloc2` instead.
861862
*
862863
* Allocates memory.
863864
*
@@ -870,6 +871,7 @@ typedef void *(*GDExtensionInterfaceMemAlloc)(size_t p_bytes);
870871
/**
871872
* @name mem_realloc
872873
* @since 4.1
874+
* @deprecated in Godot 4.6. Use `mem_realloc2` instead.
873875
*
874876
* Reallocates memory.
875877
*
@@ -883,14 +885,53 @@ typedef void *(*GDExtensionInterfaceMemRealloc)(void *p_ptr, size_t p_bytes);
883885
/**
884886
* @name mem_free
885887
* @since 4.1
888+
* @deprecated in Godot 4.6. Use `mem_free2` instead.
886889
*
887890
* Frees memory.
888891
*
889892
* @param p_ptr A pointer to the previously allocated memory.
890893
*/
891894
typedef void (*GDExtensionInterfaceMemFree)(void *p_ptr);
892895

893-
/* INTERFACE: Godot Core */
896+
/**
897+
* @name mem_alloc2
898+
* @since 4.6
899+
*
900+
* Allocates memory.
901+
*
902+
* @param p_bytes The amount of memory to allocate in bytes.
903+
* @param p_pad_align If true, the returned memory will have prepadding of at least 8 bytes.
904+
*
905+
* @return A pointer to the allocated memory, or NULL if unsuccessful.
906+
*/
907+
typedef void *(*GDExtensionInterfaceMemAlloc2)(size_t p_bytes, GDExtensionBool p_pad_align);
908+
909+
/**
910+
* @name mem_realloc2
911+
* @since 4.6
912+
*
913+
* Reallocates memory.
914+
*
915+
* @param p_ptr A pointer to the previously allocated memory.
916+
* @param p_bytes The number of bytes to resize the memory block to.
917+
* @param p_pad_align If true, the returned memory will have prepadding of at least 8 bytes.
918+
*
919+
* @return A pointer to the allocated memory, or NULL if unsuccessful.
920+
*/
921+
typedef void *(*GDExtensionInterfaceMemRealloc2)(void *p_ptr, size_t p_bytes, GDExtensionBool p_pad_align);
922+
923+
/**
924+
* @name mem_free2
925+
* @since 4.6
926+
*
927+
* Frees memory.
928+
*
929+
* @param p_ptr A pointer to the previously allocated memory.
930+
* @param p_pad_align If true, the given memory was allocated with prepadding.
931+
*/
932+
typedef void (*GDExtensionInterfaceMemFree2)(void *p_ptr, GDExtensionBool p_pad_align);
933+
934+
//* INTERFACE: Godot Core */
894935

895936
/**
896937
* @name print_error

include/godot_cpp/godot.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ extern "C" GDExtensionGodotVersion2 godot_version;
4444

4545
// All of the GDExtension interface functions.
4646
extern "C" GDExtensionInterfaceGetGodotVersion2 gdextension_interface_get_godot_version2;
47-
extern "C" GDExtensionInterfaceMemAlloc gdextension_interface_mem_alloc;
48-
extern "C" GDExtensionInterfaceMemRealloc gdextension_interface_mem_realloc;
49-
extern "C" GDExtensionInterfaceMemFree gdextension_interface_mem_free;
47+
extern "C" GDExtensionInterfaceMemAlloc2 gdextension_interface_mem_alloc2;
48+
extern "C" GDExtensionInterfaceMemRealloc2 gdextension_interface_mem_realloc2;
49+
extern "C" GDExtensionInterfaceMemFree2 gdextension_interface_mem_free2;
5050
extern "C" GDExtensionInterfacePrintError gdextension_interface_print_error;
5151
extern "C" GDExtensionInterfacePrintErrorWithMessage gdextension_interface_print_error_with_message;
5252
extern "C" GDExtensionInterfacePrintWarning gdextension_interface_print_warning;

src/core/memory.cpp

Lines changed: 3 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -35,21 +35,7 @@
3535
namespace godot {
3636

3737
void *Memory::alloc_static(size_t p_bytes, bool p_pad_align) {
38-
#ifdef DEBUG_ENABLED
39-
bool prepad = false; // Already pre paded in the engine.
40-
#else
41-
bool prepad = p_pad_align;
42-
#endif
43-
44-
void *mem = internal::gdextension_interface_mem_alloc(p_bytes + (prepad ? DATA_OFFSET : 0));
45-
ERR_FAIL_NULL_V(mem, nullptr);
46-
47-
if (prepad) {
48-
uint8_t *s8 = (uint8_t *)mem;
49-
return s8 + DATA_OFFSET;
50-
} else {
51-
return mem;
52-
}
38+
return internal::gdextension_interface_mem_alloc2(p_bytes, p_pad_align);
5339
}
5440

5541
void *Memory::realloc_static(void *p_memory, size_t p_bytes, bool p_pad_align) {
@@ -60,37 +46,11 @@ void *Memory::realloc_static(void *p_memory, size_t p_bytes, bool p_pad_align) {
6046
return nullptr;
6147
}
6248

63-
uint8_t *mem = (uint8_t *)p_memory;
64-
65-
#ifdef DEBUG_ENABLED
66-
bool prepad = false; // Already pre paded in the engine.
67-
#else
68-
bool prepad = p_pad_align;
69-
#endif
70-
71-
if (prepad) {
72-
mem -= DATA_OFFSET;
73-
mem = (uint8_t *)internal::gdextension_interface_mem_realloc(mem, p_bytes + DATA_OFFSET);
74-
ERR_FAIL_NULL_V(mem, nullptr);
75-
return mem + DATA_OFFSET;
76-
} else {
77-
return (uint8_t *)internal::gdextension_interface_mem_realloc(mem, p_bytes);
78-
}
49+
return internal::gdextension_interface_mem_realloc2(p_memory, p_bytes, p_pad_align);
7950
}
8051

8152
void Memory::free_static(void *p_ptr, bool p_pad_align) {
82-
uint8_t *mem = (uint8_t *)p_ptr;
83-
84-
#ifdef DEBUG_ENABLED
85-
bool prepad = false; // Already pre paded in the engine.
86-
#else
87-
bool prepad = p_pad_align;
88-
#endif
89-
90-
if (prepad) {
91-
mem -= DATA_OFFSET;
92-
}
93-
internal::gdextension_interface_mem_free(mem);
53+
internal::gdextension_interface_mem_free2(p_ptr, p_pad_align);
9454
}
9555

9656
_GlobalNil::_GlobalNil() {

src/godot.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,9 @@ GDExtensionGodotVersion2 godot_version = {};
5353

5454
// All of the GDExtension interface functions.
5555
GDExtensionInterfaceGetGodotVersion2 gdextension_interface_get_godot_version2 = nullptr;
56-
GDExtensionInterfaceMemAlloc gdextension_interface_mem_alloc = nullptr;
57-
GDExtensionInterfaceMemRealloc gdextension_interface_mem_realloc = nullptr;
58-
GDExtensionInterfaceMemFree gdextension_interface_mem_free = nullptr;
56+
GDExtensionInterfaceMemAlloc2 gdextension_interface_mem_alloc2 = nullptr;
57+
GDExtensionInterfaceMemRealloc2 gdextension_interface_mem_realloc2 = nullptr;
58+
GDExtensionInterfaceMemFree2 gdextension_interface_mem_free2 = nullptr;
5959
GDExtensionInterfacePrintError gdextension_interface_print_error = nullptr;
6060
GDExtensionInterfacePrintErrorWithMessage gdextension_interface_print_error_with_message = nullptr;
6161
GDExtensionInterfacePrintWarning gdextension_interface_print_warning = nullptr;
@@ -339,9 +339,9 @@ GDExtensionBool GDExtensionBinding::init(GDExtensionInterfaceGetProcAddress p_ge
339339
return false;
340340
}
341341

342-
LOAD_PROC_ADDRESS(mem_alloc, GDExtensionInterfaceMemAlloc);
343-
LOAD_PROC_ADDRESS(mem_realloc, GDExtensionInterfaceMemRealloc);
344-
LOAD_PROC_ADDRESS(mem_free, GDExtensionInterfaceMemFree);
342+
LOAD_PROC_ADDRESS(mem_alloc2, GDExtensionInterfaceMemAlloc2);
343+
LOAD_PROC_ADDRESS(mem_realloc2, GDExtensionInterfaceMemRealloc2);
344+
LOAD_PROC_ADDRESS(mem_free2, GDExtensionInterfaceMemFree2);
345345
LOAD_PROC_ADDRESS(print_error_with_message, GDExtensionInterfacePrintErrorWithMessage);
346346
LOAD_PROC_ADDRESS(print_warning, GDExtensionInterfacePrintWarning);
347347
LOAD_PROC_ADDRESS(print_warning_with_message, GDExtensionInterfacePrintWarningWithMessage);

0 commit comments

Comments
 (0)