Title: [88462] trunk/Source/WebKit2
Revision
88462
Author
[email protected]
Date
2011-06-09 11:14:21 -0700 (Thu, 09 Jun 2011)

Log Message

2011-06-09  Andreas Kling  <[email protected]>

        Reviewed by Anders Carlsson.

        WebKit2: Generate correct header conditionals in message receivers.
        https://bugs.webkit.org/show_bug.cgi?id=62379

        Given a *.messages.in file like this:

        Foo(AwesomeObject o)
        #if ENABLE(ESOTERIC_FEATURE)
        Bar(AwesomeObject o)
        #endif

        messages.py would include AwesomeObject.h only #if ENABLE(ESOTERIC_FEATURE).
        This breaks the build on platforms without that defined.

        Furthermore, if two messages guarded by different conditionals both pull in the same
        header, only the last conditional will be applied, for example:

        #if ENABLE(ESOTERIC_FEATURE)
        Foo(AwesomeObject o)
        #endif
        #if ENABLE(MYSTERIOUS_FEATURE)
        Bar(AwesomeObject o)
        #endif

        Would include AwesomeObject.h #if ENABLE(MYSTERIOUS_FEATURE) when it really should
        check #if ENABLE(ESOTERIC_FEATURE) || ENABLE(MYSTERIOUS_FEATURE).

        Change the generator to consider all conditionals for a given header file.
        Also consider conditionals for reply parameters.

        * Scripts/webkit2/messages.py:
        * Scripts/webkit2/messages_unittest.py:

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (88461 => 88462)


--- trunk/Source/WebKit2/ChangeLog	2011-06-09 18:09:30 UTC (rev 88461)
+++ trunk/Source/WebKit2/ChangeLog	2011-06-09 18:14:21 UTC (rev 88462)
@@ -1,3 +1,39 @@
+2011-06-09  Andreas Kling  <[email protected]>
+
+        Reviewed by Anders Carlsson.
+
+        WebKit2: Generate correct header conditionals in message receivers.
+        https://bugs.webkit.org/show_bug.cgi?id=62379
+
+        Given a *.messages.in file like this:
+
+        Foo(AwesomeObject o)
+        #if ENABLE(ESOTERIC_FEATURE)
+        Bar(AwesomeObject o)
+        #endif
+
+        messages.py would include AwesomeObject.h only #if ENABLE(ESOTERIC_FEATURE).
+        This breaks the build on platforms without that defined.
+
+        Furthermore, if two messages guarded by different conditionals both pull in the same
+        header, only the last conditional will be applied, for example:
+
+        #if ENABLE(ESOTERIC_FEATURE)
+        Foo(AwesomeObject o)
+        #endif
+        #if ENABLE(MYSTERIOUS_FEATURE)
+        Bar(AwesomeObject o)
+        #endif
+
+        Would include AwesomeObject.h #if ENABLE(MYSTERIOUS_FEATURE) when it really should
+        check #if ENABLE(ESOTERIC_FEATURE) || ENABLE(MYSTERIOUS_FEATURE).
+
+        Change the generator to consider all conditionals for a given header file.
+        Also consider conditionals for reply parameters.
+
+        * Scripts/webkit2/messages.py:
+        * Scripts/webkit2/messages_unittest.py:
+
 2011-06-09  Eunmi Lee  <[email protected]>
 
         Reviewed by Kenneth Rohde Christiansen.

Modified: trunk/Source/WebKit2/Scripts/webkit2/messages.py (88461 => 88462)


--- trunk/Source/WebKit2/Scripts/webkit2/messages.py	2011-06-09 18:09:30 UTC (rev 88461)
+++ trunk/Source/WebKit2/Scripts/webkit2/messages.py	2011-06-09 18:14:21 UTC (rev 88462)
@@ -86,12 +86,11 @@
                 name, parameters_string, reply_parameters_string, attributes_string = match.groups()
                 if parameters_string:
                     parameters = parse_parameter_string(parameters_string)
+                    for parameter in parameters:
+                        parameter.condition = condition
                 else:
                     parameters = []
 
-                for parameter in parameters:
-                    parameter.condition = condition
-
                 if attributes_string:
                     attributes = frozenset(attributes_string.split())
                     is_delayed = "Delayed" in attributes
