Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ private static string GetNullableTypeName(GirModel.Parameter parameter)
{
{ Direction: GirModel.Direction.In, Transfer: GirModel.Transfer.None } => Model.TypedRecord.GetFullyQuallifiedHandle(type),
{ Direction: GirModel.Direction.In, Transfer: GirModel.Transfer.Full } => Model.TypedRecord.GetFullyQuallifiedUnownedHandle(type),
{ Direction: GirModel.Direction.Out, Transfer: GirModel.Transfer.None } => Model.TypedRecord.GetFullyQuallifiedHandle(type),
_ => throw new Exception($"Can't detect record parameter type {parameter.Name}: CallerAllocates={parameter.CallerAllocates} Direction={parameter.Direction} Transfer={parameter.Transfer}")
};
}
Expand All @@ -36,6 +37,7 @@ private static string GetNullableTypeName(GirModel.Parameter parameter)
{
{ Direction: GirModel.Direction.In } => ParameterDirection.In(),
{ Direction: GirModel.Direction.InOut } => ParameterDirection.In(),
{ Direction: GirModel.Direction.Out, CallerAllocates: true } => ParameterDirection.In(), //We can use "in" here because caller allocates the memory
_ => throw new Exception($"Unknown parameter direction for typed record parameter {parameter.Name}")
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,6 @@ private static string GetNullableTypeName(GirModel.Parameter parameter)
{
{ Direction: GirModel.Direction.In } => ParameterDirection.In(),
{ Direction: GirModel.Direction.Out } => ParameterDirection.Out(),
_ => throw new Exception($"records with direction '{parameter.Direction}' not yet supported")
_ => throw new Exception($"Typed records with direction '{parameter.Direction}' not yet supported")
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,21 @@ private static void ErrorRecord(ParameterToNativeData parameterData)

private static void RegularRecord(ParameterToNativeData parameter)
{
if (parameter.Parameter.Direction != GirModel.Direction.In)
throw new NotImplementedException($"{parameter.Parameter.AnyTypeOrVarArgs}: record parameter '{parameter.Parameter.Name}' with direction != in not yet supported");
switch (parameter.Parameter.Direction)
{
case GirModel.Direction.In:
In(parameter);
break;
case GirModel.Direction.Out:
Out(parameter);
break;
default:
throw new NotImplementedException($"{parameter.Parameter.AnyTypeOrVarArgs}: record parameter '{parameter.Parameter.Name}' with direction = {parameter.Parameter.Direction} not yet supported");
}
}

private static void In(ParameterToNativeData parameter)
{
var record = (GirModel.Record) parameter.Parameter.AnyTypeOrVarArgs.AsT0.AsT0;
var typeHandle = Model.TypedRecord.GetFullyQuallifiedHandle(record);
var nullHandle = Model.TypedRecord.GetFullyQuallifiedNullHandle(record);
Expand All @@ -47,4 +59,21 @@ private static void RegularRecord(ParameterToNativeData parameter)
parameter.SetSignatureName(() => signatureName);
parameter.SetCallName(() => callName);
}

private static void Out(ParameterToNativeData parameter)
{
var record = (GirModel.Record) parameter.Parameter.AnyTypeOrVarArgs.AsT0.AsT0;
var signatureName = Model.Parameter.GetName(parameter.Parameter);
var className = Model.TypedRecord.GetFullyQualifiedPublicClassName(record);

var callName = parameter.Parameter switch
{
{ Nullable: false, Transfer: GirModel.Transfer.None, CallerAllocates: true } => $"{signatureName}.Handle",
_ => throw new Exception($"Can't detect call name for parameter record parameter {parameter.Parameter.Name}")
};

parameter.SetSignatureName(() => signatureName);
parameter.SetExpression(() => @$"{signatureName} = new {className}();");
parameter.SetCallName(() => callName);
}
}
14 changes: 13 additions & 1 deletion src/Native/GirTestLib/girtest-typed-record-tester.c
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ girtest_typed_record_tester_nullable_mirror(GirTestTypedRecordTester *data, gboo
}

/**
* girtrest_typed_record_tester_unref:
* girtest_typed_record_tester_unref:
* @self: (transfer full): a `GirTestTypedRecordTester`
*
* Decrements the reference count on `data` and frees the
Expand Down Expand Up @@ -224,6 +224,18 @@ int girtest_typed_record_tester_get_ref_count_sum_nullable(GirTestTypedRecordTes
return girtest_typed_record_tester_get_ref_count_sum(data, size);
}

/**
* girtest_typed_record_tester_out_no_ownership_transfer_non_nullable_caller_allocates:
* @data: (not nullable) (out caller-allocates) (transfer none): a `GirTestTypedRecordTester`
**/
void
girtest_typed_record_tester_out_no_ownership_transfer_non_nullable_caller_allocates (GirTestTypedRecordTester *data)
{
g_return_if_fail (data != NULL);

data->custom_string = g_strdup("OutParameter");
}

/**
* girtest_typed_record_tester_run_callback_return_no_ownership_transfer:
* @callback: (scope call): a callback
Expand Down
5 changes: 3 additions & 2 deletions src/Native/GirTestLib/girtest-typed-record-tester.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,14 @@ GType girtest_typed_record_tester_get_type (void) G_GNUC_CONST;
/**
* GirTestCreateTypedRecordTesterNoOwnershipTransfer:
*
* Returns: (transfer none): a new OpaqueRecordTester.
* Returns: (transfer none): a new TypedRecordTester.
*/
typedef GirTestTypedRecordTester* (*GirTestCreateTypedRecordTesterNoOwnershipTransfer) ();

/**
* GirTestCreateTypedRecordTesterNoOwnershipTransferNullable:
*
* Returns: (transfer none) (nullable): a new OpaqueRecordTester or NULL.
* Returns: (transfer none) (nullable): a new TypedRecordTester or NULL.
*/
typedef GirTestTypedRecordTester* (*GirTestCreateTypedRecordTesterNoOwnershipTransferNullable) ();

Expand Down Expand Up @@ -120,6 +120,7 @@ void girtest_typed_record_tester_take_and_unref_func(int dummy, GirTestTypedReco
void girtest_typed_record_tester_take_and_unref_func_nullable(int dummy, GirTestTypedRecordTester *data);
int girtest_typed_record_tester_get_ref_count_sum(GirTestTypedRecordTester * const *data, gsize size);
int girtest_typed_record_tester_get_ref_count_sum_nullable(GirTestTypedRecordTester * const *data, gsize size);
void girtest_typed_record_tester_out_no_ownership_transfer_non_nullable_caller_allocates(GirTestTypedRecordTester *data);
GirTestTypedRecordTester * girtest_typed_record_tester_run_callback_return_no_ownership_transfer(GirTestCreateTypedRecordTesterNoOwnershipTransfer callback);
GirTestTypedRecordTester * girtest_typed_record_tester_run_callback_return_no_ownership_transfer_nullable(GirTestCreateTypedRecordTesterNoOwnershipTransferNullable callback);
GirTestTypedRecordTester * girtest_typed_record_tester_run_callback_return_full_ownership_transfer(GirTestCreateTypedRecordTesterFullOwnershipTransfer callback);
Expand Down
7 changes: 7 additions & 0 deletions src/Tests/Libs/GirTest-0.1.Tests/TypedRecordTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,13 @@ public void SupportsParameterNullableTransferNone()
result.Should().Be(1);
}

[TestMethod]
public void SupportsOutParameterNonNullableTransferNoneCallerAllocates()
{
TypedRecordTester.OutNoOwnershipTransferNonNullableCallerAllocates(out TypedRecordTester recordTester);
recordTester.CustomString.Should().Be("OutParameter");
}

[TestMethod]
public void SupportsParameterArrayWithLengthParameter()
{
Expand Down
Loading