Add a BlockLiteral.GetTarget method and use it to simplify code (and make it less unsafe as well).

This commit is contained in:
Rolf Bjarne Kvinge 2018-08-01 02:10:10 +02:00
Родитель f5914589e1
Коммит 2f5e14434f
8 изменённых файлов: 37 добавлений и 48 удалений

Просмотреть файл

@ -54,10 +54,9 @@ namespace CoreFoundation {
static DispatchReadWrite static_DispatchReadWriteHandler = Trampoline_DispatchReadWriteHandler;
[MonoPInvokeCallback (typeof (DispatchReadWrite))]
static unsafe void Trampoline_DispatchReadWriteHandler (IntPtr block, IntPtr dispatchData, int error)
static void Trampoline_DispatchReadWriteHandler (IntPtr block, IntPtr dispatchData, int error)
{
var descriptor = (BlockLiteral *) block;
var del = (DispatchIOHandler) (descriptor->Target);
var del = BlockLiteral.GetTarget<DispatchIOHandler> (block);
if (del != null) {
var dd = dispatchData == IntPtr.Zero ? null : new DispatchData (dispatchData, owns: false);
del (dd, error);

Просмотреть файл

@ -84,10 +84,9 @@ namespace Network {
static StateChangeCallback static_stateChangeHandler = Trampoline_StateChangeCallback;
[MonoPInvokeCallback (typeof (StateChangeCallback))]
static unsafe void Trampoline_StateChangeCallback (IntPtr block, NWConnectionState state, IntPtr error)
static void Trampoline_StateChangeCallback (IntPtr block, NWConnectionState state, IntPtr error)
{
var descriptor = (BlockLiteral *) block;
var del = (Action<NWConnectionState,NWError>) (descriptor->Target);
var del = BlockLiteral.GetTarget<Action<NWConnectionState,NWError>> (block);
if (del != null) {
NWError err = error != IntPtr.Zero ? new NWError (error, owns: false) : null;
del (state, err);
@ -121,10 +120,9 @@ namespace Network {
static nw_connection_boolean_event_handler_t static_BooleanChangeHandler = TrampolineBooleanChangeHandler;
[MonoPInvokeCallback (typeof (nw_connection_boolean_event_handler_t))]
static unsafe void TrampolineBooleanChangeHandler (IntPtr block, bool value)
static void TrampolineBooleanChangeHandler (IntPtr block, bool value)
{
var descriptor = (BlockLiteral *) block;
var del = (Action<bool>) (descriptor->Target);
var del = BlockLiteral.GetTarget<Action<bool>> (block);
if (del != null)
del (value);
}
@ -179,10 +177,9 @@ namespace Network {
static nw_connection_path_event_handler_t static_PathChanged = TrampolinePathChanged;
[MonoPInvokeCallback (typeof (nw_connection_path_event_handler_t))]
static unsafe void TrampolinePathChanged (IntPtr block, IntPtr path)
static void TrampolinePathChanged (IntPtr block, IntPtr path)
{
var descriptor = (BlockLiteral *) block;
var del = (Action<NWPath>) (descriptor->Target);
var del = BlockLiteral.GetTarget<Action<NWPath>> (block);
if (del != null) {
var x = new NWPath (path, owns: false);
del (x);
@ -252,10 +249,9 @@ namespace Network {
static nw_connection_receive_completion_t static_ReceiveCompletionDispatchData = TrampolineReceiveCompletionData;
[MonoPInvokeCallback (typeof (nw_connection_receive_completion_t))]
static unsafe void TrampolineReceiveCompletion (IntPtr block, IntPtr dispatchDataPtr, IntPtr contentContext, bool isComplete, IntPtr error)
static void TrampolineReceiveCompletion (IntPtr block, IntPtr dispatchDataPtr, IntPtr contentContext, bool isComplete, IntPtr error)
{
var descriptor = (BlockLiteral *) block;
var del = (NWConnectionReceiveCompletion) (descriptor->Target);
var del = BlockLiteral.GetTarget<NWConnectionReceiveCompletion> (block);
if (del != null) {
DispatchData dispatchData = null, dataCopy = null;
IntPtr bufferAddress = IntPtr.Zero;
@ -280,10 +276,9 @@ namespace Network {
}
[MonoPInvokeCallback (typeof (nw_connection_receive_completion_t))]
static unsafe void TrampolineReceiveCompletionData (IntPtr block, IntPtr dispatchDataPtr, IntPtr contentContext, bool isComplete, IntPtr error)
static void TrampolineReceiveCompletionData (IntPtr block, IntPtr dispatchDataPtr, IntPtr contentContext, bool isComplete, IntPtr error)
{
var descriptor = (BlockLiteral *) block;
var del = (NWConnectionReceiveDispatchDataCompletion) (descriptor->Target);
var del = BlockLiteral.GetTarget<NWConnectionReceiveDispatchDataCompletion> (block);
if (del != null) {
DispatchData dispatchData = null;
IntPtr bufferAddress = IntPtr.Zero;
@ -383,10 +378,9 @@ namespace Network {
static nw_connection_send_completion_t static_SendCompletion = TrampolineSendCompletion;
[MonoPInvokeCallback (typeof (nw_connection_send_completion_t))]
static unsafe void TrampolineSendCompletion (IntPtr block, IntPtr error)
static void TrampolineSendCompletion (IntPtr block, IntPtr error)
{
var descriptor = (BlockLiteral *) block;
var del = (Action<NWError>) (descriptor->Target);
var del = BlockLiteral.GetTarget<Action<NWError>> (block);
if (del != null) {
var err = error == IntPtr.Zero ? null : new NWError (error, owns: false);
del (err);

Просмотреть файл

@ -155,10 +155,9 @@ namespace Network {
static ProtocolIterator static_ProtocolIterator = TrampolineProtocolIterator;
[MonoPInvokeCallback (typeof (ProtocolIterator))]
static unsafe void TrampolineProtocolIterator (IntPtr block, IntPtr definition, IntPtr metadata)
static void TrampolineProtocolIterator (IntPtr block, IntPtr definition, IntPtr metadata)
{
var descriptor = (BlockLiteral *) block;
var del = (Action<NWProtocolDefinition,NWProtocolMetadata>) (descriptor->Target);
var del = BlockLiteral.GetTarget<Action<NWProtocolDefinition,NWProtocolMetadata>> (block);
if (del != null) {
var pdef = definition == IntPtr.Zero ? null : new NWProtocolDefinition (definition, owns: true);
var meta = metadata == IntPtr.Zero ? null : new NWProtocolMetadata (metadata, owns: true);

Просмотреть файл

@ -107,10 +107,9 @@ namespace Network {
static nw_listener_state_changed_handler_t static_ListenerStateChanged = TrampolineListenerStateChanged;
[MonoPInvokeCallback (typeof (nw_listener_state_changed_handler_t))]
static unsafe void TrampolineListenerStateChanged (IntPtr block, NWListenerState state, IntPtr nwerror)
static void TrampolineListenerStateChanged (IntPtr block, NWListenerState state, IntPtr nwerror)
{
var descriptor = (BlockLiteral *) block;
var del = (Action<NWListenerState,NWError>) (descriptor->Target);
var del = BlockLiteral.GetTarget<Action<NWListenerState,NWError>> (block);
if (del != null){
NWError err = nwerror == IntPtr.Zero ? null : new NWError (nwerror, owns: false);
del (state, err);
@ -145,10 +144,9 @@ namespace Network {
static nw_listener_new_connection_handler_t static_NewConnection = TrampolineNewConnection;
[MonoPInvokeCallback (typeof (nw_listener_new_connection_handler_t))]
static unsafe void TrampolineNewConnection (IntPtr block, IntPtr connection)
static void TrampolineNewConnection (IntPtr block, IntPtr connection)
{
var descriptor = (BlockLiteral *) block;
var del = (Action<NWConnection>) (descriptor->Target);
var del = BlockLiteral.GetTarget<Action<NWConnection>> (block);
if (del != null){
var nwconnection = new NWConnection (connection, owns: false);
del (nwconnection);
@ -184,10 +182,9 @@ namespace Network {
public delegate void AdvertisedEndpointChanged (NWEndpoint endpoint, bool added);
[MonoPInvokeCallback (typeof (nw_listener_advertised_endpoint_changed_handler_t))]
static unsafe void TrampolineAdvertisedEndpointChangedHandler (IntPtr block, IntPtr endpoint, byte added)
static void TrampolineAdvertisedEndpointChangedHandler (IntPtr block, IntPtr endpoint, byte added)
{
var descriptor = (BlockLiteral *) block;
var del = (AdvertisedEndpointChanged) (descriptor->Target);
var del = BlockLiteral.GetTarget<AdvertisedEndpointChanged> (block);
if (del != null) {
var nwendpoint = new NWEndpoint (endpoint, owns: false);
del (nwendpoint, added != 0 ? true : false);

Просмотреть файл

@ -54,10 +54,9 @@ namespace Network {
static nw_parameters_configure_protocol_block_t static_ConfigureHandler = TrampolineConfigureHandler;
[MonoPInvokeCallback(typeof (nw_parameters_configure_protocol_block_t))]
static unsafe void TrampolineConfigureHandler (IntPtr block, IntPtr iface)
static void TrampolineConfigureHandler (IntPtr block, IntPtr iface)
{
var descriptor = (BlockLiteral *) block;
var del = (Action<NWProtocolOptions>) (descriptor->Target);
var del = BlockLiteral.GetTarget<Action<NWProtocolOptions>> (block);
if (del != null) {
var x = new NWProtocolOptions (iface, owns: false);
del (x);
@ -353,10 +352,9 @@ namespace Network {
[MonoPInvokeCallback (typeof (nw_parameters_iterate_interfaces_block_t))]
[return: MarshalAs (UnmanagedType.I1)]
static unsafe bool TrampolineIterateProhibitedHandler (IntPtr block, IntPtr iface)
static bool TrampolineIterateProhibitedHandler (IntPtr block, IntPtr iface)
{
var descriptor = (BlockLiteral *) block;
var del = (Func<NWInterface,bool>) (descriptor->Target);
var del = BlockLiteral.GetTarget<Func<NWInterface,bool>> (block);
if (del != null) {
var x = new NWInterface (iface, owns: false);
var ret = del (x);
@ -391,10 +389,9 @@ namespace Network {
[MonoPInvokeCallback (typeof (nw_parameters_iterate_interface_types_block_t))]
[return: MarshalAs (UnmanagedType.I1)]
static unsafe bool TrampolineIterateProhibitedTypeHandler (IntPtr block, NWInterfaceType type)
static bool TrampolineIterateProhibitedTypeHandler (IntPtr block, NWInterfaceType type)
{
var descriptor = (BlockLiteral *) block;
var del = (Func<NWInterfaceType,bool>) (descriptor->Target);
var del = BlockLiteral.GetTarget<Func<NWInterfaceType,bool>> (block);
if (del != null)
return del (type);
return false;

Просмотреть файл

@ -100,10 +100,9 @@ namespace Network {
static nw_path_enumerate_interfaces_block_t static_Enumerator = TrampolineEnumerator;
[MonoPInvokeCallback (typeof (nw_path_enumerate_interfaces_block_t))]
static unsafe void TrampolineEnumerator (IntPtr block, IntPtr iface)
static void TrampolineEnumerator (IntPtr block, IntPtr iface)
{
var descriptor = (BlockLiteral *) block;
var del = (Action<NWInterface>) (descriptor->Target);
var del = BlockLiteral.GetTarget<Action<NWInterface>> (block);
if (del != null)
del (new NWInterface (iface, owns: false));
}

Просмотреть файл

@ -48,10 +48,9 @@ namespace Network {
static nw_protocol_stack_iterate_protocols_block_t static_iterateHandler = TrampolineIterateHandler;
[MonoPInvokeCallback (typeof (nw_protocol_stack_iterate_protocols_block_t))]
static unsafe void TrampolineIterateHandler (IntPtr block, IntPtr options)
static void TrampolineIterateHandler (IntPtr block, IntPtr options)
{
var descriptor = (BlockLiteral *) block;
var del = (Action<NWProtocolOptions>) (descriptor->Target);
var del = BlockLiteral.GetTarget<Action<NWProtocolOptions>> (block);
if (del != null) {
var x = new NWProtocolOptions (options, owns: false);
del (x);

Просмотреть файл

@ -232,6 +232,11 @@ namespace ObjCRuntime {
return (T) (object) Runtime.GetDelegateForBlock (invoke, typeof (T));
}
public unsafe static T GetTarget<T> (IntPtr block) where T: class /* /* requires C# 7.3+: System.MulticastDelegate */
{
return (T) ((BlockLiteral *) block)->Target;
}
[EditorBrowsable (EditorBrowsableState.Never)]
public static bool IsManagedBlock (IntPtr block)
{