@@ -102,6 +101,8 @@
 
                 if reply_parameters_string:
                     reply_parameters = parse_parameter_string(reply_parameters_string)
+                    for reply_parameter in reply_parameters:
+                        reply_parameter.condition = condition
                 elif reply_parameters_string == '':
                     reply_parameters = []
                 else:
@@ -483,34 +484,36 @@
 def generate_message_handler(file):
     receiver = MessageReceiver.parse(file)
     headers = {
-        '"%s"' % messages_header_filename(receiver): None,
-        '"HandleMessage.h"': None,
-        '"ArgumentDecoder.h"': None,
+        '"%s"' % messages_header_filename(receiver): [None],
+        '"HandleMessage.h"': [None],
+        '"ArgumentDecoder.h"': [None],
     }
 
     type_conditions = {}
     for parameter in receiver.iterparameters():
+        if not parameter.type in type_conditions:
+            type_conditions[parameter.type] = []
+
+        if not parameter.condition in type_conditions[parameter.type]:
+            type_conditions[parameter.type].append(parameter.condition)
+
+    for parameter in receiver.iterparameters():
         type = parameter.type
-        condition = parameter.condition
+        conditions = type_conditions[type]
 
-        if type in type_conditions:
-            if not type_conditions[type]:
-                condition = type_conditions[type]
-            else:
-                if not condition:
-                    type_conditions[type] = condition
-        else:
-            type_conditions[type] = condition
-
-        argument_encoder_headers = argument_coder_headers_for_type(parameter.type)
+        argument_encoder_headers = argument_coder_headers_for_type(type)
         if argument_encoder_headers:
             for header in argument_encoder_headers:
-                headers[header] = condition
+                if header not in headers:
+                    headers[header] = []
+                headers[header].extend(conditions)
             continue
 
         type_headers = headers_for_type(type)
         for header in type_headers:
-            headers[header] = condition
+            if header not in headers:
+                headers[header] = []
+            headers[header].extend(conditions)
 
     for message in receiver.messages:
         if message.reply_parameters is not None:
@@ -519,13 +522,18 @@
                 argument_encoder_headers = argument_coder_headers_for_type(type)
                 if argument_encoder_headers:
                     for header in argument_encoder_headers:
-                        headers[header] = message.condition
+                        if header not in headers:
+                            headers[header] = []
+                        headers[header].append(message.condition)
                     continue
 
                 type_headers = headers_for_type(type)
                 for header in type_headers:
-                    headers[header] = message.condition
+                    if header not in headers:
+                        headers[header] = []
+                    headers[header].append(message.condition)
 
+
     result = []
 
     result.append(_license_header)
@@ -537,8 +545,8 @@
 
     result.append('#include "%s.h"\n\n' % receiver.name)
     for headercondition in sorted(headers):
-        if headers[headercondition]:
-            result.append('#if %s\n' % headers[headercondition])
+        if headers[headercondition] and not None in headers[headercondition]:
+            result.append('#if %s\n' % ' || '.join(set(headers[headercondition])))
             result += ['#include %s\n' % headercondition]
             result.append('#endif\n')
         else:

Modified: trunk/Source/WebKit2/Scripts/webkit2/messages_unittest.py (88461 => 88462)


--- trunk/Source/WebKit2/Scripts/webkit2/messages_unittest.py	2011-06-09 18:09:30 UTC (rev 88461)
+++ trunk/Source/WebKit2/Scripts/webkit2/messages_unittest.py	2011-06-09 18:14:21 UTC (rev 88462)
@@ -79,6 +79,14 @@
     # Keyboard support
     InterpretKeyEvent(uint32_t type) -> (Vector<WebCore::KeypressCommand> commandName)
 #endif
+
+#if ENABLE(DEPRECATED_FEATURE)
+    DeprecatedOperation(CoreIPC::DummyType dummy)
+#endif
+
+#if ENABLE(EXPERIMENTAL_FEATURE)
+    ExperimentalOperation(CoreIPC::DummyType dummy)
+#endif
 }
 
 #endif
