Skip to content

Commit 1af4262

Browse files
authored
Merge pull request #103362 from bruvzg/gds_get_set_bchk
Add bound checks to `Array`/`Packed*Array` variant call `get` and `set` methods.
2 parents 53faed5 + f9c7d34 commit 1af4262

File tree

1 file changed

+33
-26
lines changed

1 file changed

+33
-26
lines changed

core/variant/variant_call.cpp

+33-26
Original file line numberDiff line numberDiff line change
@@ -657,22 +657,28 @@ static _FORCE_INLINE_ void vc_ptrcall(void (*method)(T *, P...), void *p_base, c
657657
} \
658658
};
659659

660-
#define VARCALL_PACKED_GETTER(m_packed_type, m_return_type) \
661-
static m_return_type func_##m_packed_type##_get(m_packed_type *p_instance, int64_t p_index) { \
662-
return p_instance->get(p_index); \
660+
#define VARCALL_ARRAY_GETTER_SETTER(m_packed_type, m_type) \
661+
static m_type func_##m_packed_type##_get(m_packed_type *p_instance, int64_t p_index) { \
662+
ERR_FAIL_INDEX_V(p_index, p_instance->size(), m_type()); \
663+
return p_instance->get(p_index); \
664+
} \
665+
static void func_##m_packed_type##_set(m_packed_type *p_instance, int64_t p_index, const m_type &p_value) { \
666+
ERR_FAIL_INDEX(p_index, p_instance->size()); \
667+
p_instance->set(p_index, p_value); \
663668
}
664669

