diff options
Diffstat (limited to 'mojo/public/tools/bindings/generators/js_templates/fuzzing.tmpl')
-rw-r--r-- | mojo/public/tools/bindings/generators/js_templates/fuzzing.tmpl | 125 |
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 -%} |