Changeset 174863 in webkit for trunk/Source/JavaScriptCore/replay


Ignore:
Timestamp:
Oct 18, 2014, 11:13:05 AM (11 years ago)
Author:
Brian Burg
Message:

Web Replay: code generator shouldn't complain about enums without a storage type if they are in an enclosing scope
https://bugs.webkit.org/show_bug.cgi?id=137084

Reviewed by Joseph Pecoraro.

In order to generate encode/decode method declarations without pulling in lots of headers,
the generator must forward declare enums (for enum classes or enums with explicit sizes).

Change the generator to not require an explicit size if an enum is declared inside a struct
or class definition. In that case, it must pull in headers since scoped enums can't be
forward declared.

This patch also fixes some chained if-statements that should be if-else statements.

Test: updated replay/scripts/tests/generate-enum-encoding-helpers.json to cover the new case.

  • replay/scripts/CodeGeneratorReplayInputs.py:

(InputsModel.parse_type_with_framework_name.is):
(InputsModel.parse_type_with_framework_name.is.must):
(Generator.generate_enum_trait_implementation):
(InputsModel.parse_type_with_framework_name): Deleted.

  • replay/scripts/CodeGeneratorReplayInputsTemplates.py:
  • replay/scripts/tests/expected/fail-on-c-style-enum-no-storage.json-error:
  • replay/scripts/tests/expected/generate-enum-encoding-helpers-with-guarded-values.json-TestReplayInputs.cpp:

(JSC::EncodingTraits<WebCore::MouseButton>::decodeValue):

  • replay/scripts/tests/expected/generate-enum-encoding-helpers.json-TestReplayInputs.cpp:

(JSC::EncodingTraits<WebCore::MouseButton>::decodeValue):
(JSC::EncodingTraits<WebCore::PlatformEvent::Type>::encodeValue):
(JSC::EncodingTraits<WebCore::PlatformEvent::Type>::decodeValue):

  • replay/scripts/tests/expected/generate-enum-encoding-helpers.json-TestReplayInputs.h:
  • replay/scripts/tests/expected/generate-enums-with-same-base-name.json-TestReplayInputs.cpp:

(JSC::EncodingTraits<WebCore::FormData1::Type>::decodeValue):
(JSC::EncodingTraits<PlatformEvent1::Type>::decodeValue):

  • replay/scripts/tests/generate-enum-encoding-helpers.json: Added a new input to cover this case.
