Title: [223607] trunk/Source/WebCore
Revision
223607
Author
[email protected]
Date
2017-10-18 08:16:35 -0700 (Wed, 18 Oct 2017)

Log Message

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

Patch by Sam Weinig <[email protected]> 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.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (223606 => 223607)


--- trunk/Source/WebCore/ChangeLog	2017-10-18 14:57:13 UTC (rev 223606)
+++ trunk/Source/WebCore/ChangeLog	2017-10-18 15:16:35 UTC (rev 223607)
@@ -1,3 +1,16 @@
+2017-10-18  Sam Weinig  <[email protected]>
+
+        [Settings] Replace macros in Settings.h/cpp with generated code
+        https://bugs.webkit.org/show_bug.cgi?id=178419
+
+        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.
+
 2017-10-18  Zalan Bujtas  <[email protected]>
 
         [FrameView::layout cleanup] Move frame flattening layout logic to a separate function

Modified: trunk/Source/WebCore/Scripts/GenerateSettings/GenerateSettingsHeaderFile.py (223606 => 223607)


--- trunk/Source/WebCore/Scripts/GenerateSettings/GenerateSettingsHeaderFile.py	2017-10-18 14:57:13 UTC (rev 223606)
+++ trunk/Source/WebCore/Scripts/GenerateSettings/GenerateSettingsHeaderFile.py	2017-10-18 15:16:35 UTC (rev 223607)
@@ -29,6 +29,21 @@
 
 
 def generateSettingsHeaderFile(outputDirectory, settings):
+    settingsByConditional = {}
+    unconditionalSettings = {}
+
+    for settingName in sorted(settings.iterkeys()):
+        setting = settings[settingName]
+        if setting.conditional:
+            if setting.conditional not in settingsByConditional:
+                settingsByConditional[setting.conditional] = {}
+            settingsByConditional[setting.conditional][setting.name] = True
+        else:
+            unconditionalSettings[setting.name] = True
+
+    sortedUnconditionalSettingsNames = sorted(unconditionalSettings.iterkeys())
+    sortedConditionals = sorted(settingsByConditional.iterkeys())
+
     outputPath = os.path.join(outputDirectory, "Settings.h")
     outputFile = open(outputPath, 'w')
     outputFile.write(license())
@@ -36,7 +51,6 @@
     outputFile.write("#pragma once\n\n")
 
     outputFile.write("#include \"SettingsBase.h\"\n")
-    outputFile.write("#include \"SettingsMacros.h\"\n")
     outputFile.write("#include <wtf/RefCounted.h>\n\n")
 
     outputFile.write("namespace WebCore {\n\n")
@@ -49,12 +63,12 @@
     outputFile.write("    static Ref<Settings> create(Page*);\n")
     outputFile.write("    ~Settings();\n\n")
 
-    outputFile.write("    SETTINGS_GETTERS_AND_SETTERS\n\n")
+    printGettersAndSetters(outputFile, sortedUnconditionalSettingsNames, sortedConditionals, settingsByConditional, settings)
 
     outputFile.write("private:\n")
     outputFile.write("    explicit Settings(Page*);\n\n")
 
-    outputFile.write("    SETTINGS_MEMBER_VARIABLES\n")
+    printMemberVariables(outputFile, sortedUnconditionalSettingsNames, sortedConditionals, settingsByConditional, settings)
 
     outputFile.write("};\n\n")
 
@@ -61,3 +75,86 @@
     outputFile.write("}\n")
 
     outputFile.close()
