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


Problem: languages/lua doesn't compile on Win32, with the following
error message.
    luanumber.c
    luanumber.c(1152) : error C2143: syntax error : missing ';' before
    'type'
    luanumber.c(1154) : error C2065: 'my_enum_class_LuaString' :
    undeclared identifier
    luanumber.c(1195) : error C2143: syntax error : missing '{' before
    '*'
    luanumber.c(1197) : error C2371: 'Parrot_lib_luanumber_load' :
    redefinition; different basic types
        luanumber.c(1195) : see declaration of
    'Parrot_lib_luanumber_load'
    compile luanumber.c failed (512)

The reason for this is the following initialization, in the middle of
function Parrot_LuaNumber_class_init.

    int my_enum_class_LuaString = pmc_type(interp,
    string_from_const_cstring(interp, "LuaString", 0));


Possible Solution: Attached patch adds a block around the MMD
initializer code, which should bring the generated code back to valid C.


Changed Files: lib/Parrot/Pmc2c.pm
Index: lib/Parrot/Pmc2c.pm
===================================================================
--- lib/Parrot/Pmc2c.pm (revision 13316)
+++ lib/Parrot/Pmc2c.pm (working copy)
@@ -951,23 +951,27 @@
     $class_init_code
 EOC
 
+    $cout .= <<"EOC";
+        {
+EOC
+
     # declare auxiliary variables for dyncpmc IDs
     foreach my $dynpmc (keys %init_mmds) {
         next if $dynpmc eq $classname;
         $cout .= <<"EOC";
-        int my_enum_class_$dynpmc = pmc_type(interp, 
string_from_const_cstring(interp, "$dynpmc", 0));
+            int my_enum_class_$dynpmc = pmc_type(interp, 
string_from_const_cstring(interp, "$dynpmc", 0));
 EOC
     }
     # init MMD "right" slots with the dynpmc types
     foreach my $entry (@init_mmds) {
         if ($entry->[1] eq $classname) {
             $cout .= <<"EOC";
-        _temp_mmd_init[$entry->[0]].right = entry;
+            _temp_mmd_init[$entry->[0]].right = entry;
 EOC
         }
         else {
             $cout .= <<"EOC";
-        _temp_mmd_init[$entry->[0]].right = my_enum_class_$entry->[1];
+            _temp_mmd_init[$entry->[0]].right = my_enum_class_$entry->[1];
 EOC
         }
     }
@@ -975,18 +979,19 @@
     foreach my $dynpmc (keys %init_mmds) {
         next if $dynpmc eq $classname;
         $cout .= <<"EOC";
-        assert(my_enum_class_$dynpmc != enum_class_default);
+            assert(my_enum_class_$dynpmc != enum_class_default);
 EOC
     }
     if (scalar @mmds) {
         $cout .= <<"EOC";
 #define N_MMD_INIT (sizeof(_temp_mmd_init)/sizeof(_temp_mmd_init[0]))
-        Parrot_mmd_register_table(interp, entry,
-            _temp_mmd_init, N_MMD_INIT);
+            Parrot_mmd_register_table(interp, entry,
+                _temp_mmd_init, N_MMD_INIT);
 EOC
     }
 
     $cout .= <<"EOC";
+        }
     } /* pass */
 } /* Parrot_${classname}_class_init */
 EOC

Reply via email to