Hi,

You also need to remove the call to objc.selector. With correct metadata 
“blocks” are callables in Python code.

Ronald
—

Twitter: @ronaldoussoren
Blog: https://blog.ronaldoussoren.net/

> On 6 Jan 2020, at 23:59, Rand Dvorak <randdvo...@gmail.com> wrote:
> 
> Same result:
> 
> Updated code:
> 
> import objc 
> CRApplication = objc.lookUpClass("CRApplication")
> objc.registerMetaDataForSelector(
>       b'CRApplication',
>       b'get_block_',
>       {
>       'arguments': {
>               2: {
>                       'callable': {
>                       'arguments': {
>                       0:{'type': b'^v'},
>                       1:{'type': b'@'},
>                       2:{'type': b'@'},
>                       3:{'type': b'@'}
>                       },
>               '       retval': { 'type': b'v' }
>                       } 
>               }
>       }
>       }
> )
> global server
> 
> def helloHandler(self, request, response, handler):
>       response.send_("Hello World!")
>       handler()
>       
> if __name__ == "__main__":
>       server = CRApplication.sharedApplication().delegate().server()
>       server.get_block_("/", objc.selector(helloHandler, signature=b'v@:@@@'))
>       server.startListening()
> 
> 
> results:
> 
> Traceback (most recent call last):
>   File "main.py", line 37, in <module>
>     server.get_block_("/", objc.selector(helloHandler, signature=b'v@:@@@'))
> TypeError: Argument 3 is a block, but no signature available
> 
> 
>> On Jan 6, 2020, at 09:27, Ronald Oussoren <ronaldousso...@mac.com 
>> <mailto:ronaldousso...@mac.com>> wrote:
>> 
>> 
>> 
>>> On 6 Jan 2020, at 00:51, Rand Dvorak <randdvo...@gmail.com 
>>> <mailto:randdvo...@gmail.com>> wrote:
>>> 
>>> 
>>> I am trying to implement a simple server in PyObjC for the Criollo HTTP 
>>> server.  The server has a method to set route handlers by passing a block 
>>> to setup the route and then when it receives and HTTP request for the route 
>>> it calls the block.  The block has the signature:
>>> 
>>> typedef void(^CRRouteBlock)(CRRequest* _Nonnull request, CRResponse* 
>>> _Nonnull response, CRRouteCompletionBlock _Nonnull completionHandler);
>>> 
>>> 
>>> So, here is my simple proof of concept:
>>> 
>>> import objc 
>>> CRApplication = objc.lookUpClass("CRApplication")
>>> global server
>>> 
>>> def helloHandler(self, request, response, handler):
>>>     response.send_("Hello World!")
>>>     handler()
>>>     
>>> if __name__ == "__main__":
>>>     server = CRApplication.sharedApplication().delegate().server()
>>>     server.get_block_("/", objc.selector(helloHandler, 
>>> signature=b'v@:@@@‘))  *** error occurs here
>>>     server.startListening()
>>> 
>>> 
>>> But, when I try to setup the route I get the following error:
>>> 
>>> Traceback (most recent call last):
>>> File "main.py", line 21, in <module>
>>>   server.get_block_("/", objc.selector(helloHandler, signature=b'v@:@@'))
>>> TypeError: Argument 3 is a block, but no signature available
>>> 
>>> 
>>> Any ideas how to workaround this issue and implement the route handlers in 
>>> PyObjC?
>> 
>> The code below should do the trick, but eas typed directly into this mail 
>> and might therefore contain syntax errors.
>> 
>> import objc
>> objc.registerMetaDataForSelector(
>>    b”CRApplication”,  # name of the class implementing “get_block:”, or 
>> “NSObject”
>>    b”get_block:”,
>>   {
>>     “arguments”: {
>>       2: {
>>         “callable”: {
>>          “arguments”: {
>>           0: { “type”: b”^v” },
>>           1: { “type”: b”@” },
>>           2: { “type”: b”@” },
>>           3: { “type”: b”@” }
>>          },
>>          “retail”: { “type”: b”v” }
>>        } 
>>      }
>>   }
>> )
>> 
>> This tells the bridge the signature for the block argument of the 
>> “get_block:” selector, which is information that cannot be retrieved from 
>> the Objective-C runtime.  Argument 2 is the first real argument of ObjC 
>> selectors, after the implicit arguments “self” and “_imp” (which is not 
>> available in python code).
>> 
>> Ronald
>> —
>> 
>> Twitter: @ronaldoussoren
>> Blog: https://blog.ronaldoussoren.net/ <https://blog.ronaldoussoren.net/>
>>> _______________________________________________
>>> Pythonmac-SIG maillist  -  Pythonmac-SIG@python.org 
>>> <mailto:Pythonmac-SIG@python.org>
>>> https://mail.python.org/mailman/listinfo/pythonmac-sig 
>>> <https://mail.python.org/mailman/listinfo/pythonmac-sig>
>>> unsubscribe: https://mail.python.org/mailman/options/Pythonmac-SIG
>> 
> 

_______________________________________________
Pythonmac-SIG maillist  -  Pythonmac-SIG@python.org
https://mail.python.org/mailman/listinfo/pythonmac-sig
unsubscribe: https://mail.python.org/mailman/options/Pythonmac-SIG

Reply via email to