Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(385)

Unified Diff: third_party/WebKit/Source/build/scripts/make_element_lookup_trie.py

Issue 1938343002: Generate a series of nested switch statements to parse CSSPrimitiveValue units. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/build/scripts/make_element_lookup_trie.py
diff --git a/third_party/WebKit/Source/build/scripts/make_element_lookup_trie.py b/third_party/WebKit/Source/build/scripts/make_element_lookup_trie.py
index 90b696d0c22b83aa0eb1de8fc69b3b559431e477..79221a17f6c3cc529f0b0602f57588a38c48a137 100755
--- a/third_party/WebKit/Source/build/scripts/make_element_lookup_trie.py
+++ b/third_party/WebKit/Source/build/scripts/make_element_lookup_trie.py
@@ -27,6 +27,7 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+from collections import OrderedDict
from itertools import groupby, islice
import sys
@@ -36,7 +37,7 @@ import template_expander
PARAMETER_NAME = 'data'
-def _trie(tags, index):
+def _trie(str_to_return_value_dict, index):
"""Make a trie from list of tags, starting at index.
Resulting trie is partly space-optimized (semi-radix tree): once have only
@@ -44,39 +45,47 @@ def _trie(tags, index):
However, does not compact branch nodes with a single child. (FIXME)
Returns:
- (char, subtrie, tag, conditions): (char, trie, str, list)
- code generation differs between branch nodes and leaf nodes,
- hence need different data for each.
+ dict(char, subtrie, string, value, conditions):
Timothy Loh 2016/05/03 07:40:25 Can we return something structured like (e.g.) {
meade_UTC10 2016/05/04 07:24:54 Done.
+ char, list, string, string, string. Code generation differs between
+ branch nodes and leaf nodes, hence need different data for each.
Arguments:
- tags: sorted list
- (sorted needed by groupby, list needed by len)
+ str_to_return_value_dict: A ordered dictionary of strings to the return
+ value strings. Ordered by length, then alphabetically.
index: index at which to branch
- (assumes prior to this index strings have a common prefix)
"""
def trie_node(char, subtags_iter):
# Pass in |char| so we can include in same tuple without unpacking
subtags = list(subtags_iter) # need list for len
if len(subtags) == 1: # terminal node, no subtrie
- subtrie = None
tag = subtags[0]
- conditions = _conditions(tag, index + 1)
+ return {
+ 'char': char,
+ 'subtrie': None,
+ 'string': tag,
+ 'value': subtags_iter[tag],
+ 'conditions': _conditions(tag, index + 1)
+ }
else:
- subtrie = _trie(subtags, index + 1)
- tag = None
- conditions = None
- return char, subtrie, tag, conditions
+ return {
+ 'char': char,
+ 'subtrie': _trie(subtags_iter, index + 1),
+ 'string': None,
+ 'value': None,
+ 'conditions': None
+ }
# Group by char at index
- def char_at_index(tag):
- return tag[index].lower()
+ def char_at_index(string):
+ return string[index].lower()
- char_subtags = ((k, g) for k, g in groupby(tags, char_at_index))
+ char_subtags = []
+ for k, g in groupby(str_to_return_value_dict, char_at_index):
Timothy Loh 2016/05/03 07:40:25 same comment as other place about groupby/OrderedD
meade_UTC10 2016/05/04 07:24:54 Done.
+ sub_dict = OrderedDict(
+ [(inner_key, str_to_return_value_dict[inner_key]) for inner_key in g])
+ char_subtags.append((k, sub_dict))
- # FIXME: if all subtags have a common prefix, merge with child
- # and skip the switch in the generated code
-
- return (trie_node(char, subtags) for char, subtags in char_subtags)
+ return [trie_node(char, subtags) for char, subtags in char_subtags]
def _conditions(tag, index):
Timothy Loh 2016/05/03 07:40:25 as discussed, let's move all of the logic for this
meade_UTC10 2016/05/04 07:24:54 Done.
@@ -86,6 +95,19 @@ def _conditions(tag, index):
for i, c in islice(enumerate(tag), index, None)]
+def _trie_list(str_to_return_value_dict):
+ ordered_dict = OrderedDict(
Timothy Loh 2016/05/03 07:40:25 OrderedDict+groupby seems weird here, probably bet
meade_UTC10 2016/05/04 07:24:54 Done.
+ sorted(str_to_return_value_dict.items(), key=lambda pair: (len(pair[0]), pair[0])))
+
+ dicts = []
+ for k, g in groupby(ordered_dict, len):
+ sub_dict = OrderedDict(
+ [(inner_key, str_to_return_value_dict[inner_key]) for inner_key in g])
+ dicts.append((k, sub_dict))
+
+ return [(length, _trie(d, 0)) for length, d in dicts]
+
+
class ElementLookupTrieWriter(in_generator.Writer):
# FIXME: Inherit all these from somewhere.
defaults = {
@@ -108,7 +130,9 @@ class ElementLookupTrieWriter(in_generator.Writer):
def __init__(self, in_file_paths):
super(ElementLookupTrieWriter, self).__init__(in_file_paths)
- self._tags = [entry['name'] for entry in self.in_file.name_dictionaries]
+ self._tags = {}
+ for entry in self.in_file.name_dictionaries:
+ self._tags[entry['name']] = entry['name']
self._namespace = self.in_file.parameters['namespace'].strip('"')
self._outputs = {
(self._namespace + 'ElementLookupTrie.h'): self.generate_header,
@@ -123,15 +147,9 @@ class ElementLookupTrieWriter(in_generator.Writer):
@template_expander.use_jinja('ElementLookupTrie.cpp.tmpl')
def generate_implementation(self):
- # First sort, so groupby works
- self._tags.sort(key=lambda tag: (len(tag), tag))
- # Group tags by length
- length_tags = ((k, g) for k, g in groupby(self._tags, len))
-
return {
'namespace': self._namespace,
- 'length_tries': ((length, _trie(tags, 0))
- for length, tags in length_tags),
+ 'length_tries': _trie_list(self._tags)
}

Powered by Google App Engine
This is Rietveld 408576698