summaryrefslogtreecommitdiff
path: root/src/codegen
AgeCommit message (Collapse)Author
2017-06-22Allow marking specific template instantiations as opaqueNick Fitzgerald
If a template has a specialization that bindgen doesn't understand, it can be helpful to mark it as opaque and continue making forward progress in the meantime. This is something we need in the SpiderMonkey bindings.
2017-06-21Auto merge of #741 - tmfink:feature-699-constified-enum-module, r=emiliobors-servo
Feature 699 constified enum module This is a work in progress for issue #699 that adds the `--constified-enum-module` option to bindgen. @emilio, could you give me some guidance on fixing the uses of the enum variant types? In the example below, `foo` should be replaced with `foo::Type`. I'm not sure of the proper way to rename `Item`s after the structures have been defined. My initial thought was to redefine the `CodeGenerator` trait to take a mutable reference to `item`, but that will not work because of the borrow checker. Thoughts? Todo: - [x] put constified enum variants in a `mod` - [x] ensure references to constified enum `foo` are changed to `foo::Type` - [x] handle `typedef` enums ----- Given the input header `tests/headers/constify-module-enums.h`: ~~~c // bindgen-flags: --constified-enum-module foo enum foo { THIS, SHOULD_BE, A_CONSTANT, }; struct bar { enum foo this_should_work; }; ~~~ `$ cargo run -- tests/headers/constify-module-enums.h --constified-enum-module foo --no-layout-tests` will output: ~~~rust /* automatically generated by rust-bindgen */ pub mod foo { pub type Type = ::std::os::raw::c_uint; pub const THIS: Type = 0; pub const SHOULD_BE: Type = 1; pub const A_CONSTANT: Type = 2; } #[repr(C)] #[derive(Debug, Copy)] pub struct bar { pub this_should_work: foo, } impl Clone for bar { fn clone(&self) -> Self { *self } } ~~~
2017-06-20Auto merge of #770 - fitzgen:issue-769-bad-instantiation-test, r=emiliobors-servo
Ensure that every item is in some module's children list Previously, if an item's parent was not a module (eg a nested class definition whose parent it the outer class definition) and the parent was not whitelisted but the item was transitively whitelisted, then we could generate uses of the item without emitting any definition for it. This could happen because we were relying on the outer type calling for code generation on its inner types, but that relies on us doing code generation for the outer type, which won't happen if the outer type is not whitelisted. This commit avoids this gotcha by ensuring that all items end up in a module's children list, and so will be code generated even if their parent is not whitelisted. This does have the downside of changing the relative order of some of the emitted code, and so this has a big diff (as will the next bindgen update for downstream dependencies) but I actually think the newer order makes more sense, for what that is worth. Fixes #769 r? @emilio
2017-06-20Ensure that every item is in some module's children listNick Fitzgerald
Previously, if an item's parent was not a module (eg a nested class definition whose parent it the outer class definition) and the parent was not whitelisted but the item was transitively whitelisted, then we could generate uses of the item without emitting any definition for it. This could happen because we were relying on the outer type calling for code generation on its inner types, but that relies on us doing code generation for the outer type, which won't happen if the outer type is not whitelisted. This commit avoids this gotcha by ensuring that all items end up in a module's children list, and so will be code generated even if their parent is not whitelisted. Fixes #769
2017-06-20codegen: Inline {read,write}_unaligned in order to support rust 1.15.Emilio Cobos Álvarez
... Which is what Firefox uses right now.
2017-06-19Rename `AsNamed` to `AsTemplateParam`Nick Fitzgerald
And also its trait methods `is_named` and `as_named` into `is_template_param` and `as_template_param` respectively. These new names better reflect what the trait is about.
2017-06-18codegen: Fix bitfield getter/setters so they work with NPOT sizes.Emilio Cobos Álvarez
2017-06-17ir: use a bigger integer for the bitfield mask in 32bit, to avoid overflows.Emilio Cobos Álvarez
Like the ones seen in https://bugzilla.mozilla.org/show_bug.cgi?id=1365254#c22
2017-06-17ir: Correct size calculation of a bitfield unit.Emilio Cobos Álvarez
Fixes #734
2017-06-17codegen: Remove trailing whitespace.Emilio Cobos Álvarez
2017-06-16codegen: Respect prepend_enum_name in constified variants.Emilio Cobos Álvarez
Fixes #755
2017-06-11Adds `--constified-enum-module` option per #699Travis Finkenauer
2017-06-02ir: Give a better error message for unknown ABI.Emilio Cobos Álvarez
Fixes #727
2017-05-26ir: Don't panic when finding an unknown calling convention until code ↵Emilio Cobos Álvarez
generation.
2017-05-24Fix bitfield generation bug with const functionzzhu
Const function can't have variables or blocks.
2017-05-20codegen: Reuse the next_child_local_id hack for template instantiations.Emilio Cobos Álvarez
This should be good enough, following the pattern of anonymous items, and should prevent most of the current noise in stylo updates. Closes #620 Fixes #619
2017-05-19Flatten nesting in Bitfield::extend_ctor_implNick Fitzgerald
This commit flattens the nesting in `Bitfield::extend_ctor_impl`, as requested in review, because it was getting pretty deep. Should be easier to read now.
2017-05-19Add bitfield allocation unit constructorsNick Fitzgerald
This commit gives bindgen the ability to generate constructors for bitfield allocation units. This enables more ergonomic use of struct literals for bindings structs that contain bitfields. Additionally, when we are generating unstable Rust, these constructors are marked as const functions. This enables the creation of const binding structs that contain bitfields.
2017-05-18Move bitfields into the IRNick Fitzgerald
This commit moves bitfields and the computation of their allocation units into the IR. They were previously computed on-the-fly during code generation. In addition to breaking up and compartmentalizaing a portion of the gargantuan `CodeGeneration` implementation for `CompInfo`, this paves the way for adding const-fn bitfield unit constructors.
2017-05-10Add other bitwise ops for bitflag enumsJon Gjengset
2017-05-08codegen: Make phantom fields public.v0.25.0Emilio Cobos Álvarez
Otherwise you can't construct structs outside of the bindings file, which is breaking. Also, given the previous change was breaking and I didn't notice, I yanked 0.24.1.
2017-05-05Emit `PhantomData<UnsafeCell<T>>` members for all generic parametersKowasaki
This makes generated generic structs lifetime invariant, since we cannot know the C++ type's true variance. Fixes #506
2017-05-03objc: Fix broken option handlingMikko Lehtonen
2017-05-03objc: Handle class and instance method with same nameMikko Lehtonen
Prefixes the clashing class method with class_ prefix
2017-04-23codegen: Change forward-declared types to avoid collisions with functions.Emilio Cobos Álvarez
Fixes #654
2017-04-17Move the TemplateParameters trait from ir::ty to ir::templateNick Fitzgerald
Organizationally, it makes more sense.
2017-04-17Rename the `TemplateDeclaration` trait to `TemplateParameters`Nick Fitzgerald
The trait is all about accessing template parameters, and is also implemented for things that are not template declarations or definitions, but do end up using template parameters one way or another. The new name makes more sense.
2017-04-17Make a builder for item resolution optionsNick Fitzgerald
We have a couple knobs to turn for item resolution, such as whether we keep going through type references and type aliases. It makes sense to have a single, easy place to configure these knobs.
2017-04-14code reviewDavid Hotham
2017-04-14Option to avoid generating layout testsDavid Hotham
2017-04-08update dependenciesDavid Hotham
2017-04-07Auto merge of #622 - Tiwalun:fix-570, r=fitzgenbors-servo
Don't generate accessor methods for large bitfields This fixes #570, by not generating accessor methods for large methods.
2017-04-08Move check for field size outside loopDominik Boehi
2017-04-08Omit accessor functions for large bitfieldsDominik Boehi
2017-04-07Define extra assertion macrosNick Fitzgerald
This commit defines a new set of assertion macros that are only checked in testing/CI when the `testing_only_extra_assertions` feature is enabled. This makes it so that *users* of bindgen that happen to be making a debug build don't enable all these extra and expensive assertions. Additionally, this removes the `testing_only_assert_no_dangling_items` feature, and runs the assertions that were previously gated on that feature when the new `testing_only_extra_assertions` feature is enabled.
2017-04-04ir: Handle char in a more cross-platform way when possible.Emilio Cobos Álvarez
Signed-off-by: Emilio Cobos Álvarez <emilio@crisal.io>
2017-04-04codegen: Simplify method implementations.Emilio Cobos Álvarez
2017-04-04codegen: Rename the destructor methods to "destruct".Emilio Cobos Álvarez
2017-04-04options: Allow configuring destructors via CLI.Emilio Cobos Álvarez
2017-04-04Refactor a bit and do not generate virtual destructors.Emilio Cobos Álvarez
2017-04-04Add codegen for destructors.Nikhil Shagrithaya
2017-03-21Make vtables non-zero-size to fix a rustc warning.Simon Sapin
``` warning: found non-foreign-function-safe member in struct marked #[repr(C)]: found zero-size struct in foreign module, consider adding a member to this struct ```
2017-03-21Do not derive Default on vtable typesSimon Sapin
https://github.com/servo/rust-bindgen/pull/597#issuecomment-288006557
2017-03-16Resolve namespace clashes between methods and generated bitfield accessorsNick Fitzgerald
This commit makes bitfields' accessor codegen detect conflicting method names and generate alternative, non-conflicting names instead.
2017-03-15Refactor fallibility of conversions from IR to Rust typesNick Fitzgerald
The old ToRustTy and ItemToRustTy conversion traits were problematic in that they assumed infallibity. That assumption is problematic because we are often dealing with C++ constructs for which Rust has no equivalent *and* we don't have a usable layout from which to generate an opaque blob in its stead. But, a usable layout is often "up the stack" if only we had a way to get up there. For example, Rust does not currently have an equivalent of const value template parameters, and libclang will not give us a layout for template definitions with const value template parameters. However, libclang will give us the layout for an instantiation of such a template definition. First, this commit separates the concepts of generating an equivalent Rust type from generating an opaque blob of the same size and alignment as an IR thing. This consolidates and DRYs up a *ton* of code involved in falling back to an opaque blob (and doing our best to get a Layout for the blob) when we can't generate an equivalent Rust type for some IR thing. Second, it separates fallible and infallible conversions, and provides a nice little framework for when to choose which. This gives us one single place where we do this whole dance: if could not generate equivalent Rust type: if we have a layout: return opaque blob based on layout else: return opaque blob based on a wish and a prayer The ToRustTy trait is replaced by the TryToOpaque, ToOpaque, TryToRustTyOrOpaque, and ToRustTyOrOpaque traits. The ItemToRustTy helper was just a way to avoid ToRustTy's Self::Extra parameter when it was not needed, and is simply removed without a replacement. We suck it up and pass `&()` at call sites now. We *could* introduce ItemTryToOpaque, ItemToOpaque, etc... traits, but the cost of the added boiler plate would outweigh the benefits of not passing `&()` at call sites, IMHO. In addition to being a nice code cleanup, this also fixes #573.
2017-03-15ir: Generate non-finite floating point constants properly.Emilio Cobos Álvarez
2017-03-09Auto merge of #565 - framlog:master, r=fitzgenbors-servo
automatically allow non rust naming conventions + related issue: #562 I just added those attributes at the root mod. And I'm not sure whether it should be better if we could set this setting in `build.rs`.
2017-03-09Replace if let / else return with matchNick Fitzgerald
It reads a little bit better this way, but is exactly equivalent.
2017-03-09Add a comment documenting the hacky test of `()` from ToRustTyNick Fitzgerald
2017-03-09Generate better opaque blobs in the face of non-type parametersNick Fitzgerald
When instantiating templates whose definitions have non-type generic parameters, prefer the layout of the instantiation type to the garbage we get from the definition's layout. In general, an instantiation's layout will always be a better choice than the definition's layout, regardless of non-type parameters. Fixes #569