Add a BlockLiteral.GetTarget method and use it to simplify code (and make it less unsafe as well).
This commit is contained in:
Родитель
f5914589e1
Коммит
2f5e14434f
|
@ -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)
|
||||
{
|
||||
|
|
Загрузка…
Ссылка в новой задаче