id	summary	reporter	owner	description	type	status	priority	milestone	component	version	severity	resolution	keywords	cc	lang	patch	platform
551	t/pmc/nci.t:  2 test failures	jkeenan		"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:
{{{
mhk@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

mhk@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};
}}}
"	bug	closed	normal		core		medium	fixed	pmc nci pointer	cotto mikehh jkeen@… rg@…		applied	
