Benjamin Goldberg <[EMAIL PROTECTED]> wrote:

> #define PARROT_DECLARE_STATIC_STRING(name, cstring) \

[ big snip ]

While Juergen's original or your proposal are fine, they don't work
(or not as proposed). First there are compiler issues:

$ gcc -Iinclude -Lblib/lib -lparrot -ldl -Wall -g bg.c && ./a.out

#v+
bg.c: In function `main':
bg.c:35: warning: braces around scalar initializer
bg.c:35: warning: (near initialization for `_Parrot_static_mystr_STRING.obj.u.int_val')
bg.c:35: warning: initialization makes integer from pointer without a cast
bg.c:35: warning: excess elements in scalar initializer
bg.c:35: warning: (near initialization for `_Parrot_static_mystr_STRING.obj.u.int_val')
#v-

The declaration looks ok at first sight, my gcc 2.95.2 might be wrong, but
anyway, a bigger problem is here:

     PIO_printf(interpreter, "%S\n", mystr);

Program received signal SIGSEGV, Segmentation fault.
0x400f8725 in make_COW_reference (interpreter=0x8049828, s=0x80486e0)
    at string.c:95
95              PObj_constant_CLEAR(s);
(gdb) bac
#0  0x400f8725 in make_COW_reference (interpreter=0x8049828, s=0x80486e0)
    at string.c:95
#1  0x400f91b6 in string_copy (interpreter=0x8049828, s=0x80486e0)
    at string.c:497

snippet from objdump:

 .rodata        00000011              _Parrot_static_mystr_cstring.15
 .rodata        00000024              _Parrot_static_mystr_STRING.16

If we get a general compiler independend solution for declaring static
STRINGs we still have nothing for static keys.

leo


#include "parrot/parrot.h"
#include "parrot/embed.h"

#if ! DISABLE_GC_DEBUG
#  define GC_DEBUG_VERSION ,0
#else
#  define GC_DEBUG_VERSION
#endif

#define PCONCAT(b,c) _Parrot_static_##b##c
#define PARROT_DECLARE_STATIC_STRING(name, cstring) \
   static const char PCONCAT(name,_cstring) * = cstring; \
   static const struct parrot_string_t \
      PCONCAT(name,_STRING) = { \
      { /* pobj_t */ \
         {{ \
            (void*)PCONCAT(name,_cstring), \
            sizeof(PCONCAT(name,_cstring)) \
         }}, \
         PObj_constant_FLAG \
         GC_DEBUG_VERSION \
      }, \
      sizeof(PCONCAT(name,_cstring)), \
      (void*)PCONCAT(name,_cstring), \
      sizeof(PCONCAT(name,_cstring)) - 1, \
      NULL, \
      NULL, \
      0 \
   }, * const name = &PCONCAT(name,_STRING)


int main(int argc, char* argv[]) {
    int dummy_var;
    struct Parrot_Interp * interpreter;
    PARROT_DECLARE_STATIC_STRING(mystr, "some string here");

    interpreter = Parrot_new();
    Parrot_init(interpreter, (void*) &dummy_var);
    PIO_printf(interpreter, "%S\n", mystr);
    return 0;
}



Reply via email to