Changeset 223607 in webkit


Ignore:
Timestamp:
Oct 18, 2017 8:16:35 AM (7 years ago)
Author:
commit-queue@webkit.org
Message:

[Settings] Replace macros in Settings.h/cpp with generated code
https://bugs.webkit.org/show_bug.cgi?id=178419

Patch by Sam Weinig <sam@webkit.org> on 2017-10-18
Reviewed by Antti Koivisto.

  • Scripts/GenerateSettings/GenerateSettingsHeaderFile.py:
  • Scripts/GenerateSettings/GenerateSettingsImplementationFile.py:

Rather than use macros in the generated Settings class, generate the code the macros
would expand to.

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r223605 r223607  
     12017-10-18  Sam Weinig  <sam@webkit.org>
     2
     3        [Settings] Replace macros in Settings.h/cpp with generated code
     4        https://bugs.webkit.org/show_bug.cgi?id=178419
     5
     6        Reviewed by Antti Koivisto.
     7
     8        * Scripts/GenerateSettings/GenerateSettingsHeaderFile.py:
     9        * Scripts/GenerateSettings/GenerateSettingsImplementationFile.py:
     10
     11            Rather than use macros in the generated Settings class, generate the code the macros
     12            would expand to.
     13
    1142017-10-18  Zalan Bujtas  <zalan@apple.com>
    215
  • trunk/Source/WebCore/Scripts/GenerateSettings/GenerateSettingsHeaderFile.py

    r223574 r223607  
    3030
    3131def generateSettingsHeaderFile(outputDirectory, settings):
     32    settingsByConditional = {}
     33    unconditionalSettings = {}
     34
     35    for settingName in sorted(settings.iterkeys()):
     36        setting = settings[settingName]
     37        if setting.conditional:
     38            if setting.conditional not in settingsByConditional:
     39                settingsByConditional[setting.conditional] = {}
     40            settingsByConditional[setting.conditional][setting.name] = True
     41        else:
     42            unconditionalSettings[setting.name] = True
     43
     44    sortedUnconditionalSettingsNames = sorted(unconditionalSettings.iterkeys())
     45    sortedConditionals = sorted(settingsByConditional.iterkeys())
     46
    3247    outputPath = os.path.join(outputDirectory, "Settings.h")
    3348    outputFile = open(outputPath, 'w')
     
    3752
    3853    outputFile.write("#include \"SettingsBase.h\"\n")
    39     outputFile.write("#include \"SettingsMacros.h\"\n")
    4054    outputFile.write("#include <wtf/RefCounted.h>\n\n")
    4155
     
    5064    outputFile.write("    ~Settings();\n\n")
    5165
    52     outputFile.write("    SETTINGS_GETTERS_AND_SETTERS\n\n")
     66    printGettersAndSetters(outputFile, sortedUnconditionalSettingsNames, sortedConditionals, settingsByConditional, settings)
    5367
    5468    outputFile.write("private:\n")
    5569    outputFile.write("    explicit Settings(Page*);\n\n")
    5670
    57     outputFile.write("    SETTINGS_MEMBER_VARIABLES\n")
     71    printMemberVariables(outputFile, sortedUnconditionalSettingsNames, sortedConditionals, settingsByConditional, settings)
    5872
    5973    outputFile.write("};\n\n")
     
    6276
    6377    outputFile.close()
     78
     79
     80def printGetterAndSetter(outputFile, setting):
     81    setterFunctionName = makeSetterFunctionName(setting)
     82
     83    webcoreExport = "WEBCORE_EXPORT " if setting.setNeedsStyleRecalcInAllFrames else ""
     84
     85    if setting.type[0].islower():
     86        outputFile.write("    " + setting.type + " " + setting.name + "() const { return m_" + setting.name + "; }\n")
     87        outputFile.write("    " + webcoreExport + "void " + setterFunctionName + "(" + setting.type + " " + setting.name + ")")
     88    else:
     89        outputFile.write("    const " + setting.type + "& " + setting.name + "() const { return m_" + setting.name + "; } \n")
     90        outputFile.write("    " + webcoreExport + "void " + setterFunctionName + "(const " + setting.type + "& " + setting.name + ")")
     91
     92    if setting.setNeedsStyleRecalcInAllFrames:
     93        outputFile.write("; \n")
     94    else:
     95        outputFile.write(" { m_" + setting.name + " = " + setting.name + "; } \n")
     96
     97
     98def printGettersAndSetters(outputFile, sortedUnconditionalSettingsNames, sortedConditionals, settingsByConditional, settings):
     99    for unconditionalSettingName in sortedUnconditionalSettingsNames:
     100        printGetterAndSetter(outputFile, settings[unconditionalSettingName])
     101
     102    outputFile.write("\n")
     103
     104    for conditional in sortedConditionals:
     105        outputFile.write("#if " + makeConditionalString(conditional) + "\n")
     106
     107        for settingName in sorted(settingsByConditional[conditional].iterkeys()):
     108            printGetterAndSetter(outputFile, settings[settingName])
     109
     110        outputFile.write("#endif\n\n")
     111
     112
     113def printMemberVariables(outputFile, sortedUnconditionalSettingsNames, sortedConditionals, settingsByConditional, settings):
     114    for unconditionalSettingName in sortedUnconditionalSettingsNames:
     115        setting = settings[unconditionalSettingName]
     116        if setting.type == "bool":
     117            continue
     118        outputFile.write("    " + setting.type + " m_" + setting.name + ";\n")
     119
     120    for conditional in sortedConditionals:
     121        hasMemberVariable = False
     122        for settingName in sorted(settingsByConditional[conditional].iterkeys()):
     123            setting = settings[settingName]
     124            if setting.type != "bool":
     125                hasMemberVariable = True
     126                break
     127
     128        if hasMemberVariable:
     129            outputFile.write("#if " + makeConditionalString(conditional) + "\n")
     130
     131            for settingName in sorted(settingsByConditional[conditional].iterkeys()):
     132                setting = settings[settingName]
     133                if setting.type != "bool":
     134                    outputFile.write("    " + setting.type + " m_" + setting.name + ";\n")
     135
     136            outputFile.write("#endif\n")
     137
     138    for unconditionalSettingName in sortedUnconditionalSettingsNames:
     139        setting = settings[unconditionalSettingName]
     140        if setting.type != "bool":
     141            continue
     142        outputFile.write("    " + setting.type + " m_" + setting.name + " : 1;\n")
     143
     144    for conditional in sortedConditionals:
     145        hasMemberVariable = False
     146        for settingName in sorted(settingsByConditional[conditional].iterkeys()):
     147            setting = settings[settingName]
     148            if setting.type == "bool":
     149                hasMemberVariable = True
     150                break
     151
     152        if hasMemberVariable:
     153            outputFile.write("#if " + makeConditionalString(conditional) + "\n")
     154
     155            for settingName in sorted(settingsByConditional[conditional].iterkeys()):
     156                setting = settings[settingName]
     157                if setting.type == "bool":
     158                    outputFile.write("    " + setting.type + " m_" + setting.name + " : 1;\n")
     159
     160            outputFile.write("#endif\n")
  • trunk/Source/WebCore/Scripts/GenerateSettings/GenerateSettingsImplementationFile.py

    r223574 r223607  
    2626import os.path
    2727
    28 from Settings import license, makeConditionalString, makeSetterFunctionName
     28from Settings import license, makeConditionalString, makeSetterFunctionName, makePreferredConditional
    2929
    3030
    3131def generateSettingsImplementationFile(outputDirectory, settings):
     32    settingsByConditional = {}
     33    unconditionalSettings = {}
     34
     35    for settingName in sorted(settings.iterkeys()):
     36        setting = settings[settingName]
     37        if setting.conditional:
     38            if setting.conditional not in settingsByConditional:
     39                settingsByConditional[setting.conditional] = {}
     40            settingsByConditional[setting.conditional][setting.name] = True
     41        else:
     42            unconditionalSettings[setting.name] = True
     43
     44    sortedUnconditionalSettingsNames = sorted(unconditionalSettings.iterkeys())
     45    sortedConditionals = sorted(settingsByConditional.iterkeys())
     46
    3247    outputPath = os.path.join(outputDirectory, "Settings.cpp")
    3348    outputFile = open(outputPath, 'w')
     
    4964    outputFile.write("Settings::Settings(Page* page)\n")
    5065    outputFile.write("    : SettingsBase(page)\n")
    51     outputFile.write("    SETTINGS_INITIALIZER_LIST\n")
     66
     67    printInitializerList(outputFile, sortedUnconditionalSettingsNames, sortedConditionals, settingsByConditional, settings)
     68
    5269    outputFile.write("{\n")
    5370    outputFile.write("}\n\n")
     
    5774    outputFile.write("}\n\n")
    5875
    59     outputFile.write("SETTINGS_SETTER_BODIES\n\n")
     76    printSetterBodies(outputFile, sortedUnconditionalSettingsNames, sortedConditionals, settingsByConditional, settings)
    6077
    6178    outputFile.write("}\n")
    6279
    6380    outputFile.close()
     81
     82
     83def hasNonBoolInitializer(setting):
     84    if setting.type == "bool":
     85        return False
     86    if not setting.initial:
     87        return False
     88    return True
     89
     90
     91def printNonBoolInitializer(outputFile, setting):
     92    if not hasNonBoolInitializer(setting):
     93        return
     94    outputFile.write("    , m_" + setting.name + "(" + setting.initial + ")\n")
     95
     96
     97def hasBoolInitializer(setting):
     98    if setting.type != "bool":
     99        return False
     100    if not setting.initial:
     101        return False
     102    return True
     103
     104
     105def printBoolInitializer(outputFile, setting):
     106    if not hasBoolInitializer(setting):
     107        return
     108    outputFile.write("    , m_" + setting.name + "(" + setting.initial + ")\n")
     109
     110
     111def printInitializerList(outputFile, sortedUnconditionalSettingsNames, sortedConditionals, settingsByConditional, settings):
     112    for unconditionalSettingName in sortedUnconditionalSettingsNames:
     113        printNonBoolInitializer(outputFile, settings[unconditionalSettingName])
     114
     115    for conditional in sortedConditionals:
     116        hasInitializer = False
     117        for settingName in sorted(settingsByConditional[conditional].iterkeys()):
     118            if hasNonBoolInitializer(settings[settingName]):
     119                hasInitializer = True
     120                break
     121
     122        if hasInitializer:
     123            outputFile.write("#if " + makeConditionalString(conditional) + "\n")
     124
     125            for settingName in sorted(settingsByConditional[conditional].iterkeys()):
     126                printNonBoolInitializer(outputFile, settings[settingName])
     127
     128            outputFile.write("#endif\n")
     129
     130    for unconditionalSettingName in sortedUnconditionalSettingsNames:
     131        printBoolInitializer(outputFile, settings[unconditionalSettingName])
     132
     133    for conditional in sortedConditionals:
     134        hasInitializer = False
     135        for settingName in sorted(settingsByConditional[conditional].iterkeys()):
     136            if hasBoolInitializer(settings[settingName]):
     137                hasInitializer = True
     138                break
     139
     140        if hasInitializer:
     141            outputFile.write("#if " + makeConditionalString(conditional) + "\n")
     142
     143            for settingName in sorted(settingsByConditional[conditional].iterkeys()):
     144                printBoolInitializer(outputFile, settings[settingName])
     145
     146            outputFile.write("#endif\n")
     147
     148
     149def printSetterBody(outputFile, setting):
     150    if not setting.setNeedsStyleRecalcInAllFrames:
     151        return
     152
     153    setterFunctionName = makeSetterFunctionName(setting)
     154
     155    if setting.type[0].islower():
     156        outputFile.write("void Settings::" + setterFunctionName + "(" + setting.type + " " + setting.name + ")\n")
     157    else:
     158        outputFile.write("void Settings::" + setterFunctionName + "(const " + setting.type + "& " + setting.name + ")\n")
     159
     160    outputFile.write("{\n")
     161    outputFile.write("    if (m_" + setting.name + " == " + setting.name + ")\n")
     162    outputFile.write("        return;\n")
     163    outputFile.write("    m_" + setting.name + " = " + setting.name + ";\n")
     164    outputFile.write("    m_page->setNeedsRecalcStyleInAllFrames();\n")
     165    outputFile.write("}\n\n")
     166
     167
     168def printSetterBodies(outputFile, sortedUnconditionalSettingsNames, sortedConditionals, settingsByConditional, settings):
     169    for unconditionalSettingName in sortedUnconditionalSettingsNames:
     170        setting = settings[unconditionalSettingName]
     171        printSetterBody(outputFile, setting)
     172
     173    for conditional in sortedConditionals:
     174        hasSetterBody = False
     175        for settingName in sorted(settingsByConditional[conditional].iterkeys()):
     176            setting = settings[settingName]
     177            if setting.setNeedsStyleRecalcInAllFrames:
     178                hasSetterBody = True
     179                break
     180
     181        if hasSetterBody:
     182            outputFile.write("#if " + makeConditionalString(conditional) + "\n\n")
     183
     184            for settingName in sorted(settingsByConditional[conditional].iterkeys()):
     185                printSetterBody(outputFile, settings[settingName])
     186
     187            outputFile.write("#endif\n\n")
Note: See TracChangeset for help on using the changeset viewer.