[fpc-devel] c-blocks (darwin aarch64)

Dmitry Boyarintsev skalogryz.lists at gmail.com
Sat Apr 16 03:09:45 CEST 2016


On Fri, Apr 15, 2016 at 5:13 AM, Jonas Maebe <jonas.maebe at elis.ugent.be>
wrote:

>
> The tests in the testsuite work at least, both for ARM and AArch64.

Could it be run-time environment dependent then...


> Even if that were the case, it wouldn't crash at that place in
> objc_msgSend. r0 contains the "self" pointer of the Objective-C instance.
> It's unrelated to the the value of any parameters.
>
I think it attempted to copy the block in some way, didn't find the proper
reference and crashed or something like that.
Again, without any useful debugging information (which i didn't provide),
it's just impossible to say.


> When using trunk, you should always use the latest version.
>
First all of - I am so sorry - I've not updated yet to the latest trunk. I
decided to play with blocks first.
Second - THANK YOU - for blockrtl unit.

Instead of relying on FPC to do the block, I decided to make the block
myself.

1) the declaration of
  GCExtendedGamepadValueChangedHandler = reference to procedure (gamepad:
GCGamepad;
    element: GCControllerElement); cdecl;
was changed back to:

  GCExtendedGamepadValueChangedHandler = OpaqueCBlock;

1.1)
the method declaration
 GCExtendedGamepad = objcclass external (NSObject)
  ...
  procedure setValueChangedHandler(newValue:
GCExtendedGamepadValueChangedHandler); message 'setValueChangedHandler:';

remains unchanged.

2) the main unit is now using "blockrtl".
3) the call has been adjusted as following:

type
  Tblock = FPC_Block_literal_base
  Pblock = ^TBlock;

var
  descr : FPC_Block_descriptor_complex; // global block description

procedure joystickInit;
var
  ..
  gc   : GCController;
  block : tblock;
...
      fillchar(descr, sizeof(descr), 0);
      descr.Block_size:=sizeof(block);
...
      fillchar(block, sizeof(block), 0);
      block.isa:=@_NSConcreteStackBlock; // the block is on stack
      block.descriptor:=@descr; // pointing to description
      block.invoke:=@extendedGamePadChange_inblock; // point to the function
...
      gc.extendedGamepad.setValueChangedHandler(@block);

4) extendedGamePadChange_inblock() looks like this:

procedure extendedGamePadChange_inblock(block: PBlock; gamepad: GCGamepad;
element: GCControllerElement); cdecl;
begin
  writeln('block is calling!');
  writeln('A: ', gamepad.buttonA.isPressed);
  writeln('B: ', gamepad.buttonB.isPressed);
  writeln('X: ', gamepad.buttonX.isPressed);
  writeln('Y: ', gamepad.buttonY.isPressed);
end;

and that's it. The code works. The function is called as expected,
providing accurate data.
call to ssetValueChangedHandler() doesn't crash. darwin-arm7

I'm going to update to the latest FPC revision now.

thanks,
Dmitry
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20160415/966f8c26/attachment.html>


More information about the fpc-devel mailing list