Skip to content

Commit 61126f5

Browse files
[release/9.0-preview7] Add swiftcall signature check for mono_class_try_get_swift_error_class (#105813)
* Add signature check for swiftcall * Handle null values for swift_error_ptr --------- Co-authored-by: Milos Kotlar <[email protected]>
1 parent 4c12625 commit 61126f5

File tree

4 files changed

+7
-7
lines changed

4 files changed

+7
-7
lines changed

Diff for: src/mono/mono/metadata/marshal.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -3702,7 +3702,7 @@ mono_marshal_get_native_wrapper (MonoMethod *method, gboolean check_exceptions,
37023702
MonoClass *swift_self_t = mono_class_try_get_swift_self_t_class ();
37033703
MonoClass *swift_error = mono_class_try_get_swift_error_class ();
37043704
MonoClass *swift_indirect_result = mono_class_try_get_swift_indirect_result_class ();
3705-
MonoClass *swift_error_ptr = mono_class_create_ptr (m_class_get_this_arg (swift_error));
3705+
MonoClass *swift_error_ptr = swift_error ? mono_class_create_ptr (m_class_get_this_arg (swift_error)) : NULL;
37063706
int swift_error_args = 0, swift_self_args = 0, swift_indirect_result_args = 0;
37073707
for (int i = 0; i < method->signature->param_count; ++i) {
37083708
MonoClass *param_klass = mono_class_from_mono_type_internal (method->signature->params [i]);

Diff for: src/mono/mono/mini/interp/transform.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -4486,8 +4486,6 @@ interp_method_compute_offsets (TransformData *td, InterpMethod *imethod, MonoMet
44864486
#ifdef MONO_ARCH_HAVE_SWIFTCALL
44874487
int swift_error_index = -1;
44884488
imethod->swift_error_offset = -1;
4489-
MonoClass *swift_error = mono_class_try_get_swift_error_class ();
4490-
MonoClass *swift_error_ptr = mono_class_create_ptr (m_class_get_this_arg (swift_error));
44914489
#endif
44924490

44934491
/*
@@ -4517,6 +4515,8 @@ interp_method_compute_offsets (TransformData *td, InterpMethod *imethod, MonoMet
45174515

45184516
#ifdef MONO_ARCH_HAVE_SWIFTCALL
45194517
if (swift_error_index < 0 && mono_method_signature_has_ext_callconv (sig, MONO_EXT_CALLCONV_SWIFTCALL)) {
4518+
MonoClass *swift_error = mono_class_try_get_swift_error_class ();
4519+
MonoClass *swift_error_ptr = swift_error ? mono_class_create_ptr (m_class_get_this_arg (swift_error)) : NULL;
45204520
MonoClass *klass = mono_class_from_mono_type_internal (type);
45214521
if (klass == swift_error_ptr)
45224522
swift_error_index = i;

Diff for: src/mono/mono/mini/mini-amd64.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -1089,7 +1089,7 @@ get_call_info (MonoMemPool *mp, MonoMethodSignature *sig)
10891089
MonoClass *swift_self = mono_class_try_get_swift_self_class ();
10901090
MonoClass *swift_error = mono_class_try_get_swift_error_class ();
10911091
MonoClass *swift_indirect_result = mono_class_try_get_swift_indirect_result_class ();
1092-
MonoClass *swift_error_ptr = mono_class_create_ptr (m_class_get_this_arg (swift_error));
1092+
MonoClass *swift_error_ptr = swift_error ? mono_class_create_ptr (m_class_get_this_arg (swift_error)) : NULL;
10931093
MonoClass *klass = mono_class_from_mono_type_internal (sig->params [i]);
10941094
if (klass == swift_indirect_result)
10951095
cinfo->need_swift_return_buffer = TRUE;
@@ -1553,7 +1553,7 @@ gpointer
15531553
mono_arch_get_swift_error (CallContext *ccontext, MonoMethodSignature *sig, int *arg_index)
15541554
{
15551555
MonoClass *swift_error = mono_class_try_get_swift_error_class ();
1556-
MonoClass *swift_error_ptr = mono_class_create_ptr (m_class_get_this_arg (swift_error));
1556+
MonoClass *swift_error_ptr = swift_error ? mono_class_create_ptr (m_class_get_this_arg (swift_error)) : NULL;
15571557
for (guint i = 0; i < sig->param_count + sig->hasthis; i++) {
15581558
MonoClass *klass = mono_class_from_mono_type_internal (sig->params [i]);
15591559
if (klass && (klass == swift_error || klass == swift_error_ptr)) {

Diff for: src/mono/mono/mini/mini-arm64.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -1916,7 +1916,7 @@ get_call_info (MonoMemPool *mp, MonoMethodSignature *sig)
19161916
MonoClass *swift_self = mono_class_try_get_swift_self_class ();
19171917
MonoClass *swift_error = mono_class_try_get_swift_error_class ();
19181918
MonoClass *swift_indirect_result = mono_class_try_get_swift_indirect_result_class ();
1919-
MonoClass *swift_error_ptr = mono_class_create_ptr (m_class_get_this_arg (swift_error));
1919+
MonoClass *swift_error_ptr = swift_error ? mono_class_create_ptr (m_class_get_this_arg (swift_error)) : NULL;
19201920
MonoClass *klass = mono_class_from_mono_type_internal (sig->params [pindex]);
19211921
if ((klass == swift_self || klass == swift_indirect_result) && sig->pinvoke) {
19221922
guint32 align;
@@ -2269,7 +2269,7 @@ gpointer
22692269
mono_arch_get_swift_error (CallContext *ccontext, MonoMethodSignature *sig, int *arg_index)
22702270
{
22712271
MonoClass *swift_error = mono_class_try_get_swift_error_class ();
2272-
MonoClass *swift_error_ptr = mono_class_create_ptr (m_class_get_this_arg (swift_error));
2272+
MonoClass *swift_error_ptr = swift_error ? mono_class_create_ptr (m_class_get_this_arg (swift_error)) : NULL;
22732273
for (guint i = 0; i < sig->param_count + sig->hasthis; i++) {
22742274
MonoClass *klass = mono_class_from_mono_type_internal (sig->params [i]);
22752275
if (klass && (klass == swift_error || klass == swift_error_ptr)) {

0 commit comments

Comments
 (0)