summaryrefslogtreecommitdiff
path: root/mojo/public/tools/bindings/generators/js_templates/fuzzing.tmpl
diff options
context:
space:
mode:
Diffstat (limited to 'mojo/public/tools/bindings/generators/js_templates/fuzzing.tmpl')
-rw-r--r--mojo/public/tools/bindings/generators/js_templates/fuzzing.tmpl125
1 files changed, 125 insertions, 0 deletions
diff --git a/mojo/public/tools/bindings/generators/js_templates/fuzzing.tmpl b/mojo/public/tools/bindings/generators/js_templates/fuzzing.tmpl
new file mode 100644
index 0000000000..fb535fe03a
--- /dev/null
+++ b/mojo/public/tools/bindings/generators/js_templates/fuzzing.tmpl
@@ -0,0 +1,125 @@
+{%- macro get_handle_deps(kind, name) -%}
+{%- if kind|is_struct_kind or kind|is_union_kind -%}
+{{name}}.getHandleDeps()
+{%- elif kind|is_array_kind -%}
+[].concat.apply([], {{name}}.map(function(val) {
+ if (val) {
+ return {{get_handle_deps(kind.kind, 'val')|indent(4)}};
+ }
+ return [];
+}))
+{%- elif kind|is_map_kind -%}
+[].concat.apply([], Array.from({{name}}.values()).map(function(val) {
+ if (val) {
+ return {{get_handle_deps(kind.value_kind, 'val')|indent(4)}};
+ }
+ return [];
+}))
+{%- elif kind|is_any_handle_or_interface_kind -%}
+ ["{{kind|fuzz_handle_name}}"]
+{%- else -%}
+ []
+{%- endif -%}
+{%- endmacro -%}
+
+{%- macro set_handles(kind, name) -%}
+{%- if kind|is_struct_kind or kind|is_union_kind -%}
+idx = {{name}}.setHandlesInternal_(handles, idx)
+{%- elif kind|is_array_kind -%}
+{{name}}.forEach(function(val) {
+ {{set_handles(kind.kind, 'val')|indent(2)}};
+})
+{%- elif kind|is_map_kind -%}
+{{name}}.forEach(function(val) {
+ {{set_handles(kind.value_kind, 'val')|indent(2)}};
+})
+{%- elif kind|is_any_handle_or_interface_kind -%}
+{{name}} = handles[idx++];
+{%- endif -%}
+{%- endmacro -%}
+
+{%- macro build_call(obj, operation, type, name) -%}
+{%- if name -%}
+{{obj}}.{{operation}}{{type}}({{((name,) + varargs)|join(', ')}})
+{%- else -%}
+{{obj}}.{{operation}}{{type}}({{varargs|join(', ')}})
+{%- endif -%}
+{%- endmacro -%}
+
+{%- macro generate_or_mutate_enum(obj, operation, kind, name) -%}
+{%- if kind.max_value is not none -%}
+{{build_call(obj, operation, 'Enum', name, '0', kind.max_value)}}
+{%- else -%}
+{{build_call(obj, operation, 'Enum', name)}}
+{%- endif %}
+{%- endmacro -%}
+
+{%- macro generate_or_mutate_array(obj, operation, kind, name) -%}
+{%- if operation == 'mutate' -%}
+{{obj}}.{{operation}}Array({{name}}, function(val) {
+ return {{generate_or_mutate(obj, operation, kind.kind, 'val')|indent(2)}};
+})
+{%- else -%}
+{{obj}}.{{operation}}Array(function() {
+ return {{generate_or_mutate(obj, operation, kind.kind)|indent(2)}};
+})
+{%- endif -%}
+{%- endmacro -%}
+
+{%- macro generate_or_mutate_map(obj, operation, kind, name) -%}
+{%- if operation == 'mutate' -%}
+{{obj}}.{{operation}}Map({{name}},
+ function(val) {
+ return {{generate_or_mutate(obj, operation, kind.key_kind, 'val')|indent(4)}};
+ },
+ function(val) {
+ return {{generate_or_mutate(obj, operation, kind.value_kind, 'val')|indent(4)}};
+ })
+{%- else -%}
+{{obj}}.{{operation}}Map(
+ function() {
+ return {{generate_or_mutate(obj, operation, kind.key_kind)|indent(4)}};
+ },
+ function() {
+ return {{generate_or_mutate(obj, operation, kind.value_kind)|indent(4)}};
+ })
+{%- endif -%}
+{%- endmacro -%}
+
+{%- macro generate_or_mutate_primitive(obj, operation, kind, name) -%}
+{%- if kind|is_reference_kind -%}
+{{build_call(obj, operation, kind|primitive_to_fuzz_type, name, kind.is_nullable|to_js_boolean)}}
+{%- else -%}
+{{build_call(obj, operation, kind|primitive_to_fuzz_type, name)}}
+{%- endif -%}
+{%- endmacro -%}
+
+{%- macro generate_or_mutate_interface(obj, operation, kind, name) -%}
+{%- if kind|is_interface_request_kind -%}
+{{build_call(obj, operation, 'InterfaceRequest', name, '"' ~ kind.kind.module.namespace ~ '.' ~ kind.kind.name ~ '"', kind.is_nullable|to_js_boolean)}}
+{%- elif kind|is_interface_kind -%}
+{{build_call(obj, operation, 'Interface', name, '"' ~ kind.module.namespace ~ '.' ~ kind.name ~ '"', kind.is_nullable|to_js_boolean)}}
+{%- elif kind|is_associated_interface_request_kind -%}
+{{build_call(obj, operation, 'AssociatedInterfaceRequest', name, '"' ~ kind.kind.module.namespace ~ '.' ~ kind.kind.name ~ '"', kind.is_nullable|to_js_boolean)}}
+{%- elif kind|is_associated_interface_kind -%}
+{{build_call(obj, operation, 'AssociatedInterface', name, '"' ~ kind.kind.module.namespace ~ '.' ~ kind.kind.name ~ '"', kind.is_nullable|to_js_boolean)}}
+{%- endif -%}
+{%- endmacro -%}
+
+{%- macro generate_or_mutate(obj, operation, kind, name='') -%}
+{%- if kind|is_primitive_kind -%}
+{{generate_or_mutate_primitive(obj, operation, kind, name)}}
+{%- elif kind|is_any_interface_kind -%}
+{{generate_or_mutate_interface(obj, operation, kind, name)}}
+{%- elif kind|is_enum_kind -%}
+{{generate_or_mutate_enum(obj, operation, kind, name)}}
+{%- elif kind|is_struct_kind -%}
+{{build_call(obj, operation, 'Struct', kind.module.namespace ~ '.' ~ kind.name, kind.is_nullable|to_js_boolean)}}
+{%- elif kind|is_union_kind -%}
+{{build_call(obj, operation, 'Union', kind.module.namespace ~ '.' ~ kind.name, kind.is_nullable|to_js_boolean)}}
+{%- elif kind|is_array_kind -%}
+{{generate_or_mutate_array(obj, operation, kind, name)}}
+{%- elif kind|is_map_kind -%}
+{{generate_or_mutate_map(obj, operation, kind, name)}}
+{%- endif -%}
+{%- endmacro -%}