[webkit-dev] PSA: COMPILE_ASSERT_MATCHING_ENUM is a bad idea

Anders Carlsson andersca at apple.com
Tue Jan 28 14:32:42 PST 2014


Hi floks!

I noticed that both the EFL port and GTK+ port use a COMPILE_ASSERT_MATCHING_ENUM macro to make sure that WebCore enum values map to API enum values correctly, for example:

COMPILE_ASSERT_MATCHING_ENUM(WEBKIT_WEB_NAVIGATION_REASON_LINK_CLICKED, NavigationTypeLinkClicked);

This means that we can’t add new enums declarations (unless they’re added at the end) without breaking the build.

Instead of doing this (and then just blindly casting between the API layer and WebCore enum types), use conversion functions, like this (taken from WebKit2):

> inline WebCore::PageVisibilityState toPageVisibilityState(WKPageVisibilityState wkPageVisibilityState)
> {
>     switch (wkPageVisibilityState) {
>     case kWKPageVisibilityStateVisible:
>         return WebCore::PageVisibilityStateVisible;
>     case kWKPageVisibilityStateHidden:
>         return WebCore::PageVisibilityStateHidden;
>     case kWKPageVisibilityStatePrerender:
>         return WebCore::PageVisibilityStatePrerender;
>     }
> 
>     ASSERT_NOT_REACHED();
>     return WebCore::PageVisibilityStateVisible;
> }

I plan to audit the Mac and Windows ports and look for places where we cast between API enum types and WebCore enum types, and I filed 

https://bugs.webkit.org/show_bug.cgi?id=127800 WebKitGTK+ should stop using COMPILE_ASSERT_MATCHING_ENUM macros
https://bugs.webkit.org/show_bug.cgi?id=127801 EFL port should stop using COMPILE_ASSERT_MATCHING_ENUM macros

for the Mac and EFL ports respectively. I’m happy to answer any questions about this.

- Anders



More information about the webkit-dev mailing list