Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add ostream serializer #582

Merged
merged 5 commits into from
Oct 1, 2020
Merged

Add ostream serializer #582

merged 5 commits into from
Oct 1, 2020

Conversation

staktrace
Copy link
Contributor

Fixes part of #580. Tagged enums are not yet supported. I'll try to get that working but wanted put these patches up for initial feedback.

Ideally we'd just do this when we need it, but the ostream derivation
will be controlled by both global config and per-structure config, so
it's hard to know exactly when we need it and when we don't.
@staktrace
Copy link
Contributor Author

Added some support for tagged enums, at least the ones that get turned into unions. I haven't tested the other case yet (where it gets turned into structs with a separated tag).

@staktrace
Copy link
Contributor Author

Ok, added a patch for the tagged enums with separated tags. Stuff passes locally, haven't tried it on Firefox code yet.

@staktrace
Copy link
Contributor Author

Needed a small tweak, but now ready for review. @emilio or @eqrion

Copy link
Collaborator

@emilio emilio left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just some very minor nitpicks, but looks reasonable otherwise.

src/bindgen/ir/structure.rs Show resolved Hide resolved
src/bindgen/ir/enumeration.rs Show resolved Hide resolved
tests/expectations/derive_ostream.cpp Show resolved Hide resolved
Tagged enums will be handled in later patches.
This seems like a relatively reasonable way to get the variant body structs
to generate their own ostream serializers.
This happens when the tags are separated. In this case the output is slightly
different since the tag is not part of the struct body, so we need the top-level
serializer to write the tag type.
@staktrace
Copy link
Contributor Author

Updated with a couple of comments clarifying the things pointed out in review.

Copy link
Collaborator

@emilio emilio left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah the compiler was complaining about not knowing what Tag was if I just used Tag::Foo here. I was kinda surprised by it but didn't spend much time trying to figure it out. I can add a comment about it.

Wat, C++ name resolution rules won't ever stop surprising me... This looks good, I have a minor follow-up that I'd like to run through you, plus my nit below. But we can merge this as-is and iterate on another PR.