@@ -86,21 +94,21 @@
 
 _expected_results = {
     'name': 'WebPage',
-    'condition': 'ENABLE(WEBKIT2)',
+    'conditions': ('ENABLE(WEBKIT2)'),
     'messages': (
         {
             'name': 'LoadURL',
             'parameters': (
                 ('WTF::String', 'url'),
             ),
-            'condition': None,
+            'conditions': (None),
         },
         {
             'name': 'TouchEvent',
             'parameters': (
                 ('WebKit::WebTouchEvent', 'event'),
             ),
-            'condition': 'ENABLE(TOUCH_EVENTS)',
+            'conditions': ('ENABLE(TOUCH_EVENTS)'),
         },
         {
             'name': 'DidReceivePolicyDecision',
@@ -109,19 +117,19 @@
                 ('uint64_t', 'listenerID'),
                 ('uint32_t', 'policyAction'),
             ),
-            'condition': None,
+            'conditions': (None),
         },
         {
             'name': 'Close',
             'parameters': (),
-            'condition': None,
+            'conditions': (None),
         },
         {
             'name': 'PreferencesDidChange',
             'parameters': (
                 ('WebKit::WebPreferencesStore', 'store'),
             ),
-            'condition': None,
+            'conditions': (None),
         },
         {
             'name': 'SendDoubleAndFloat',
@@ -129,7 +137,7 @@
                 ('double', 'd'),
                 ('float', 'f'),
             ),
-            'condition': None,
+            'conditions': (None),
         },
         {
             'name': 'SendInts',
@@ -137,7 +145,7 @@
                 ('Vector<uint64_t>', 'ints'),
                 ('Vector<Vector<uint64_t> >', 'intVectors')
             ),
-            'condition': None,
+            'conditions': (None),
         },
         {
             'name': 'CreatePlugin',
@@ -148,7 +156,7 @@
             'reply_parameters': (
                 ('bool', 'result'),
             ),
-            'condition': None,
+            'conditions': (None),
         },
         {
             'name': 'RunJavaScriptAlert',
@@ -157,7 +165,7 @@
                 ('WTF::String', 'message')
             ),
             'reply_parameters': (),
-            'condition': None,
+            'conditions': (None),
         },
         {
             'name': 'GetPlugins',
@@ -167,7 +175,7 @@
             'reply_parameters': (
                 ('Vector<WebCore::PluginInfo>', 'plugins'),
             ),
-            'condition': None,
+            'conditions': (None),
         },
         {
             'name': 'GetPluginProcessConnection',
@@ -177,7 +185,7 @@
             'reply_parameters': (
                 ('CoreIPC::Connection::Handle', 'connectionHandle'),
             ),
-            'condition': None,
+            'conditions': (None),
         },
         {
             'name': 'TestMultipleAttributes',
@@ -185,21 +193,21 @@
             ),
             'reply_parameters': (
             ),
-            'condition': None,
+            'conditions': (None),
         },
         {
             'name': 'TestConnectionQueue',
             'parameters': (
                 ('uint64_t', 'pluginID'),
             ),
-            'condition': None,
+            'conditions': (None),
         },
         {
             'name': 'DidCreateWebProcessConnection',
             'parameters': (
                 ('CoreIPC::MachPort', 'connectionIdentifier'),
             ),
-            'condition': 'PLATFORM(MAC)',
+            'conditions': ('PLATFORM(MAC)'),
         },
         {
             'name': 'InterpretKeyEvent',
@@ -209,8 +217,22 @@
             'reply_parameters': (
                 ('Vector<WebCore::KeypressCommand>', 'commandName'),
             ),
-            'condition': 'PLATFORM(MAC)',
+            'conditions': ('PLATFORM(MAC)'),
         },
+        {
+            'name': 'DeprecatedOperation',
+            'parameters': (
+                ('CoreIPC::DummyType', 'dummy'),
+            ),
+            'conditions': ('ENABLE(DEPRECATED_FEATURE)'),
+        },
+        {
+            'name': 'ExperimentalOperation',
+            'parameters': (
+                ('CoreIPC::DummyType', 'dummy'),
+            ),
+            'conditions': ('ENABLE(EXPERIMENTAL_FEATURE)'),
+        }
     ),
 }
 
