[PATCH wayland] Add "enum" attribute to "arg" elements

Bill Spitzak spitzak at gmail.com
Thu Apr 23 11:53:59 PDT 2015


I think there may be some confusion about how this would be used by a 
language binding, and why bitmap is necessary, and also why it has to be 
on the enumeration.

Imagine an interface called Widget, and it has two methods 
set_type(Type) and set_flags(Flags). set_type takes an enumeration 
called Type and set_flags takes a bitmap called Flags. Type has two 
values Left and Right. Flags has two non-zero values A and B.

"widget" is an instance of Widget in this language. Here is how the two 
messages might look written in this language:

	widget.set_type(Widget.Type.Left)
	widget.set_flags(Widget.Flags.A)

The following do not compile. In most languages this is because there is 
a type mismatch between the argument and the expression used to set it:

	widget.set_type(43) // error!
	widget.set_type(Widget.Flags.A) // error!
	widget.set_flags(Widget.Type.Left) // error!
	widget.set_flags(0x1349) // error!

However (and this is why I don't think "documentation only" or 
"strictness" is needed) the languages can provide a method to force the 
above things to compile. This usually involves adding some extra syntax 
such as a cast, the extra code makes it clear to the programmer that 
they should be careful:

	widget.set_type(Widget.Type(43))
	widget.set_flags(Widget.Flags(0x1349))

(yes the language binding could prevent this, but programmers writing 
direct Wayland api are already wading into dangerous waters and can 
probably be trusted to do this correctly. So for now I don't think there 
is any need for a strict control).

The reason for the bitmap is because this should work:

	widget.set_flags(Widget.Flags.A | Widget.Flags.B)

but this should not work (either you cannot or the two values together, 
or the result of or is the wrong type):

	widget.set_type(Widget.Type.Left | Widget.Type.Right) // error!

The binding generation has to know whether it is a bitmap so that it can 
make these two cases behave differently.

You may think this is minor detail and it would be ok to or any values 
together, and yes that would probably not confuse programmers able to 
write Wayland api. However the real reason is that supporting the or is 
much more complex in some languages (C++ for example) and thus binding 
generators would like to avoid it if possible.

The reason the bitmap indicator has to be on the enumeration and not the 
method is because of this:

	var x = Widget.Flags.A;
	if (foo) x |= Widget.Flags.B; // ***
	widget.set_flags(x)

The language has to know the legality of the statmeent marked with ***. 
It cannot depend on knowing the result will later be used for the 
set_flags request. Therefore the bitmap attribute has to be on the type, 
not the request.


More information about the wayland-devel mailing list