meson: Move all code generation scripts to utils/codegen/
We have multiple code generation scripts in utils/, mixed with other miscellaneous utilities, as well as a larger code base based on mojom in utils/ipc/. To make code sharing easier between the generator scripts, without creating a mess in the utils/ directory, move all the code generation code to utils/codegen/. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
This commit is contained in:
parent
d3bf27180e
commit
50c92cc7e2
91 changed files with 15 additions and 15 deletions
|
@ -0,0 +1,202 @@
|
|||
{#-
|
||||
# SPDX-License-Identifier: LGPL-2.1-or-later
|
||||
# Copyright (C) 2020, Google Inc.
|
||||
-#}
|
||||
{#
|
||||
# \brief Generate function prototype
|
||||
#
|
||||
# \param class Class name
|
||||
# \param method mojom Method object
|
||||
# \param suffix Suffix to append to \a method function name
|
||||
# \param need_class_name If true, generate class name with function
|
||||
# \param override If true, generate override tag after the function prototype
|
||||
#}
|
||||
{%- macro func_sig(class, method, suffix = "", need_class_name = true, override = false) -%}
|
||||
{{method|method_return_value}} {{class + "::" if need_class_name}}{{method.mojom_name}}{{suffix}}(
|
||||
{%- for param in method|method_parameters %}
|
||||
{{param}}{{- "," if not loop.last}}
|
||||
{%- endfor -%}
|
||||
){{" override" if override}}
|
||||
{%- endmacro -%}
|
||||
|
||||
{#
|
||||
# \brief Generate function body for IPA stop() function for thread
|
||||
#}
|
||||
{%- macro stop_thread_body() -%}
|
||||
ASSERT(state_ != ProxyStopping);
|
||||
if (state_ != ProxyRunning)
|
||||
return;
|
||||
|
||||
state_ = ProxyStopping;
|
||||
|
||||
proxy_.invokeMethod(&ThreadProxy::stop, ConnectionTypeBlocking);
|
||||
|
||||
thread_.exit();
|
||||
thread_.wait();
|
||||
|
||||
Thread::current()->dispatchMessages(Message::Type::InvokeMessage);
|
||||
|
||||
state_ = ProxyStopped;
|
||||
{%- endmacro -%}
|
||||
|
||||
|
||||
{#
|
||||
# \brief Serialize multiple objects into data buffer and fd vector
|
||||
#
|
||||
# Generate code to serialize multiple objects, as specified in \a params
|
||||
# (which are the parameters to some function), into \a buf data buffer and
|
||||
# \a fds fd vector.
|
||||
# This code is meant to be used by the proxy, for serializing prior to IPC calls.
|
||||
#
|
||||
# \todo Avoid intermediate vectors
|
||||
#}
|
||||
{%- macro serialize_call(params, buf, fds) %}
|
||||
{%- for param in params %}
|
||||
{%- if param|is_enum %}
|
||||
static_assert(sizeof({{param|name_full}}) <= 4);
|
||||
{%- endif %}
|
||||
std::vector<uint8_t> {{param.mojom_name}}Buf;
|
||||
{%- if param|has_fd %}
|
||||
std::vector<SharedFD> {{param.mojom_name}}Fds;
|
||||
std::tie({{param.mojom_name}}Buf, {{param.mojom_name}}Fds) =
|
||||
{%- else %}
|
||||
std::tie({{param.mojom_name}}Buf, std::ignore) =
|
||||
{%- endif %}
|
||||
{%- if param|is_flags %}
|
||||
IPADataSerializer<{{param|name_full}}>::serialize({{param.mojom_name}}
|
||||
{%- elif param|is_enum %}
|
||||
IPADataSerializer<uint32_t>::serialize(static_cast<uint32_t>({{param.mojom_name}})
|
||||
{%- else %}
|
||||
IPADataSerializer<{{param|name}}>::serialize({{param.mojom_name}}
|
||||
{% endif -%}
|
||||
{{- ", &controlSerializer_" if param|needs_control_serializer -}}
|
||||
);
|
||||
{%- endfor %}
|
||||
|
||||
{%- if params|length > 1 %}
|
||||
{%- for param in params %}
|
||||
appendPOD<uint32_t>({{buf}}, {{param.mojom_name}}Buf.size());
|
||||
{%- if param|has_fd %}
|
||||
appendPOD<uint32_t>({{buf}}, {{param.mojom_name}}Fds.size());
|
||||
{%- endif %}
|
||||
{%- endfor %}
|
||||
{%- endif %}
|
||||
|
||||
{%- for param in params %}
|
||||
{{buf}}.insert({{buf}}.end(), {{param.mojom_name}}Buf.begin(), {{param.mojom_name}}Buf.end());
|
||||
{%- endfor %}
|
||||
|
||||
{%- for param in params %}
|
||||
{%- if param|has_fd %}
|
||||
{{fds}}.insert({{fds}}.end(), {{param.mojom_name}}Fds.begin(), {{param.mojom_name}}Fds.end());
|
||||
{%- endif %}
|
||||
{%- endfor %}
|
||||
{%- endmacro -%}
|
||||
|
||||
|
||||
{#
|
||||
# \brief Deserialize a single object from data buffer and fd vector
|
||||
#
|
||||
# \param pointer If true, deserialize the object into a dereferenced pointer
|
||||
# \param iter If true, treat \a buf as an iterator instead of a vector
|
||||
# \param data_size Variable that holds the size of the vector referenced by \a buf
|
||||
#
|
||||
# Generate code to deserialize a single object, as specified in \a param,
|
||||
# from \a buf data buffer and \a fds fd vector.
|
||||
# This code is meant to be used by macro deserialize_call.
|
||||
#}
|
||||
{%- macro deserialize_param(param, pointer, loop, buf, fds, iter, data_size) -%}
|
||||
{{"*" if pointer}}{{param.mojom_name}} =
|
||||
{%- if param|is_flags %}
|
||||
IPADataSerializer<{{param|name_full}}>::deserialize(
|
||||
{%- elif param|is_enum %}
|
||||
static_cast<{{param|name_full}}>(IPADataSerializer<uint32_t>::deserialize(
|
||||
{%- else %}
|
||||
IPADataSerializer<{{param|name}}>::deserialize(
|
||||
{%- endif %}
|
||||
{{buf}}{{- ".cbegin()" if not iter}} + {{param.mojom_name}}Start,
|
||||
{%- if loop.last and not iter %}
|
||||
{{buf}}.cend()
|
||||
{%- elif not iter %}
|
||||
{{buf}}.cbegin() + {{param.mojom_name}}Start + {{param.mojom_name}}BufSize
|
||||
{%- elif iter and loop.length == 1 %}
|
||||
{{buf}} + {{data_size}}
|
||||
{%- else %}
|
||||
{{buf}} + {{param.mojom_name}}Start + {{param.mojom_name}}BufSize
|
||||
{%- endif -%}
|
||||
{{- "," if param|has_fd}}
|
||||
{%- if param|has_fd %}
|
||||
{{fds}}.cbegin() + {{param.mojom_name}}FdStart,
|
||||
{%- if loop.last %}
|
||||
{{fds}}.cend()
|
||||
{%- else %}
|
||||
{{fds}}.cbegin() + {{param.mojom_name}}FdStart + {{param.mojom_name}}FdsSize
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
{{- "," if param|needs_control_serializer}}
|
||||
{%- if param|needs_control_serializer %}
|
||||
&controlSerializer_
|
||||
{%- endif -%}
|
||||
){{")" if param|is_enum and not param|is_flags}};
|
||||
{%- endmacro -%}
|
||||
|
||||
|
||||
{#
|
||||
# \brief Deserialize multiple objects from data buffer and fd vector
|
||||
#
|
||||
# \param pointer If true, deserialize objects into pointers, and adds a null check.
|
||||
# \param declare If true, declare the objects in addition to deserialization.
|
||||
# \param iter if true, treat \a buf as an iterator instead of a vector
|
||||
# \param data_size Variable that holds the size of the vector referenced by \a buf
|
||||
#
|
||||
# Generate code to deserialize multiple objects, as specified in \a params
|
||||
# (which are the parameters to some function), from \a buf data buffer and
|
||||
# \a fds fd vector.
|
||||
# This code is meant to be used by the proxy, for deserializing after IPC calls.
|
||||
#
|
||||
# \todo Avoid intermediate vectors
|
||||
#}
|
||||
{%- macro deserialize_call(params, buf, fds, pointer = true, declare = false, iter = false, data_size = '', init_offset = 0) -%}
|
||||
{% set ns = namespace(size_offset = init_offset) %}
|
||||
{%- if params|length > 1 %}
|
||||
{%- for param in params %}
|
||||
[[maybe_unused]] const size_t {{param.mojom_name}}BufSize = readPOD<uint32_t>({{buf}}, {{ns.size_offset}}
|
||||
{%- if iter -%}
|
||||
, {{buf}} + {{data_size}}
|
||||
{%- endif -%}
|
||||
);
|
||||
{%- set ns.size_offset = ns.size_offset + 4 %}
|
||||
{%- if param|has_fd %}
|
||||
[[maybe_unused]] const size_t {{param.mojom_name}}FdsSize = readPOD<uint32_t>({{buf}}, {{ns.size_offset}}
|
||||
{%- if iter -%}
|
||||
, {{buf}} + {{data_size}}
|
||||
{%- endif -%}
|
||||
);
|
||||
{%- set ns.size_offset = ns.size_offset + 4 %}
|
||||
{%- endif %}
|
||||
{%- endfor %}
|
||||
{%- endif %}
|
||||
{% for param in params %}
|
||||
{%- if loop.first %}
|
||||
const size_t {{param.mojom_name}}Start = {{ns.size_offset}};
|
||||
{%- else %}
|
||||
const size_t {{param.mojom_name}}Start = {{loop.previtem.mojom_name}}Start + {{loop.previtem.mojom_name}}BufSize;
|
||||
{%- endif %}
|
||||
{%- endfor %}
|
||||
{% for param in params|with_fds %}
|
||||
{%- if loop.first %}
|
||||
const size_t {{param.mojom_name}}FdStart = 0;
|
||||
{%- else %}
|
||||
const size_t {{param.mojom_name}}FdStart = {{loop.previtem.mojom_name}}FdStart + {{loop.previtem.mojom_name}}FdsSize;
|
||||
{%- endif %}
|
||||
{%- endfor %}
|
||||
{% for param in params %}
|
||||
{%- if pointer %}
|
||||
if ({{param.mojom_name}}) {
|
||||
{{deserialize_param(param, pointer, loop, buf, fds, iter, data_size)|indent(16, True)}}
|
||||
}
|
||||
{%- else %}
|
||||
{{param|name + " " if declare}}{{deserialize_param(param, pointer, loop, buf, fds, iter, data_size)|indent(8)}}
|
||||
{%- endif %}
|
||||
{% endfor %}
|
||||
{%- endmacro -%}
|
Loading…
Add table
Add a link
Reference in a new issue