@@ -233,12 +255,12 @@
                 self.assertEquals(parameter.name, expected_message['reply_parameters'][index][1])
         else:
             self.assertFalse('reply_parameters' in expected_message)
-        self.assertEquals(message.condition, expected_message['condition'])
+        self.assertEquals(message.condition, expected_message['conditions'])
 
     def test_receiver(self):
         """Receiver should be parsed as expected"""
         self.assertEquals(self.receiver.name, _expected_results['name'])
-        self.assertEquals(self.receiver.condition, _expected_results['condition'])
+        self.assertEquals(self.receiver.condition, _expected_results['conditions'])
         self.assertEquals(len(self.receiver.messages), len(_expected_results['messages']))
         for index, message in enumerate(self.receiver.messages):
             self.check_message(message, _expected_results['messages'][index])
@@ -284,6 +306,7 @@
 namespace CoreIPC {
     class ArgumentEncoder;
     class Connection;
+    class DummyType;
     class MachPort;
 }
 
@@ -322,6 +345,12 @@
 #if PLATFORM(MAC)
     InterpretKeyEventID,
 #endif
+#if ENABLE(DEPRECATED_FEATURE)
+    DeprecatedOperationID,
+#endif
+#if ENABLE(EXPERIMENTAL_FEATURE)
+    ExperimentalOperationID,
+#endif
 };
 
 struct LoadURL : CoreIPC::Arguments1<const WTF::String&> {
@@ -485,6 +514,28 @@
 };
 #endif
 
+#if ENABLE(DEPRECATED_FEATURE)
+struct DeprecatedOperation : CoreIPC::Arguments1<const CoreIPC::DummyType&> {
+    static const Kind messageID = DeprecatedOperationID;
+    typedef CoreIPC::Arguments1<const CoreIPC::DummyType&> DecodeType;
+    explicit DeprecatedOperation(const CoreIPC::DummyType& dummy)
+        : CoreIPC::Arguments1<const CoreIPC::DummyType&>(dummy)
+    {
+    }
+};
+#endif
+
+#if ENABLE(EXPERIMENTAL_FEATURE)
+struct ExperimentalOperation : CoreIPC::Arguments1<const CoreIPC::DummyType&> {
+    static const Kind messageID = ExperimentalOperationID;
+    typedef CoreIPC::Arguments1<const CoreIPC::DummyType&> DecodeType;
+    explicit ExperimentalOperation(const CoreIPC::DummyType& dummy)
+        : CoreIPC::Arguments1<const CoreIPC::DummyType&>(dummy)
+    {
+    }
+};
+#endif
+
 } // namespace WebPage
 
 } // namespace Messages
@@ -532,19 +583,18 @@
 
 #include "WebPage.h"
 
-#if PLATFORM(MAC)
 #include "ArgumentCoders.h"
-#endif
 #include "ArgumentDecoder.h"
 #include "Connection.h"
+#if ENABLE(DEPRECATED_FEATURE) || ENABLE(EXPERIMENTAL_FEATURE)
+#include "DummyType.h"
+#endif
 #include "HandleMessage.h"
 #if PLATFORM(MAC)
 #include "MachPort.h"
 #endif
 #include "Plugin.h"
-#if PLATFORM(MAC)
 #include "WebCoreArgumentCoders.h"
-#endif
 #if ENABLE(TOUCH_EVENTS)
 #include "WebEvent.h"
 #endif
@@ -649,6 +699,16 @@
         CoreIPC::handleMessage<Messages::WebPage::DidCreateWebProcessConnection>(arguments, this, &WebPage::didCreateWebProcessConnection);
         return;
 #endif
+#if ENABLE(DEPRECATED_FEATURE)
+    case Messages::WebPage::DeprecatedOperationID:
+        CoreIPC::handleMessage<Messages::WebPage::DeprecatedOperation>(arguments, this, &WebPage::deprecatedOperation);
+        return;
+#endif
+#if ENABLE(EXPERIMENTAL_FEATURE)
+    case Messages::WebPage::ExperimentalOperationID:
+        CoreIPC::handleMessage<Messages::WebPage::ExperimentalOperation>(arguments, this, &WebPage::experimentalOperation);
+        return;
+#endif
     default:
         break;
     }
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to