Skip to content

Commit

Permalink
Merge branch 'main' into dev/mandel/transformer-thread-safe-data
Browse files Browse the repository at this point in the history
  • Loading branch information
mandel-macaque authored Jan 29, 2025
2 parents 624397d + 3b647ca commit de71f7d
Show file tree
Hide file tree
Showing 16 changed files with 158 additions and 15 deletions.
2 changes: 1 addition & 1 deletion msbuild/Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
-->
<MessagingVersion Condition="'$(MessagingVersion)' == ''">[3.0.13]</MessagingVersion>
<HotRestartVersion>[17.14.51-gd03e25086a]</HotRestartVersion>
<HotRestartVersion>[17.14.83-g77e8f56103]</HotRestartVersion>
</PropertyGroup>
<Import Project="$(MSBuildThisFileDirectory)../Directory.Build.props" />
</Project>
2 changes: 1 addition & 1 deletion msbuild/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ IOS_WINDOWS_TARGETS = \

TASK_ASSEMBLIES = Xamarin.MacDev.Tasks $(LOCALIZATION_ASSEMBLIES)
IOS_WINDOWS_TASK_ASSEMBLIES = Xamarin.iOS.Tasks.Windows
IOS_WINDOWS_DEPENDENCIES = Xamarin.iOS.Windows.Client iSign.Core ws2_32 System.Diagnostics.Tracer System.Formats.Asn1 System.Buffers System.Memory System.Numerics.Vectors System.Runtime.CompilerServices.Unsafe System.Security.Cryptography.ProtectedData System.Security.Cryptography.Pkcs Microsoft.Win32.Registry System.Security.AccessControl System.Security.Principal.Windows
IOS_WINDOWS_DEPENDENCIES = Xamarin.iOS.Windows.Client iSign.Core ws2_32 System.Diagnostics.Tracer System.Formats.Asn1 System.Buffers System.Memory System.Numerics.Vectors System.Runtime.CompilerServices.Unsafe System.Security.Cryptography.ProtectedData System.Security.Cryptography.Pkcs Microsoft.Win32.Registry
IOS_WINDOWS_MOBILEDEVICE_TOOLS = iMobileDevice-net bz2 getopt ideviceactivation idevicebackup idevicebackup2 idevicecrashreport idevicedate idevicedebug idevicedebugserverproxy idevicediagnostics ideviceenterrecovery ideviceimagemounter ideviceinfo ideviceinstaller idevicename idevicenotificationproxy idevicepair ideviceprovision idevicerestore idevicescreenshot idevicesyslog idevice_id imobiledevice-net-lighthouse imobiledevice ios_webkit_debug_proxy iproxy irecovery irecovery libcharset libcurl LIBEAY32 libiconv libusb-1.0 libusb0 libxml2 lzma pcre pcreposix plist plistutil plist_cmp plist_test pthreadVC3 readline SSLEAY32 usbmuxd usbmuxd vcruntime140 zip zlib1

PROPS_AND_TARGETS = \
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
<PackageReference Include="Xamarin.Messaging.Build.Client" Version="$(MessagingVersion)" IncludeAssets="contentFiles" />
<PackageReference Include="Xamarin.Messaging.Core" Version="$(MessagingVersion)" IncludeAssets="build" />
<PackageReference Include="Xamarin.Messaging.Server" Version="$(MessagingVersion)" IncludeAssets="contentFiles" />
<PackageReference Include="iSign.Core" Version="$(HotRestartVersion)" GeneratePathProperty="true" />
<PackageReference Include="Xamarin.iOS.HotRestart.Client" Version="$(HotRestartVersion)" GeneratePathProperty="true" />
<PackageReference Include="System.Diagnostics.Tracer" Version="2.1.0-alpha" GeneratePathProperty="true" />
<!-- GitInfo is pulled in because of Xamarin.Messaging from above, but we don't want it, so just exclude all assets from it -->
Expand All @@ -38,7 +39,7 @@
<None Include="*.targets">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="$(PkgXamarin_iOS_HotRestart_Client)\lib\netstandard2.0\iSign.Core.pdb" CopyToOutputDirectory="PreserveNewest" />
<None Include="$(PkgiSign_Core)\lib\netstandard2.0\iSign.Core.pdb" CopyToOutputDirectory="PreserveNewest" />
<None Include="$(PkgXamarin_iOS_HotRestart_Client)\lib\netstandard2.0\Xamarin.iOS.Windows.Client.pdb" CopyToOutputDirectory="PreserveNewest" />
<Compile Include="../Versions.g.cs" />
<Compile Include="..\Xamarin.MacDev.Tasks\PublishFolderType.cs">
Expand Down
2 changes: 1 addition & 1 deletion src/rgen/Microsoft.Macios.Generator/DataModel/TypeInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ public override int GetHashCode ()
const string IntPtr = "IntPtr";
const string UIntPtr = "UIntPtr";

