1 {%- macro get_handle_deps(kind, name) -%} 2 {%- if kind|is_struct_kind or kind|is_union_kind -%} 3 {{name}}.getHandleDeps() 4 {%- elif kind|is_array_kind -%} 5 [].concat.apply([], {{name}}.map(function(val) { 6 if (val) { 7 return {{get_handle_deps(kind.kind, 'val')|indent(4)}}; 8 } 9 return []; 10 })) 11 {%- elif kind|is_map_kind -%} 12 [].concat.apply([], Array.from({{name}}.values()).map(function(val) { 13 if (val) { 14 return {{get_handle_deps(kind.value_kind, 'val')|indent(4)}}; 15 } 16 return []; 17 })) 18 {%- elif kind|is_any_handle_or_interface_kind -%} 19 ["{{kind|fuzz_handle_name}}"] 20 {%- else -%} 21 [] 22 {%- endif -%} 23 {%- endmacro -%} 24 25 {%- macro set_handles(kind, name) -%} 26 {%- if kind|is_struct_kind or kind|is_union_kind -%} 27 idx = {{name}}.setHandlesInternal_(handles, idx) 28 {%- elif kind|is_array_kind -%} 29 {{name}}.forEach(function(val) { 30 {{set_handles(kind.kind, 'val')|indent(2)}}; 31 }) 32 {%- elif kind|is_map_kind -%} 33 {{name}}.forEach(function(val) { 34 {{set_handles(kind.value_kind, 'val')|indent(2)}}; 35 }) 36 {%- elif kind|is_any_handle_or_interface_kind -%} 37 {{name}} = handles[idx++]; 38 {%- endif -%} 39 {%- endmacro -%} 40 41 {%- macro build_call(obj, operation, type, name) -%} 42 {%- if name -%} 43 {{obj}}.{{operation}}{{type}}({{((name,) + varargs)|join(', ')}}) 44 {%- else -%} 45 {{obj}}.{{operation}}{{type}}({{varargs|join(', ')}}) 46 {%- endif -%} 47 {%- endmacro -%} 48 49 {%- macro generate_or_mutate_enum(obj, operation, kind, name) -%} 50 {%- if kind.max_value is not none -%} 51 {{build_call(obj, operation, 'Enum', name, '0', kind.max_value)}} 52 {%- else -%} 53 {{build_call(obj, operation, 'Enum', name)}} 54 {%- endif %} 55 {%- endmacro -%} 56 57 {%- macro generate_or_mutate_array(obj, operation, kind, name) -%} 58 {%- if operation == 'mutate' -%} 59 {{obj}}.{{operation}}Array({{name}}, function(val) { 60 return {{generate_or_mutate(obj, operation, kind.kind, 'val')|indent(2)}}; 61 }) 62 {%- else -%} 63 {{obj}}.{{operation}}Array(function() { 64 return {{generate_or_mutate(obj, operation, kind.kind)|indent(2)}}; 65 }) 66 {%- endif -%} 67 {%- endmacro -%} 68 69 {%- macro generate_or_mutate_map(obj, operation, kind, name) -%} 70 {%- if operation == 'mutate' -%} 71 {{obj}}.{{operation}}Map({{name}}, 72 function(val) { 73 return {{generate_or_mutate(obj, operation, kind.key_kind, 'val')|indent(4)}}; 74 }, 75 function(val) { 76 return {{generate_or_mutate(obj, operation, kind.value_kind, 'val')|indent(4)}}; 77 }) 78 {%- else -%} 79 {{obj}}.{{operation}}Map( 80 function() { 81 return {{generate_or_mutate(obj, operation, kind.key_kind)|indent(4)}}; 82 }, 83 function() { 84 return {{generate_or_mutate(obj, operation, kind.value_kind)|indent(4)}}; 85 }) 86 {%- endif -%} 87 {%- endmacro -%} 88 89 {%- macro generate_or_mutate_primitive(obj, operation, kind, name) -%} 90 {%- if kind|is_reference_kind -%} 91 {{build_call(obj, operation, kind|primitive_to_fuzz_type, name, kind.is_nullable|to_js_boolean)}} 92 {%- else -%} 93 {{build_call(obj, operation, kind|primitive_to_fuzz_type, name)}} 94 {%- endif -%} 95 {%- endmacro -%} 96 97 {%- macro generate_or_mutate_interface(obj, operation, kind, name) -%} 98 {%- if kind|is_interface_request_kind -%} 99 {{build_call(obj, operation, 'InterfaceRequest', name, '"' ~ kind.kind.module.namespace ~ '.' ~ kind.kind.name ~ '"', kind.is_nullable|to_js_boolean)}} 100 {%- elif kind|is_interface_kind -%} 101 {{build_call(obj, operation, 'Interface', name, '"' ~ kind.module.namespace ~ '.' ~ kind.name ~ '"', kind.is_nullable|to_js_boolean)}} 102 {%- elif kind|is_associated_interface_request_kind -%} 103 {{build_call(obj, operation, 'AssociatedInterfaceRequest', name, '"' ~ kind.kind.module.namespace ~ '.' ~ kind.kind.name ~ '"', kind.is_nullable|to_js_boolean)}} 104 {%- elif kind|is_associated_interface_kind -%} 105 {{build_call(obj, operation, 'AssociatedInterface', name, '"' ~ kind.kind.module.namespace ~ '.' ~ kind.kind.name ~ '"', kind.is_nullable|to_js_boolean)}} 106 {%- endif -%} 107 {%- endmacro -%} 108 109 {%- macro generate_or_mutate(obj, operation, kind, name='') -%} 110 {%- if kind|is_primitive_kind -%} 111 {{generate_or_mutate_primitive(obj, operation, kind, name)}} 112 {%- elif kind|is_any_interface_kind -%} 113 {{generate_or_mutate_interface(obj, operation, kind, name)}} 114 {%- elif kind|is_enum_kind -%} 115 {{generate_or_mutate_enum(obj, operation, kind, name)}} 116 {%- elif kind|is_struct_kind -%} 117 {{build_call(obj, operation, 'Struct', name, kind.module.namespace ~ '.' ~ kind.name, kind.is_nullable|to_js_boolean)}} 118 {%- elif kind|is_union_kind -%} 119 {{build_call(obj, operation, 'Union', name, kind.module.namespace ~ '.' ~ kind.name, kind.is_nullable|to_js_boolean)}} 120 {%- elif kind|is_array_kind -%} 121 {{generate_or_mutate_array(obj, operation, kind, name)}} 122 {%- elif kind|is_map_kind -%} 123 {{generate_or_mutate_map(obj, operation, kind, name)}} 124 {%- endif -%} 125 {%- endmacro -%} 126