[Vala] Display values of an enum.









Hi All,

I've been interested in vala from the beginning, but only
 recently started doing some simple tests in it. In my daily work I'm a 
Software Engineer developing in Java/JEE. In my private projects I use C
 mostly (using my own object system, so I can develop object oriented.)

I'm
 porting a small java framework (I wrote myself) for writing Command 
Line Interfaces (CLI) to vala, in order to get more acquainted with 
vala. Now I'm having a problem with Enumerations. I'm trying to iterate 
over the values of an Enumeration. My testcase looks as follows:

---
 start of EnumTest.vala:
enum EnumTest {TEST1, TEST2, TEST3}

void
 main() {
    EnumClass enumClass = (EnumClass) typeof 
(EnumTest).class_ref();
    unowned EnumValue[] falues = 
enumClass.values;
    for (int i = 0; i < falues.length; i++) {
       
 unowned EnumValue falue = falues[i]; 
        stdout.printf("%s", 
falue.value_name);
    }
}
--- end of EnumTest.vala.

First
 of all, I don't know whether this is the way it should be done, but at 
least valac -C doesn't complain. Please enlighten me if I'm doing 
anything wrong in the vala code :-).
I'm trying to compile this in 
Ubuntu Lucid, 64-bits, using the vala ppa, but I get an error on the 
generated C code.

$ uname -a


Linux peterpaul-vaio 2.6.32-23-generic #37-Ubuntu SMP Fri Jun 11 
08:03:28 UTC 2010 x86_64 GNU/Linux


$ valac --version


Vala 0.9.1
$ valac EnumTest.vala 
/home/peterpaul/projects/vala/EnumTest.vala.c:
 In function ‘_vala_main’:
/home/peterpaul/projects/vala/EnumTest.vala.c:45:
 warning: assignment from incompatible pointer type
/home/peterpaul/projects/vala/EnumTest.vala.c:45:
 error: ‘GEnumClass’ has no member named ‘values_length1’
error: cc 
exited with status 256
Compilation failed: 1 error(s), 0 warning(s)

I've
 also generated the C code using 'valac -C', and studied the generated 
code. Indeed it contains a reference to values_length1. By googling 
around, I found that this might need to be: 'n_values'. However when 
changing this in the C file, compilation still gives me another error:

$
 gcc -g3 -o enumtest EnumTest.c `pkg-config --libs --cflags glib-2.0` 
`pkg-config --libs --cflags gobject-2.0`
EnumTest.c: In function 
‘_vala_main’:
EnumTest.c:45: warning: assignment from incompatible 
pointer type

Here is the relevant section from the C file:
---
 start part of EnumTest.c
39:    GEnumClass* enumClass;
40:    
GEnumValue** _tmp0_;
41:    gint _falues_size_;
42:    gint 
falues_length1;
43:    GEnumValue** falues;
44:    enumClass = 
(GEnumClass*) g_type_class_ref (TYPE_ENUM_TEST);
45:    falues = 
(_tmp0_ = enumClass->values, falues_length1 = enumClass->n_values,
 _falues_size_ = falues_length1, _tmp0_);
--- end part of EnumTest.c

When
 I explicitly cast in line 45: falues = (_tmp0_ = (GEnumValue**) 
enumClass->values, falues_length1 = enumClass->n_values, 
_falues_size_ = falues_length1, _tmp0_);
I get a segmentation fault 
in the generated binary (enumtest).

Coming to a conclusion, I 
think I've found a bug in the vala compiler, in that it doesn't generate
 the correct code for the EnumClass length of values. But also when I 
try to fix the generated C code, I cannot create something working. Note
 that I'm not familiar with the internals of the GObject system. So in 
the end it could still be my lack of knowledge. I hope that someone can 
have a look at this, and tell me how it should be done, or verify 
valac's behavior.

Thanks in advance,
Peterpaul Klein Haneveld.                                         
_________________________________________________________________
Al je email accounts in 1 inbox. Het kan in Hotmail.
http://www.microsoft.com/netherlands/windowslive/Views/productdetail.aspx?product=Hotmail


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]