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")