Skip to content

Commit 74857d7

Browse files
authored
Switch SwiftSelf<T> position requirement to last (#108547)
This is added as the last parameter by the Swift compiler, so to support instance calls taking parameters this needs to come last.
1 parent e1a14a8 commit 74857d7

File tree

4 files changed

+40
-9
lines changed

4 files changed

+40
-9
lines changed

src/coreclr/jit/importercalls.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2226,9 +2226,9 @@ void Compiler::impPopArgsForSwiftCall(GenTreeCall* call, CORINFO_SIG_INFO* sig,
22262226
BADCODE("Duplicate SwiftSelf parameter");
22272227
}
22282228

2229-
if (argIndex != 0)
2229+
if (argIndex != (sig->numArgs - 1))
22302230
{
2231-
BADCODE("SwiftSelf<T> must be the first argument in the signature");
2231+
BADCODE("SwiftSelf<T> must be the last argument in the signature");
22322232
}
22332233

22342234
selfType = info.compCompHnd->getTypeInstantiationArgument(argClass, 0);

src/mono/mono/metadata/marshal.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3714,9 +3714,9 @@ mono_marshal_get_native_wrapper (MonoMethod *method, gboolean check_exceptions,
37143714
break;
37153715
} else if (param_klass == swift_error || param_klass == swift_error_ptr) {
37163716
swift_error_args++;
3717-
} else if (param_gklass && (param_gklass->container_class == swift_self_t) && i > 0) {
3717+
} else if (param_gklass && (param_gklass->container_class == swift_self_t) && (i != method->signature->param_count - 1)) {
37183718
swift_error_args = swift_self_args = 0;
3719-
mono_error_set_generic_error (emitted_error, "System", "InvalidProgramException", "SwiftSelf<T> must be the first argument in the signature.");
3719+
mono_error_set_generic_error (emitted_error, "System", "InvalidProgramException", "SwiftSelf<T> must be the last argument in the signature.");
37203720
break;
37213721
} else if (param_gklass && (param_gklass->container_class == swift_self_t) && m_type_is_byref (method->signature->params [i])) {
37223722
swift_error_args = swift_self_args = 0;

src/tests/Interop/Swift/SwiftSelfContext/SwiftSelfContext.cs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,11 @@ public struct FrozenNonEnregisteredStruct
6161
}
6262

6363
[UnmanagedCallConv(CallConvs = new Type[] { typeof(CallConvSwift) })]
64-
[DllImport(SwiftLib, EntryPoint = "$s16SwiftSelfContext24FrozenEnregisteredStructV3Sums5Int64VyF")]
64+
[DllImport(SwiftLib, EntryPoint = "$s16SwiftSelfContext24FrozenEnregisteredStructV3sums5Int64VyF")]
6565
public static extern long SumFrozenEnregisteredStruct(SwiftSelf<FrozenEnregisteredStruct> self);
6666

6767
[UnmanagedCallConv(CallConvs = new Type[] { typeof(CallConvSwift) })]
68-
[DllImport(SwiftLib, EntryPoint = "$s16SwiftSelfContext27FrozenNonEnregisteredStructV3Sums5Int64VyF")]
68+
[DllImport(SwiftLib, EntryPoint = "$s16SwiftSelfContext27FrozenNonEnregisteredStructV3sums5Int64VyF")]
6969
public static extern long SumFrozenNonEnregisteredStruct(SwiftSelf<FrozenNonEnregisteredStruct> self);
7070

7171
[Fact]
@@ -81,4 +81,27 @@ public unsafe static void TestSelfIsFrozenNonEnregisteredStruct()
8181
long sum = SumFrozenNonEnregisteredStruct(new SwiftSelf<FrozenNonEnregisteredStruct>(new FrozenNonEnregisteredStruct { A = 10, B = 20, C = 30, D = 40, E = 50 }));
8282
Assert.Equal(150, sum);
8383
}
84+
85+
[UnmanagedCallConv(CallConvs = new Type[] { typeof(CallConvSwift) })]
86+
[DllImport(SwiftLib, EntryPoint = "$s16SwiftSelfContext24FrozenEnregisteredStructV16sumWithExtraArgs1c1dS2f_SftF")]
87+
public static extern float SumFrozenEnregisteredStructWithExtraArgs(float c, float d, SwiftSelf<FrozenEnregisteredStruct> self);
88+
89+
[UnmanagedCallConv(CallConvs = new Type[] { typeof(CallConvSwift) })]
90+
[DllImport(SwiftLib, EntryPoint = "$s16SwiftSelfContext27FrozenNonEnregisteredStructV16sumWithExtraArgs1f1gS2f_SftF")]
91+
public static extern float SumFrozenNonEnregisteredStructWithExtraArgs(float f, float g, SwiftSelf<FrozenNonEnregisteredStruct> self);
92+
93+
[Fact]
94+
public unsafe static void TestSelfIsFrozenEnregisteredStructWithExtraArgs()
95+
{
96+
float sum = SumFrozenEnregisteredStructWithExtraArgs(3f, 4f, new SwiftSelf<FrozenEnregisteredStruct>(new FrozenEnregisteredStruct { A = 10, B = 20 }));
97+
Assert.Equal(37f, sum);
98+
}
99+
100+
[Fact]
101+
[SkipOnMono("https://github.com/dotnet/runtime/issues/108855")]
102+
public unsafe static void TestSelfIsFrozenNonEnregisteredStructWithExtraArgs()
103+
{
104+
float sum = SumFrozenNonEnregisteredStructWithExtraArgs(3f, 4f, new SwiftSelf<FrozenNonEnregisteredStruct>(new FrozenNonEnregisteredStruct { A = 10, B = 20, C = 30, D = 40, E = 50 }));
105+
Assert.Equal(157f, sum);
106+
}
84107
}

src/tests/Interop/Swift/SwiftSelfContext/SwiftSelfContext.swift

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,13 @@ public struct FrozenEnregisteredStruct
2626
let a : Int64;
2727
let b : Int64;
2828

29-
public func Sum() -> Int64 {
29+
public func sum() -> Int64 {
3030
return a + b
3131
}
32+
33+
public func sumWithExtraArgs(c: Float, d: Float) -> Float {
34+
return Float(a + b) + c + d
35+
}
3236
}
3337

3438
@frozen
@@ -39,7 +43,11 @@ public struct FrozenNonEnregisteredStruct {
3943
let d : Int64;
4044
let e : Int64;
4145

42-
public func Sum() -> Int64 {
46+
public func sum() -> Int64 {
4347
return a + b + c + d + e
4448
}
45-
}
49+
50+
public func sumWithExtraArgs(f: Float, g: Float) -> Float {
51+
return Float(a + b + c + d + e) + f + g
52+
}
53+
}

0 commit comments

Comments
 (0)