aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/bindings/codegen/CodegenRust.py
diff options
context:
space:
mode:
authoryvt <i@yvt.jp>2021-07-27 01:31:08 +0900
committeryvt <i@yvt.jp>2021-07-27 01:31:08 +0900
commit2e0dd0816f8385fda04e69908916e0fe00fb6d39 (patch)
treed2e5b9504ba35d5b0fe033cb18644c502a6b94ac /components/script/dom/bindings/codegen/CodegenRust.py
parentc28e98ec40e0950e77c60b32af023c6eb7da7366 (diff)
downloadservo-2e0dd0816f8385fda04e69908916e0fe00fb6d39.tar.gz
servo-2e0dd0816f8385fda04e69908916e0fe00fb6d39.zip
refactor(script): refactor common code into `PropertyDefiner.generateUnguardedArray`
There are code fragments in `(Method|Attr)Definer.generateArray` that are much alike. This commit refactors them into a new method of `PropertyDefiner` named `generateUnguardedArray` (in contrast to the existing method `generateGuardedArray`).
Diffstat (limited to 'components/script/dom/bindings/codegen/CodegenRust.py')
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py58
1 files changed, 38 insertions, 20 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py
index 1319dbab3a6..d1a32f9352d 100644
--- a/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/components/script/dom/bindings/codegen/CodegenRust.py
@@ -1642,6 +1642,33 @@ class PropertyDefiner:
+ "];\n") % (name, specType)
return specsArray + prefArray
+ def generateUnguardedArray(self, array, name, specTemplate, specTerminator,
+ specType, getCondition, getDataTuple):
+ """
+ Takes the same set of parameters as generateGuardedArray but instead
+ generates a single, flat array of type `&[specType]` that contains all
+ provided members. The provided members' conditions shall be homogeneous,
+ or else this method will fail.
+ """
+
+ # this method can't handle heterogeneous condition
+ groups = groupby(array, lambda m: getCondition(m, self.descriptor))
+ assert len(list(groups)) == 1
+
+ origTemplate = specTemplate
+ if isinstance(specTemplate, str):
+ specTemplate = lambda _: origTemplate # noqa
+
+ specsArray = [specTemplate(m) % getDataTuple(m) for m in array]
+ specsArray.append(specTerminator)
+
+ return dedent(
+ """
+ const %s: &[%s] = &[
+ %s
+ ];
+ """) % (name, specType, ',\n'.join(specsArray))
+
# The length of a method is the minimum of the lengths of the
# argument lists of all its overloads.
@@ -1829,16 +1856,11 @@ class MethodDefiner(PropertyDefiner):
' }')
if self.crossorigin:
- groups = groupby(array, lambda m: condition(m, self.descriptor))
- assert len(list(groups)) == 1 # can't handle mixed condition
- elems = [specTemplate % specData(m) for m in array]
- return dedent(
- """
- const %s: &[JSFunctionSpec] = &[
- %s,
- %s,
- ];
- """) % (name, ',\n'.join(elems), specTerminator)
+ return self.generateUnguardedArray(
+ array, name,
+ specTemplate, specTerminator,
+ 'JSFunctionSpec',
+ condition, specData)
else:
return self.generateGuardedArray(
array, name,
@@ -1983,16 +2005,12 @@ class AttrDefiner(PropertyDefiner):
"""
if self.crossorigin:
- groups = groupby(array, lambda m: condition(m, self.descriptor))
- assert len(list(groups)) == 1 # can't handle mixed condition
- elems = [template(m) % specData(m) for m in array]
- return dedent(
- """
- const %s: &[JSPropertySpec] = &[
- %s,
- JSPropertySpec::ZERO,
- ];
- """) % (name, ',\n'.join(elems))
+ return self.generateUnguardedArray(
+ array, name,
+ template,
+ ' JSPropertySpec::ZERO',
+ 'JSPropertySpec',
+ condition, specData)
else:
return self.generateGuardedArray(
array, name,