Raku / old-issue-tracker

Tickets from RT
https://github.com/Raku/old-issue-tracker/issues
2 stars 1 forks source link

NativeCall MoarVM panic #6364

Open p6rt opened 7 years ago

p6rt commented 7 years ago

Migrated from rt.perl.org#131666 (status was 'open')

Searchable as RT131666$

p6rt commented 7 years ago

From Vladimir.Marek@oracle.com

I took the NativeCall sample from here​:

https://perl6advent.wordpress.com/2015/12/21/day-21-nativecall-backs-and-beyond-c/


use NativeCall;

sub XML_SetElementHandler(OpaquePointer $parser,
  &start (OpaquePointer, Str, CArray[Str]),   &end (OpaquePointer, Str))   is native('expat') { ... }

sub XML_ParserCreate(Str --> OpaquePointer) is native('expat') { ... } sub XML_ParserFree(OpaquePointer) is native('expat') { ... } sub XML_Parse(OpaquePointer, Buf, int32, int32 --> int32) is native('expat') { ... }

my $xml = q​:to/XML/;   \   \   \   \   \   XML

my $depth = 0;

sub start-element($, $elem, $attr) {   say "open $elem".indent($depth * 4);   ++$depth; }

sub end-element($, $elem) {   --$depth;   say "close $elem".indent($depth * 4); }

my $parser = XML_ParserCreate('UTF-8'); XML_SetElementHandler($parser, &start-element, &end-element);

my $buf = $xml.encode('UTF-8'); XML_Parse($parser, $buf, $buf.elems, 1);

XML_ParserFree($parser);


All works fine, unless I try to use the $attr in start-element

sub start-element($, $elem, $attr) {   say "open $elem".indent($depth * 4);   say $attr.elems;   ++$depth; }

The program then terminates with​:

MoarVM panic​: Internal error​: Unwound entire stack and missed handler

I have seen that on Solaris, but Linux has the same issue. In both cases custom build perl6 using 'rakudobrew build moar' so I suppose latest git revision.

Thank you --   Vlad

p6rt commented 5 years ago

From @dwarring

Can confirm this is still current behaviour with Rakudo 2019. I have came across exactly the same issue and found this ticket. I've noticed, If I change the example to catch exceptions. It then runs​:

  sub start-element($, $elem, $attr)   {   say "open $elem".indent($depth * 4);   say $attr.elems;   ++$depth;   CATCH { default { warn "whoops​: $_" } }   }

Produces​:

  open calendar   whoops​: Don't know how many elements a C array returned from a library   in block at /tmp/tst.p6 line 27   open advent   whoops​: Don't know how many elements a C array returned from a library   in block at /tmp/tst.p6 line 27 ...etc

Underlying issue seems to be that any uncaught exception in a NativeCall Perl callback currently results in a unfriendly NativeCall MoarVM panic. The exception itself is lost.

On Tue, 27 Jun 2017 05​:59​:08 -0700, Vladimir.Marek@​oracle.com wrote​:

I took the NativeCall sample from here​:

https://perl6advent.wordpress.com/2015/12/21/day-21-nativecall-backs- and-beyond-c/

-------------------------------------------------------------------------------- use NativeCall;

sub XML_SetElementHandler(OpaquePointer $parser, &start (OpaquePointer, Str, CArray[Str]), &end (OpaquePointer, Str)) is native('expat') { ... }

sub XML_ParserCreate(Str --> OpaquePointer) is native('expat') { ... } sub XML_ParserFree(OpaquePointer) is native('expat') { ... } sub XML_Parse(OpaquePointer, Buf, int32, int32 --> int32) is native('expat') { ... }

my $xml = q​:to/XML/; \ \ \ \ \ XML

my $depth = 0;

sub start-element($, $elem, $attr) { say "open $elem".indent($depth * 4); ++$depth; }

sub end-element($, $elem) { --$depth; say "close $elem".indent($depth * 4); }

my $parser = XML_ParserCreate('UTF-8'); XML_SetElementHandler($parser, &start-element, &end-element);

my $buf = $xml.encode('UTF-8'); XML_Parse($parser, $buf, $buf.elems, 1);

XML_ParserFree($parser); --------------------------------------------------------------------------------

All works fine, unless I try to use the $attr in start-element

sub start-element($, $elem, $attr) { say "open $elem".indent($depth * 4); say $attr.elems; ++$depth; }

The program then terminates with​:

MoarVM panic​: Internal error​: Unwound entire stack and missed handler

I have seen that on Solaris, but Linux has the same issue. In both cases custom build perl6 using 'rakudobrew build moar' so I suppose latest git revision.

Thank you

p6rt commented 5 years ago

The RT System itself - Status changed from 'new' to 'open'