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


The latest version of Sun's compiler, 
    cc: Sun Ceres C 5.10 SunOS_i386 2008/10/22
needs the following patch to compile parrot.  The problem appears to be
the same one already documented for icc in tools/build/c2str.pl:

    # NOTE: when CONST_STRING gets used it and any macro invocations
    # that it is used in *should not* be split across more than one
    # line, because some compilers generate line numbers in such cases
    # differently from the way gcc does this (a case in point is
    # Intel's C compiler, icc) and hence the #defined CONST_STRING
    # won't be found by the compiler.

This patch re-joins CONST_STRING invocations that have been split across
more than one line.  This will undoubtedly fall afoul of some coding
standard test, but I think compiling trumps passing a line-length test.

Ultimately, it might be nice if there weren't this arbitrary restriction,
but I'd have to dig much deeper before I understood the whole process
well enough to propose a better solution.


diff -r -u parrot-current/src/exceptions.c parrot-suncc/src/exceptions.c
--- parrot-current/src/exceptions.c     2008-11-05 11:15:17.000000000 -0500
+++ parrot-suncc/src/exceptions.c       2008-11-17 14:22:33.000000000 -0500
@@ -71,10 +71,8 @@
 {
     PMC *exception = pmc_new(interp, enum_class_Exception);
 
-    VTABLE_set_integer_keyed_str(interp, exception,
-            CONST_STRING(interp, "severity"), severity);
-    VTABLE_set_integer_keyed_str(interp, exception,
-            CONST_STRING(interp, "type"), error);
+    VTABLE_set_integer_keyed_str(interp, exception, CONST_STRING(interp, 
"severity"), severity);
+    VTABLE_set_integer_keyed_str(interp, exception, CONST_STRING(interp, 
"type"), error);
     if (msg)
         VTABLE_set_string_native(interp, exception, msg);
 
@@ -103,8 +101,7 @@
     else {
         STRING * const message = VTABLE_get_string(interp, exception);
         INTVAL exit_status = 1;
-        const INTVAL severity = VTABLE_get_integer_keyed_str(interp,
-                exception, CONST_STRING(interp, "severity"));
+        const INTVAL severity = VTABLE_get_integer_keyed_str(interp, 
exception, CONST_STRING(interp, "severity"));
 
         /* flush interpreter output to get things printed in order */
         PIO_flush(interp, PIO_STDOUT(interp));
@@ -122,8 +119,7 @@
         }
         else if (severity == EXCEPT_exit) {
             /* TODO: get exit status based on type */
-            exit_status = VTABLE_get_integer_keyed_str(interp,
-                    exception, CONST_STRING(interp, "exit_code"));
+            exit_status = VTABLE_get_integer_keyed_str(interp, exception, 
CONST_STRING(interp, "exit_code"));
         }
         else {
                 PIO_eprintf(interp, "No exception handler and no message\n");
@@ -284,8 +280,7 @@
     }
 
     if (Interp_debug_TEST(interp, PARROT_BACKTRACE_DEBUG_FLAG)) {
-        int exitcode = VTABLE_get_integer_keyed_str(interp, exception,
-                CONST_STRING(interp, "exit_code"));
+        int exitcode = VTABLE_get_integer_keyed_str(interp, exception, 
CONST_STRING(interp, "exit_code"));
         STRING *msg = VTABLE_get_string(interp, exception);
         PIO_eprintf(interp,
             "Parrot_ex_throw_from_c (severity:%d error:%d): %Ss\n",
@@ -430,8 +425,7 @@
 void
 Parrot_ex_mark_unhandled(PARROT_INTERP, ARGIN(PMC *exception))
 {
-    VTABLE_set_integer_keyed_str(interp, exception,
-            CONST_STRING(interp, "handled"), -1);
+    VTABLE_set_integer_keyed_str(interp, exception, CONST_STRING(interp, 
"handled"), -1);
 }
 
 /*
diff -r -u parrot-current/src/inter_call.c parrot-suncc/src/inter_call.c
--- parrot-current/src/inter_call.c     2008-10-23 19:15:10.000000000 -0400
+++ parrot-suncc/src/inter_call.c       2008-11-17 14:22:57.000000000 -0500
@@ -2610,8 +2610,7 @@
     PMC * const args_sig    = pmc_new(interp, enum_class_FixedIntegerArray);
     PMC * const results_sig = pmc_new(interp, enum_class_FixedIntegerArray);
     PMC * const ret_cont    = new_ret_continuation_pmc(interp, NULL);
-    PMC * const result_list = VTABLE_get_attr_str(interp, sig_obj,
-            CONST_STRING(interp, "returns"));
+    PMC * const result_list = VTABLE_get_attr_str(interp, sig_obj, 
CONST_STRING(interp, "returns"));
 
     Parrot_Context *ctx;
     opcode_t         *dest;
diff -r -u parrot-current/src/multidispatch.c parrot-suncc/src/multidispatch.c
--- parrot-current/src/multidispatch.c  2008-11-05 03:15:14.000000000 -0500
+++ parrot-suncc/src/multidispatch.c    2008-11-17 14:23:33.000000000 -0500
@@ -435,8 +435,7 @@
         /* Only create the returns array if it's needed */
         if (in_return_sig && PMC_IS_NULL(returns)) {
             returns = pmc_new(interp, enum_class_ResizablePMCArray);
-            VTABLE_set_attr_str(interp, call_object,
-                    CONST_STRING(interp, "results"), returns);
+            VTABLE_set_attr_str(interp, call_object, CONST_STRING(interp, 
"results"), returns);
         }
 
         if (in_return_sig) {
@@ -449,23 +448,19 @@
             switch (type) {
                 case 'I':
                     VTABLE_set_pointer(interp, val_pointer, (void *) 
va_arg(args, INTVAL*));
-                    VTABLE_set_string_keyed_str(interp, val_pointer,
-                        signature, CONST_STRING(interp, "I"));
+                    VTABLE_set_string_keyed_str(interp, val_pointer, 
signature, CONST_STRING(interp, "I"));
                     break;
                 case 'N':
                     VTABLE_set_pointer(interp, val_pointer, (void *) 
va_arg(args, FLOATVAL*));
-                    VTABLE_set_string_keyed_str(interp, val_pointer,
-                        signature, CONST_STRING(interp, "N"));
+                    VTABLE_set_string_keyed_str(interp, val_pointer, 
signature, CONST_STRING(interp, "N"));
                     break;
                 case 'S':
                     VTABLE_set_pointer(interp, val_pointer, (void *) 
va_arg(args, STRING**));
-                    VTABLE_set_string_keyed_str(interp, val_pointer,
-                        signature, CONST_STRING(interp, "S"));
+                    VTABLE_set_string_keyed_str(interp, val_pointer, 
signature, CONST_STRING(interp, "S"));
                     break;
                 case 'P':
                     VTABLE_set_pointer(interp, val_pointer, (void *) 
va_arg(args, PMC**));
-                    VTABLE_set_string_keyed_str(interp, val_pointer,
-                        signature, CONST_STRING(interp, "P"));
+                    VTABLE_set_string_keyed_str(interp, val_pointer, 
signature, CONST_STRING(interp, "P"));
                     break;
                 default:
                     Parrot_ex_throw_from_c_args(interp, NULL,
diff -r -u parrot-current/src/pmc/exceptionhandler.pmc 
parrot-suncc/src/pmc/exceptionhandler.pmc
--- parrot-current/src/pmc/exceptionhandler.pmc 2008-11-17 03:15:13.000000000 
-0500
+++ parrot-suncc/src/pmc/exceptionhandler.pmc   2008-11-17 14:24:36.000000000 
-0500
@@ -204,8 +204,7 @@
             }
             else if (core_struct->handled_types != PMCNULL) {
                 INTVAL elems = VTABLE_elements(interp, 
core_struct->handled_types);
-                INTVAL type  = VTABLE_get_integer_keyed_str(interp, exception,
-                        CONST_STRING(interp, "type"));
+                INTVAL type  = VTABLE_get_integer_keyed_str(interp, exception, 
CONST_STRING(interp, "type"));
                 INTVAL i;
 
                 for (i = 0; i < elems; i++) {
diff -r -u parrot-current/src/pmc/scheduler.pmc 
parrot-suncc/src/pmc/scheduler.pmc
--- parrot-current/src/pmc/scheduler.pmc        2008-09-08 19:15:13.000000000 
-0400
+++ parrot-suncc/src/pmc/scheduler.pmc  2008-11-17 14:25:11.000000000 -0500
@@ -464,10 +464,8 @@
         /* Exceptions store the handler iterator for rethrow, other kinds of
          * tasks don't (though they could). */
         if (task->vtable->base_type == enum_class_Exception
-        &&  VTABLE_get_integer_keyed_str(interp, task,
-                    CONST_STRING(interp, "handled")) == -1) {
-            iter = VTABLE_get_attr_str(interp, task,
-                    CONST_STRING(interp, "handler_iter"));
+        &&  VTABLE_get_integer_keyed_str(interp, task, CONST_STRING(interp, 
"handled")) == -1) {
+            iter = VTABLE_get_attr_str(interp, task, CONST_STRING(interp, 
"handler_iter"));
         }
         else {
             PMC *handlers;
@@ -475,8 +473,7 @@
             iter = VTABLE_get_iter(interp, handlers);
 
             if (task->vtable->base_type == enum_class_Exception)
-                VTABLE_set_attr_str(interp, task,
-                        CONST_STRING(interp, "handler_iter"), iter);
+                VTABLE_set_attr_str(interp, task, CONST_STRING(interp, 
"handler_iter"), iter);
         }
 
         /* Loop from newest handler to oldest handler. */
diff -r -u parrot-current/src/scheduler.c parrot-suncc/src/scheduler.c
--- parrot-current/src/scheduler.c      2008-11-17 03:15:14.000000000 -0500
+++ parrot-suncc/src/scheduler.c        2008-11-17 14:24:09.000000000 -0500
@@ -745,10 +745,8 @@
     /* Exceptions store the handler iterator for rethrow, other kinds of
      * tasks don't (though they could). */
     if (task->vtable->base_type == enum_class_Exception &&
-            VTABLE_get_integer_keyed_str(interp, task,
-                CONST_STRING(interp, "handled")) == -1) {
-        iter    = VTABLE_get_attr_str(interp, task,
-                CONST_STRING(interp, "handler_iter"));
+            VTABLE_get_integer_keyed_str(interp, task, CONST_STRING(interp, 
"handled")) == -1) {
+        iter    = VTABLE_get_attr_str(interp, task, CONST_STRING(interp, 
"handler_iter"));
         context = (Parrot_Context *)VTABLE_get_pointer(interp, task);
     }
     else {
@@ -770,8 +768,7 @@
                 if (valid_handler) {
                     if (task->vtable->base_type == enum_class_Exception) {
                         /* Store iterator and context for a later rethrow. */
-                        VTABLE_set_attr_str(interp, task,
-                                CONST_STRING(interp, "handler_iter"), iter);
+                        VTABLE_set_attr_str(interp, task, CONST_STRING(interp, 
"handler_iter"), iter);
                         VTABLE_set_pointer(interp, task, context);
 
                         /* Mark that this handler has been used before. */

-- 
    Andy Dougherty              [EMAIL PROTECTED]

Reply via email to