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
