Skip to content

Commit cfdc058

Browse files
committed
Update to use mem_alloc2, mem_realloc2 and mem_free2
1 parent 12db068 commit cfdc058

File tree

4 files changed

+58
-36
lines changed

4 files changed

+58
-36
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: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -36,20 +36,15 @@ namespace godot {
3636

3737
void *Memory::alloc_static(size_t p_bytes, bool p_pad_align) {
3838
#ifdef DEBUG_ENABLED
39-
bool prepad = false; // Already pre paded in the engine.
39+
bool prepad = true;
4040
#else
4141
bool prepad = p_pad_align;
4242
#endif
4343

44-
void *mem = internal::gdextension_interface_mem_alloc(p_bytes + (prepad ? DATA_OFFSET : 0));
44+
void *mem = internal::gdextension_interface_mem_alloc2(p_bytes, prepad);
4545
ERR_FAIL_NULL_V(mem, nullptr);
4646

47-
if (prepad) {
48-
uint8_t *s8 = (uint8_t *)mem;
49-
return s8 + DATA_OFFSET;
50-
} else {
51-
return mem;
52-
}
47+
return mem;
5348
}
5449

5550
void *Memory::realloc_static(void *p_memory, size_t p_bytes, bool p_pad_align) {
@@ -60,37 +55,23 @@ void *Memory::realloc_static(void *p_memory, size_t p_bytes, bool p_pad_align) {
6055
return nullptr;
6156
}
6257

63-
uint8_t *mem = (uint8_t *)p_memory;
64-
6558
#ifdef DEBUG_ENABLED
66-
bool prepad = false; // Already pre paded in the engine.
59+
bool prepad = true;
6760
#else
6861
bool prepad = p_pad_align;
6962
#endif
7063

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-
}
64+
return internal::gdextension_interface_mem_realloc2(p_memory, p_bytes, prepad);
7965
}
8066

8167
void Memory::free_static(void *p_ptr, bool p_pad_align) {
82-
uint8_t *mem = (uint8_t *)p_ptr;
83-
8468
#ifdef DEBUG_ENABLED
85-
bool prepad = false; // Already pre paded in the engine.
69+
bool prepad = true;
8670
#else
8771
bool prepad = p_pad_align;
8872
#endif
8973

90-
if (prepad) {
91-
mem -= DATA_OFFSET;
92-
}
93-
internal::gdextension_interface_mem_free(mem);
74+
internal::gdextension_interface_mem_free2(p_ptr, p_pad_align);
9475
}
9576

9677
_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)