Commit a227fd7b authored by Wojciech Bielawski's avatar Wojciech Bielawski Committed by Commit Bot

Improve jinja2 templates to support build on python3

Summary: Python3 doesn't support comparison between NoneType objects. Jinja uses sort function within 'groupby' and that leads to
"TypeError: '<' not supported between instances of 'NoneType' and 'NoneType'" when template tries to group by attribute that is empty.
This commit adds 'stringifykeygroupby' which mimics jinja's groupby but converts keys to string during sort, so comparison always succeeds.

Bug: 1138872
Change-Id: If604b4b8c405b5d924c934a04ffc763132b72061
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2495062Reviewed-by: default avatarYuki Shiino <yukishiino@chromium.org>
Commit-Queue: Raphael Kubo da Costa <raphael.kubo.da.costa@intel.com>
Cr-Commit-Position: refs/heads/master@{#821196}
parent d74340c6
...@@ -13,6 +13,7 @@ import re ...@@ -13,6 +13,7 @@ import re
import sys import sys
from idl_types import set_ancestors, IdlType from idl_types import set_ancestors, IdlType
from itertools import groupby
from v8_globals import includes from v8_globals import includes
from v8_interface import constant_filters from v8_interface import constant_filters
from v8_types import set_component_dirs from v8_types import set_component_dirs
...@@ -43,6 +44,7 @@ TEMPLATES_DIR = os.path.normpath( ...@@ -43,6 +44,7 @@ TEMPLATES_DIR = os.path.normpath(
# after path[0] == invoking script dir # after path[0] == invoking script dir
sys.path.insert(1, THIRD_PARTY_DIR) sys.path.insert(1, THIRD_PARTY_DIR)
import jinja2 import jinja2
from jinja2.filters import make_attrgetter, environmentfilter
def generate_indented_conditional(code, conditional): def generate_indented_conditional(code, conditional):
...@@ -88,6 +90,13 @@ def runtime_enabled_if(code, name): ...@@ -88,6 +90,13 @@ def runtime_enabled_if(code, name):
return generate_indented_conditional(code, function) return generate_indented_conditional(code, function)
@environmentfilter
def do_stringify_key_group_by(environment, value, attribute):
expr = make_attrgetter(environment, attribute)
key = lambda item: '' if expr(item) is None else str(expr(item))
return groupby(sorted(value, key=key), expr)
def initialize_jinja_env(cache_dir): def initialize_jinja_env(cache_dir):
jinja_env = jinja2.Environment( jinja_env = jinja2.Environment(
loader=jinja2.FileSystemLoader(TEMPLATES_DIR), loader=jinja2.FileSystemLoader(TEMPLATES_DIR),
...@@ -117,6 +126,7 @@ def initialize_jinja_env(cache_dir): ...@@ -117,6 +126,7 @@ def initialize_jinja_env(cache_dir):
}) })
jinja_env.filters.update(constant_filters()) jinja_env.filters.update(constant_filters())
jinja_env.filters.update(method_filters()) jinja_env.filters.update(method_filters())
jinja_env.filters["stringifykeygroupby"] = do_stringify_key_group_by
return jinja_env return jinja_env
......
...@@ -59,9 +59,9 @@ void {{v8_class}}::ToImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8_value, { ...@@ -59,9 +59,9 @@ void {{v8_class}}::ToImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8_value, {
DCHECK(executionContext); DCHECK(executionContext);
{% endif %}{# has_origin_trial_members #} {% endif %}{# has_origin_trial_members #}
{% endif %}{# members #} {% endif %}{# members #}
{% for origin_trial_test, origin_trial_member_list in members | groupby('origin_trial_feature_name') %} {% for origin_trial_test, origin_trial_member_list in members | stringifykeygroupby('origin_trial_feature_name') %}
{% filter origin_trial_enabled(origin_trial_test, "executionContext") %} {% filter origin_trial_enabled(origin_trial_test, "executionContext") %}
{% for feature_name, member_list in origin_trial_member_list | groupby('runtime_enabled_feature_name') %} {% for feature_name, member_list in origin_trial_member_list | stringifykeygroupby('runtime_enabled_feature_name') %}
{% filter runtime_enabled(feature_name) %} {% filter runtime_enabled(feature_name) %}
{% for member in member_list %} {% for member in member_list %}
v8::Local<v8::Value> {{member.v8_value}}; v8::Local<v8::Value> {{member.v8_value}};
...@@ -147,9 +147,9 @@ bool toV8{{cpp_class}}(const {{cpp_class}}* impl, v8::Local<v8::Object> dictiona ...@@ -147,9 +147,9 @@ bool toV8{{cpp_class}}(const {{cpp_class}}* impl, v8::Local<v8::Object> dictiona
DCHECK(executionContext); DCHECK(executionContext);
{% endif %}{# has_origin_trial_members #} {% endif %}{# has_origin_trial_members #}
{% endif %}{# members #} {% endif %}{# members #}
{% for origin_trial_test, origin_trial_member_list in members | groupby('origin_trial_feature_name') %} {% for origin_trial_test, origin_trial_member_list in members | stringifykeygroupby('origin_trial_feature_name') %}
{% filter origin_trial_enabled(origin_trial_test, "executionContext") %} {% filter origin_trial_enabled(origin_trial_test, "executionContext") %}
{% for feature_name, member_list in origin_trial_member_list | groupby('runtime_enabled_feature_name') %} {% for feature_name, member_list in origin_trial_member_list | stringifykeygroupby('runtime_enabled_feature_name') %}
{% filter runtime_enabled(feature_name) %} {% filter runtime_enabled(feature_name) %}
{% for member in member_list %} {% for member in member_list %}
v8::Local<v8::Value> {{member.v8_value}}; v8::Local<v8::Value> {{member.v8_value}};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment