# New Ticket Created by  Ronald Blaschke 
# Please include the string:  [perl #47153]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=47153 >


  Parrot currently uses indirect DLL linkage, which means that exported
data, including PMCNULL, used by PMC_IS_NULL, can not be accessed.
  Attached patch introduces a function PMC_is_null which should be used
instead.
  An alternative solution would be to use direct DLL linkage, but this
would require more work (i.e., get __declspec(dllexport/dllimport) right).

  What do you guys think?  (Should it be possible to use data exported
by libparrot?)

Changed Files:
src/pmc.c
include/parrot/pmc.h
t/src/compiler.t

Ron
Index: src/pmc.c
===================================================================
--- src/pmc.c   (revision 22695)
+++ src/pmc.c   (working copy)
@@ -39,12 +39,36 @@
 
 
 #if PARROT_CATCH_NULL
-PARROT_API PMC * PMCNULL;
+PMC * PMCNULL;
 #endif
 
 /*
 
 =item C<PARROT_API
+INTVAL
+PMC_is_null(PARROT_INTERP, NULLOK(PMC *pmc))>
+
+Tests if the given pmc is null.
+
+=cut
+
+*/
+
+PARROT_API
+INTVAL
+PMC_is_null(PARROT_INTERP, NULLOK(PMC *pmc))
+{
+#if PARROT_CATCH_NULL
+    return pmc == PMCNULL || pmc == NULL;
+#else
+    return pmc == NULL;
+#endif
+}
+
+
+/*
+
+=item C<PARROT_API
 PARROT_CANNOT_RETURN_NULL
 PARROT_MALLOC
 PMC *
Index: include/parrot/pmc.h
===================================================================
--- include/parrot/pmc.h        (revision 22695)
+++ include/parrot/pmc.h        (working copy)
@@ -48,6 +48,10 @@
         __attribute__nonnull__(1);
 
 PARROT_API
+INTVAL PMC_is_null(PARROT_INTERP, NULLOK(PMC *pmc))
+        __attribute__nonnull__(1);
+
+PARROT_API
 PARROT_CANNOT_RETURN_NULL
 PARROT_MALLOC
 PMC * pmc_new(PARROT_INTERP, INTVAL base_type)
Index: t/src/compiler.t
===================================================================
--- t/src/compiler.t    (revision 22695)
+++ t/src/compiler.t    (working copy)
@@ -8,9 +8,7 @@
 use Test::More;
 use Parrot::Test;
 
-plan $^O =~ m/MSWin32|cygwin/
-    ? ( skip_all => 'broken on win32 && cygwin' )
-    : ( tests => 6 );
+plan tests => 6;
 
 =head1 NAME
 
@@ -53,7 +51,7 @@
                                        IGLOBALS_COMPREG_HASH);
     pir = const_string(interp, "PIR");
     comp = VTABLE_get_pmc_keyed_str(interp, compreg, pir);
-    if (PMC_IS_NULL(comp) || !VTABLE_defined(interp, comp)) {
+    if (PMC_is_null(interp, comp) || !VTABLE_defined(interp, comp)) {
         PIO_eprintf(interp, "Pir compiler not loaded");
         exit(EXIT_FAILURE);
     }
@@ -62,7 +60,7 @@
      */
     prog = imcc_compile_pir(interp, c_src);
 
-    if (PMC_IS_NULL(prog) || !VTABLE_defined(interp, prog)) {
+    if (PMC_is_null(interp, prog) || !VTABLE_defined(interp, prog)) {
         PIO_eprintf(interp, "Pir compiler returned no prog");
         exit(EXIT_FAILURE);
     }
@@ -136,7 +134,7 @@
                                        IGLOBALS_COMPREG_HASH);
     pir = const_string(interp, "PIR");
     comp = VTABLE_get_pmc_keyed_str(interp, compreg, pir);
