Skip to content

Commit 7ad0bf3

Browse files
committed
Synchronize gdextension_interface.h with Godot
1 parent 1c18413 commit 7ad0bf3

File tree

1 file changed

+49
-27
lines changed

1 file changed

+49
-27
lines changed

gdextension/gdextension_interface.h

Lines changed: 49 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -139,16 +139,37 @@ typedef enum {
139139

140140
} GDExtensionVariantOperator;
141141

142+
// In this API there are multiple functions which expect the caller to pass a pointer
143+
// on return value as parameter.
144+
// In order to make it clear if the caller should initialize the return value or not
145+
// we have two flavor of types:
146+
// - `GDExtensionXXXPtr` for pointer on an initialized value
147+
// - `GDExtensionUninitializedXXXPtr` for pointer on uninitialized value
148+
//
149+
// Notes:
150+
// - Not respecting those requirements can seems harmless, but will lead to unexpected
151+
// segfault or memory leak (for instance with a specific compiler/OS, or when two
152+
// native extensions start doing ptrcall on each other).
153+
// - Initialization must be done with the function pointer returned by `variant_get_ptr_constructor`,
154+
// zero-initializing the variable should not be considered a valid initialization method here !
155+
// - Some types have no destructor (see `extension_api.json`'s `has_destructor` field), for
156+
// them it is always safe to skip the constructor for the return value if you are in a hurry ;-)
157+
142158
typedef void *GDExtensionVariantPtr;
143159
typedef const void *GDExtensionConstVariantPtr;
160+
typedef void *GDExtensionUninitializedVariantPtr;
144161
typedef void *GDExtensionStringNamePtr;
145162
typedef const void *GDExtensionConstStringNamePtr;
163+
typedef void *GDExtensionUninitializedStringNamePtr;
146164
typedef void *GDExtensionStringPtr;
147165
typedef const void *GDExtensionConstStringPtr;
166+
typedef void *GDExtensionUninitializedStringPtr;
148167
typedef void *GDExtensionObjectPtr;
149168
typedef const void *GDExtensionConstObjectPtr;
169+
typedef void *GDExtensionUninitializedObjectPtr;
150170
typedef void *GDExtensionTypePtr;
151171
typedef const void *GDExtensionConstTypePtr;
172+
typedef void *GDExtensionUninitializedTypePtr;
152173
typedef const void *GDExtensionMethodBindPtr;
153174
typedef int64_t GDExtensionInt;
154175
typedef uint8_t GDExtensionBool;
@@ -295,6 +316,7 @@ typedef enum {
295316
} GDExtensionClassMethodArgumentMetadata;
296317

297318
typedef void (*GDExtensionClassMethodCall)(void *method_userdata, GDExtensionClassInstancePtr p_instance, const GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argument_count, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error);
319+
typedef void (*GDExtensionClassMethodValidatedCall)(void *method_userdata, GDExtensionClassInstancePtr p_instance, const GDExtensionConstVariantPtr *p_args, GDExtensionVariantPtr r_return);
298320
typedef void (*GDExtensionClassMethodPtrCall)(void *method_userdata, GDExtensionClassInstancePtr p_instance, const GDExtensionConstTypePtr *p_args, GDExtensionTypePtr r_ret);
299321