665670
struct _VariantCall {
666-
VARCALL_PACKED_GETTER(PackedByteArray, uint8_t)
667-
VARCALL_PACKED_GETTER(PackedColorArray, Color)
668-
VARCALL_PACKED_GETTER(PackedFloat32Array, float)
669-
VARCALL_PACKED_GETTER(PackedFloat64Array, double)
670-
VARCALL_PACKED_GETTER(PackedInt32Array, int32_t)
671-
VARCALL_PACKED_GETTER(PackedInt64Array, int64_t)
672-
VARCALL_PACKED_GETTER(PackedStringArray, String)
673-
VARCALL_PACKED_GETTER(PackedVector2Array, Vector2)
674-
VARCALL_PACKED_GETTER(PackedVector3Array, Vector3)
675-
VARCALL_PACKED_GETTER(PackedVector4Array, Vector4)
671+
VARCALL_ARRAY_GETTER_SETTER(PackedByteArray, uint8_t)
672+
VARCALL_ARRAY_GETTER_SETTER(PackedColorArray, Color)
673+
VARCALL_ARRAY_GETTER_SETTER(PackedFloat32Array, float)
674+
VARCALL_ARRAY_GETTER_SETTER(PackedFloat64Array, double)
675+
VARCALL_ARRAY_GETTER_SETTER(PackedInt32Array, int32_t)
676+
VARCALL_ARRAY_GETTER_SETTER(PackedInt64Array, int64_t)
677+
VARCALL_ARRAY_GETTER_SETTER(PackedStringArray, String)
678+
VARCALL_ARRAY_GETTER_SETTER(PackedVector2Array, Vector2)
679+
VARCALL_ARRAY_GETTER_SETTER(PackedVector3Array, Vector3)
680+
VARCALL_ARRAY_GETTER_SETTER(PackedVector4Array, Vector4)
681+
VARCALL_ARRAY_GETTER_SETTER(Array, Variant)
676682

677683
static String func_PackedByteArray_get_string_from_ascii(PackedByteArray *p_instance) {
678684
String s;
@@ -2354,8 +2360,8 @@ static void _register_variant_builtin_methods_array() {
23542360
bind_method(Array, clear, sarray(), varray());
23552361
bind_method(Array, hash, sarray(), varray());
23562362
bind_method(Array, assign, sarray("array"), varray());
2357-
bind_method(Array, get, sarray("index"), varray());
2358-
bind_method(Array, set, sarray("index", "value"), varray());
2363+
bind_function(Array, get, _VariantCall::func_Array_get, sarray("index"), varray());
2364+
bind_functionnc(Array, set, _VariantCall::func_Array_set, sarray("index", "value"), varray());
23592365
bind_method(Array, push_back, sarray("value"), varray());
23602366
bind_method(Array, push_front, sarray("value"), varray());
23612367
bind_method(Array, append, sarray("value"), varray());
@@ -2400,7 +2406,7 @@ static void _register_variant_builtin_methods_array() {
24002406
bind_method(Array, make_read_only, sarray(), varray());
24012407
bind_method(Array, is_read_only, sarray(), varray());
24022408

2403-
/* Packed*Array get (see VARCALL_PACKED_GETTER macro) */
2409+
/* Packed*Array get/set (see VARCALL_ARRAY_GETTER_SETTER macro) */
24042410
bind_function(PackedByteArray, get, _VariantCall::func_PackedByteArray_get, sarray("index"), varray());
24052411
bind_function(PackedColorArray, get, _VariantCall::func_PackedColorArray_get, sarray("index"), varray());
24062412
bind_function(PackedFloat32Array, get, _VariantCall::func_PackedFloat32Array_get, sarray("index"), varray());
@@ -2412,10 +2418,20 @@ static void _register_variant_builtin_methods_array() {
24122418
bind_function(PackedVector3Array, get, _VariantCall::func_PackedVector3Array_get, sarray("index"), varray());
24132419
bind_function(PackedVector4Array, get, _VariantCall::func_PackedVector4Array_get, sarray("index"), varray());
24142420

2421+
bind_functionnc(PackedByteArray, set, _VariantCall::func_PackedByteArray_set, sarray("index", "value"), varray());
2422+
bind_functionnc(PackedColorArray, set, _VariantCall::func_PackedColorArray_set, sarray("index", "value"), varray());
2423+
bind_functionnc(PackedFloat32Array, set, _VariantCall::func_PackedFloat32Array_set, sarray("index", "value"), varray());
2424+
bind_functionnc(PackedFloat64Array, set, _VariantCall::func_PackedFloat64Array_set, sarray("index", "value"), varray());
2425+
bind_functionnc(PackedInt32Array, set, _VariantCall::func_PackedInt32Array_set, sarray("index", "value"), varray());
2426+
bind_functionnc(PackedInt64Array, set, _VariantCall::func_PackedInt64Array_set, sarray("index", "value"), varray());
2427+
bind_functionnc(PackedStringArray, set, _VariantCall::func_PackedStringArray_set, sarray("index", "value"), varray());
2428+
bind_functionnc(PackedVector2Array, set, _VariantCall::func_PackedVector2Array_set, sarray("index", "value"), varray());
2429+
bind_functionnc(PackedVector3Array, set, _VariantCall::func_PackedVector3Array_set, sarray("index", "value"), varray());
2430+
bind_functionnc(PackedVector4Array, set, _VariantCall::func_PackedVector4Array_set, sarray("index", "value"), varray());
2431+
24152432
/* Byte Array */
24162433
bind_method(PackedByteArray, size, sarray(), varray());
24172434
bind_method(PackedByteArray, is_empty, sarray(), varray());
2418-
bind_method(PackedByteArray, set, sarray("index", "value"), varray());
24192435
bind_method(PackedByteArray, push_back, sarray("value"), varray());
24202436
bind_method(PackedByteArray, append, sarray("value"), varray());
24212437
bind_method(PackedByteArray, append_array, sarray("array"), varray());
@@ -2481,7 +2497,6 @@ static void _register_variant_builtin_methods_array() {
24812497

24822498
bind_method(PackedInt32Array, size, sarray(), varray());
24832499
bind_method(PackedInt32Array, is_empty, sarray(), varray());
2484-
bind_method(PackedInt32Array, set, sarray("index", "value"), varray());
24852500
bind_method(PackedInt32Array, push_back, sarray("value"), varray());
24862501
bind_method(PackedInt32Array, append, sarray("value"), varray());
24872502
bind_method(PackedInt32Array, append_array, sarray("array"), varray());
@@ -2505,7 +2520,6 @@ static void _register_variant_builtin_methods_array() {
25052520

25062521
bind_method(PackedInt64Array, size, sarray(), varray());
25072522
bind_method(PackedInt64Array, is_empty, sarray(), varray());
2508-
bind_method(PackedInt64Array, set, sarray("index", "value"), varray());
25092523
bind_method(PackedInt64Array, push_back, sarray("value"), varray());
25102524
bind_method(PackedInt64Array, append, sarray("value"), varray());
25112525
bind_method(PackedInt64Array, append_array, sarray("array"), varray());
@@ -2529,7 +2543,6 @@ static void _register_variant_builtin_methods_array() {
25292543

25302544
bind_method(PackedFloat32Array, size, sarray(), varray());
25312545
bind_method(PackedFloat32Array, is_empty, sarray(), varray());
2532-
bind_method(PackedFloat32Array, set, sarray("index", "value"), varray());
25332546
bind_method(PackedFloat32Array, push_back, sarray("value"), varray());
25342547
bind_method(PackedFloat32Array, append, sarray("value"), varray());
25352548
bind_method(PackedFloat32Array, append_array, sarray("array"), varray());
@@ -2553,7 +2566,6 @@ static void _register_variant_builtin_methods_array() {
25532566

25542567
bind_method(PackedFloat64Array, size, sarray(), varray());
25552568
bind_method(PackedFloat64Array, is_empty, sarray(), varray());
2556-
bind_method(PackedFloat64Array, set, sarray("index", "value"), varray());
25572569
bind_method(PackedFloat64Array, push_back, sarray("value"), varray());
25582570
bind_method(PackedFloat64Array, append, sarray("value"), varray());
25592571
bind_method(PackedFloat64Array, append_array, sarray("array"), varray());
@@ -2577,7 +2589,6 @@ static void _register_variant_builtin_methods_array() {
25772589

25782590
bind_method(PackedStringArray, size, sarray(), varray());
25792591
bind_method(PackedStringArray, is_empty, sarray(), varray());
2580-
bind_method(PackedStringArray, set, sarray("index", "value"), varray());
25812592
bind_method(PackedStringArray, push_back, sarray("value"), varray());
25822593
bind_method(PackedStringArray, append, sarray("value"), varray());
25832594
bind_method(PackedStringArray, append_array, sarray("array"), varray());
@@ -2601,7 +2612,6 @@ static void _register_variant_builtin_methods_array() {
26012612

26022613
bind_method(PackedVector2Array, size, sarray(), varray());
26032614
bind_method(PackedVector2Array, is_empty, sarray(), varray());
2604-
bind_method(PackedVector2Array, set, sarray("index", "value"), varray());
26052615
bind_method(PackedVector2Array, push_back, sarray("value"), varray());
26062616
bind_method(PackedVector2Array, append, sarray("value"), varray());
26072617
bind_method(PackedVector2Array, append_array, sarray("array"), varray());
@@ -2625,7 +2635,6 @@ static void _register_variant_builtin_methods_array() {
26252635

26262636
bind_method(PackedVector3Array, size, sarray(), varray());
26272637
bind_method(PackedVector3Array, is_empty, sarray(), varray());
2628-
bind_method(PackedVector3Array, set, sarray("index", "value"), varray());
26292638
bind_method(PackedVector3Array, push_back, sarray("value"), varray());
26302639
bind_method(PackedVector3Array, append, sarray("value"), varray());
26312640
bind_method(PackedVector3Array, append_array, sarray("array"), varray());
@@ -2649,7 +2658,6 @@ static void _register_variant_builtin_methods_array() {
26492658

26502659
bind_method(PackedColorArray, size, sarray(), varray());
26512660
bind_method(PackedColorArray, is_empty, sarray(), varray());
2652-
bind_method(PackedColorArray, set, sarray("index", "value"), varray());
26532661
bind_method(PackedColorArray, push_back, sarray("value"), varray());
26542662
bind_method(PackedColorArray, append, sarray("value"), varray());
26552663
bind_method(PackedColorArray, append_array, sarray("array"), varray());
@@ -2673,7 +2681,6 @@ static void _register_variant_builtin_methods_array() {
26732681

26742682
bind_method(PackedVector4Array, size, sarray(), varray());
26752683
bind_method(PackedVector4Array, is_empty, sarray(), varray());
2676-
bind_method(PackedVector4Array, set, sarray("index", "value"), varray());
26772684
bind_method(PackedVector4Array, push_back, sarray("value"), varray());
26782685
bind_method(PackedVector4Array, append, sarray("value"), varray());
26792686
bind_method(PackedVector4Array, append_array, sarray("array"), varray());

0 commit comments

Comments
 (0)