diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2021-04-15 16:49:14 +0200 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2022-01-04 16:27:14 +0100 |
commit | a24f44294041cc87dd3cadab38e3caa919f774e0 (patch) | |
tree | d184b7382ce311dffaa19795720c17111d28a82c /tests/arrays | |
parent | d74400bfaae61a1e2c246382e627b0a9adf8c304 (diff) | |
download | vala-a24f44294041cc87dd3cadab38e3caa919f774e0.tar.gz |
Add native support to specify non default length-type for arrays
string[:long] foo = new string[:long] { "foo" };
This applies to generated bindings where this new syntax will be
picked up. It will apply a stricter variable type checking for
such array types.
Fixes https://gitlab.gnome.org/GNOME/vala/issues/607
Diffstat (limited to 'tests/arrays')
-rw-r--r-- | tests/arrays/length-type.c-expected | 210 | ||||
-rw-r--r-- | tests/arrays/length-type.vala | 49 |
2 files changed, 259 insertions, 0 deletions
diff --git a/tests/arrays/length-type.c-expected b/tests/arrays/length-type.c-expected new file mode 100644 index 000000000..a854f2029 --- /dev/null +++ b/tests/arrays/length-type.c-expected @@ -0,0 +1,210 @@ +/* arrays_length_type.c generated by valac, the Vala compiler + * generated from arrays_length_type.vala, do not modify */ + +#include <glib.h> + +#if !defined(VALA_EXTERN) +#if defined(_MSC_VER) +#define VALA_EXTERN __declspec(dllexport) extern +#elif __GNUC__ >= 4 +#define VALA_EXTERN __attribute__((visibility("default"))) extern +#else +#define VALA_EXTERN extern +#endif +#endif + +typedef guint8* (*ManamFunc) (guint8* param, gsize param_length1, guint64* result_length1); +#define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg); +#define _vala_return_if_fail(expr, msg) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return; } +#define _vala_return_val_if_fail(expr, msg, val) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return val; } +#define _vala_warn_if_fail(expr, msg) if G_LIKELY (expr) ; else g_warn_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg); + +VALA_EXTERN guint8* field; +VALA_EXTERN gsize field_length1; +guint8* field = NULL; +gsize field_length1 = 0; +static gsize _field_size_ = 0; + +VALA_EXTERN guint8* manam (guint8* param, + gsize param_length1, + guint64* result_length1); +VALA_EXTERN void test_pass (void); +static guint8* _manam_manam_func (guint8* param, + gsize param_length1, + guint64* result_length1); +VALA_EXTERN void foo (guint8** param, + gssize* param_length1); +VALA_EXTERN void test_ref (void); +VALA_EXTERN void bar (guint8** param, + gssize* param_length1); +VALA_EXTERN void test_out (void); +static void _vala_main (void); + +guint8* +manam (guint8* param, + gsize param_length1, + guint64* result_length1) +{ + guint8* _tmp0_; + guint64 _tmp0__length1; + guint8* result; + _vala_assert (((gint64) param_length1) == 2147483648LL, "param.length == 2147483648LL"); + _tmp0_ = param; + _tmp0__length1 = param_length1; + if (result_length1) { + *result_length1 = _tmp0__length1; + } + result = _tmp0_; + return result; +} + +static guint8* +_manam_manam_func (guint8* param, + gsize param_length1, + guint64* result_length1) +{ + guint8* result; + result = manam (param, param_length1, result_length1); + return result; +} + +void +test_pass (void) +{ + guint8* foo = NULL; + guint8* _tmp0_; + gssize foo_length1; + gssize _foo_size_; + guint8* _tmp1_; + gssize _tmp1__length1; + ManamFunc func = NULL; + guint8* bar = NULL; + guint8* _tmp2_; + gssize _tmp2__length1; + guint64 _tmp3_ = 0; + guint8* _tmp4_; + guint64 bar_length1; + guint64 _bar_size_; + guint8* _tmp5_; + gssize _tmp5__length1; + guint8* _tmp6_; + gsize _tmp6__length1; + _tmp0_ = g_new0 (guint8, 2147483648LL); + foo = _tmp0_; + foo_length1 = 2147483648LL; + _foo_size_ = foo_length1; + _tmp1_ = foo; + _tmp1__length1 = foo_length1; + _vala_assert (((gint64) _tmp1__length1) == 2147483648LL, "foo.length == 2147483648LL"); + func = _manam_manam_func; + _tmp2_ = foo; + _tmp2__length1 = foo_length1; + _tmp4_ = func (_tmp2_, (gsize) _tmp2__length1, &_tmp3_); + bar = _tmp4_; + bar_length1 = _tmp3_; + _bar_size_ = bar_length1; + _vala_assert (bar_length1 == ((guint64) 2147483648LL), "bar.length == 2147483648LL"); + _tmp5_ = foo; + _tmp5__length1 = foo_length1; + foo = NULL; + foo_length1 = 0; + field = (g_free (field), NULL); + field = _tmp5_; + field_length1 = _tmp5__length1; + _field_size_ = field_length1; + _tmp6_ = field; + _tmp6__length1 = field_length1; + _vala_assert (((gint64) _tmp6__length1) == 2147483648LL, "field.length == 2147483648LL"); + field = (g_free (field), NULL); + field = NULL; + field_length1 = 0; + _field_size_ = field_length1; + foo = (g_free (foo), NULL); +} + +void +foo (guint8** param, + gssize* param_length1) +{ + guint8* _tmp0_; + _tmp0_ = g_new0 (guint8, 2147483648LL); + *param = (g_free (*param), NULL); + *param = _tmp0_; + *param_length1 = 2147483648LL; +} + +void +test_ref (void) +{ + guint8* a = NULL; + guint8* _tmp0_; + gssize a_length1; + gssize _a_size_; + guint8* _tmp1_; + gssize _tmp1__length1; + _tmp0_ = g_new0 (guint8, 0); + a = _tmp0_; + a_length1 = 0; + _a_size_ = a_length1; + foo (&a, (gssize*) (&a_length1)); + _a_size_ = a_length1; + _tmp1_ = a; + _tmp1__length1 = a_length1; + _vala_assert (((gint64) _tmp1__length1) == 2147483648LL, "a.length == 2147483648LL"); + a = (g_free (a), NULL); +} + +void +bar (guint8** param, + gssize* param_length1) +{ + guint8* _vala_param = NULL; + gssize _vala_param_length1 = 0; + guint8* _tmp0_; + _tmp0_ = g_new0 (guint8, 2147483648LL); + _vala_param = (g_free (_vala_param), NULL); + _vala_param = _tmp0_; + _vala_param_length1 = 2147483648LL; + if (param) { + *param = _vala_param; + } else { + _vala_param = (g_free (_vala_param), NULL); + } + if (param_length1) { + *param_length1 = _vala_param_length1; + } +} + +void +test_out (void) +{ + guint8* a = NULL; + gssize a_length1 = 0L; + gssize _a_size_ = 0L; + guint8* _tmp0_ = NULL; + gssize _tmp1_ = 0; + bar (&_tmp0_, &_tmp1_); + a = (g_free (a), NULL); + a = _tmp0_; + a_length1 = _tmp1_; + _a_size_ = a_length1; + _vala_assert (((gint64) a_length1) == 2147483648LL, "a.length == 2147483648LL"); + a = (g_free (a), NULL); +} + +static void +_vala_main (void) +{ + test_pass (); + test_ref (); + test_out (); +} + +int +main (int argc, + char ** argv) +{ + _vala_main (); + return 0; +} + diff --git a/tests/arrays/length-type.vala b/tests/arrays/length-type.vala new file mode 100644 index 000000000..63f6124d6 --- /dev/null +++ b/tests/arrays/length-type.vala @@ -0,0 +1,49 @@ +[CCode (has_target = false)] +delegate unowned uint8[:uint64] ManamFunc (uint8[:size_t] param); + +unowned uint8[:uint64] manam (uint8[:size_t] param) { + assert (param.length == 2147483648LL); + return param; +} + +uint8[:size_t] field; + +void test_pass () { + var foo = new uint8[2147483648LL:ssize_t]; + assert (foo.length == 2147483648LL); + + ManamFunc func = manam; + unowned var bar = func (foo); + assert (bar.length == 2147483648LL); + + field = (owned) foo; + assert (field.length == 2147483648LL); + + field = null; +} + +void foo (ref uint8[:ssize_t] param) { + param = new uint8[2147483648LL:ssize_t]; +} + +void test_ref () { + var a = new uint8[:ssize_t] {}; + foo (ref a); + assert (a.length == 2147483648LL); +} + +void bar (out uint8[:ssize_t] param) { + param = new uint8[2147483648LL:ssize_t]; +} + +void test_out () { + uint8[:ssize_t] a; + bar (out a); + assert (a.length == 2147483648LL); +} + +void main () { + test_pass (); + test_ref (); + test_out (); +} |