# New Ticket Created by Nick Glencross # Please include the string: [perl #37609] # in the subject line of all future correspondence about this issue. # <URL: https://rt.perl.org/rt3/Ticket/Display.html?id=37609 >
Guys, As hinted in an earlier email, I'd like to propose the addition of a return type to the new_callback signature. This will add consistency, and prevent breakage when we support other NCI backends. I've also made a change to the 'unhandled signature' which didn't look like it was printing the signature correctly. All NCI tests pass. Nick
Index: runtime/parrot/library/YAML/Parser/Syck.imc =================================================================== --- runtime/parrot/library/YAML/Parser/Syck.imc (revision 9770) +++ runtime/parrot/library/YAML/Parser/Syck.imc (working copy) @@ -55,7 +55,7 @@ # this callback function will eventually by called by the library .const .Sub yaml_handler = "_yaml_handler" .local pmc yaml_handler_wrapped - yaml_handler_wrapped = new_callback yaml_handler, user_data, "Up" # Z in pdd16 + yaml_handler_wrapped = new_callback yaml_handler, user_data, "vUp" # Z in pdd16 .local pmc synchronous synchronous = new Integer Index: src/inter_cb.c =================================================================== --- src/inter_cb.c (revision 9770) +++ src/inter_cb.c (working copy) @@ -61,6 +61,14 @@ VTABLE_setprop(interpreter, user_data, sc, sub); /* only ASCII signatures are supported */ sig_str = cb_signature->strstart; + + if (strlen (sig_str) != 3) { + internal_exception(1, "unhandled signature '%s' in make_cb", + cb_signature->strstart); + } + + ++sig_str; /* Skip callback return type */ + if (*sig_str == 'U') { type = 'D'; } @@ -70,8 +78,8 @@ type = 'C'; } else { - internal_exception(1, "unhandled signature '%Ss' in make_cb", - cb_signature); + internal_exception(1, "unhandled signature '%s' in make_cb", + cb_signature->strstart); } } @@ -264,6 +272,7 @@ sig_str = VTABLE_get_string(interpreter, signature); p = sig_str->strstart; + ++p; /* Skip return type */ pasm_sig[0] = 'v'; /* no return value supported yet */ pasm_sig[1] = 'P'; Index: t/pmc/nci.t =================================================================== --- t/pmc/nci.t (revision 9770) +++ t/pmc/nci.t (working copy) @@ -1322,7 +1322,7 @@ # prepare user data new P7, .Integer set P7, 42 - new_callback P5, P6, P7, "tU" # Z in pdd16 + new_callback P5, P6, P7, "vtU" # Z in pdd16 print "ok 1\n" # now call the external sub, that takes a call_back and user_data loadlib P1, "libnci_test" @@ -1391,7 +1391,7 @@ # this callback function will eventually by called by the library .const .Sub cb = "_call_back" .local pmc cb_wrapped - cb_wrapped = new_callback cb, user_data, "tU" # Z in pdd16 + cb_wrapped = new_callback cb, user_data, "vtU" # Z in pdd16 print "created a callback sub\n" # now call the external sub, that takes a callback and user data @@ -1456,7 +1456,7 @@ # prepare user data new P7, .Integer set P7, 42 - new_callback P5, P6, P7, "iU" # Z in pdd16 + new_callback P5, P6, P7, "viU" # Z in pdd16 print "ok 1\n" # now call the external sub, that takes a call_back and user_data loadlib P1, "libnci_test" @@ -1529,7 +1529,7 @@ # this callback function will eventually by called by the library .const .Sub cb = "_call_back" .local pmc cb_wrapped - cb_wrapped = new_callback cb, user_data, "pU" # Z in pdd16 + cb_wrapped = new_callback cb, user_data, "vpU" # Z in pdd16 print "created a callback sub\n" # now call the external sub, that takes a callback and user data @@ -1604,7 +1604,7 @@ # prepare user data new P7, .Integer set P7, 42 - new_callback P5, P6, P7, "Ut" # Z in pdd16 + new_callback P5, P6, P7, "vUt" # Z in pdd16 print "ok 1\n" # now call the external sub, that takes a call_back and user_data loadlib P1, "libnci_test" @@ -1663,7 +1663,7 @@ # prepare user data new P7, .Integer set P7, 42 - new_callback P5, P6, P7, "Ui" # Z in pdd16 + new_callback P5, P6, P7, "vUi" # Z in pdd16 print "ok 1\n" # now call the external sub, that takes a call_back and user_data loadlib P1, "libnci_test" @@ -1732,7 +1732,7 @@ # this callback function will eventually by called by the library .const .Sub cb = "_call_back" .local pmc cb_wrapped - cb_wrapped = new_callback cb, user_data, "Ui" # Z in pdd16 + cb_wrapped = new_callback cb, user_data, "vUi" # Z in pdd16 print "created a callback sub\n" # now call the external sub, that takes a callback and user data @@ -1810,7 +1810,7 @@ # this callback function will eventually by called by the library .const .Sub cb = "_call_back" .local pmc cb_wrapped - cb_wrapped = new_callback cb, user_data, "Up" # Z in pdd16 + cb_wrapped = new_callback cb, user_data, "vUp" # Z in pdd16 print "created a callback sub\n" # now call the external sub, that takes a callback and user data @@ -1910,7 +1910,7 @@ # this callback function will eventually by called by the library .const .Sub cb = "_call_back" .local pmc cb_wrapped - cb_wrapped = new_callback cb, user_data, "Up" # Z in pdd16 + cb_wrapped = new_callback cb, user_data, "vUp" # Z in pdd16 print "created a callback sub\n" # now call the external sub, that takes a callback and user data