#551: t/pmc/nci.t: 2 test failures
---------------------+------------------------------------------------------
Reporter: jkeenan | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: none | Version:
Severity: medium | Keywords: pmc nci pointer
Lang: | Patch:
Platform: |
---------------------+------------------------------------------------------
These two tests began to fail after r38036; bisection suggests r38037.
Here are some pastes:
1. Output of my run on Linux/i386 of `prove -v t/pmc/nci.t`:
{{{
ok 65 - arity
not ok 66 - nci_vVi - void** out parameter
# Failed test 'nci_vVi - void** out parameter'
# at t/pmc/nci.t line 2650.
# Exited with error code: [SIGNAL 6]
# Received:
# src/call/pcc.c:978: failed assertion '(st->dest.sig &
PARROT_ARG_TYPE_MASK) == PARROT_ARG_PMC'
# Backtrace - Obtained 18 stack frames (max trace depth is 32).
# (unknown)
# Parrot_confess
# Parrot_fetch_arg_nci
# (unknown)
# (unknown)
# Parrot_NCI_invoke
# Parrot_invokecc_p
# (unknown)
# (unknown)
# (unknown)
# (unknown)
# Parrot_runops_fromc_args
# Parrot_runcode
# (unknown)
# imcc_run
# (unknown)
# __libc_start_main
# (unknown)
#
# Expected:
# got 10
#
ok 67 - nci_ttt - t_tt parameter
ok 68 - nci_vfff - v_fff parameter
not ok 69 - nci_vV - char** out parameter
# Failed test 'nci_vV - char** out parameter'
# at t/pmc/nci.t line 2709.
# Exited with error code: [SIGNAL 11]
# Received:
#
# Expected:
# Hello bright new world
#
# Looks like you failed 2 tests of 69.
Dubious, test returned 2 (wstat 512, 0x200)
Failed 2/69 subtests
Test Summary Report
-------------------
t/pmc/nci (Wstat: 512 Tests: 69 Failed: 2)
Failed tests: 66, 69
Non-zero exit status: 2
Files=1, Tests=69, 6 wallclock secs ( 0.00 usr 0.00 sys + 1.30 cusr
0.18 csys = 1.48 CPU)
Result: FAIL
}}}
2. mikehh's direct call:
{{{
m...@mhk-desktop:~/parrot.t$ ./parrot -t t/pmc/nci_66.pir
0 set S0, "libnci_test"
S0="(null)"
3 loadlib P1, S0 P1=PMCNULL
S0="libnci_test"
6 dlfunc P3, P1, "nci_vVi", "vVi"
P3=PMCNULL P1=ParrotLibrary=PMC(0x9c25538)
11 dlfunc P2, P1, "nci_vp", "vp"
P2=PMCNULL P1=ParrotLibrary=PMC(0x9c25538)
16 new P0, PC14 P0=PMCNULL
PC14=Key=PMC(0x9c25550)
19 set I0, 10 I0=0
22 set_args PC9 (2), P0, I0
PC9=FixedIntegerArray=PMC(0x9c25580) P0=Pointer=PMC(0x9c1e960) I0=10
26 get_results PC11
28 invokecc P3
P3=NCI=PMC(0x9c1ec60)
Segmentation fault
m...@mhk-desktop:~/parrot.t$ ./parrot -t t/pmc/nci_69.pir
0 set S1, "libnci_test"
S1="(null)"
3 loadlib P0, S1 P0=PMCNULL
S1="libnci_test"
6 dlfunc P1, P0, "nci_vV", "vV"
P1=PMCNULL P0=ParrotLibrary=PMC(0x97c8550)
11 new P2, PC10 P2=PMCNULL
PC10=Key=PMC(0x97c8568)
14 set_args PC4 (1), P2
PC4=FixedIntegerArray=PMC(0x97c8598) P2=Pointer=PMC(0x97c1990)
17 get_results PC7
19 invokecc P1
P1=NCI=PMC(0x97c1c60)
Segmentation fault
}}}
3. A diff
{{{
cat ~/learn/parrot/38036.38037.diff
Index: src/pmc/pointer.pmc
===================================================================
--- src/pmc/pointer.pmc (revision 38036)
+++ src/pmc/pointer.pmc (revision 38037)
@@ -23,6 +23,8 @@
#include "parrot/parrot.h"
pmclass Pointer need_ext {
+ ATTR void * mark_function;
+ ATTR void * pointer;
/*
@@ -36,6 +38,7 @@
VTABLE void init() {
PObj_custom_mark_SET(SELF);
+ PMC_data(SELF) =
mem_allocate_zeroed_typed(Parrot_Pointer_attributes);
}
/*
@@ -50,10 +53,10 @@
VTABLE void mark() {
void (*mark_function)(Interp *, void *) =
- (void (*)(Interp *, void *))D2FPTR(PMC_struct_val(SELF));
-
- if (PMC_data(SELF) && PMC_struct_val(SELF))
- (*mark_function)(INTERP, PMC_data(SELF));
+ (void (*)(Interp *, void
*))D2FPTR(PARROT_POINTER(SELF)->mark_function);
+ void * data = PARROT_POINTER(SELF)->pointer;
+ if (data && mark_function)
+ (*mark_function)(INTERP,data);
}
/*
@@ -84,7 +87,7 @@
*/
VTABLE void *get_pointer() {
- return PMC_data(SELF);
+ return PARROT_POINTER(SELF)->pointer;
}
/*
@@ -98,7 +101,7 @@
*/
VTABLE INTVAL get_integer() {
- return (INTVAL)PMC_data(SELF);
+ return (INTVAL)(PARROT_POINTER(SELF)->pointer);
}
/*
@@ -112,7 +115,7 @@
*/
VTABLE FLOATVAL get_number() {
- return (FLOATVAL)(INTVAL)PMC_data(SELF);
+ return (FLOATVAL)(INTVAL)(PARROT_POINTER(SELF)->pointer);
}
/*
@@ -126,7 +129,7 @@
*/
VTABLE STRING *get_repr() {
- return Parrot_sprintf_c(INTERP, "Pointer = 0x%p",
PMC_data(SELF));
+ return Parrot_sprintf_c(INTERP, "Pointer = 0x%p",
PARROT_POINTER(SELF)->pointer);
}
@@ -141,7 +144,7 @@
*/
VTABLE STRING *get_string() {
- return Parrot_sprintf_c(INTERP, "%s", PMC_data(SELF));
+ return Parrot_sprintf_c(INTERP, "%s",
PARROT_POINTER(SELF)->pointer);
}
/*
@@ -170,7 +173,7 @@
VTABLE INTVAL is_same(PMC *pmc2) {
return (INTVAL)(SELF->vtable == pmc2->vtable &&
- PMC_data(SELF) == PMC_data(pmc2));
+ PARROT_POINTER(SELF)->pointer ==
PARROT_POINTER(pmc2)->pointer);
}
}
Index: tools/build/nativecall.pl
===================================================================
--- tools/build/nativecall.pl (revision 38036)
+++ tools/build/nativecall.pl (revision 38037)
@@ -197,6 +197,7 @@
#include "parrot/oplib/ops.h"
#include "pmc/pmc_managedstruct.h"
#include "pmc/pmc_nci.h"
+#include "pmc/pmc_pointer.h"
#include "nci.str"
#include "jit.h"
@@ -353,7 +354,7 @@
/V/ && do {
push @{$temps_ref}, "PMC *t_$temp_num;";
push @{$extra_preamble_ref}, "t_$temp_num =
GET_NCI_P($reg_num);";
- return "(void**)&PMC_data(t_$temp_num)";
+ return "(void**)&PARROT_POINTER(t_$temp_num)->pointer";
};
/[ilIscfdNS]/ && do {
my $ret_type = $sig_table{$_}{return_type};
}}}
--
Ticket URL: <https://trac.parrot.org/parrot/ticket/551>
Parrot <https://trac.parrot.org/parrot/>
Parrot Development
_______________________________________________
parrot-tickets mailing list
[email protected]
http://lists.parrot.org/mailman/listinfo/parrot-tickets