src/bindgen/ir/enumeration.rs Show resolved Hide resolved
@emilio emilio merged commit 2be47c8 into mozilla:master Oct 1, 2020
@staktrace staktrace deleted the ostream branch October 1, 2020 13:04
staktrace added a commit to staktrace/cbindgen that referenced this pull request Oct 1, 2020
This avoids propagating the derive-ostream annotation from an enum to
the variant body if the variant body already has an explicit annotation
set. This allows for more possibilities ending in compilation failure
but generally only when the user explicitly sets these annotations without
defining necessary serializers themselves. We should be able to assume
the user knows what they're doing if they trigger these particular scenarios.
emilio added a commit that referenced this pull request Oct 7, 2020
  * Allow customizing mangling of generic parameters in C (#575)
  * Box<T> simplifies to T* in C (4ce324c)
  * ManuallyDrop<T> and MaubeUninit<T> simplify to T in C, and are opaque in C++ (0076a17)
  * C++ supports a derive-ostream annotation to derive serialization of structs, unions and enums (#582)
  * Large character constants have been fixed on Windows (#586)
  * Constants are now generated for typedefs, etc (#589)
  * The `sort_by` configuration option has been made to work for constants (#587)
  * Default sort order is source order now (sort_by = "None"), and can be changed by the above option (#587)
bors bot added a commit to crypto-com/thaler that referenced this pull request Oct 8, 2020
2271: Bump cbindgen from 0.14.6 to 0.15.0 r=tomtau a=dependabot-preview[bot]

Bumps [cbindgen](https://github.com/eqrion/cbindgen) from 0.14.6 to 0.15.0.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/eqrion/cbindgen/blob/master/CHANGES">cbindgen's changelog</a>.</em></p>
<blockquote>
<h2>0.15.0</h2>
<pre><code> * Allow customizing mangling of generic parameters in C ([#575](mozilla/cbindgen#575))
 * Box&lt;T&gt; simplifies to T* in C (4ce324c)
 * ManuallyDrop&lt;T&gt; and MaubeUninit&lt;T&gt; simplify to T in C, and are opaque in C++ (0076a17)
 * C++ supports a derive-ostream annotation to derive serialization of structs, unions and enums ([#582](mozilla/cbindgen#582))
 * Large character constants have been fixed on Windows ([#586](mozilla/cbindgen#586))
 * Constants are now generated for typedefs, etc ([#589](mozilla/cbindgen#589))
 * The `sort_by` configuration option has been made to work for constants ([#587](mozilla/cbindgen#587))
 * Default sort order is source order now (sort_by = &quot;None&quot;), and can be changed by the above option ([#587](mozilla/cbindgen#587))
</code></pre>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/eqrion/cbindgen/commit/83b3be9f884697a51f8717af8b5498866a81e62e"><code>83b3be9</code></a> v0.15.0</li>
<li><a href="https://github.com/eqrion/cbindgen/commit/aeb69bcc6941b37a0d0acfa1ed77d4ccdf1cccc9"><code>aeb69bc</code></a> Switch default sorting order for items to &quot;None&quot;</li>
<li><a href="https://github.com/eqrion/cbindgen/commit/ea919a4edfdfc62af0f84a3f796a2c072d469e8a"><code>ea919a4</code></a> <code>mem::replace</code> -&gt; <code>mem::take</code></li>
<li><a href="https://github.com/eqrion/cbindgen/commit/f3d5a20363be93c4d38324b7b7928db71158c27e"><code>f3d5a20</code></a> Support <code>sort_by</code> for constants</li>
<li><a href="https://github.com/eqrion/cbindgen/commit/6439e6df563786d8f834579a00ffd5c418244cd3"><code>6439e6d</code></a> Support constants with arbitrary types</li>
<li><a href="https://github.com/eqrion/cbindgen/commit/9669cadf6076df4a77246b9d1dedb5b261cf478a"><code>9669cad</code></a> Rename ARCHITECTURE.md to internals.md in contributing instructions</li>
<li><a href="https://github.com/eqrion/cbindgen/commit/56d0799366f58b1fa7c96524da576245b1f0a57d"><code>56d0799</code></a> Use <code>U'...'</code> character literals instead of <code>L'...'</code> character literals</li>
<li><a href="https://github.com/eqrion/cbindgen/commit/f4b26fef2a7625cc49915d8f4b620d3365a9feb6"><code>f4b26fe</code></a> Checkout files with LF line endings</li>
<li><a href="https://github.com/eqrion/cbindgen/commit/d1d97d44820b406bbeba662c8d5d6ffdd020a6bd"><code>d1d97d4</code></a> enumeration: Only propagate derive_ostream annotation if not present.</li>
<li><a href="https://github.com/eqrion/cbindgen/commit/36a3f8ba6e2cda3e224155a7f14754506f006a71"><code>36a3f8b</code></a> enumertion: Add a using declaration rather than qualifying all branches.</li>
<li>Additional commits viewable in <a href="https://github.com/eqrion/cbindgen/compare/v0.14.6...v0.15.0">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://api.dependabot.com/badges/compatibility_score?dependency-name=cbindgen&package-manager=cargo&previous-version=0.14.6&new-version=0.15.0)](https://dependabot.com/compatibility-score/?dependency-name=cbindgen&package-manager=cargo&previous-version=0.14.6&new-version=0.15.0)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
- `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language
- `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language
- `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language
- `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language
- `@dependabot badge me` will comment on this PR with code to add a "Dependabot enabled" badge to your readme

Additionally, you can set the following in your Dependabot [dashboard](https://app.dependabot.com):
- Update frequency (including time of day and day of week)
- Pull request limits (per update run and/or open at any time)
- Out-of-range updates (receive only lockfile updates, if desired)
- Security updates (receive only security updates, if desired)



</details>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
bors-servo added a commit to servo/servo that referenced this pull request Apr 6, 2022
Bump cbindgen from 0.14.6 to 0.20.0

Bumps [cbindgen](https://github.com/eqrion/cbindgen) from 0.14.6 to 0.20.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/eqrion/cbindgen/releases">cbindgen's releases</a>.</em></p>
<blockquote>
<h2>v0.20.0</h2>
<ul>
<li>Add Builder::with_using_namespaces. (<a href="https://github-redirect.dependabot.com/eqrion/cbindgen/issues/688">#688</a>)</li>
<li>Ignore PhantomPinned. (<a href="https://github-redirect.dependabot.com/eqrion/cbindgen/issues/695">#695</a>)</li>
<li>Simplify Pin<!-- raw HTML omitted --> to T. (<a href="https://github-redirect.dependabot.com/eqrion/cbindgen/issues/697">#697</a>)</li>
<li>Update --pretty=expanded to -Zunpretty=expanded. (<a href="https://github-redirect.dependabot.com/eqrion/cbindgen/issues/706">#706</a>)</li>
</ul>
<h2>v0.19.0</h2>
<ul>
<li>Simplify types in generics (<a href="https://github-redirect.dependabot.com/eqrion/cbindgen/issues/663">#663</a>)</li>
<li>Use --profile=check for macro expansion (<a href="https://github-redirect.dependabot.com/eqrion/cbindgen/issues/671">#671</a>)</li>
<li>Use exported name to prefix enum variants (<a href="https://github-redirect.dependabot.com/eqrion/cbindgen/issues/672">#672</a>)</li>
<li>Fix path attribute handling in inline submodules (<a href="https://github-redirect.dependabot.com/eqrion/cbindgen/issues/679">#679</a>)</li>
<li>Fix a stack overflow with some recursive typedefs (<a href="https://github-redirect.dependabot.com/eqrion/cbindgen/issues/680">#680</a>)</li>
</ul>
<h2>v0.18.0</h2>
<ul>
<li>Simplify types in nested types such as pointed-to types and function signatures (<a href="https://github-redirect.dependabot.com/eqrion/cbindgen/issues/661">#661</a>)</li>
</ul>
<h2>v0.17.0</h2>
<ul>
<li>Add with_parse_extra_bindings to builder. (<a href="https://github-redirect.dependabot.com/eqrion/cbindgen/issues/645">#645</a>)</li>
<li>Support NonZero and fix incorrect simplification of Option<!-- raw HTML omitted --> into ptr. (<a href="https://github-redirect.dependabot.com/eqrion/cbindgen/issues/647">#647</a>)</li>
<li>Deal with name conflicts correctly in declaration type resolution. (<a href="https://github-redirect.dependabot.com/eqrion/cbindgen/issues/651">#651</a>)</li>
<li>Support pointers to ZSTs. (<a href="https://github-redirect.dependabot.com/eqrion/cbindgen/issues/656">#656</a>)</li>
</ul>
<h2>v0.16.0</h2>
<p>No release notes provided.</p>
<h2>v0.15.0</h2>
<p>No release notes provided.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/eqrion/cbindgen/blob/master/CHANGES">cbindgen's changelog</a>.</em></p>
<blockquote>
<h2>0.20.0</h2>
<pre><code> * Add Builder::with_using_namespaces. ([#688](mozilla/cbindgen#688))
 * Ignore PhantomPinned. ([#695](mozilla/cbindgen#695))
 * Simplify Pin&lt;T&gt; to T. ([#697](mozilla/cbindgen#697))
 * Update --pretty=expanded to -Zunpretty=expanded. ([#706](mozilla/cbindgen#706))
</code></pre>
<h2>0.19.0</h2>
<pre><code> * Simplify types in generics ([#663](mozilla/cbindgen#663))
 * Use --profile=check for macro expansion ([#671](mozilla/cbindgen#671))
 * Use exported name to prefix enum variants ([#672](mozilla/cbindgen#672))
 * Fix path attribute handling in inline submodules ([#679](mozilla/cbindgen#679))
 * Fix a stack overflow with some recursive typedefs ([#680](mozilla/cbindgen#680))
</code></pre>
<h2>0.18.0</h2>
<pre><code> * Simplify types in nested types such as pointed-to types and function signatures ([#661](mozilla/cbindgen#661))
</code></pre>
<h2>0.17.0</h2>
<pre><code> * Add with_parse_extra_bindings to builder. ([#645](mozilla/cbindgen#645))
 * Support NonZero and fix incorrect simplification of Option&lt;ptr&gt; into ptr. ([#647](mozilla/cbindgen#647))
 * Deal with name conflicts correctly in declaration type resolution. ([#651](mozilla/cbindgen#651))
 * Support pointers to ZSTs. ([#656](mozilla/cbindgen#656))
</code></pre>
<h2>0.16.0</h2>
<pre><code> * Remove artificial restriction on lifetime parameters on enums ([#604](mozilla/cbindgen#604))
 * Add an option for converting usize/isize into size_t/ptrdiff_t. ([#606](mozilla/cbindgen#606))
 * Allow controlling the cargo profile used for expansion. ([#607](mozilla/cbindgen#607))
 * Support wider range of expressions in enum discriminants ([#614](mozilla/cbindgen#614))
 * Support generation of Cython bindings ([#590](mozilla/cbindgen#590))
 * Fixed some issues with style=tag and recursive structs ([#615](mozilla/cbindgen#615))
 * Default C style to Both (as specified in docs) ([#615](mozilla/cbindgen#615))
 * Fix resolution of path dependencies from certain modules. ([#629](mozilla/cbindgen#629))
 * Support inlined definitions for tuple variants with a single field in C ([#631](mozilla/cbindgen#631))
</code></pre>
<p>Thanks to all the awesome contributors that contributed to this release.</p>
<h2>0.15.0</h2>
<pre><code> * Allow customizing mangling of generic parameters in C ([#575](mozilla/cbindgen#575))
 * Box&lt;T&gt; simplifies to T* in C (4ce324c)
 * ManuallyDrop&lt;T&gt; and MaybeUninit&lt;T&gt; simplify to T in C, and are opaque in C++ (0076a17)
 * C++ supports a derive-ostream annotation to derive serialization of structs, unions and enums ([#582](mozilla/cbindgen#582))
 * Large character constants have been fixed on Windows ([#586](mozilla/cbindgen#586))
 * Constants are now generated for typedefs, etc ([#589](mozilla/cbindgen#589))
 * The `sort_by` configuration option has been made to work for constants ([#587](mozilla/cbindgen#587))
 * Default sort order is source order now (sort_by = &quot;None&quot;), and can be changed by the above option ([#587](mozilla/cbindgen#587))
</code></pre>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/eqrion/cbindgen/commit/41506d5aeb2be8d200f52d08afb0c243414eb00d"><code>41506d5</code></a> v0.20.0</li>
<li><a href="https://github.com/eqrion/cbindgen/commit/34299aef5610fa82a058374bdfce8d782e0abe29"><code>34299ae</code></a> Don't use <code>check</code> profile when expanding code on a release build</li>
<li><a href="https://github.com/eqrion/cbindgen/commit/6c96c8ab957542eb0bebe576fee3fb1241db0114"><code>6c96c8a</code></a> Update --pretty=expanded to -Zunpretty=expanded</li>
<li><a href="https://github.com/eqrion/cbindgen/commit/57add9c86083b492266c8511fba30fb7c37cce25"><code>57add9c</code></a> Fix some clippy lints.</li>
<li><a href="https://github.com/eqrion/cbindgen/commit/63c1043dfb92fcac0bf3073c2d71e9e4ac69c943"><code>63c1043</code></a> Simplify Pin&lt;T&gt; to T</li>
<li><a href="https://github.com/eqrion/cbindgen/commit/ccd1f0e9ec2369735b9481c85057b9c65b6b0908"><code>ccd1f0e</code></a> add <code>Builder::with_using_namespaces</code></li>
<li><a href="https://github.com/eqrion/cbindgen/commit/4e394493d63c2348a08d486562dc2082cbdfe306"><code>4e39449</code></a> Ignore PhantomPinned</li>
<li><a href="https://github.com/eqrion/cbindgen/commit/2d20c4b15179523b10605bdd95006882dd1c8e4e"><code>2d20c4b</code></a> Move the target-guessing code from <a href="https://github-redirect.dependabot.com/eqrion/cbindgen/issues/676">#676</a> to its own function.</li>
<li><a href="https://github.com/eqrion/cbindgen/commit/93c06c5c9d319f481788c9670700097b4e46d270"><code>93c06c5</code></a> Only fetch dependencies for current platform by default (<a href="https://github-redirect.dependabot.com/eqrion/cbindgen/issues/676">#676</a>)</li>
<li><a href="https://github.com/eqrion/cbindgen/commit/d9e490ce8b836194595bd30611253a7028059da2"><code>d9e490c</code></a> v0.19.0</li>
<li>Additional commits viewable in <a href="https://github.com/eqrion/cbindgen/compare/v0.14.6...v0.20.0">compare view</a></li>
</ul>
</details>
<br />

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=cbindgen&package-manager=cargo&previous-version=0.14.6&new-version=0.20.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

</details>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants