<div dir="ltr"><div><div><div><div><div>Hello, <br><br></div>I do think that docenum and enum should be split up. I don't really get the purpose of docenum though. Even if an enum can be extended, that extension would technically be an extension to the protocol, would it not? <br><br>
> Completeness of enums is information that can be encoded in strongly<br>
> typed languages, but I do not think such guarantees are necessary.<br>
> Bindings should be able to deal with new constants not listed in the<br>
> protocol. If we guarantee completeness of enums, I expect we will get<br>
> all kinds of backwards compatibility issues.<br><br></div>I do not quite agree with this. If an application encounters an enum it's not familiar with, it should output a warning or an error. The bindings should generate the code to be used by the application. If the application wants to extend the protocol, they'll have to extend the specification. <br><br></div>As for the bitfields, I do agree it makes more sense to have them in the argument tags, for the reasons already mentioned. <br><br>> That would be solved by documenting the XML language, including<br>
> guidelines for generator writers. I think there are things that<br>
> wayland-scanner cannot communicate, especially when they do not really<br>
> exist in C.<br><br></div><div>I can only agree with this.<br></div><br></div><div>Thanks<br></div> - Jeroen<br></div><br><div class="gmail_quote">On Thu, 23 Apr 2015 at 10:38 Pekka Paalanen <<a href="mailto:ppaalanen@gmail.com">ppaalanen@gmail.com</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Thu, 23 Apr 2015 10:17:12 +0200<br>
Auke Booij <<a href="mailto:auke@tulcod.com" target="_blank">auke@tulcod.com</a>> wrote:<br>
<br>
> On 23 April 2015 at 08:38, Pekka Paalanen <<a href="mailto:ppaalanen@gmail.com" target="_blank">ppaalanen@gmail.com</a>> wrote:<br>
> > On Wed, 22 Apr 2015 11:47:51 +0200<br>
> > Auke Booij <<a href="mailto:auke@tulcod.com" target="_blank">auke@tulcod.com</a>> wrote:<br>
> ><br>
> >> On 22 April 2015 at 08:34, Pekka Paalanen <<a href="mailto:ppaalanen@gmail.com" target="_blank">ppaalanen@gmail.com</a>> wrote:<br>
> >> > I also think this discussion is going off-topic. You wanted to add<br>
> >> > annotations to the XML, so you could find out about enum and bitfield<br>
> >> > arguments, so let's keep to that. There is value in simplicity.<br>
> >> ><br>
> >> ><br>
> >> > How about this:<br>
> >> ><br>
> >> > Add three new, mutually exclusive attributes for <arg> tags:<br>
> >> ><br>
> >> >         docenum="enumname"<br>
> >> ><br>
> >> > Docenum would be for documentation linking only, and should not affect<br>
> >> > code generation. The effect would be in the documentation to add a link<br>
> >> > to the definition of the "enumname" <enum>. This attribute is<br>
> >> > applicable for both int and uint type <arg>s.<br>
> >> ><br>
> >> >         enumeration="enumname"<br>
> >> ><br>
> >> > Enumeration would be a doc link, but also specify that the <enum><br>
> >> > "enumname" is a complete enumeration: no other values are legal. You<br>
> >> > can use this for code generation. You will rely on interface version<br>
> >> > negotiation to avoid unknown values in case you have an old definition<br>
> >> > of the interface and your opponent is using a new definition which<br>
> >> > added values. This attribute is applicable for both int and uint type<br>
> >> > <arg>s.<br>
> >> ><br>
> >> >         bitfield="enumname"<br>
> >> ><br>
> >> > Bitfield would be a doc link, but also specify that the values listed<br>
> >> > in <enum> "enumanme" can be orred together to form new legal values.<br>
> >> > Bits that are not settable by using the listed values must be zero. You<br>
> >> > rely on the interface versioning to avoid getting undefined bits set,<br>
> >> > just like enumeration relies for adding new values. This attribute is<br>
> >> > applicable only to uint type <arg>s.<br>
> >> ><br>
> >> ><br>
> >> > So, both enumeration and bitfield could be used for codegen, docenum<br>
> >> > would not. Docenum or nothing would be used for cases that do not fit<br>
> >> > as enumeration or bitfield, including cases where unknown values are<br>
> >> > always allowed but the interface specification defines what to do when<br>
> >> > encountering one (ignore, use as a literal value, ...).<br>
> >> ><br>
> >> > Wayland-scanner would generate the doclink references in header<br>
> >> > comments, and check that the referenced enum exists and the <arg> type.<br>
> >><br>
> >> Two comments on this.<br>
> >><br>
> >> 1. I do not think it is necessary to distinguish between docenum and<br>
> >> enumeration. At least for me, I am not asking for any new guarantees<br>
> >> with regards to completeness: sure, new constants may be added on the<br>
> >> fly. All I want is semantic information: which (u)int refers to which<br>
> >> enum? And this data would be provided by your docenum (which I would<br>
> >> just call "enum").<br>
> ><br>
> > Jeroen seemed to be wanting that. That's why it gets complicated.<br>
><br>
> I agree. Well, if there is support for Jeroen's ideas, I will add that<br>
> to the scanner.c patch. I am not against them, but I would expect the<br>
> guarantees to be broken by C code all the time, so there needs to be a<br>
> solution for that.<br>
<br>
I'd rather not, or at least separate these two. We can add the doc<br>
attribute, and discuss the strictness later. Adding strictness<br>
constraints later should be as simple as adding more attributes.<br>
<br>
However, if strictness attributes affect codegen, it might be difficult<br>
to add them to existing enums, because it would change the API a code<br>
generator produces. That is a pretty strong reason to not change<br>
anything that affects codegen: you may be using an XML file that does<br>
not have these attributes, or you may be using a generator that does<br>
not handle these attributes.<br>
<br>
Third party XML files are a thing, you don't have control over<br>
everything. Version requirements on depended-on projects could be used<br>
to mitigate it, plus perhaps a switch to the generator to ignore the<br>
new attributes until your code ports to the strictly typed API.<br>
<br>
> >> I agree that it should express that OR'ing together any number of<br>
> >> values from the list should *at least* not be considered a protocol<br>
> >> error. They may still be disregarded for other reasons, but passing<br>
> >> OR'ed values in a bitfield should not break protocol, and this is the<br>
> >> guarantee a bitfield flag should express (IMO).<br>
> ><br>
> > I'm not sure about that. The allowance to "or" things together was more<br>
> > related to the "strict enumeration" enforcement.<br>
> ><br>
> > Interfaces should be able to still say, that a certain combination is<br>
> > illegal and will lead to a protocol error.<br>
> ><br>
> > None of it will ever break protocol on the wire level, as it is all<br>
> > just uints.<br>
> ><br>
> > Given this and that they must not affect codegen, what are the remaining<br>
> > differences between enums and bitfields? Enum can be an int, but a<br>
> > bitfield cannot? Is it worth to have the distinction in the language at<br>
> > all?<br>
> ><br>
> > In the end, is the only really useful thing left the doc linking?<br>
><br>
> Well, for one, there is a semantic difference, which in richly typed<br>
> languages is not to be underestimated. Perhaps the requirement should<br>
> be that:<br>
> at least one (non-empty) combination of listed values OR'ed together<br>
> results in a new valid value (ie one not listed)<br>
<br>
If you talk about richly typed languages, you imply that this will<br>
affect codegen. The doc linking alone should not affect codegen.<br>
<br>
> This is a sort of sanity condition on being a bitfield: it does not<br>
> require all combinations are valid, but it also distinguishes it from<br>
> a regular enum.<br>
<br>
Is that an important distinction to make? That a bitfield with "too<br>
many" restrictions must not be a bitfield?<br>
<br>
> > It seems the main difference between your and Jeroen's requirements is<br>
> > that Jeroen wants strict guarantees so that codegen can generate the<br>
> > strictest APIs in his language.<br>
><br>
> I agree. Like I said, such guarantees are welcome, as long as the<br>
> situation is also clear for C, so that we don't get any annoying<br>
> incompatibilities due to misunderstandings between languages. At this<br>
> point I am not asking for them.<br>
<br>
That would be solved by documenting the XML language, including<br>
guidelines for generator writers. I think there are things that<br>
wayland-scanner cannot communicate, especially when they do not really<br>
exist in C.<br>
<br>
> I fixed Bill's note on my sample patch, and will publish my<br>
> intermediary work on my github [0] (probably this will be limited to<br>
> just two commits, but you can subscribe if you want to).<br>
><br>
> [0] <a href="https://github.com/tulcod/wayland/tree/enum-attribute" target="_blank">https://github.com/tulcod/wayland/tree/enum-attribute</a><br>
<br>
<br>
Thanks,<br>
pq<br>
</blockquote></div>