300322
typedef struct {
@@ -613,7 +635,7 @@ typedef uint64_t (*GDExtensionInterfaceGetNativeStructSize)(GDExtensionConstStri
613635
* @param r_dest A pointer to the destination Variant.
614636
* @param p_src A pointer to the source Variant.
615637
*/
616-
typedef void (*GDExtensionInterfaceVariantNewCopy)(GDExtensionVariantPtr r_dest, GDExtensionConstVariantPtr p_src);
638+
typedef void (*GDExtensionInterfaceVariantNewCopy)(GDExtensionUninitializedVariantPtr r_dest, GDExtensionConstVariantPtr p_src);
617639

618640
/**
619641
* @name variant_new_nil
@@ -622,7 +644,7 @@ typedef void (*GDExtensionInterfaceVariantNewCopy)(GDExtensionVariantPtr r_dest,
622644
*
623645
* @param r_dest A pointer to the destination Variant.
624646
*/
625-
typedef void (*GDExtensionInterfaceVariantNewNil)(GDExtensionVariantPtr r_dest);
647+
typedef void (*GDExtensionInterfaceVariantNewNil)(GDExtensionUninitializedVariantPtr r_dest);
626648

627649
/**
628650
* @name variant_destroy
@@ -647,7 +669,7 @@ typedef void (*GDExtensionInterfaceVariantDestroy)(GDExtensionVariantPtr p_self)
647669
*
648670
* @see Variant::callp()
649671
*/
650-
typedef void (*GDExtensionInterfaceVariantCall)(GDExtensionVariantPtr p_self, GDExtensionConstStringNamePtr p_method, const GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argument_count, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error);
672+
typedef void (*GDExtensionInterfaceVariantCall)(GDExtensionVariantPtr p_self, GDExtensionConstStringNamePtr p_method, const GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argument_count, GDExtensionUninitializedVariantPtr r_return, GDExtensionCallError *r_error);
651673

652674
/**
653675
* @name variant_call_static
@@ -663,7 +685,7 @@ typedef void (*GDExtensionInterfaceVariantCall)(GDExtensionVariantPtr p_self, GD
663685
*
664686
* @see Variant::call_static()
665687
*/
666-
typedef void (*GDExtensionInterfaceVariantCallStatic)(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_method, const GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argument_count, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error);
688+
typedef void (*GDExtensionInterfaceVariantCallStatic)(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_method, const GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argument_count, GDExtensionUninitializedVariantPtr r_return, GDExtensionCallError *r_error);
667689

668690
/**
669691
* @name variant_evaluate
@@ -678,7 +700,7 @@ typedef void (*GDExtensionInterfaceVariantCallStatic)(GDExtensionVariantType p_t
678700
*
679701
* @see Variant::evaluate()
680702
*/
681-
typedef void (*GDExtensionInterfaceVariantEvaluate)(GDExtensionVariantOperator p_op, GDExtensionConstVariantPtr p_a, GDExtensionConstVariantPtr p_b, GDExtensionVariantPtr r_return, GDExtensionBool *r_valid);
703+
typedef void (*GDExtensionInterfaceVariantEvaluate)(GDExtensionVariantOperator p_op, GDExtensionConstVariantPtr p_a, GDExtensionConstVariantPtr p_b, GDExtensionUninitializedVariantPtr r_return, GDExtensionBool *r_valid);
682704

683705
/**
684706
* @name variant_set
@@ -745,7 +767,7 @@ typedef void (*GDExtensionInterfaceVariantSetIndexed)(GDExtensionVariantPtr p_se
745767
* @param r_ret A pointer to a Variant which will be assigned the value.
746768
* @param r_valid A pointer to a boolean which will be set to false if the operation is invalid.
747769
*/
748-
typedef void (*GDExtensionInterfaceVariantGet)(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid);
770+
typedef void (*GDExtensionInterfaceVariantGet)(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionUninitializedVariantPtr r_ret, GDExtensionBool *r_valid);
749771

750772
/**
751773
* @name variant_get_named
@@ -757,7 +779,7 @@ typedef void (*GDExtensionInterfaceVariantGet)(GDExtensionConstVariantPtr p_self
757779
* @param r_ret A pointer to a Variant which will be assigned the value.
758780
* @param r_valid A pointer to a boolean which will be set to false if the operation is invalid.
759781
*/
760-
typedef void (*GDExtensionInterfaceVariantGetNamed)(GDExtensionConstVariantPtr p_self, GDExtensionConstStringNamePtr p_key, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid);
782+
typedef void (*GDExtensionInterfaceVariantGetNamed)(GDExtensionConstVariantPtr p_self, GDExtensionConstStringNamePtr p_key, GDExtensionUninitializedVariantPtr r_ret, GDExtensionBool *r_valid);
761783

762784
/**
763785
* @name variant_get_keyed
@@ -769,7 +791,7 @@ typedef void (*GDExtensionInterfaceVariantGetNamed)(GDExtensionConstVariantPtr p
769791
* @param r_ret A pointer to a Variant which will be assigned the value.
770792
* @param r_valid A pointer to a boolean which will be set to false if the operation is invalid.
771793
*/
772-
typedef void (*GDExtensionInterfaceVariantGetKeyed)(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid);
794+
typedef void (*GDExtensionInterfaceVariantGetKeyed)(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionUninitializedVariantPtr r_ret, GDExtensionBool *r_valid);
773795

774796
/**
775797
* @name variant_get_indexed
@@ -782,7 +804,7 @@ typedef void (*GDExtensionInterfaceVariantGetKeyed)(GDExtensionConstVariantPtr p
782804
* @param r_valid A pointer to a boolean which will be set to false if the operation is invalid.
783805
* @param r_oob A pointer to a boolean which will be set to true if the index is out of bounds.
784806
*/
785-
typedef void (*GDExtensionInterfaceVariantGetIndexed)(GDExtensionConstVariantPtr p_self, GDExtensionInt p_index, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid, GDExtensionBool *r_oob);
807+
typedef void (*GDExtensionInterfaceVariantGetIndexed)(GDExtensionConstVariantPtr p_self, GDExtensionInt p_index, GDExtensionUninitializedVariantPtr r_ret, GDExtensionBool *r_valid, GDExtensionBool *r_oob);
786808

787809
/**
788810
* @name variant_iter_init
@@ -797,7 +819,7 @@ typedef void (*GDExtensionInterfaceVariantGetIndexed)(GDExtensionConstVariantPtr
797819
*
798820
* @see Variant::iter_init()
799821
*/
800-
typedef GDExtensionBool (*GDExtensionInterfaceVariantIterInit)(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_iter, GDExtensionBool *r_valid);
822+
typedef GDExtensionBool (*GDExtensionInterfaceVariantIterInit)(GDExtensionConstVariantPtr p_self, GDExtensionUninitializedVariantPtr r_iter, GDExtensionBool *r_valid);
801823

802824
/**
803825
* @name variant_iter_next
@@ -824,9 +846,9 @@ typedef GDExtensionBool (*GDExtensionInterfaceVariantIterNext)(GDExtensionConstV
824846
* @param r_ret A pointer to a Variant which will be assigned false if the operation is invalid.
825847
* @param r_valid A pointer to a boolean which will be set to false if the operation is invalid.
826848
*
827-
* @see Variant::iter_next()
849+
* @see Variant::iter_get()
828850
*/
829-
typedef void (*GDExtensionInterfaceVariantIterGet)(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_iter, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid);
851+
typedef void (*GDExtensionInterfaceVariantIterGet)(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_iter, GDExtensionUninitializedVariantPtr r_ret, GDExtensionBool *r_valid);
830852

831853
/**
832854
* @name variant_hash
@@ -957,7 +979,7 @@ typedef GDExtensionBool (*GDExtensionInterfaceVariantHasKey)(GDExtensionConstVar
957979
* @param p_type The Variant type.
958980
* @param r_name A pointer to a String to store the Variant type name.
959981
*/
960-
typedef void (*GDExtensionInterfaceVariantGetTypeName)(GDExtensionVariantType p_type, GDExtensionStringPtr r_name);
982+
typedef void (*GDExtensionInterfaceVariantGetTypeName)(GDExtensionVariantType p_type, GDExtensionUninitializedStringPtr r_name);
961983

962984
/**
963985
* @name variant_can_convert
@@ -1065,7 +1087,7 @@ typedef GDExtensionPtrDestructor (*GDExtensionInterfaceVariantGetPtrDestructor)(
10651087
* @param p_argument_count The number of arguments to pass to the constructor.
10661088
* @param r_error A pointer the structure which will be updated with error information.
10671089
*/
1068-
typedef void (*GDExtensionInterfaceVariantConstruct)(GDExtensionVariantType p_type, GDExtensionVariantPtr p_base, const GDExtensionConstVariantPtr *p_args, int32_t p_argument_count, GDExtensionCallError *r_error);
1090+
typedef void (*GDExtensionInterfaceVariantConstruct)(GDExtensionVariantType p_type, GDExtensionUninitializedVariantPtr r_base, const GDExtensionConstVariantPtr *p_args, int32_t p_argument_count, GDExtensionCallError *r_error);
10691091

10701092
/**
10711093
* @name variant_get_ptr_setter
@@ -1155,7 +1177,7 @@ typedef GDExtensionPtrKeyedChecker (*GDExtensionInterfaceVariantGetPtrKeyedCheck
11551177
* @param p_constant A pointer to a StringName with the constant name.
11561178
* @param r_ret A pointer to a Variant to store the value.
11571179
*/
1158-
typedef void (*GDExtensionInterfaceVariantGetConstantValue)(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_constant, GDExtensionVariantPtr r_ret);
1180+
typedef void (*GDExtensionInterfaceVariantGetConstantValue)(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_constant, GDExtensionUninitializedVariantPtr r_ret);
11591181

11601182
/**
11611183
* @name variant_get_ptr_utility_function
@@ -1179,7 +1201,7 @@ typedef GDExtensionPtrUtilityFunction (*GDExtensionInterfaceVariantGetPtrUtility
11791201
* @param r_dest A pointer to a Variant to hold the newly created String.
11801202
* @param p_contents A pointer to a Latin-1 encoded C string (null terminated).
11811203
*/
1182-
typedef void (*GDExtensionInterfaceStringNewWithLatin1Chars)(GDExtensionStringPtr r_dest, const char *p_contents);
1204+
typedef void (*GDExtensionInterfaceStringNewWithLatin1Chars)(GDExtensionUninitializedStringPtr r_dest, const char *p_contents);
11831205

11841206
/**
11851207
* @name string_new_with_utf8_chars
@@ -1189,7 +1211,7 @@ typedef void (*GDExtensionInterfaceStringNewWithLatin1Chars)(GDExtensionStringPt
11891211
* @param r_dest A pointer to a Variant to hold the newly created String.
11901212
* @param p_contents A pointer to a UTF-8 encoded C string (null terminated).
11911213
*/
1192-
typedef void (*GDExtensionInterfaceStringNewWithUtf8Chars)(GDExtensionStringPtr r_dest, const char *p_contents);
1214+
typedef void (*GDExtensionInterfaceStringNewWithUtf8Chars)(GDExtensionUninitializedStringPtr r_dest, const char *p_contents);
11931215

11941216
/**
11951217
* @name string_new_with_utf16_chars
@@ -1199,7 +1221,7 @@ typedef void (*GDExtensionInterfaceStringNewWithUtf8Chars)(GDExtensionStringPtr
11991221
* @param r_dest A pointer to a Variant to hold the newly created String.
12001222
* @param p_contents A pointer to a UTF-16 encoded C string (null terminated).
12011223
*/
1202-
typedef void (*GDExtensionInterfaceStringNewWithUtf16Chars)(GDExtensionStringPtr r_dest, const char16_t *p_contents);
1224+
typedef void (*GDExtensionInterfaceStringNewWithUtf16Chars)(GDExtensionUninitializedStringPtr r_dest, const char16_t *p_contents);
12031225

12041226
/**
12051227
* @name string_new_with_utf32_chars
@@ -1209,7 +1231,7 @@ typedef void (*GDExtensionInterfaceStringNewWithUtf16Chars)(GDExtensionStringPtr
12091231
* @param r_dest A pointer to a Variant to hold the newly created String.
12101232
* @param p_contents A pointer to a UTF-32 encoded C string (null terminated).
12111233
*/
1212-
typedef void (*GDExtensionInterfaceStringNewWithUtf32Chars)(GDExtensionStringPtr r_dest, const char32_t *p_contents);
1234+
typedef void (*GDExtensionInterfaceStringNewWithUtf32Chars)(GDExtensionUninitializedStringPtr r_dest, const char32_t *p_contents);
12131235

12141236
/**
12151237
* @name string_new_with_wide_chars
@@ -1219,7 +1241,7 @@ typedef void (*GDExtensionInterfaceStringNewWithUtf32Chars)(GDExtensionStringPtr
12191241
* @param r_dest A pointer to a Variant to hold the newly created String.
12201242
* @param p_contents A pointer to a wide C string (null terminated).
12211243
*/
1222-
typedef void (*GDExtensionInterfaceStringNewWithWideChars)(GDExtensionStringPtr r_dest, const wchar_t *p_contents);
1244+
typedef void (*GDExtensionInterfaceStringNewWithWideChars)(GDExtensionUninitializedStringPtr r_dest, const wchar_t *p_contents);
12231245

12241246
/**
12251247
* @name string_new_with_latin1_chars_and_len
@@ -1230,7 +1252,7 @@ typedef void (*GDExtensionInterfaceStringNewWithWideChars)(GDExtensionStringPtr
12301252
* @param p_contents A pointer to a Latin-1 encoded C string.
12311253
* @param p_size The number of characters.
12321254
*/
1233-
typedef void (*GDExtensionInterfaceStringNewWithLatin1CharsAndLen)(GDExtensionStringPtr r_dest, const char *p_contents, GDExtensionInt p_size);
1255+
typedef void (*GDExtensionInterfaceStringNewWithLatin1CharsAndLen)(GDExtensionUninitializedStringPtr r_dest, const char *p_contents, GDExtensionInt p_size);
12341256

12351257
/**
12361258
* @name string_new_with_utf8_chars_and_len
@@ -1241,7 +1263,7 @@ typedef void (*GDExtensionInterfaceStringNewWithLatin1CharsAndLen)(GDExtensionSt
12411263
* @param p_contents A pointer to a UTF-8 encoded C string.
12421264
* @param p_size The number of characters.
12431265
*/
1244-
typedef void (*GDExtensionInterfaceStringNewWithUtf8CharsAndLen)(GDExtensionStringPtr r_dest, const char *p_contents, GDExtensionInt p_size);
1266+
typedef void (*GDExtensionInterfaceStringNewWithUtf8CharsAndLen)(GDExtensionUninitializedStringPtr r_dest, const char *p_contents, GDExtensionInt p_size);
12451267

12461268
/**
12471269
* @name string_new_with_utf16_chars_and_len
@@ -1252,7 +1274,7 @@ typedef void (*GDExtensionInterfaceStringNewWithUtf8CharsAndLen)(GDExtensionStri
12521274
* @param p_contents A pointer to a UTF-16 encoded C string.
12531275
* @param p_size The number of characters.
12541276
*/
1255-
typedef void (*GDExtensionInterfaceStringNewWithUtf16CharsAndLen)(GDExtensionStringPtr r_dest, const char16_t *p_contents, GDExtensionInt p_size);
1277+
typedef void (*GDExtensionInterfaceStringNewWithUtf16CharsAndLen)(GDExtensionUninitializedStringPtr r_dest, const char16_t *p_contents, GDExtensionInt p_size);
12561278

12571279
/**
12581280
* @name string_new_with_utf32_chars_and_len
@@ -1263,7 +1285,7 @@ typedef void (*GDExtensionInterfaceStringNewWithUtf16CharsAndLen)(GDExtensionStr
12631285
* @param p_contents A pointer to a UTF-32 encoded C string.
12641286
* @param p_size The number of characters.
12651287
*/
1266-
typedef void (*GDExtensionInterfaceStringNewWithUtf32CharsAndLen)(GDExtensionStringPtr r_dest, const char32_t *p_contents, GDExtensionInt p_size);
1288+
typedef void (*GDExtensionInterfaceStringNewWithUtf32CharsAndLen)(GDExtensionUninitializedStringPtr r_dest, const char32_t *p_contents, GDExtensionInt p_size);
12671289

12681290
/**
12691291
* @name string_new_with_wide_chars_and_len
@@ -1274,7 +1296,7 @@ typedef void (*GDExtensionInterfaceStringNewWithUtf32CharsAndLen)(GDExtensionStr
12741296
* @param p_contents A pointer to a wide C string.
12751297
* @param p_size The number of characters.
12761298
*/
1277-
typedef void (*GDExtensionInterfaceStringNewWithWideCharsAndLen)(GDExtensionStringPtr r_dest, const wchar_t *p_contents, GDExtensionInt p_size);
1299+
typedef void (*GDExtensionInterfaceStringNewWithWideCharsAndLen)(GDExtensionUninitializedStringPtr r_dest, const wchar_t *p_contents, GDExtensionInt p_size);
12781300

12791301
/**
12801302
* @name string_to_latin1_chars
@@ -1809,7 +1831,7 @@ typedef GDExtensionVariantPtr (*GDExtensionInterfaceDictionaryOperatorIndexConst
18091831
* @param r_ret A pointer to Variant which will receive the return value.
18101832
* @param r_error A pointer to a GDExtensionCallError struct that will receive error information.
18111833
*/
1812-
typedef void (*GDExtensionInterfaceObjectMethodBindCall)(GDExtensionMethodBindPtr p_method_bind, GDExtensionObjectPtr p_instance, const GDExtensionConstVariantPtr *p_args, GDExtensionInt p_arg_count, GDExtensionVariantPtr r_ret, GDExtensionCallError *r_error);
1834+
typedef void (*GDExtensionInterfaceObjectMethodBindCall)(GDExtensionMethodBindPtr p_method_bind, GDExtensionObjectPtr p_instance, const GDExtensionConstVariantPtr *p_args, GDExtensionInt p_arg_count, GDExtensionUninitializedVariantPtr r_ret, GDExtensionCallError *r_error);
18131835

18141836
/**
18151837
* @name object_method_bind_ptrcall
@@ -2104,7 +2126,7 @@ typedef void (*GDExtensionInterfaceClassdbUnregisterExtensionClass)(GDExtensionC
21042126
* @param p_library A pointer the library received by the GDExtension's entry point function.
21052127
* @param r_path A pointer to a String which will receive the path.
21062128
*/
2107-
typedef void (*GDExtensionInterfaceGetLibraryPath)(GDExtensionClassLibraryPtr p_library, GDExtensionStringPtr r_path);
2129+
typedef void (*GDExtensionInterfaceGetLibraryPath)(GDExtensionClassLibraryPtr p_library, GDExtensionUninitializedStringPtr r_path);
21082130

21092131
#ifdef __cplusplus
21102132
}

0 commit comments

Comments
 (0)