Skip to content

Commit 6f3472a

Browse files
committed
Cool kids use PyMem_Malloc/Free instead of stdlib's malloc/free
1 parent f754a37 commit 6f3472a

File tree

3 files changed

+28
-28
lines changed

3 files changed

+28
-28
lines changed

src/gdpy_libgodot.pyx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from libc.stdlib cimport malloc, free
1+
from cpython.mem cimport PyMem_Malloc, PyMem_Free
22
from threading import Lock
33
from contextlib import contextmanager
44

@@ -66,7 +66,7 @@ cdef GDExtensionObjectPtr _create_godot_instance(argv: list[str]):
6666
a.encode("utf8") for a in argv
6767
]
6868
cdef int length = len(argv)
69-
cdef char **c_argv = <char **>malloc(length * sizeof(char*))
69+
cdef char **c_argv = <char **>PyMem_Malloc(length * sizeof(char*))
7070
assert c_argv != NULL
7171
try:
7272
for i in range(length):
@@ -81,7 +81,7 @@ cdef GDExtensionObjectPtr _create_godot_instance(argv: list[str]):
8181
)
8282

8383
finally:
84-
free(c_argv)
84+
PyMem_Free(c_argv)
8585

8686

8787
#

src/godot/hazmat/extension_class.pxd

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
cimport cython
22
from cpython.ref cimport Py_INCREF, Py_DECREF
33
from libc.string cimport strcmp
4-
from libc.stdlib cimport malloc, free
4+
from cpython.mem cimport PyMem_Malloc, PyMem_Free
55