+
+
+def printGetterAndSetter(outputFile, setting):
+    setterFunctionName = makeSetterFunctionName(setting)
+
+    webcoreExport = "WEBCORE_EXPORT " if setting.setNeedsStyleRecalcInAllFrames else ""
+
+    if setting.type[0].islower():
+        outputFile.write("    " + setting.type + " " + setting.name + "() const { return m_" + setting.name + "; }\n")
+        outputFile.write("    " + webcoreExport + "void " + setterFunctionName + "(" + setting.type + " " + setting.name + ")")
+    else:
+        outputFile.write("    const " + setting.type + "& " + setting.name + "() const { return m_" + setting.name + "; } \n")
+        outputFile.write("    " + webcoreExport + "void " + setterFunctionName + "(const " + setting.type + "& " + setting.name + ")")
+
+    if setting.setNeedsStyleRecalcInAllFrames:
+        outputFile.write("; \n")
+    else:
+        outputFile.write(" { m_" + setting.name + " = " + setting.name + "; } \n")
+
+
+def printGettersAndSetters(outputFile, sortedUnconditionalSettingsNames, sortedConditionals, settingsByConditional, settings):
+    for unconditionalSettingName in sortedUnconditionalSettingsNames:
+        printGetterAndSetter(outputFile, settings[unconditionalSettingName])
+
+    outputFile.write("\n")
+
+    for conditional in sortedConditionals:
+        outputFile.write("#if " + makeConditionalString(conditional) + "\n")
+
+        for settingName in sorted(settingsByConditional[conditional].iterkeys()):
+            printGetterAndSetter(outputFile, settings[settingName])
+
+        outputFile.write("#endif\n\n")
+
+
+def printMemberVariables(outputFile, sortedUnconditionalSettingsNames, sortedConditionals, settingsByConditional, settings):
+    for unconditionalSettingName in sortedUnconditionalSettingsNames:
+        setting = settings[unconditionalSettingName]
+        if setting.type == "bool":
+            continue
+        outputFile.write("    " + setting.type + " m_" + setting.name + ";\n")
+
+    for conditional in sortedConditionals:
+        hasMemberVariable = False
+        for settingName in sorted(settingsByConditional[conditional].iterkeys()):
+            setting = settings[settingName]
+            if setting.type != "bool":
+                hasMemberVariable = True
+                break
+
+        if hasMemberVariable:
+            outputFile.write("#if " + makeConditionalString(conditional) + "\n")
+
+            for settingName in sorted(settingsByConditional[conditional].iterkeys()):
+                setting = settings[settingName]
+                if setting.type != "bool":
+                    outputFile.write("    " + setting.type + " m_" + setting.name + ";\n")
+
+            outputFile.write("#endif\n")
+
+    for unconditionalSettingName in sortedUnconditionalSettingsNames:
+        setting = settings[unconditionalSettingName]
+        if setting.type != "bool":
+            continue
+        outputFile.write("    " + setting.type + " m_" + setting.name + " : 1;\n")
+
+    for conditional in sortedConditionals:
+        hasMemberVariable = False
+        for settingName in sorted(settingsByConditional[conditional].iterkeys()):
+            setting = settings[settingName]
+            if setting.type == "bool":
+                hasMemberVariable = True
+                break
+
+        if hasMemberVariable:
+            outputFile.write("#if " + makeConditionalString(conditional) + "\n")
+
+            for settingName in sorted(settingsByConditional[conditional].iterkeys()):
+                setting = settings[settingName]
+                if setting.type == "bool":
+                    outputFile.write("    " + setting.type + " m_" + setting.name + " : 1;\n")
+
+            outputFile.write("#endif\n")

Modified: trunk/Source/WebCore/Scripts/GenerateSettings/GenerateSettingsImplementationFile.py (223606 => 223607)


--- trunk/Source/WebCore/Scripts/GenerateSettings/GenerateSettingsImplementationFile.py	2017-10-18 14:57:13 UTC (rev 223606)
+++ trunk/Source/WebCore/Scripts/GenerateSettings/GenerateSettingsImplementationFile.py	2017-10-18 15:16:35 UTC (rev 223607)
@@ -25,10 +25,25 @@
 
 import os.path
 
-from Settings import license, makeConditionalString, makeSetterFunctionName
+from Settings import license, makeConditionalString, makeSetterFunctionName, makePreferredConditional
 
 
 def generateSettingsImplementationFile(outputDirectory, settings):
+    settingsByConditional = {}
+    unconditionalSettings = {}
+
+    for settingName in sorted(settings.iterkeys()):
+        setting = settings[settingName]
+        if setting.conditional:
+            if setting.conditional not in settingsByConditional:
+                settingsByConditional[setting.conditional] = {}
+            settingsByConditional[setting.conditional][setting.name] = True
+        else:
+            unconditionalSettings[setting.name] = True
+
+    sortedUnconditionalSettingsNames = sorted(unconditionalSettings.iterkeys())
+    sortedConditionals = sorted(settingsByConditional.iterkeys())
+
     outputPath = os.path.join(outputDirectory, "Settings.cpp")
     outputFile = open(outputPath, 'w')
     outputFile.write(license())
@@ -48,7 +63,9 @@
 
     outputFile.write("Settings::Settings(Page* page)\n")
     outputFile.write("    : SettingsBase(page)\n")
-    outputFile.write("    SETTINGS_INITIALIZER_LIST\n")
+
+    printInitializerList(outputFile, sortedUnconditionalSettingsNames, sortedConditionals, settingsByConditional, settings)
+
     outputFile.write("{\n")
     outputFile.write("}\n\n")
 
