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


This patch solves the casting problems that breaks or generates
warnings in src/io/io_unix.c allowing clean compiling with C or C++,
with or without --optimize.

Also drops the const in argv in several main and main-alike functions,
that can generate warnings or force const castings.

And also changes lib/Parrot/Pmc2c/PMCEmitter.pm to avoid generating an
empty class init block and to add a block around a mro initialization
that declares a variable.

-- 
Salu2
Index: src/pdb.c
===================================================================
--- src/pdb.c	(revisión: 28225)
+++ src/pdb.c	(copia de trabajo)
@@ -111,7 +111,7 @@
 #include "parrot/embed.h"
 
 static void PDB_printwelcome(void);
-static void PDB_run_code(Parrot_Interp interp, int argc, const char *argv[]);
+static void PDB_run_code(Parrot_Interp interp, int argc, char *argv[]);
 
 /*
 
@@ -127,7 +127,7 @@
 extern void imcc_init(Parrot_Interp interp);
 
 int
-main(int argc, const char *argv[])
+main(int argc, char *argv[])
 {
     Parrot_Interp     debugger = Parrot_new(NULL);
     Parrot_Interp     interp   = Parrot_new(debugger);
@@ -214,7 +214,7 @@
 */
 
 static void
-PDB_run_code(Parrot_Interp interp, int argc, const char *argv[])
+PDB_run_code(Parrot_Interp interp, int argc, char *argv[])
 {
     Parrot_exception exp;
 
Index: src/embed.c
===================================================================
--- src/embed.c	(revisión: 28225)
+++ src/embed.c	(copia de trabajo)
@@ -49,7 +49,7 @@
         __attribute__nonnull__(1);
 
 PARROT_CANNOT_RETURN_NULL
-static PMC* setup_argv(PARROT_INTERP, int argc, ARGIN(const char **argv))
+static PMC* setup_argv(PARROT_INTERP, int argc, ARGIN(char **argv))
         __attribute__nonnull__(1)
         __attribute__nonnull__(3);
 
@@ -563,7 +563,7 @@
 
 PARROT_CANNOT_RETURN_NULL
 static PMC*
-setup_argv(PARROT_INTERP, int argc, ARGIN(const char **argv))
+setup_argv(PARROT_INTERP, int argc, ARGIN(char **argv))
 {
     INTVAL i;
     PMC   *userargv;
@@ -860,7 +860,7 @@
 
 PARROT_API
 void
-Parrot_runcode(PARROT_INTERP, int argc, ARGIN(const char **argv))
+Parrot_runcode(PARROT_INTERP, int argc, ARGIN(char **argv))
 {
     PMC *userargv, *main_sub;
 
Index: src/main.c
===================================================================
--- src/main.c	(revisión: 28225)
+++ src/main.c	(copia de trabajo)
@@ -36,7 +36,7 @@
 */
 
 int
-main(int argc, const char * argv[])
+main(int argc, char * argv[])
 {
     const char *sourcefile;
     Interp  *interp;
Index: src/io/io_unix.c
===================================================================
--- src/io/io_unix.c	(revisión: 28225)
+++ src/io/io_unix.c	(copia de trabajo)
@@ -825,12 +825,13 @@
 PIO_unix_connect(SHIM_INTERP, SHIM(ParrotIOLayer *layer), ARGMOD(ParrotIO *io),
         ARGIN_NULLOK(STRING *r))
 {
+    struct sockaddr_in * saddr = & io->remote;
     if (r) {
         memcpy(&io->remote, PObj_bufstart(r), sizeof (struct sockaddr_in));
     }
 AGAIN:
-    if ((connect(io->fd, (const struct sockaddr_in *)&io->remote,
-        sizeof (struct sockaddr_in))) != 0) {
+    if ((connect(io->fd, (struct sockaddr *) saddr,
+            sizeof (struct sockaddr_in))) != 0) {
         switch (errno) {
             case EINTR:
                 goto AGAIN;
@@ -860,12 +861,13 @@
 PIO_unix_bind(SHIM_INTERP, SHIM(ParrotIOLayer *layer), ARGMOD(ParrotIO *io),
         ARGMOD(STRING *l))
 {
+    struct sockaddr_in * saddr = & io->local;
     if (!l)
         return -1;
 
     memcpy(&io->local, PObj_bufstart(l), sizeof (struct sockaddr_in));
 
-    if ((bind(io->fd, (const struct sockaddr_in *)&io->local,
+    if ((bind(io->fd, (struct sockaddr *) saddr,
             sizeof (struct sockaddr_in))) == -1) {
         return -1;
     }
@@ -912,8 +914,9 @@
     ParrotIO * const newio = PIO_new(interp, PIO_F_SOCKET, 0, PIO_F_READ|PIO_F_WRITE);
 
     Parrot_Socklen_t addrlen = sizeof (struct sockaddr_in);
+    struct sockaddr_in * saddr = & newio->remote;
     const int        newsock = accept(io->fd,
-                        (struct sockaddr_in *)&newio->remote, &addrlen);
+                        (struct sockaddr *)saddr, &addrlen);
 
     if (newsock == -1) {
         mem_sys_free(newio);
Index: tools/dev/pbc_to_exe_gen.pl
===================================================================
--- tools/dev/pbc_to_exe_gen.pl	(revisión: 28225)
+++ tools/dev/pbc_to_exe_gen.pl	(copia de trabajo)
@@ -194,7 +194,7 @@
 
 .sub 'body'
     $S0 = <<'END_BODY'
-int main(int argc, const char *argv[])
+int main(int argc, char *argv[])
 {
     PackFile     *pf;
     Parrot_Interp interp;
Index: lib/Parrot/Pmc2c/PMCEmitter.pm
===================================================================
--- lib/Parrot/Pmc2c/PMCEmitter.pm	(revisión: 28225)
+++ lib/Parrot/Pmc2c/PMCEmitter.pm	(copia de trabajo)
@@ -545,13 +545,14 @@
     my $provides        = join( " ", keys( %{ $self->{flags}{provides} } ) );
     my $class_init_code = "";
 
-    $class_init_code    = $self->get_method('class_init')->body
-        if $self->has_method('class_init');
+    if ($self->has_method('class_init')) {
+        $class_init_code    = $self->get_method('class_init')->body;
 
-    $class_init_code =~ s/INTERP/interp/g;
+        $class_init_code =~ s/INTERP/interp/g;
 
-    # fix indenting
-    $class_init_code =~ s/^/        /mg;
+        # fix indenting
+        $class_init_code =~ s/^/        /mg;
+    }
 
     my %extra_vt;
     $extra_vt{ro} = $self->{ro} if $self->{ro};
@@ -675,23 +676,26 @@
     }
 
         $cout .= <<"EOC";
-        PMC           *mro      = pmc_new(interp, enum_class_ResizableStringArray);
-        VTABLE * const vt_clone = interp->vtables[entry];
+        {
+            PMC           *mro      = pmc_new(interp, enum_class_ResizableStringArray);
+            VTABLE * const vt_clone = interp->vtables[entry];
 
-        vt_clone->mro = mro;
+            vt_clone->mro = mro;
 
-        if (vt_clone->ro_variant_vtable)
-            vt_clone->ro_variant_vtable->mro = mro;
+            if (vt_clone->ro_variant_vtable)
+                vt_clone->ro_variant_vtable->mro = mro;
 
 EOC
 
     for my $isa ($classname, @isa) {
         $cout .= <<"EOC";
-        VTABLE_push_string(interp, mro, CONST_STRING(interp, "$isa"));
+            VTABLE_push_string(interp, mro, CONST_STRING(interp, "$isa"));
 EOC
     }
 
     $cout .= <<"EOC";
+        }
+
         /* setup MRO and _namespace */
         Parrot_create_mro(interp, entry);
 EOC
@@ -725,10 +729,8 @@
     }
 
     # include any class specific init code from the .pmc file
-    $cout .= <<"EOC";
+    $cout .= <<"EOC" if $class_init_code;
         /* class_init */
-EOC
-    $cout .= <<"EOC" if $class_init_code;
         {
 $class_init_code
         }
Index: include/parrot/embed.h
===================================================================
--- include/parrot/embed.h	(revisión: 28225)
+++ include/parrot/embed.h	(copia de trabajo)
@@ -52,7 +52,7 @@
 
 PARROT_API void Parrot_setup_opt(Parrot_Interp, int n, char *argv);
 
-PARROT_API void Parrot_runcode(Parrot_Interp, int argc, const char **argv);
+PARROT_API void Parrot_runcode(Parrot_Interp, int argc, char **argv);
 
 PARROT_API void Parrot_destroy(Parrot_Interp);
 
Index: include/parrot/imcc.h
===================================================================
--- include/parrot/imcc.h	(revisión: 28225)
+++ include/parrot/imcc.h	(copia de trabajo)
@@ -7,8 +7,8 @@
 #define PARROT_IMCC_H_GUARD
 
 PARROT_API void imcc_initialize(PARROT_INTERP);
-PARROT_API const char * parseflags(PARROT_INTERP, int *argc, const char **argv[]);
-PARROT_API int imcc_run(PARROT_INTERP, const char *sourcefile, int argc, const char **argv);
+PARROT_API const char * parseflags(PARROT_INTERP, int *argc, char **argv[]);
+PARROT_API int imcc_run(PARROT_INTERP, const char *sourcefile, int argc, char **argv);
 
 #endif /* PARROT_IMCC_H_GUARD */
 
Index: compilers/imcc/main.c
===================================================================
--- compilers/imcc/main.c	(revisión: 28225)
+++ compilers/imcc/main.c	(copia de trabajo)
@@ -79,7 +79,7 @@
     int obj_file,
     ARGIN(const char *output_file),
     int argc,
-    ARGIN(const char **argv))
+    ARGIN(char **argv))
         __attribute__nonnull__(1)
         __attribute__nonnull__(3)
         __attribute__nonnull__(5);
@@ -329,7 +329,7 @@
 PARROT_WARN_UNUSED_RESULT
 PARROT_CAN_RETURN_NULL
 const char *
-parseflags(PARROT_INTERP, int *argc, const char **argv[])
+parseflags(PARROT_INTERP, int *argc, char **argv[])
 {
     struct longopt_opt_info opt = LONGOPT_OPT_INFO_INIT;
     int   status;
@@ -759,7 +759,7 @@
 
 static void
 imcc_run_pbc(PARROT_INTERP, int obj_file, ARGIN(const char *output_file),
-        int argc, ARGIN(const char **argv))
+        int argc, ARGIN(char **argv))
 {
     if (IMCC_INFO(interp)->imcc_warn)
         PARROT_WARNINGS_on(interp, PARROT_WARNINGS_ALL_FLAG);
@@ -990,7 +990,7 @@
 
 int
 imcc_run(PARROT_INTERP, ARGIN(const char *sourcefile), int argc,
-        ARGIN(const char **argv))
+        ARGIN(char **argv))
 {
     int                obj_file;
     yyscan_t           yyscanner   = IMCC_INFO(interp)->yyscanner;
Index: examples/c/test_main.c
===================================================================
--- examples/c/test_main.c	(revisión: 28225)
+++ examples/c/test_main.c	(copia de trabajo)
@@ -28,7 +28,7 @@
 #define setopt(flag) Parrot_setflag(interp, (flag), (*argv)[0]+2);
 #define unsetopt(flag) Parrot_setflag(interp, (flag), 0)
 
-char *parseflags(Parrot_Interp interp, int *argc, char **argv[]);
+static char *parseflags(Parrot_Interp interp, int *argc, char **argv[]);
 
 #define OPT_GC_DEBUG     128
 #define OPT_DESTROY_FLAG 129
@@ -105,7 +105,7 @@
 
 */
 
-char *
+static char *
 parseflags(Parrot_Interp interp, int *argc, char **argv[])
 {
     struct longopt_opt_info opt = LONGOPT_OPT_INFO_INIT;

Reply via email to