66
from .gdextension_interface cimport *
77
from .gdapi cimport *
@@ -127,32 +127,32 @@ cdef inline void _extension_class_method_get_argument_info(void* p_method_userda
127127

128128
if p_argument == -1:
129129
r_info.type = _type_name_to_gdnative_variant_type(spec.return_type)
130-
r_info.name = malloc(sizeof(gd_string_name_t))
130+
r_info.name = PyMem_Malloc(sizeof(gd_string_name_t))
131131
(<gd_string_name_t*>r_info.name)[0] = gd_string_name_from_pybytes(b"")
132132
else:
133133
arg_name, type_name = spec.arguments_type[p_argument]
134134
r_info.type = _type_name_to_gdnative_variant_type(type_name)
135-
r_info.name = malloc(sizeof(gd_string_name_t))
135+
r_info.name = PyMem_Malloc(sizeof(gd_string_name_t))
136136
(<gd_string_name_t*>r_info.name)[0] = gd_string_name_from_pybytes(arg_name)
137137

138-
r_info.class_name = malloc(sizeof(gd_string_name_t))
138+
r_info.class_name = PyMem_Malloc(sizeof(gd_string_name_t))
139139
(<gd_string_name_t*>r_info.class_name)[0] = gd_string_name_from_pybytes(spec.class_name)
140140

141141
# TODO: finish that !
142142
r_info.hint = PROPERTY_HINT_NONE
143-
r_info.hint_string = malloc(sizeof(gd_string_t))
143+
r_info.hint_string = PyMem_Malloc(sizeof(gd_string_t))
144144
(<gd_string_t*>r_info.hint_string)[0] = gd_string_from_pybytes(b"")
145145
r_info.usage = PROPERTY_USAGE_DEFAULT
146146

147147

148148
cdef inline void _extension_class_method_empty_argument_info(GDExtensionPropertyInfo* r_info) noexcept with gil:
149149
r_info.type = GDEXTENSION_VARIANT_TYPE_NIL
150-
r_info.name = malloc(sizeof(gd_string_name_t))
150+
r_info.name = PyMem_Malloc(sizeof(gd_string_name_t))
151151
(<gd_string_name_t*>r_info.name)[0] = gd_string_name_from_pybytes(b"")
152-
r_info.class_name = malloc(sizeof(gd_string_name_t))
152+
r_info.class_name = PyMem_Malloc(sizeof(gd_string_name_t))
153153
(<gd_string_name_t*>r_info.class_name)[0] = gd_string_name_from_pybytes(b"")
154154
r_info.hint = PROPERTY_HINT_NONE
155-
r_info.hint_string = malloc(sizeof(gd_string_t))
155+
r_info.hint_string = PyMem_Malloc(sizeof(gd_string_t))
156156
(<gd_string_t*>r_info.hint_string)[0] = gd_string_from_pybytes(b"")
157157
r_info.usage = PROPERTY_USAGE_DEFAULT
158158

@@ -337,7 +337,7 @@ cdef inline void register_extension_class_method(
337337
else:
338338
info.method_flags = GDEXTENSION_METHOD_FLAG_NORMAL
339339

340-
info.return_value_info = <GDExtensionPropertyInfo*>malloc(sizeof(GDExtensionPropertyInfo))
340+
info.return_value_info = <GDExtensionPropertyInfo*>PyMem_Malloc(sizeof(GDExtensionPropertyInfo))
341341
if return_type == b"void":
342342
info.has_return_value = False # gd_bool_t
343343
info.return_value_metadata = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE # Dummy default
@@ -351,8 +351,8 @@ cdef inline void register_extension_class_method(
351351
info.argument_count = <uint32_t>len(arguments_type) # uint32_t
352352

353353
if info.argument_count > 0:
354-
info.arguments_info = <GDExtensionPropertyInfo*>malloc(sizeof(GDExtensionPropertyInfo) * info.argument_count)
355-
info.arguments_metadata = <GDExtensionClassMethodArgumentMetadata*>malloc(sizeof(GDExtensionClassMethodArgumentMetadata) * info.argument_count)
354+
info.arguments_info = <GDExtensionPropertyInfo*>PyMem_Malloc(sizeof(GDExtensionPropertyInfo) * info.argument_count)
355+
info.arguments_metadata = <GDExtensionClassMethodArgumentMetadata*>PyMem_Malloc(sizeof(GDExtensionClassMethodArgumentMetadata) * info.argument_count)
356356
else:
357357
info.arguments_info = NULL # GDExtensionPropertyInfo *
358358
info.arguments_metadata = NULL # GDExtensionClassMethodArgumentMetadata *
@@ -381,31 +381,31 @@ cdef inline void register_extension_class_method(
381381
gd_string_name_del(&gd_method_name)
382382

383383
gd_string_name_del(<gd_string_name_t*>info.return_value_info.name)
384-
free(info.return_value_info.name)
384+
PyMem_Free(info.return_value_info.name)
385385

386386
gd_string_name_del(<gd_string_name_t*>info.return_value_info.class_name)
387-
free(info.return_value_info.class_name)
387+
PyMem_Free(info.return_value_info.class_name)
388388

389389
gd_string_del(<gd_string_t*>info.return_value_info.hint_string)
390-
free(info.return_value_info.hint_string)
390+
PyMem_Free(info.return_value_info.hint_string)
391391

392-
free(info.return_value_info)
392+
PyMem_Free(info.return_value_info)
393393

394394
for i, _ in enumerate(arguments_type):
395395
gd_string_name_del(<gd_string_name_t*>info.arguments_info[i].name)
396-
free(info.arguments_info[i].name)
396+
PyMem_Free(info.arguments_info[i].name)
397397

398398
gd_string_name_del(<gd_string_name_t*>info.arguments_info[i].class_name)
399-
free(info.arguments_info[i].class_name)
399+
PyMem_Free(info.arguments_info[i].class_name)
400400

401401
gd_string_del(<gd_string_t*>info.arguments_info[i].hint_string)
402-
free(info.arguments_info[i].hint_string)
402+
PyMem_Free(info.arguments_info[i].hint_string)
403403

404404
if info.arguments_info != NULL:
405-
free(info.arguments_info)
405+
PyMem_Free(info.arguments_info)
406406

407407
if info.arguments_metadata != NULL:
408-
free(info.arguments_metadata)
408+
PyMem_Free(info.arguments_metadata)
409409

410410
# TODO: free `info.default_arguments`
411411

src/godot/utils.pyx.j2

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ def {{ utility.name }}(*args):
1313
gd_args_ptrs_stack[i] = &gd_args_stack[i]
1414
gd_args_ptrs = <gd_variant_t **>&gd_args_ptrs_stack
1515
else:
16-
gd_args_heap = <gd_variant_t*>malloc(sizeof(gd_variant_t) * len(args))
17-
gd_args_ptrs_heap = <gd_variant_t**>malloc(sizeof(gd_variant_t*) * len(args))
16+
gd_args_heap = <gd_variant_t*>PyMem_Malloc(sizeof(gd_variant_t) * len(args))
17+
gd_args_ptrs_heap = <gd_variant_t**>PyMem_Malloc(sizeof(gd_variant_t*) * len(args))
1818
for i, arg in enumerate(args):
1919
gd_args_heap[i] = ensure_is_gdany_and_borrow_ref(arg)
2020
gd_args_ptrs_heap[i] = &gd_args_heap[i]
@@ -36,8 +36,8 @@ def {{ utility.name }}(*args):
3636
)
3737
# Note we don't need to destroy the variants since they have only borrowed their data from the PyObjects
3838
if not stack_args_passing:
39-
free(gd_args_heap)
40-
free(gd_args_ptrs_heap)
39+
PyMem_Free(gd_args_heap)
40+
PyMem_Free(gd_args_ptrs_heap)
4141
{# 4) Optional return value conversion #}
4242
{% if not utility.return_type.is_nil %}
4343
{% if utility.return_type.is_object %}
@@ -128,7 +128,7 @@ BaseGDObject {{ arg.name }}
128128
{% endmacro -%}
129129

130130

131-
from libc.stdlib cimport malloc, free
131+
from cpython.mem cimport PyMem_Malloc, PyMem_Free
132132
from godot.hazmat cimport gdapi
133133
from godot.hazmat.gdtypes cimport *
134134
from godot.builtins cimport *

0 commit comments

Comments
 (0)