@@ -56,8 +73,115 @@
     outputFile.write("{\n")
     outputFile.write("}\n\n")
 
-    outputFile.write("SETTINGS_SETTER_BODIES\n\n")
+    printSetterBodies(outputFile, sortedUnconditionalSettingsNames, sortedConditionals, settingsByConditional, settings)
 
     outputFile.write("}\n")
 
     outputFile.close()
+
+
+def hasNonBoolInitializer(setting):
+    if setting.type == "bool":
+        return False
+    if not setting.initial:
+        return False
+    return True
+
+
+def printNonBoolInitializer(outputFile, setting):
+    if not hasNonBoolInitializer(setting):
+        return
+    outputFile.write("    , m_" + setting.name + "(" + setting.initial + ")\n")
+
+
+def hasBoolInitializer(setting):
+    if setting.type != "bool":
+        return False
+    if not setting.initial:
+        return False
+    return True
+
+
+def printBoolInitializer(outputFile, setting):
+    if not hasBoolInitializer(setting):
+        return
+    outputFile.write("    , m_" + setting.name + "(" + setting.initial + ")\n")
+
+
+def printInitializerList(outputFile, sortedUnconditionalSettingsNames, sortedConditionals, settingsByConditional, settings):
+    for unconditionalSettingName in sortedUnconditionalSettingsNames:
+        printNonBoolInitializer(outputFile, settings[unconditionalSettingName])
+
+    for conditional in sortedConditionals:
+        hasInitializer = False
+        for settingName in sorted(settingsByConditional[conditional].iterkeys()):
+            if hasNonBoolInitializer(settings[settingName]):
+                hasInitializer = True
+                break
+
+        if hasInitializer:
+            outputFile.write("#if " + makeConditionalString(conditional) + "\n")
+
+            for settingName in sorted(settingsByConditional[conditional].iterkeys()):
+                printNonBoolInitializer(outputFile, settings[settingName])
+
+            outputFile.write("#endif\n")
+
+    for unconditionalSettingName in sortedUnconditionalSettingsNames:
+        printBoolInitializer(outputFile, settings[unconditionalSettingName])
+
+    for conditional in sortedConditionals:
+        hasInitializer = False
+        for settingName in sorted(settingsByConditional[conditional].iterkeys()):
+            if hasBoolInitializer(settings[settingName]):
+                hasInitializer = True
+                break
+
+        if hasInitializer:
+            outputFile.write("#if " + makeConditionalString(conditional) + "\n")
+
+            for settingName in sorted(settingsByConditional[conditional].iterkeys()):
+                printBoolInitializer(outputFile, settings[settingName])
+
+            outputFile.write("#endif\n")
+
+
+def printSetterBody(outputFile, setting):
+    if not setting.setNeedsStyleRecalcInAllFrames:
+        return
+
+    setterFunctionName = makeSetterFunctionName(setting)
+
+    if setting.type[0].islower():
+        outputFile.write("void Settings::" + setterFunctionName + "(" + setting.type + " " + setting.name + ")\n")
+    else:
+        outputFile.write("void Settings::" + setterFunctionName + "(const " + setting.type + "& " + setting.name + ")\n")
+
+    outputFile.write("{\n")
+    outputFile.write("    if (m_" + setting.name + " == " + setting.name + ")\n")
+    outputFile.write("        return;\n")
+    outputFile.write("    m_" + setting.name + " = " + setting.name + ";\n")
+    outputFile.write("    m_page->setNeedsRecalcStyleInAllFrames();\n")
+    outputFile.write("}\n\n")
+
+
+def printSetterBodies(outputFile, sortedUnconditionalSettingsNames, sortedConditionals, settingsByConditional, settings):
+    for unconditionalSettingName in sortedUnconditionalSettingsNames:
+        setting = settings[unconditionalSettingName]
+        printSetterBody(outputFile, setting)
+
+    for conditional in sortedConditionals:
+        hasSetterBody = False
+        for settingName in sorted(settingsByConditional[conditional].iterkeys()):
+            setting = settings[settingName]
+            if setting.setNeedsStyleRecalcInAllFrames:
+                hasSetterBody = True
+                break
+
+        if hasSetterBody:
+            outputFile.write("#if " + makeConditionalString(conditional) + "\n\n")
+
+            for settingName in sorted(settingsByConditional[conditional].iterkeys()):
+                printSetterBody(outputFile, settings[settingName])
+
+            outputFile.write("#endif\n\n")
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to