Skip to content

Commit 80e5346

Browse files
committed
Update to use mem_alloc2, mem_realloc2 and mem_free2
1 parent 8bb931c commit 80e5346

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
@@ -856,6 +856,7 @@ typedef void (*GDExtensionInterfaceGetGodotVersion2)(GDExtensionGodotVersion2 *r
856856
/**
857857
* @name mem_alloc
858858
* @since 4.1
859+
* @deprecated in Godot 4.6. Use `mem_alloc2` instead.
859860
*
860861
* Allocates memory.
861862
*
@@ -868,6 +869,7 @@ typedef void *(*GDExtensionInterfaceMemAlloc)(size_t p_bytes);
868869
/**
869870
* @name mem_realloc
870871
* @since 4.1
872+
* @deprecated in Godot 4.6. Use `mem_realloc2` instead.
871873
*
872874
* Reallocates memory.
873875
*
@@ -881,14 +883,53 @@ typedef void *(*GDExtensionInterfaceMemRealloc)(void *p_ptr, size_t p_bytes);
881883
/**
882884
* @name mem_free
883885
* @since 4.1
886+
* @deprecated in Godot 4.6. Use `mem_free2` instead.
884887
*
885888
* Frees memory.
886889
*
887890
* @param p_ptr A pointer to the previously allocated memory.
888891
*/
889892
typedef void (*GDExtensionInterfaceMemFree)(void *p_ptr);
890893

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

893934
/**
894935
* @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 = false;
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 = false;
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 = false;
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
@@ -51,9 +51,9 @@ GDExtensionGodotVersion2 godot_version = {};
5151

5252
// All of the GDExtension interface functions.
5353
GDExtensionInterfaceGetGodotVersion2 gdextension_interface_get_godot_version2 = nullptr;
54-
GDExtensionInterfaceMemAlloc gdextension_interface_mem_alloc = nullptr;
55-
GDExtensionInterfaceMemRealloc gdextension_interface_mem_realloc = nullptr;
56-
GDExtensionInterfaceMemFree gdextension_interface_mem_free = nullptr;
54+
GDExtensionInterfaceMemAlloc2 gdextension_interface_mem_alloc2 = nullptr;
55+
GDExtensionInterfaceMemRealloc2 gdextension_interface_mem_realloc2 = nullptr;
56+
GDExtensionInterfaceMemFree2 gdextension_interface_mem_free2 = nullptr;
5757
GDExtensionInterfacePrintError gdextension_interface_print_error = nullptr;
5858
GDExtensionInterfacePrintErrorWithMessage gdextension_interface_print_error_with_message = nullptr;
5959
GDExtensionInterfacePrintWarning gdextension_interface_print_warning = nullptr;
@@ -337,9 +337,9 @@ GDExtensionBool GDExtensionBinding::init(GDExtensionInterfaceGetProcAddress p_ge
337337
return false;
338338
}
339339

340-
LOAD_PROC_ADDRESS(mem_alloc, GDExtensionInterfaceMemAlloc);
341-
LOAD_PROC_ADDRESS(mem_realloc, GDExtensionInterfaceMemRealloc);
342-
LOAD_PROC_ADDRESS(mem_free, GDExtensionInterfaceMemFree);
340+
LOAD_PROC_ADDRESS(mem_alloc2, GDExtensionInterfaceMemAlloc2);
341+
LOAD_PROC_ADDRESS(mem_realloc2, GDExtensionInterfaceMemRealloc2);
342+
LOAD_PROC_ADDRESS(mem_free2, GDExtensionInterfaceMemFree2);
343343
LOAD_PROC_ADDRESS(print_error_with_message, GDExtensionInterfacePrintErrorWithMessage);
344344
LOAD_PROC_ADDRESS(print_warning, GDExtensionInterfacePrintWarning);
345345
LOAD_PROC_ADDRESS(print_warning_with_message, GDExtensionInterfacePrintWarningWithMessage);

0 commit comments

Comments
 (0)