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


Function prototypes in C work much better when they are living in a header
file rather than in .c files.  The attached patch below moves the prototypes
generated in the src/ops/*.c files to the header files created from the
*.ops files.

This change does cause a single new warning to appear, but I'm working
on completing that fix now (that fix will probably mean that g++ will be
compiling Parrot).

Steve Peters
[EMAIL PROTECTED]
Index: lib/Parrot/Ops2c/Utils.pm
===================================================================
--- lib/Parrot/Ops2c/Utils.pm   (revision 18699)
+++ lib/Parrot/Ops2c/Utils.pm   (working copy)
@@ -201,7 +201,9 @@
     $argsref->{defines}      = $argsref->{trans}->defines();
 
     $argsref->{flag}         = $flagref;
-    return bless $argsref, $class;
+    my $self = bless $argsref, $class;
+    $self->_iterate_over_ops();
+    return $self;
 }
 
 sub _prepare_core {
@@ -293,6 +295,11 @@
 
     $self->_print_preamble_header($HEADER);
 
+    my @op_protos = @{ $self->{op_protos} };
+    foreach my $proto (@op_protos) {
+        print $HEADER "$proto;\n";
+    }
+
     $self->_print_run_core_func_decl_header($HEADER);
 
     $self->_print_guard_suffix($HEADER);
@@ -436,9 +443,6 @@
 
     $self->_print_run_core_func_decl_source($SOURCE);
 
-    # Iterate over the ops, appending HEADER and SOURCE fragments:
-    $self->_iterate_over_ops();
-
     $self->_print_cg_jump_table($SOURCE);
 
     $self->_print_goto_opcode($SOURCE);
@@ -494,6 +498,7 @@
 sub _iterate_over_ops {
     my $self = shift;
     my @op_funcs;
+    my @op_protos;
     my @op_func_table;
     my @cg_jump_table;
     my $index = 0;
@@ -518,7 +523,7 @@
             $comment    = "/* " . $op->full_name() . " */";
         }
         else {
-            $definition = "$prototype;\n$self->{opsarraytype} *\n$func_name 
($args)";
+            $definition = "$self->{opsarraytype} *\n$func_name ($args)";
         }
 
         my $src = $op->source( $self->{trans} );
@@ -542,6 +547,7 @@
         else {
             $one_op .= "$definition $comment {\n$src}\n\n";
             push @op_funcs, $one_op;
+            push @op_protos, $prototype;
             $prev_src = $src if ( $self->{suffix} eq '_cgp' || $self->{suffix} 
eq '_switch' );
             $prev_index = $index;
         }
@@ -549,6 +555,7 @@
     }
     $self->{index}         = $index;
     $self->{op_funcs}      = [EMAIL PROTECTED];
+    $self->{op_protos}     = [EMAIL PROTECTED];
     $self->{op_func_table} = [EMAIL PROTECTED];
     $self->{cg_jump_table} = [EMAIL PROTECTED];
 }
@@ -577,7 +584,7 @@
 #ifdef __GNUC__
 # ifdef I386
     else if (cur_opcode == (void **) 1)
-    asm ("jmp *4(%ebp)");  /* jump to ret addr, used by JIT */
+    __asm__ ("jmp *4(%ebp)");  /* jump to ret addr, used by JIT */
 # endif
 #endif
     _reg_base = (char*)interp->ctx.bp.regs_i;
Index: lib/Parrot/OpTrans/CSwitch.pm
===================================================================
--- lib/Parrot/OpTrans/CSwitch.pm       (revision 18699)
+++ lib/Parrot/OpTrans/CSwitch.pm       (working copy)
@@ -153,8 +153,8 @@
     return <<END_C;
 /* run_core_func_start - $0 -> $type */
 #if defined(__GNUC__) && defined(I386) && defined(PARROT_SWITCH_REGS)
-    register void **   cur_opcode asm ("esi") = cur_op;
-    register char *   _reg_base   asm ("edi");
+    register void **   cur_opcode __asm__ ("esi") = cur_op;
+    register char *   _reg_base   __asm__ ("edi");
 #else
     void ** cur_opcode = cur_op;
     char * _reg_base;
Index: lib/Parrot/OpTrans/CGP.pm
===================================================================
--- lib/Parrot/OpTrans/CGP.pm   (revision 18699)
+++ lib/Parrot/OpTrans/CGP.pm   (working copy)
@@ -132,8 +132,8 @@
      * (gdb) disas l_ops_addr[1191] l_ops_addr[1192]
      */
 #if defined(__GNUC__) && defined(I386) && defined(PARROT_CGP_REGS)
-    register void **   cur_opcode asm ("esi") = cur_op;
-    register char *   _reg_base   asm ("edi");
+    register void **   cur_opcode __asm__ ("esi") = cur_op;
+    register char *   _reg_base   __asm__ ("edi");
 #else
     void **cur_opcode = cur_op;
     char * _reg_base;
Index: lib/Parrot/OpTrans/CGoto.pm
===================================================================
--- lib/Parrot/OpTrans/CGoto.pm (revision 18699)
+++ lib/Parrot/OpTrans/CGoto.pm (working copy)
@@ -278,7 +278,7 @@
 sub run_core_func_start {
     return <<END_C;
 #if defined(__GNUC__) && defined(I386) /* && defined(NO_DYNOPS) */
-    register opcode_t *cur_opcode asm ("esi") = cur_op;
+    register opcode_t *cur_opcode __asm__ ("esi") = cur_op;
 #else
     opcode_t *cur_opcode = cur_op;
 #endif
Index: lib/Parrot/OpTrans/CPrederef.pm
===================================================================
--- lib/Parrot/OpTrans/CPrederef.pm     (revision 18699)
+++ lib/Parrot/OpTrans/CPrederef.pm     (working copy)
@@ -44,16 +44,6 @@
 END
 }
 
-=item C<opsarraytype()>
-
-The ops array type is C<void *>.
-
-=cut
-
-sub opsarraytype {
-    return 'void *';
-}
-
 =item expr_address($addr)
 
 =item expr_address($offset)

Reply via email to