Location:
trunk/Source/JavaScriptCore/replay/scripts
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/replay/scripts/CodeGeneratorReplayInputs.py

    r174113 r174863  
    455455                raise ParseException("Malformed specification: enum %s does not supply a list of values" % type_name)
    456456
    457             if _type.is_enum() and "storage" not in json:
    458                 raise ParseException("Could not parse enum %s: C-style enums must also specify their storage type so they can be forward declared." % type_name)
     457            if _type.is_enum() and enclosing_class is None and type_storage is None:
     458                raise ParseException("Could not parse enum %s: C-style enums not enclosed by a class must specify their storage type so they can be forward declared." % type_name)
    459459
    460460        self.types.append(_type)
     
    836836        # Generate body for decode.
    837837        decodeLines = []
    838         for _value in _type.values:
     838        for i, _value in enumerate(_type.values):
     839
    839840            template_arguments = {
     841                'branchKeyword': "else if" if i > 0 else "if",
    840842                'enumStringValue': _value,
    841843                'qualifiedEnumValue': "%s%s" % (enum_prefix, _value),
     
    846848        for guard, guard_values in _type.guard_values_map.iteritems():
    847849            guardedLines = []
    848             for guard_value in guard_values:
     850            for i, guard_value in enumerate(guard_values):
    849851                template_arguments = {
     852                    'branchKeyword': "else if" if i > 0 else "if",
    850853                    'enumStringValue': guard_value,
    851854                    'qualifiedEnumValue': "%s%s" % (enum_prefix, guard_value),
  • trunk/Source/JavaScriptCore/replay/scripts/CodeGeneratorReplayInputsTemplates.py

    r174113 r174863  
    210210        return false;
    211211
    212     for (String enumString : enumStrings) {
     212    for (const String& enumString : enumStrings) {
    213213${decodeCases}
    214214    }
     
    225225
    226226    EnumDecodeCase = (
    227     """        if (enumString == "${enumStringValue}")
     227    """        ${branchKeyword} (enumString == "${enumStringValue}")
    228228            enumValue = static_cast<${qualifiedEnumName}>(enumValue | ${qualifiedEnumValue});""")
    229229
  • trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-c-style-enum-no-storage.json-error

    r163918 r174863  
    1 ERROR: Could not parse enum MouseButton: C-style enums must also specify their storage type so they can be forward declared.
     1ERROR: Could not parse enum MouseButton: C-style enums not enclosed by a class must specify their storage type so they can be forward declared.
  • trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-enum-encoding-helpers-with-guarded-values.json-TestReplayInputs.cpp

    r174113 r174863  
    120120        return false;
    121121
    122     for (String enumString : enumStrings) {
     122    for (const String& enumString : enumStrings) {
    123123        if (enumString == "NoButton")
    124124            enumValue = static_cast<WebCore::MouseButton>(enumValue | WebCore::NoButton);
    125         if (enumString == "LeftButton")
     125        else if (enumString == "LeftButton")
    126126            enumValue = static_cast<WebCore::MouseButton>(enumValue | WebCore::LeftButton);
    127         if (enumString == "MiddleButton")
     127        else if (enumString == "MiddleButton")
    128128            enumValue = static_cast<WebCore::MouseButton>(enumValue | WebCore::MiddleButton);
    129         if (enumString == "RightButton")
     129        else if (enumString == "RightButton")
    130130            enumValue = static_cast<WebCore::MouseButton>(enumValue | WebCore::RightButton);
    131131#if ENABLE(SIDE_BUTTONS)
    132132        if (enumString == "LeftSideButton")
    133133            enumValue = static_cast<WebCore::MouseButton>(enumValue | WebCore::LeftSideButton);
    134         if (enumString == "RightSideButton")
     134        else if (enumString == "RightSideButton")
    135135            enumValue = static_cast<WebCore::MouseButton>(enumValue | WebCore::RightSideButton);
    136136#endif // ENABLE(SIDE_BUTTONS)
  • trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-enum-encoding-helpers.json-TestReplayInputs.cpp

    r174113 r174863  
    130130        return false;
    131131
    132     for (String enumString : enumStrings) {
     132    for (const String& enumString : enumStrings) {
    133133        if (enumString == "NoButton")
    134134            enumValue = static_cast<WebCore::MouseButton>(enumValue | WebCore::NoButton);
    135         if (enumString == "LeftButton")
     135        else if (enumString == "LeftButton")
    136136            enumValue = static_cast<WebCore::MouseButton>(enumValue | WebCore::LeftButton);
    137         if (enumString == "MiddleButton")
     137        else if (enumString == "MiddleButton")
    138138            enumValue = static_cast<WebCore::MouseButton>(enumValue | WebCore::MiddleButton);
    139         if (enumString == "RightButton")
     139        else if (enumString == "RightButton")
    140140            enumValue = static_cast<WebCore::MouseButton>(enumValue | WebCore::RightButton);
     141    }
     142
     143    return true;
     144}
     145
     146EncodedValue EncodingTraits<WebCore::PlatformEvent::Type>::encodeValue(const WebCore::PlatformEvent::Type& enumValue)
     147{
     148    EncodedValue encodedValue = EncodedValue::createArray();
     149    if (enumValue & WebCore::PlatformEvent::Mouse) {
     150        encodedValue.append<String>(ASCIILiteral("Mouse"));
     151        if (enumValue == WebCore::PlatformEvent::Mouse)
     152            return encodedValue;
     153    }
     154    if (enumValue & WebCore::PlatformEvent::Key) {
     155        encodedValue.append<String>(ASCIILiteral("Key"));
     156        if (enumValue == WebCore::PlatformEvent::Key)
     157            return encodedValue;
     158    }
     159    if (enumValue & WebCore::PlatformEvent::Touch) {
     160        encodedValue.append<String>(ASCIILiteral("Touch"));
     161        if (enumValue == WebCore::PlatformEvent::Touch)
     162            return encodedValue;
     163    }
     164    if (enumValue & WebCore::PlatformEvent::Wheel) {
     165        encodedValue.append<String>(ASCIILiteral("Wheel"));
     166        if (enumValue == WebCore::PlatformEvent::Wheel)
     167            return encodedValue;
     168    }
     169    return encodedValue;
     170}
     171
     172bool EncodingTraits<WebCore::PlatformEvent::Type>::decodeValue(EncodedValue& encodedValue, WebCore::PlatformEvent::Type& enumValue)
     173{
     174    Vector<String> enumStrings;
     175    if (!EncodingTraits<Vector<String>>::decodeValue(encodedValue, enumStrings))
     176        return false;
     177
     178    for (const String& enumString : enumStrings) {
     179        if (enumString == "Mouse")
     180            enumValue = static_cast<WebCore::PlatformEvent::Type>(enumValue | WebCore::PlatformEvent::Mouse);
     181        else if (enumString == "Key")
     182            enumValue = static_cast<WebCore::PlatformEvent::Type>(enumValue | WebCore::PlatformEvent::Key);
     183        else if (enumString == "Touch")
     184            enumValue = static_cast<WebCore::PlatformEvent::Type>(enumValue | WebCore::PlatformEvent::Touch);
     185        else if (enumString == "Wheel")
     186            enumValue = static_cast<WebCore::PlatformEvent::Type>(enumValue | WebCore::PlatformEvent::Wheel);
    141187    }
    142188
  • trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-enum-encoding-helpers.json-TestReplayInputs.h

    r174113 r174863  
    3434#include "InternalNamespaceHeaderIncludeDummy.h"
    3535#include <platform/ExternalNamespaceHeaderIncludeDummy.h>
     36#include <platform/PlatformEvent.h>
    3637
    3738namespace WebCore {
     
    6970    static bool decodeValue(EncodedValue&, WebCore::MouseButton& value);
    7071};
     72
     73template<> struct EncodingTraits<WebCore::PlatformEvent::Type> {
     74    typedef WebCore::PlatformEvent::Type DecodedType;
     75
     76    static EncodedValue encodeValue(const WebCore::PlatformEvent::Type& value);
     77    static bool decodeValue(EncodedValue&, WebCore::PlatformEvent::Type& value);
     78};
    7179} // namespace JSC
    7280
  • trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-enum-with-guard.json-TestReplayInputs.cpp

    r174113 r174863  
    8787        return false;
    8888
    89     for (String enumString : enumStrings) {
     89    for (const String& enumString : enumStrings) {
    9090        if (enumString == "PlatformWheelEventPhaseNone")
    9191            enumValue = static_cast<WebCore::PlatformWheelEventPhase>(enumValue | WebCore::PlatformWheelEventPhaseNone);
  • trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-enums-with-same-base-name.json-TestReplayInputs.cpp

    r174113 r174863  
    108108        return false;
    109109
    110     for (String enumString : enumStrings) {
     110    for (const String& enumString : enumStrings) {
    111111        if (enumString == "Text")
    112112            enumValue = static_cast<WebCore::FormData1::Type>(enumValue | WebCore::FormData1::Text);
    113         if (enumString == "Blob")
     113        else if (enumString == "Blob")
    114114            enumValue = static_cast<WebCore::FormData1::Type>(enumValue | WebCore::FormData1::Blob);
    115115    }
     
    163163        return false;
    164164
    165     for (String enumString : enumStrings) {
     165    for (const String& enumString : enumStrings) {
    166166        if (enumString == "Mouse")
    167167            enumValue = static_cast<PlatformEvent1::Type>(enumValue | PlatformEvent1::Mouse);
    168         if (enumString == "Keyboard")
     168        else if (enumString == "Keyboard")
    169169            enumValue = static_cast<PlatformEvent1::Type>(enumValue | PlatformEvent1::Keyboard);
    170170    }
  • trunk/Source/JavaScriptCore/replay/scripts/tests/generate-enum-encoding-helpers.json

    r163918 r174863  
    1515                "values": ["NoButton", "LeftButton", "MiddleButton", "RightButton"],
    1616                "header": "platform/PlatformMouseEvent.h"
     17            },
     18            {
     19                "name": "Type", "mode": "SCALAR",
     20                "flags": ["ENUM"],
     21                "enclosing_class": "PlatformEvent",
     22                "values": ["Mouse", "Key", "Touch", "Wheel"],
     23                "header": "platform/PlatformEvent.h"
    1724            }
    1825        ]
Note: See TracChangeset for help on using the changeset viewer.