-    if (PMC_IS_NULL(comp) || !VTABLE_defined(interp, comp)) {
+    if (PMC_is_null(interp, comp) || !VTABLE_defined(interp, comp)) {
         PIO_eprintf(interp, "Pir compiler not loaded");
         exit(EXIT_FAILURE);
     }
@@ -146,7 +144,7 @@
      */
     prog = Parrot_compile_string(interp, pir, c_src, &error);
 
-    if (PMC_IS_NULL(prog) || !VTABLE_defined(interp, prog)) {
+    if (PMC_is_null(interp, prog) || !VTABLE_defined(interp, prog)) {
         PIO_eprintf(interp, "Pir compiler returned no prog");
         exit(EXIT_FAILURE);
     }
@@ -211,7 +209,7 @@
     opcode_t *dest;
     prog = Parrot_compile_string(interp, type, src, &error);
 
-    if (PMC_IS_NULL(prog) || !VTABLE_defined(interp, prog)) {
+    if (PMC_is_null(interp, prog) || !VTABLE_defined(interp, prog)) {
         PIO_eprintf(interp, "Pir compiler returned no prog");
         exit(EXIT_FAILURE);
     }
@@ -247,7 +245,7 @@
                                        IGLOBALS_COMPREG_HASH);
     pir = const_string(interp, "PIR");
     comp = VTABLE_get_pmc_keyed_str(interp, compreg, pir);
-    if (PMC_IS_NULL(comp) || !VTABLE_defined(interp, comp)) {
+    if (PMC_is_null(interp, comp) || !VTABLE_defined(interp, comp)) {
         PIO_eprintf(interp, "Pir compiler not loaded");
         exit(EXIT_FAILURE);
     }
@@ -302,7 +300,7 @@
     opcode_t *dest;
     prog = Parrot_compile_string(interp, type, src, &error);
 
-    if (PMC_IS_NULL(prog) || !VTABLE_defined(interp, prog)) {
+    if (PMC_is_null(interp, prog) || !VTABLE_defined(interp, prog)) {
         PIO_eprintf(interp, "Pir compiler returned no prog\n");
         return;
     }
@@ -338,7 +336,7 @@
                                        IGLOBALS_COMPREG_HASH);
     pir = const_string(interp, "PIR");
     comp = VTABLE_get_pmc_keyed_str(interp, compreg, pir);
-    if (PMC_IS_NULL(comp) || !VTABLE_defined(interp, comp)) {
+    if (PMC_is_null(interp, comp) || !VTABLE_defined(interp, comp)) {
         PIO_eprintf(interp, "Pir compiler not loaded");
         return NULL;
     }
@@ -393,7 +391,7 @@
     opcode_t *dest;
     prog = Parrot_compile_string(interp, type, src, &error);
 
-    if (PMC_IS_NULL(prog) || !VTABLE_defined(interp, prog)) {
+    if (PMC_is_null(interp, prog) || !VTABLE_defined(interp, prog)) {
         PIO_eprintf(interp, "Pir compiler returned no prog\n");
         return;
     }
@@ -429,7 +427,7 @@
                                        IGLOBALS_COMPREG_HASH);
     pir = const_string(interp, "PIR");
     comp = VTABLE_get_pmc_keyed_str(interp, compreg, pir);
-    if (PMC_IS_NULL(comp) || !VTABLE_defined(interp, comp)) {
+    if (PMC_is_null(interp, comp) || !VTABLE_defined(interp, comp)) {
         PIO_eprintf(interp, "Pir compiler not loaded");
         return NULL;
     }
@@ -484,7 +482,7 @@
     opcode_t *dest;
     prog = Parrot_compile_string(interp, type, src, &error);
 
-    if (PMC_IS_NULL(prog) || !VTABLE_defined(interp, prog)) {
+    if (PMC_is_null(interp, prog) || !VTABLE_defined(interp, prog)) {
         PIO_eprintf(interp, "Pir compiler returned no prog\n");
         return;
     }
@@ -519,7 +517,7 @@
                                        IGLOBALS_COMPREG_HASH);
     pir = const_string(interp, "PIR");
     comp = VTABLE_get_pmc_keyed_str(interp, compreg, pir);
-    if (PMC_IS_NULL(comp) || !VTABLE_defined(interp, comp)) {
+    if (PMC_is_null(interp, comp) || !VTABLE_defined(interp, comp)) {
         PIO_eprintf(interp, "Pir compiler not loaded");
         return NULL;
     }

Reply via email to