summaryrefslogtreecommitdiff
path: root/src/codegen/mod.rs
diff options
context:
space:
mode:
authorDr. Chat <arkolbed@gmail.com>2021-12-30 00:29:15 -0600
committerEmilio Cobos Álvarez <emilio@crisal.io>2022-01-29 11:29:00 +0100
commit604792310e19899f2c6d34e382de3b55678a8550 (patch)
tree9e2ff909ac2f81393de7afcdea2a7de374a70336 /src/codegen/mod.rs
parentacfc9ac95b65542a5172af383bdbb658dcd07187 (diff)
Account for virtual destructors
Diffstat (limited to 'src/codegen/mod.rs')
-rw-r--r--src/codegen/mod.rs36
1 files changed, 16 insertions, 20 deletions
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs
index c7801030..2b10b3de 100644
--- a/src/codegen/mod.rs
+++ b/src/codegen/mod.rs
@@ -21,8 +21,8 @@ use crate::ir::analysis::{HasVtable, Sizedness};
use crate::ir::annotations::FieldAccessorKind;
use crate::ir::comment;
use crate::ir::comp::{
- Base, Bitfield, BitfieldUnit, CompInfo, CompKind, Field, FieldData,
- FieldMethods, Method, MethodKind,
+ Bitfield, BitfieldUnit, CompInfo, CompKind, Field, FieldData, FieldMethods,
+ Method, MethodKind,
};
use crate::ir::context::{BindgenContext, ItemId};
use crate::ir::derive::{
@@ -1017,23 +1017,14 @@ impl CodeGenerator for Type {
struct Vtable<'a> {
item_id: ItemId,
+ /// A reference to the originating compound object.
#[allow(dead_code)]
- methods: &'a [Method],
- #[allow(dead_code)]
- base_classes: &'a [Base],
+ comp_info: &'a CompInfo,
}
impl<'a> Vtable<'a> {
- fn new(
- item_id: ItemId,
- methods: &'a [Method],
- base_classes: &'a [Base],
- ) -> Self {
- Vtable {
- item_id,
- methods,
- base_classes,
- }
+ fn new(item_id: ItemId, comp_info: &'a CompInfo) -> Self {
+ Vtable { item_id, comp_info }
}
}
@@ -1053,10 +1044,16 @@ impl<'a> CodeGenerator for Vtable<'a> {
let class_ident = ctx.rust_ident(self.item_id.canonical_name(ctx));
// For now, we will only generate vtables for classes that do not inherit from others.
- if self.base_classes.is_empty() {
- let methods = self
- .methods
+ if self.comp_info.base_members().is_empty() {
+ // Map the destructor into a Method, and chain it into the below iteration.
+ let dtor = self
+ .comp_info
+ .destructor()
+ .map(|(kind, id)| Method::new(kind, id, false));
+
+ let methods = dtor
.iter()
+ .chain(self.comp_info.methods().iter())
.filter_map(|m| {
if !m.is_virtual() {
return None;
@@ -1796,8 +1793,7 @@ impl CodeGenerator for CompInfo {
if !is_opaque {
if item.has_vtable_ptr(ctx) {
- let vtable =
- Vtable::new(item.id(), self.methods(), self.base_members());
+ let vtable = Vtable::new(item.id(), &self);
vtable.codegen(ctx, result, item);
let vtable_type = vtable