From 37f6e3597447cfc8c6a42ea8dbe6ef2382d23321 Mon Sep 17 00:00:00 2001 From: bruvzg <7645683+bruvzg@users.noreply.github.com> Date: Tue, 31 Jan 2023 11:27:47 +0200 Subject: [PATCH] Update typed array API to match "GDScript: Fix typed arrays". --- binding_generator.py | 1 + gdextension/extension_api.json | 401 +++++++++++----------- gdextension/gdextension_interface.h | 1 + include/godot_cpp/variant/typed_array.hpp | 42 +-- src/variant/packed_arrays.cpp | 4 + 5 files changed, 221 insertions(+), 228 deletions(-) diff --git a/binding_generator.py b/binding_generator.py index 2e6c1fc0..d3c7261d 100644 --- a/binding_generator.py +++ b/binding_generator.py @@ -696,6 +696,7 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl result.append("\tconst Variant &operator[](int p_index) const;") result.append("\tVariant &operator[](int p_index);") result.append("\tvoid set_typed(uint32_t p_type, const StringName &p_class_name, const Variant &p_script);") + result.append("\tvoid _ref(const Array &p_from) const;") if class_name == "Dictionary": result.append("\tconst Variant &operator[](const Variant &p_key) const;") diff --git a/gdextension/extension_api.json b/gdextension/extension_api.json index b44f143e..87b8855d 100644 --- a/gdextension/extension_api.json +++ b/gdextension/extension_api.json @@ -18912,6 +18912,19 @@ "is_static": false, "hash": 3173160232 }, + { + "name": "assign", + "is_vararg": false, + "is_const": false, + "is_static": false, + "hash": 2307260970, + "arguments": [ + { + "name": "array", + "type": "Array" + } + ] + }, { "name": "push_back", "is_vararg": false, @@ -19366,20 +19379,6 @@ "is_static": false, "hash": 1460142086 }, - { - "name": "typed_assign", - "return_type": "bool", - "is_vararg": false, - "is_const": false, - "is_static": false, - "hash": 1485459766, - "arguments": [ - { - "name": "array", - "type": "Array" - } - ] - }, { "name": "is_typed", "return_type": "bool", @@ -19388,6 +19387,20 @@ "is_static": false, "hash": 3918633141 }, + { + "name": "is_same_typed", + "return_type": "bool", + "is_vararg": false, + "is_const": true, + "is_static": false, + "hash": 2988181878, + "arguments": [ + { + "name": "array", + "type": "Array" + } + ] + }, { "name": "get_typed_builtin", "return_type": "int", @@ -30737,6 +30750,43 @@ } ] }, + { + "name": "set_input_reset", + "is_const": false, + "is_vararg": false, + "is_static": false, + "is_virtual": false, + "hash": 300928843, + "arguments": [ + { + "name": "input", + "type": "int", + "meta": "int32" + }, + { + "name": "enable", + "type": "bool" + } + ] + }, + { + "name": "is_input_reset", + "is_const": true, + "is_vararg": false, + "is_static": false, + "is_virtual": false, + "hash": 1116898809, + "return_value": { + "type": "bool" + }, + "arguments": [ + { + "name": "input", + "type": "int", + "meta": "int32" + } + ] + }, { "name": "set_xfade_time", "is_const": false, @@ -30788,31 +30838,6 @@ "return_value": { "type": "Curve" } - }, - { - "name": "set_reset", - "is_const": false, - "is_vararg": false, - "is_static": false, - "is_virtual": false, - "hash": 2586408642, - "arguments": [ - { - "name": "reset", - "type": "bool" - } - ] - }, - { - "name": "is_reset", - "is_const": true, - "is_vararg": false, - "is_static": false, - "is_virtual": false, - "hash": 36873697, - "return_value": { - "type": "bool" - } } ], "properties": [ @@ -30828,12 +30853,6 @@ "setter": "set_xfade_curve", "getter": "get_xfade_curve" }, - { - "type": "bool", - "name": "reset", - "setter": "set_reset", - "getter": "is_reset" - }, { "type": "int", "name": "input_count", @@ -70751,23 +70770,14 @@ "is_vararg": false, "is_static": false, "is_virtual": false, - "hash": 3871247334, + "hash": 1262296096, "return_value": { "type": "enum::Error" }, "arguments": [ { - "name": "key", - "type": "CryptoKey" - }, - { - "name": "certificate", - "type": "X509Certificate" - }, - { - "name": "chain", - "type": "X509Certificate", - "default_value": "null" + "name": "server_options", + "type": "TLSOptions" } ] }, @@ -75968,18 +75978,14 @@ "is_vararg": false, "is_static": false, "is_virtual": false, - "hash": 3447544237, + "hash": 1262296096, "return_value": { "type": "enum::Error" }, "arguments": [ { - "name": "key", - "type": "CryptoKey" - }, - { - "name": "certificate", - "type": "X509Certificate" + "name": "server_options", + "type": "TLSOptions" } ] }, @@ -75989,23 +75995,19 @@ "is_vararg": false, "is_static": false, "is_virtual": false, - "hash": 2959136280, + "hash": 3097527179, "return_value": { "type": "enum::Error" }, "arguments": [ - { - "name": "certificate", - "type": "X509Certificate" - }, { "name": "hostname", "type": "String" }, { - "name": "verify", - "type": "bool", - "default_value": "true" + "name": "client_options", + "type": "TLSOptions", + "default_value": "null" } ] }, @@ -106783,7 +106785,7 @@ "is_vararg": false, "is_static": false, "is_virtual": false, - "hash": 2602796911, + "hash": 1970282951, "return_value": { "type": "enum::Error" }, @@ -106799,14 +106801,9 @@ "default_value": "-1" }, { - "name": "use_tls", - "type": "bool", - "default_value": "false" - }, - { - "name": "verify_host", - "type": "bool", - "default_value": "true" + "name": "tls_options", + "type": "TLSOptions", + "default_value": "null" } ] }, @@ -107209,7 +107206,7 @@ "is_vararg": false, "is_static": false, "is_virtual": false, - "hash": 1899023990, + "hash": 2720304520, "return_value": { "type": "enum::Error" }, @@ -107223,11 +107220,6 @@ "type": "PackedStringArray", "default_value": "PackedStringArray()" }, - { - "name": "tls_validate_domain", - "type": "bool", - "default_value": "true" - }, { "name": "method", "type": "enum::HTTPClient.Method", @@ -107246,7 +107238,7 @@ "is_vararg": false, "is_static": false, "is_virtual": false, - "hash": 3236422912, + "hash": 4282724657, "return_value": { "type": "enum::Error" }, @@ -107260,11 +107252,6 @@ "type": "PackedStringArray", "default_value": "PackedStringArray()" }, - { - "name": "tls_validate_domain", - "type": "bool", - "default_value": "true" - }, { "name": "method", "type": "enum::HTTPClient.Method", @@ -107285,6 +107272,20 @@ "is_virtual": false, "hash": 3218959716 }, + { + "name": "set_tls_options", + "is_const": false, + "is_vararg": false, + "is_static": false, + "is_virtual": false, + "hash": 2210231844, + "arguments": [ + { + "name": "client_options", + "type": "TLSOptions" + } + ] + }, { "name": "get_http_client_status", "is_const": true, @@ -109060,7 +109061,7 @@ "is_vararg": false, "is_static": false, "is_virtual": false, - "hash": 3422491167, + "hash": 4094210332, "return_value": { "type": "enum::Error" }, @@ -109074,12 +109075,6 @@ "type": "enum::Image.CompressSource", "default_value": "0" }, - { - "name": "lossy_quality", - "type": "float", - "meta": "float", - "default_value": "0.7" - }, { "name": "astc_format", "type": "enum::Image.ASTCFormat", @@ -109093,7 +109088,7 @@ "is_vararg": false, "is_static": false, "is_virtual": false, - "hash": 180597543, + "hash": 279105990, "return_value": { "type": "enum::Error" }, @@ -109106,12 +109101,6 @@ "name": "channels", "type": "enum::Image.UsedChannels" }, - { - "name": "lossy_quality", - "type": "float", - "meta": "float", - "default_value": "0.7" - }, { "name": "astc_format", "type": "enum::Image.ASTCFormat", @@ -110130,7 +110119,7 @@ { "name": "blend_shapes", "type": "typedarray::Array", - "default_value": "[]" + "default_value": "Array[Array]([])" }, { "name": "lods", @@ -142942,7 +142931,7 @@ "is_vararg": false, "is_static": false, "is_virtual": false, - "hash": 293566484, + "hash": 1801538152, "return_value": { "type": "enum::Error" }, @@ -142952,18 +142941,12 @@ "type": "PacketPeerUDP" }, { - "name": "validate_certs", - "type": "bool", - "default_value": "true" + "name": "hostname", + "type": "String" }, { - "name": "for_hostname", - "type": "String", - "default_value": "\"\"" - }, - { - "name": "valid_certificate", - "type": "X509Certificate", + "name": "client_options", + "type": "TLSOptions", "default_value": "null" } ] @@ -152015,7 +151998,7 @@ { "name": "exclude", "type": "typedarray::RID", - "default_value": "[]" + "default_value": "Array[RID]([])" } ] }, @@ -152277,7 +152260,7 @@ { "name": "exclude", "type": "typedarray::RID", - "default_value": "[]" + "default_value": "Array[RID]([])" } ] }, @@ -179773,7 +179756,7 @@ { "name": "specialization_constants", "type": "typedarray::RDPipelineSpecializationConstant", - "default_value": "[]" + "default_value": "Array[RDPipelineSpecializationConstant]([])" } ] }, @@ -179812,7 +179795,7 @@ { "name": "specialization_constants", "type": "typedarray::RDPipelineSpecializationConstant", - "default_value": "[]" + "default_value": "Array[RDPipelineSpecializationConstant]([])" } ] }, @@ -179967,7 +179950,7 @@ { "name": "storage_textures", "type": "Array", - "default_value": "[]" + "default_value": "Array[RID]([])" } ] }, @@ -180032,7 +180015,7 @@ { "name": "storage_textures", "type": "typedarray::RID", - "default_value": "[]" + "default_value": "Array[RID]([])" } ] }, @@ -212668,7 +212651,7 @@ "is_vararg": false, "is_static": false, "is_virtual": false, - "hash": 2359858912, + "hash": 4292689651, "return_value": { "type": "enum::Error" }, @@ -212678,17 +212661,8 @@ "type": "StreamPeer" }, { - "name": "private_key", - "type": "CryptoKey" - }, - { - "name": "certificate", - "type": "X509Certificate" - }, - { - "name": "chain", - "type": "X509Certificate", - "default_value": "null" + "name": "server_options", + "type": "TLSOptions" } ] }, @@ -212698,7 +212672,7 @@ "is_vararg": false, "is_static": false, "is_virtual": false, - "hash": 127827767, + "hash": 1325480781, "return_value": { "type": "enum::Error" }, @@ -212708,18 +212682,12 @@ "type": "StreamPeer" }, { - "name": "validate_certs", - "type": "bool", - "default_value": "false" + "name": "common_name", + "type": "String" }, { - "name": "for_hostname", - "type": "String", - "default_value": "\"\"" - }, - { - "name": "valid_certificate", - "type": "X509Certificate", + "name": "client_options", + "type": "TLSOptions", "default_value": "null" } ] @@ -212753,39 +212721,6 @@ "is_static": false, "is_virtual": false, "hash": 3218959716 - }, - { - "name": "set_blocking_handshake_enabled", - "is_const": false, - "is_vararg": false, - "is_static": false, - "is_virtual": false, - "hash": 2586408642, - "arguments": [ - { - "name": "enabled", - "type": "bool" - } - ] - }, - { - "name": "is_blocking_handshake_enabled", - "is_const": true, - "is_vararg": false, - "is_static": false, - "is_virtual": false, - "hash": 36873697, - "return_value": { - "type": "bool" - } - } - ], - "properties": [ - { - "type": "bool", - "name": "blocking_handshake", - "setter": "set_blocking_handshake_enabled", - "getter": "is_blocking_handshake_enabled" } ] }, @@ -215651,6 +215586,77 @@ } ] }, + { + "name": "TLSOptions", + "is_refcounted": true, + "is_instantiable": false, + "inherits": "RefCounted", + "api_type": "core", + "methods": [ + { + "name": "client", + "is_const": false, + "is_vararg": false, + "is_static": true, + "is_virtual": false, + "hash": 3565000357, + "return_value": { + "type": "TLSOptions" + }, + "arguments": [ + { + "name": "trusted_chain", + "type": "X509Certificate", + "default_value": "null" + }, + { + "name": "common_name_override", + "type": "String", + "default_value": "\"\"" + } + ] + }, + { + "name": "client_unsafe", + "is_const": false, + "is_vararg": false, + "is_static": true, + "is_virtual": false, + "hash": 2090251749, + "return_value": { + "type": "TLSOptions" + }, + "arguments": [ + { + "name": "trusted_chain", + "type": "X509Certificate", + "default_value": "null" + } + ] + }, + { + "name": "server", + "is_const": false, + "is_vararg": false, + "is_static": true, + "is_virtual": false, + "hash": 36969539, + "return_value": { + "type": "TLSOptions" + }, + "arguments": [ + { + "name": "key", + "type": "CryptoKey" + }, + { + "name": "certificate", + "type": "X509Certificate" + } + ] + } + ] + }, { "name": "TabBar", "is_refcounted": false, @@ -258837,7 +258843,7 @@ "is_vararg": false, "is_static": false, "is_virtual": false, - "hash": 3369256093, + "hash": 3097527179, "return_value": { "type": "enum::Error" }, @@ -258847,13 +258853,8 @@ "type": "String" }, { - "name": "verify_tls", - "type": "bool", - "default_value": "true" - }, - { - "name": "tls_certificate", - "type": "X509Certificate", + "name": "tls_client_options", + "type": "TLSOptions", "default_value": "null" } ] @@ -258864,7 +258865,7 @@ "is_vararg": false, "is_static": false, "is_virtual": false, - "hash": 2363339283, + "hash": 337374795, "return_value": { "type": "enum::Error" }, @@ -258880,13 +258881,8 @@ "default_value": "\"*\"" }, { - "name": "tls_key", - "type": "CryptoKey", - "default_value": "null" - }, - { - "name": "tls_certificate", - "type": "X509Certificate", + "name": "tls_server_options", + "type": "TLSOptions", "default_value": "null" } ] @@ -259195,7 +259191,7 @@ "is_vararg": false, "is_static": false, "is_virtual": false, - "hash": 3369256093, + "hash": 3097527179, "return_value": { "type": "enum::Error" }, @@ -259205,13 +259201,8 @@ "type": "String" }, { - "name": "verify_tls", - "type": "bool", - "default_value": "true" - }, - { - "name": "trusted_tls_certificate", - "type": "X509Certificate", + "name": "tls_client_options", + "type": "TLSOptions", "default_value": "null" } ] diff --git a/gdextension/gdextension_interface.h b/gdextension/gdextension_interface.h index 7f8f7374..876a09be 100644 --- a/gdextension/gdextension_interface.h +++ b/gdextension/gdextension_interface.h @@ -551,6 +551,7 @@ typedef struct { GDExtensionVariantPtr (*array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be an Array ptr GDExtensionVariantPtr (*array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be an Array ptr + void (*array_ref)(GDExtensionTypePtr p_self, GDExtensionConstTypePtr p_from); // p_self should be an Array ptr void (*array_set_typed)(GDExtensionTypePtr p_self, uint32_t p_type, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstVariantPtr p_script); // p_self should be an Array ptr /* Dictionary functions */ diff --git a/include/godot_cpp/variant/typed_array.hpp b/include/godot_cpp/variant/typed_array.hpp index 2d71c0fa..5e7084e4 100644 --- a/include/godot_cpp/variant/typed_array.hpp +++ b/include/godot_cpp/variant/typed_array.hpp @@ -39,14 +39,9 @@ namespace godot { template class TypedArray : public Array { public: - template - _FORCE_INLINE_ void operator=(const TypedArray &p_array) { - static_assert(__is_base_of(T, U)); - typed_assign(p_array); - } - _FORCE_INLINE_ void operator=(const Array &p_array) { - typed_assign(p_array); + ERR_FAIL_COND_MSG(!is_same_typed(p_array), "Cannot assign an array with a different element type."); + _ref(p_array); } _FORCE_INLINE_ TypedArray(const Variant &p_variant) : Array(p_variant.operator Array(), Variant::OBJECT, T::get_class_static(), Variant()) { @@ -61,22 +56,23 @@ public: // specialization for the rest of variant types -#define MAKE_TYPED_ARRAY(m_type, m_variant_type) \ - template <> \ - class TypedArray : public Array { \ - public: \ - _FORCE_INLINE_ void operator=(const Array &p_array) { \ - typed_assign(p_array); \ - } \ - _FORCE_INLINE_ TypedArray(const Variant &p_variant) : \ - Array(p_variant.operator Array(), m_variant_type, StringName(), Variant()) { \ - } \ - _FORCE_INLINE_ TypedArray(const Array &p_array) : \ - Array(p_array, m_variant_type, StringName(), Variant()) { \ - } \ - _FORCE_INLINE_ TypedArray() { \ - set_typed(m_variant_type, StringName(), Variant()); \ - } \ +#define MAKE_TYPED_ARRAY(m_type, m_variant_type) \ + template <> \ + class TypedArray : public Array { \ + public: \ + _FORCE_INLINE_ void operator=(const Array &p_array) { \ + ERR_FAIL_COND_MSG(!is_same_typed(p_array), "Cannot assign an array with a different element type."); \ + _ref(p_array); \ + } \ + _FORCE_INLINE_ TypedArray(const Variant &p_variant) : \ + Array(p_variant.operator Array(), m_variant_type, StringName(), Variant()) { \ + } \ + _FORCE_INLINE_ TypedArray(const Array &p_array) : \ + Array(p_array, m_variant_type, StringName(), Variant()) { \ + } \ + _FORCE_INLINE_ TypedArray() { \ + set_typed(m_variant_type, StringName(), Variant()); \ + } \ }; MAKE_TYPED_ARRAY(bool, Variant::BOOL) diff --git a/src/variant/packed_arrays.cpp b/src/variant/packed_arrays.cpp index 5f35abd2..e5658881 100644 --- a/src/variant/packed_arrays.cpp +++ b/src/variant/packed_arrays.cpp @@ -212,6 +212,10 @@ void Array::set_typed(uint32_t p_type, const StringName &p_class_name, const Var internal::gde_interface->array_set_typed((GDExtensionTypePtr *)this, p_type, (GDExtensionConstStringNamePtr)&p_class_name, (GDExtensionConstVariantPtr)&p_script); } +void Array::_ref(const Array &p_from) const { + internal::gde_interface->array_ref((GDExtensionTypePtr *)this, (GDExtensionConstTypePtr *)&p_from); +} + const Variant &Dictionary::operator[](const Variant &p_key) const { const Variant *var = (const Variant *)internal::gde_interface->dictionary_operator_index_const((GDExtensionTypePtr *)this, (GDExtensionVariantPtr)&p_key); return *var;