public string? ToMarshallType (ReferenceKind referenceKind)
public string? ToMarshallType ()
{
#pragma warning disable format
var type = this switch {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,77 @@
using System.Collections.Immutable;
using System.Linq;
using System.Text;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.Macios.Generator.Attributes;
using Microsoft.Macios.Generator.DataModel;
using Microsoft.Macios.Generator.Extensions;
using TypeInfo = Microsoft.Macios.Generator.DataModel.TypeInfo;
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;

namespace Microsoft.Macios.Generator.Emitters;

static partial class BindingSyntaxFactory {
readonly static string objc_msgSend = "objc_msgSend";
readonly static string objc_msgSendSuper = "objc_msgSendSuper";

/// <summary>
/// Returns the expression needed to cast a parameter to its native type.
/// </summary>
/// <param name="parameter">The parameter whose castin we need to generate. The type info has to be
/// and enum and be marked as native. If it is not the method returns null</param>
/// <returns></returns>
internal static CastExpressionSyntax? CastToNative (in Parameter parameter)
{
// not an enum and not a native value. we cannot calculate the casting expression.
if (!parameter.Type.IsEnum || !parameter.Type.IsNativeEnum)
return null;

// build a casting expression based on the marshall type of the typeinfo
var marshalType = parameter.Type.ToMarshallType ();
if (marshalType is null)
// cannot calculate the marshal, return null
return null;

var enumBackingValue = parameter.Type.EnumUnderlyingType.Value.GetKeyword ();
var castExpression = CastExpression (IdentifierName (marshalType), // (IntPtr/UIntPtr) cast
CastExpression (
IdentifierName (enumBackingValue),
IdentifierName (parameter.Name)
.WithLeadingTrivia (Space))
.WithLeadingTrivia (Space)); // (backingfield) (variable) cast
return castExpression;
}

/// <summary>
/// Returns the expression needed to cast a bool to a byte to be used in a native call.
/// </summary>
/// <param name="parameter">The parameter to cast.</param>
/// <returns>A conditional expression that casts a bool to a byte.</returns>
internal static ConditionalExpressionSyntax? CastToByte (in Parameter parameter)
{
if (parameter.Type.SpecialType != SpecialType.System_Boolean)
return null;
// (byte) 1
var castOne = CastExpression (
PredefinedType (Token (SyntaxKind.ByteKeyword)),
LiteralExpression (SyntaxKind.NumericLiteralExpression, Literal (1)).WithLeadingTrivia (Space).WithTrailingTrivia (Space)
);
// (byte) 0
var castZero = CastExpression (
PredefinedType (Token (SyntaxKind.ByteKeyword)),
LiteralExpression (SyntaxKind.NumericLiteralExpression, Literal (0)).WithLeadingTrivia (Space)
).WithLeadingTrivia (Space);

// with this exact space count
// foo ? (byte) 1 : (byte) 0
return ConditionalExpression (
condition: IdentifierName (parameter.Name).WithTrailingTrivia (Space),
whenTrue: castOne.WithLeadingTrivia (Space),
whenFalse: castZero);
}

static string? GetObjCMessageSendMethodName<T> (ExportData<T> exportData,
TypeInfo returnType, ImmutableArray<Parameter> parameters, bool isSuper = false, bool isStret = false) where T : Enum
{
Expand All @@ -42,7 +102,7 @@ static partial class BindingSyntaxFactory {
}

// return types do not have a reference kind
sb.Append (returnType.ToMarshallType (ReferenceKind.None));
sb.Append (returnType.ToMarshallType ());
sb.Append ('_');
// append the msg method based if it is for super or not, do not append '_' intimidatingly, since if we do
// not have parameters, we are done
Expand All @@ -53,7 +113,7 @@ static partial class BindingSyntaxFactory {
// loop over params and get their native handler name
if (parameters.Length > 0) {
sb.Append ('_');
sb.AppendJoin ('_', parameters.Select (p => p.Type.ToMarshallType (p.ReferenceKind)));
sb.AppendJoin ('_', parameters.Select (p => p.Type.ToMarshallType ()));
}

// check if we do have a custom marshall exception set for the export
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ static class SpecialTypeExtensions {
/// </summary>
/// <param name="self">The special type to convert.</param>
/// <returns>The string representation of the keyword.</returns>
public static string? GetKeyword (this SpecialType self)
public static string GetKeyword (this SpecialType self)
{
var kind = self switch {
SpecialType.System_Void => SyntaxKind.VoidKeyword,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,7 @@ void GenerateCode (SourceProductionContext context, Compilation compilation,
var models = new (string Model, AttributeTargets[] Targets) [] {
("EnumMember", [AttributeTargets.Field]),
("Parameter", [AttributeTargets.Parameter]),
("Accessor", [AttributeTargets.Property]),
("Property", [AttributeTargets.Property]),
("Method", [AttributeTargets.Method]),
("Binding", [AttributeTargets.Interface, AttributeTargets.Class, AttributeTargets.Enum, AttributeTargets.Struct]),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,6 @@ namespace Microsoft.Macios.Generator.DataModel;
readonly partial struct Accessor {

public ExportData? ExportPropertyData { get; init; }

public Accessor () { }
}
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ void ToMarshallType (ApplePlatform platform, string inputText, string expectedTy
Assert.NotNull (declaration);
Assert.True (Property.TryCreate (declaration, semanticModel, out var changes));
Assert.NotNull (changes);
var marshall = changes.Value.ReturnType.ToMarshallType (ReferenceKind.None);
var marshall = changes.Value.ReturnType.ToMarshallType ();
Assert.NotNull (marshall);
Assert.Equal (expectedTypeName, marshall);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

using System.Collections;
using System.Collections.Generic;
using Microsoft.CodeAnalysis;
using Microsoft.Macios.Generator.DataModel;
using Xunit;
using static Microsoft.Macios.Generator.Emitters.BindingSyntaxFactory;
using static Microsoft.Macios.Generator.Tests.TestDataFactory;

namespace Microsoft.Macios.Generator.Tests.Emitters;

public class BindingSyntaxFactoryObjCRuntimeTests {

class TestDataCastToNativeTests : IEnumerable<object []> {
public IEnumerator<object []> GetEnumerator ()
{

// not enum parameter
var boolParam = new Parameter (
position: 0,
type: ReturnTypeForBool (),
name: "myParam");
yield return [boolParam, null!];

// not smart enum parameter
var enumParam = new Parameter (
position: 0,
type: ReturnTypeForEnum ("MyEnum", isNativeEnum: false),
name: "myParam");

yield return [enumParam, null!];

// int64
var byteEnum = new Parameter (
position: 0,
type: ReturnTypeForEnum ("MyEnum", isNativeEnum: true, underlyingType: SpecialType.System_Int64),
name: "myParam");
yield return [byteEnum, "(IntPtr) (long) myParam"];

// uint64
var int64Enum = new Parameter (
position: 0,
type: ReturnTypeForEnum ("MyEnum", isNativeEnum: true, underlyingType: SpecialType.System_UInt64),
name: "myParam");
yield return [int64Enum, "(UIntPtr) (ulong) myParam"];
}

IEnumerator IEnumerable.GetEnumerator () => GetEnumerator ();
}

[Theory]
[ClassData (typeof (TestDataCastToNativeTests))]
void CastToNativeTests (Parameter parameter, string? expectedCast)
{
var expression = CastToNative (parameter);
if (expectedCast is null) {
Assert.Null (expression);
} else {
Assert.NotNull (expression);
Assert.Equal (expectedCast, expression?.ToString ());
}
}

[Fact]
void CastToByteTests ()
{
var boolParameter = new Parameter (0, ReturnTypeForBool (), "myParameter");
var conditionalExpr = CastToByte (boolParameter);
Assert.NotNull (conditionalExpr);
Assert.Equal ("myParameter ? (byte) 1 : (byte) 0", conditionalExpr.ToString ());

var intParameter = new Parameter (1, ReturnTypeForInt (), "myParameter");
conditionalExpr = CastToByte (intParameter);
Assert.Null (conditionalExpr);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,8 @@ public static TypeInfo ReturnTypeForStruct (string structName)
isStruct: true
) { Parents = ["System.ValueType", "object"] };

public static TypeInfo ReturnTypeForEnum (string enumName, bool isSmartEnum = false, bool isNativeEnum = false)
public static TypeInfo ReturnTypeForEnum (string enumName, bool isSmartEnum = false, bool isNativeEnum = false,
SpecialType underlyingType = SpecialType.System_Int32)
=> new (
name: enumName,
isBlittable: true,
Expand All @@ -199,7 +200,7 @@ public static TypeInfo ReturnTypeForEnum (string enumName, bool isSmartEnum = fa
"System.ISpanFormattable"
],
IsNativeEnum = isNativeEnum,
EnumUnderlyingType = SpecialType.System_Int32,
EnumUnderlyingType = underlyingType,
};

public static TypeInfo ReturnTypeForArray (string type, bool isNullable = false, bool isBlittable = false)
Expand Down
2 changes: 1 addition & 1 deletion tools/devops/automation/build-pipeline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ parameters:
- name: macOSName # comes from the build agent demand named macOS.Name
displayName: Name of the version of macOS to use
type: string
default: 'Sonoma'
default: 'Sequoia'

- name: runGovernanceTests
displayName: Run Governance Checks
Expand Down
2 changes: 1 addition & 1 deletion tools/devops/automation/build-pull-request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ parameters:
- name: macOSName # comes from the build agent demand named macOS.Name
displayName: Name of the version of macOS to use
type: string
default: 'Sonoma'
default: 'Sequoia'

- name: runGovernanceTests
displayName: Run Governance Checks
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ parameters:
- name: macOSName # comes from the build agent demand named macOS.Name
displayName: Name of the version of macOS to use
type: string
default: 'Sonoma'
default: 'Sequoia'

- name: pool
type: string
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ parameters:
- name: macOSName # comes from the build agent demand named macOS.Name
displayName: Name of the version of macOS to use
type: string
default: 'Sonoma'
default: 'Sequoia'

- name: pool
type: string
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ parameters:
- name: macOSName # comes from the build agent demand named macOS.Name
displayName: Name of the version of macOS to use
type: string
default: 'Sonoma'
default: 'Sequoia'

- name: runTests
displayName: Run Simulator Tests
Expand Down

0 comments on commit de71f7d

Please sign in to comment.