@@ -139,16 +139,37 @@ typedef enum {
139
139
140
140
} GDExtensionVariantOperator ;
141
141
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
+
142
158
typedef void * GDExtensionVariantPtr ;
143
159
typedef const void * GDExtensionConstVariantPtr ;
160
+ typedef void * GDExtensionUninitializedVariantPtr ;
144
161
typedef void * GDExtensionStringNamePtr ;
145
162
typedef const void * GDExtensionConstStringNamePtr ;
163
+ typedef void * GDExtensionUninitializedStringNamePtr ;
146
164
typedef void * GDExtensionStringPtr ;
147
165
typedef const void * GDExtensionConstStringPtr ;
166
+ typedef void * GDExtensionUninitializedStringPtr ;
148
167
typedef void * GDExtensionObjectPtr ;
149
168
typedef const void * GDExtensionConstObjectPtr ;
169
+ typedef void * GDExtensionUninitializedObjectPtr ;
150
170
typedef void * GDExtensionTypePtr ;
151
171
typedef const void * GDExtensionConstTypePtr ;
172
+ typedef void * GDExtensionUninitializedTypePtr ;
152
173
typedef const void * GDExtensionMethodBindPtr ;
153
174
typedef int64_t GDExtensionInt ;
154
175
typedef uint8_t GDExtensionBool ;
@@ -295,6 +316,7 @@ typedef enum {
295
316
} GDExtensionClassMethodArgumentMetadata ;
296
317
297
318
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 );
298
320
typedef void (* GDExtensionClassMethodPtrCall )(void * method_userdata , GDExtensionClassInstancePtr p_instance , const GDExtensionConstTypePtr * p_args , GDExtensionTypePtr r_ret );
299
321
300
322
typedef struct {
@@ -613,7 +635,7 @@ typedef uint64_t (*GDExtensionInterfaceGetNativeStructSize)(GDExtensionConstStri
613
635
* @param r_dest A pointer to the destination Variant.
614
636
* @param p_src A pointer to the source Variant.
615
637
*/
616
- typedef void (* GDExtensionInterfaceVariantNewCopy )(GDExtensionVariantPtr r_dest , GDExtensionConstVariantPtr p_src );
638
+ typedef void (* GDExtensionInterfaceVariantNewCopy )(GDExtensionUninitializedVariantPtr r_dest , GDExtensionConstVariantPtr p_src );
617
639
618
640
/**
619
641
* @name variant_new_nil
@@ -622,7 +644,7 @@ typedef void (*GDExtensionInterfaceVariantNewCopy)(GDExtensionVariantPtr r_dest,
622
644
*
623
645
* @param r_dest A pointer to the destination Variant.
624
646
*/
625
- typedef void (* GDExtensionInterfaceVariantNewNil )(GDExtensionVariantPtr r_dest );
647
+ typedef void (* GDExtensionInterfaceVariantNewNil )(GDExtensionUninitializedVariantPtr r_dest );
626
648
627
649
/**
628
650
* @name variant_destroy
@@ -647,7 +669,7 @@ typedef void (*GDExtensionInterfaceVariantDestroy)(GDExtensionVariantPtr p_self)
647
669
*
648
670
* @see Variant::callp()
649
671
*/
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 );
651
673
652
674
/**
653
675
* @name variant_call_static
@@ -663,7 +685,7 @@ typedef void (*GDExtensionInterfaceVariantCall)(GDExtensionVariantPtr p_self, GD
663
685
*
664
686
* @see Variant::call_static()
665
687
*/
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 );
667
689
668
690
/**
669
691
* @name variant_evaluate
@@ -678,7 +700,7 @@ typedef void (*GDExtensionInterfaceVariantCallStatic)(GDExtensionVariantType p_t
678
700
*
679
701
* @see Variant::evaluate()
680
702
*/
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 );
682
704
683
705
/**
684
706
* @name variant_set
@@ -745,7 +767,7 @@ typedef void (*GDExtensionInterfaceVariantSetIndexed)(GDExtensionVariantPtr p_se
745
767
* @param r_ret A pointer to a Variant which will be assigned the value.
746
768
* @param r_valid A pointer to a boolean which will be set to false if the operation is invalid.
747
769
*/
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 );
749
771
750
772
/**
751
773
* @name variant_get_named
@@ -757,7 +779,7 @@ typedef void (*GDExtensionInterfaceVariantGet)(GDExtensionConstVariantPtr p_self
757
779
* @param r_ret A pointer to a Variant which will be assigned the value.
758
780
* @param r_valid A pointer to a boolean which will be set to false if the operation is invalid.
759
781
*/
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 );
761
783
762
784
/**
763
785
* @name variant_get_keyed
@@ -769,7 +791,7 @@ typedef void (*GDExtensionInterfaceVariantGetNamed)(GDExtensionConstVariantPtr p
769
791
* @param r_ret A pointer to a Variant which will be assigned the value.
770
792
* @param r_valid A pointer to a boolean which will be set to false if the operation is invalid.
771
793
*/
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 );
773
795
774
796
/**
775
797
* @name variant_get_indexed
@@ -782,7 +804,7 @@ typedef void (*GDExtensionInterfaceVariantGetKeyed)(GDExtensionConstVariantPtr p
782
804
* @param r_valid A pointer to a boolean which will be set to false if the operation is invalid.
783
805
* @param r_oob A pointer to a boolean which will be set to true if the index is out of bounds.
784
806
*/
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 );
786
808
787
809
/**
788
810
* @name variant_iter_init
@@ -797,7 +819,7 @@ typedef void (*GDExtensionInterfaceVariantGetIndexed)(GDExtensionConstVariantPtr
797
819
*
798
820
* @see Variant::iter_init()
799
821
*/
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 );
801
823
802
824
/**
803
825
* @name variant_iter_next
@@ -824,9 +846,9 @@ typedef GDExtensionBool (*GDExtensionInterfaceVariantIterNext)(GDExtensionConstV
824
846
* @param r_ret A pointer to a Variant which will be assigned false if the operation is invalid.
825
847
* @param r_valid A pointer to a boolean which will be set to false if the operation is invalid.
826
848
*
827
- * @see Variant::iter_next ()
849
+ * @see Variant::iter_get ()
828
850
*/
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 );
830
852
831
853
/**
832
854
* @name variant_hash
@@ -957,7 +979,7 @@ typedef GDExtensionBool (*GDExtensionInterfaceVariantHasKey)(GDExtensionConstVar
957
979
* @param p_type The Variant type.
958
980
* @param r_name A pointer to a String to store the Variant type name.
959
981
*/
960
- typedef void (* GDExtensionInterfaceVariantGetTypeName )(GDExtensionVariantType p_type , GDExtensionStringPtr r_name );
982
+ typedef void (* GDExtensionInterfaceVariantGetTypeName )(GDExtensionVariantType p_type , GDExtensionUninitializedStringPtr r_name );
961
983
962
984
/**
963
985
* @name variant_can_convert
@@ -1065,7 +1087,7 @@ typedef GDExtensionPtrDestructor (*GDExtensionInterfaceVariantGetPtrDestructor)(
1065
1087
* @param p_argument_count The number of arguments to pass to the constructor.
1066
1088
* @param r_error A pointer the structure which will be updated with error information.
1067
1089
*/
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 );
1069
1091
1070
1092
/**
1071
1093
* @name variant_get_ptr_setter
@@ -1155,7 +1177,7 @@ typedef GDExtensionPtrKeyedChecker (*GDExtensionInterfaceVariantGetPtrKeyedCheck
1155
1177
* @param p_constant A pointer to a StringName with the constant name.
1156
1178
* @param r_ret A pointer to a Variant to store the value.
1157
1179
*/
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 );
1159
1181
1160
1182
/**
1161
1183
* @name variant_get_ptr_utility_function
@@ -1179,7 +1201,7 @@ typedef GDExtensionPtrUtilityFunction (*GDExtensionInterfaceVariantGetPtrUtility
1179
1201
* @param r_dest A pointer to a Variant to hold the newly created String.
1180
1202
* @param p_contents A pointer to a Latin-1 encoded C string (null terminated).
1181
1203
*/
1182
- typedef void (* GDExtensionInterfaceStringNewWithLatin1Chars )(GDExtensionStringPtr r_dest , const char * p_contents );
1204
+ typedef void (* GDExtensionInterfaceStringNewWithLatin1Chars )(GDExtensionUninitializedStringPtr r_dest , const char * p_contents );
1183
1205
1184
1206
/**
1185
1207
* @name string_new_with_utf8_chars
@@ -1189,7 +1211,7 @@ typedef void (*GDExtensionInterfaceStringNewWithLatin1Chars)(GDExtensionStringPt
1189
1211
* @param r_dest A pointer to a Variant to hold the newly created String.
1190
1212
* @param p_contents A pointer to a UTF-8 encoded C string (null terminated).
1191
1213
*/
1192
- typedef void (* GDExtensionInterfaceStringNewWithUtf8Chars )(GDExtensionStringPtr r_dest , const char * p_contents );
1214
+ typedef void (* GDExtensionInterfaceStringNewWithUtf8Chars )(GDExtensionUninitializedStringPtr r_dest , const char * p_contents );
1193
1215
1194
1216
/**
1195
1217
* @name string_new_with_utf16_chars
@@ -1199,7 +1221,7 @@ typedef void (*GDExtensionInterfaceStringNewWithUtf8Chars)(GDExtensionStringPtr
1199
1221
* @param r_dest A pointer to a Variant to hold the newly created String.
1200
1222
* @param p_contents A pointer to a UTF-16 encoded C string (null terminated).
1201
1223
*/
1202
- typedef void (* GDExtensionInterfaceStringNewWithUtf16Chars )(GDExtensionStringPtr r_dest , const char16_t * p_contents );
1224
+ typedef void (* GDExtensionInterfaceStringNewWithUtf16Chars )(GDExtensionUninitializedStringPtr r_dest , const char16_t * p_contents );
1203
1225
1204
1226
/**
1205
1227
* @name string_new_with_utf32_chars
@@ -1209,7 +1231,7 @@ typedef void (*GDExtensionInterfaceStringNewWithUtf16Chars)(GDExtensionStringPtr
1209
1231
* @param r_dest A pointer to a Variant to hold the newly created String.
1210
1232
* @param p_contents A pointer to a UTF-32 encoded C string (null terminated).
1211
1233
*/
1212
- typedef void (* GDExtensionInterfaceStringNewWithUtf32Chars )(GDExtensionStringPtr r_dest , const char32_t * p_contents );
1234
+ typedef void (* GDExtensionInterfaceStringNewWithUtf32Chars )(GDExtensionUninitializedStringPtr r_dest , const char32_t * p_contents );
1213
1235
1214
1236
/**
1215
1237
* @name string_new_with_wide_chars
@@ -1219,7 +1241,7 @@ typedef void (*GDExtensionInterfaceStringNewWithUtf32Chars)(GDExtensionStringPtr
1219
1241
* @param r_dest A pointer to a Variant to hold the newly created String.
1220
1242
* @param p_contents A pointer to a wide C string (null terminated).
1221
1243
*/
1222
- typedef void (* GDExtensionInterfaceStringNewWithWideChars )(GDExtensionStringPtr r_dest , const wchar_t * p_contents );
1244
+ typedef void (* GDExtensionInterfaceStringNewWithWideChars )(GDExtensionUninitializedStringPtr r_dest , const wchar_t * p_contents );
1223
1245
1224
1246
/**
1225
1247
* @name string_new_with_latin1_chars_and_len
@@ -1230,7 +1252,7 @@ typedef void (*GDExtensionInterfaceStringNewWithWideChars)(GDExtensionStringPtr
1230
1252
* @param p_contents A pointer to a Latin-1 encoded C string.
1231
1253
* @param p_size The number of characters.
1232
1254
*/
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 );
1234
1256
1235
1257
/**
1236
1258
* @name string_new_with_utf8_chars_and_len
@@ -1241,7 +1263,7 @@ typedef void (*GDExtensionInterfaceStringNewWithLatin1CharsAndLen)(GDExtensionSt
1241
1263
* @param p_contents A pointer to a UTF-8 encoded C string.
1242
1264
* @param p_size The number of characters.
1243
1265
*/
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 );
1245
1267
1246
1268
/**
1247
1269
* @name string_new_with_utf16_chars_and_len
@@ -1252,7 +1274,7 @@ typedef void (*GDExtensionInterfaceStringNewWithUtf8CharsAndLen)(GDExtensionStri
1252
1274
* @param p_contents A pointer to a UTF-16 encoded C string.
1253
1275
* @param p_size The number of characters.
1254
1276
*/
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 );
1256
1278
1257
1279
/**
1258
1280
* @name string_new_with_utf32_chars_and_len
@@ -1263,7 +1285,7 @@ typedef void (*GDExtensionInterfaceStringNewWithUtf16CharsAndLen)(GDExtensionStr
1263
1285
* @param p_contents A pointer to a UTF-32 encoded C string.
1264
1286
* @param p_size The number of characters.
1265
1287
*/
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 );
1267
1289
1268
1290
/**
1269
1291
* @name string_new_with_wide_chars_and_len
@@ -1274,7 +1296,7 @@ typedef void (*GDExtensionInterfaceStringNewWithUtf32CharsAndLen)(GDExtensionStr
1274
1296
* @param p_contents A pointer to a wide C string.
1275
1297
* @param p_size The number of characters.
1276
1298
*/
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 );
1278
1300
1279
1301
/**
1280
1302
* @name string_to_latin1_chars
@@ -1809,7 +1831,7 @@ typedef GDExtensionVariantPtr (*GDExtensionInterfaceDictionaryOperatorIndexConst
1809
1831
* @param r_ret A pointer to Variant which will receive the return value.
1810
1832
* @param r_error A pointer to a GDExtensionCallError struct that will receive error information.
1811
1833
*/
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 );
1813
1835
1814
1836
/**
1815
1837
* @name object_method_bind_ptrcall
@@ -1890,7 +1912,7 @@ typedef void (*GDExtensionInterfaceObjectSetInstance)(GDExtensionObjectPtr p_o,
1890
1912
*
1891
1913
* @return true if successful in getting the class name; otherwise false.
1892
1914
*/
1893
- typedef GDExtensionBool (* GDExtensionInterfaceObjectGetClassName )(GDExtensionConstObjectPtr p_object , GDExtensionClassLibraryPtr p_library , GDExtensionStringNamePtr r_class_name );
1915
+ typedef GDExtensionBool (* GDExtensionInterfaceObjectGetClassName )(GDExtensionConstObjectPtr p_object , GDExtensionClassLibraryPtr p_library , GDExtensionUninitializedStringNamePtr r_class_name );
1894
1916
1895
1917
/**
1896
1918
* @name object_cast_to
@@ -2117,7 +2139,7 @@ typedef void (*GDExtensionInterfaceClassdbUnregisterExtensionClass)(GDExtensionC
2117
2139
* @param p_library A pointer the library received by the GDExtension's entry point function.
2118
2140
* @param r_path A pointer to a String which will receive the path.
2119
2141
*/
2120
- typedef void (* GDExtensionInterfaceGetLibraryPath )(GDExtensionClassLibraryPtr p_library , GDExtensionStringPtr r_path );
2142
+ typedef void (* GDExtensionInterfaceGetLibraryPath )(GDExtensionClassLibraryPtr p_library , GDExtensionUninitializedStringPtr r_path );
2121
2143
2122
2144
/**
2123
2145
* @name editor_add_plugin
0 commit comments